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