]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/wxDynamicSashWindow.py
digital mars updated
[wxWidgets.git] / wxPython / demo / wxDynamicSashWindow.py
CommitLineData
ebf4302c
RD
1
2from wxPython.wx import *
3from wxPython.gizmos import *
4from wxPython.stc import *
5
6#----------------------------------------------------------------------
7# This is an example of the complex view that manages its own scrollbars
8# as described in the overview below.
9
10class TestView(wxStyledTextCtrl):
11 def __init__(self, parent, ID, log):
12 wxStyledTextCtrl.__init__(self, parent, ID, style=wxNO_BORDER)
13 self.dyn_sash = parent
14 self.log = log
6e8a778a 15 self.SetupScrollBars()
ebf4302c
RD
16 self.SetMarginWidth(1,0)
17 self.StyleSetFont(wxSTC_STYLE_DEFAULT,
18 wxFont(10, wxMODERN, wxNORMAL, wxNORMAL))
ebf4302c
RD
19 EVT_DYNAMIC_SASH_SPLIT(self, -1, self.OnSplit)
20 EVT_DYNAMIC_SASH_UNIFY(self, -1, self.OnUnify)
a834585d 21 #self.SetScrollWidth(500)
ebf4302c
RD
22
23 def SetupScrollBars(self):
24 # hook the scrollbars provided by the wxDynamicSashWindow
25 # to this view
26 v_bar = self.dyn_sash.GetVScrollBar(self)
27 h_bar = self.dyn_sash.GetHScrollBar(self)
28 EVT_SCROLL(v_bar, self.OnSBScroll)
29 EVT_SCROLL(h_bar, self.OnSBScroll)
30 EVT_SET_FOCUS(v_bar, self.OnSBFocus)
31 EVT_SET_FOCUS(h_bar, self.OnSBFocus)
32
33 # And set the wxStyledText to use these scrollbars instead
34 # of its built-in ones.
35 self.SetVScrollBar(v_bar)
36 self.SetHScrollBar(h_bar)
37
38
39 def __del__(self):
40 self.log.write("TestView.__del__\n")
41
42 def OnSplit(self, evt):
43 self.log.write("TestView.OnSplit\n");
44 newview = TestView(self.dyn_sash, -1, self.log)
45 newview.SetDocPointer(self.GetDocPointer()) # use the same document
46 self.SetupScrollBars()
47
48
49 def OnUnify(self, evt):
50 self.log.write("TestView.OnUnify\n");
51 self.SetupScrollBars()
52
53
54 def OnSBScroll(self, evt):
55 # redirect the scroll events from the dyn_sash's scrollbars to the STC
56 self.GetEventHandler().ProcessEvent(evt)
57
58 def OnSBFocus(self, evt):
59 # when the scrollbar gets the focus move it back to the STC
60 self.SetFocus()
61
62
63sampleText="""\
64You can drag the little tabs above the vertical scrollbar, or to the
65left of the horizontal scrollbar to split this view, and you can
66continue splitting the new views as much as you like. Try it and see.
67
68In this case the views also share the same document so changes in one
69are instantly seen in the others. This is a feature of the
70wxStyledTextCtrl that is used for the view class in this sample.
71"""
72
73#----------------------------------------------------------------------
74# This one is simpler, but doesn't do anything with the scrollbars
75# except the default wxDynamicSashWindow behaviour
76
77class SimpleView(wxPanel):
78 def __init__(self, parent, ID, log):
79 wxPanel.__init__(self, parent, ID)
80 self.dyn_sash = parent
81 self.log = log
82 self.SetBackgroundColour("LIGHT BLUE")
83 EVT_DYNAMIC_SASH_SPLIT(self, -1, self.OnSplit)
84
85 def OnSplit(self, evt):
86 v = SimpleView(self.dyn_sash, -1, self.log)
87
88
89#----------------------------------------------------------------------
90
91def runTest(frame, nb, log):
1e4a197e
RD
92 if wxPlatform == "__WXMAC__":
93 wxMessageBox("This demo currently fails on the Mac. The problem is being looked into...", "Sorry")
94 return
95
ebf4302c
RD
96 if 1:
97 win = wxDynamicSashWindow(nb, -1, style = 0
98 | wxCLIP_CHILDREN
99 #| wxDS_MANAGE_SCROLLBARS
100 #| wxDS_DRAG_CORNER
101 )
102 win.SetFont(wxFont(10, wxMODERN, wxNORMAL, wxNORMAL))
103 view = TestView(win, -1, log)
104 view.SetText(sampleText)
105 else:
106 win = wxDynamicSashWindow(nb, -1)
107 view = SimpleView(win, -1, log)
108 return win
109
110#----------------------------------------------------------------------
111
112overview = """\
113<html><body>
114<h2>wxDynamicSashWindow</h2>
115<p>
116wxDynamicSashWindow widgets manages the way other widgets are viewed.
117When a wxDynamicSashWindow is first shown, it will contain one child
118view, a viewport for that child, and a pair of scrollbars to allow the
119user to navigate the child view area. Next to each scrollbar is a small
120tab. By clicking on either tab and dragging to the appropriate spot, a
121user can split the view area into two smaller views separated by a
122draggable sash. Later, when the user wishes to reunify the two subviews,
123the user simply drags the sash to the side of the window.
124wxDynamicSashWindow will automatically reparent the appropriate child
125view back up the window hierarchy, and the wxDynamicSashWindow will have
126only one child view once again.
127<p>
128As an application developer, you will simply create a wxDynamicSashWindow
129using either the Create() function or the more complex constructor
130provided below, and then create a view window whose parent is the
131wxDynamicSashWindow. The child should respond to
132wxDynamicSashSplitEvents -- perhaps with an OnSplit() event handler -- by
133constructing a new view window whose parent is also the
134wxDynamicSashWindow. That's it! Now your users can dynamically split
135and reunify the view you provided.
136<p>
137If you wish to handle the scrollbar events for your view, rather than
138allowing wxDynamicSashWindow to do it for you, things are a bit more
139complex. (You might want to handle scrollbar events yourself, if,
140for instance, you wish to scroll a subwindow of the view you add to
141your wxDynamicSashWindow object, rather than scrolling the whole view.)
142In this case, you will need to construct your wxDynamicSashWindow without
143the wxDS_MANAGE_SCROLLBARS style and you will need to use the
144GetHScrollBar() and GetVScrollBar() methods to retrieve the scrollbar
145controls and call SetEventHanler() on them to redirect the scrolling
146events whenever your window is reparented by wxDyanmicSashWindow.
147You will need to set the scrollbars' event handler at three times:
148<p>
149<ul>
150<li> When your view is created
151<li> When your view receives a wxDynamicSashSplitEvent
152<li> When your view receives a wxDynamicSashUnifyEvent
153</ul>
154</body></html>
155"""
1e4a197e
RD
156
157
158if __name__ == '__main__':
159 import sys,os
160 import run
161 run.main(['', os.path.basename(sys.argv[0])])
162