]>
Commit | Line | Data |
---|---|---|
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 | from Main import MessagePanel | |
96 | win = MessagePanel(nb, 'This demo currently fails on the Mac. The problem is being looked into...', | |
97 | 'Sorry', wx.ICON_WARNING) | |
98 | return win | |
99 | ||
100 | if 1: | |
101 | win = gizmos.DynamicSashWindow(nb, -1, style = wx.CLIP_CHILDREN | |
102 | #| wxDS_MANAGE_SCROLLBARS | |
103 | #| wxDS_DRAG_CORNER | |
104 | ) | |
105 | ||
106 | win.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL)) | |
107 | view = TestView(win, -1, log) | |
108 | view.SetText(sampleText) | |
109 | else: | |
110 | win = wx.DynamicSashWindow(nb, -1) | |
111 | view = SimpleView(win, -1, log) | |
112 | return win | |
113 | ||
114 | #---------------------------------------------------------------------- | |
115 | ||
116 | overview = """\ | |
117 | <html><body> | |
118 | <h2>DynamicSashWindow</h2> | |
119 | <p> | |
120 | wxDynamicSashWindow widgets manages the way other widgets are viewed. | |
121 | When a wxDynamicSashWindow is first shown, it will contain one child | |
122 | view, a viewport for that child, and a pair of scrollbars to allow the | |
123 | user to navigate the child view area. Next to each scrollbar is a small | |
124 | tab. By clicking on either tab and dragging to the appropriate spot, a | |
125 | user can split the view area into two smaller views separated by a | |
126 | draggable sash. Later, when the user wishes to reunify the two subviews, | |
127 | the user simply drags the sash to the side of the window. | |
128 | wxDynamicSashWindow will automatically reparent the appropriate child | |
129 | view back up the window hierarchy, and the wxDynamicSashWindow will have | |
130 | only one child view once again. | |
131 | <p> | |
132 | As an application developer, you will simply create a wxDynamicSashWindow | |
133 | using either the Create() function or the more complex constructor | |
134 | provided below, and then create a view window whose parent is the | |
135 | wxDynamicSashWindow. The child should respond to | |
136 | wxDynamicSashSplitEvents -- perhaps with an OnSplit() event handler -- by | |
137 | constructing a new view window whose parent is also the | |
138 | wxDynamicSashWindow. That's it! Now your users can dynamically split | |
139 | and reunify the view you provided. | |
140 | <p> | |
141 | If you wish to handle the scrollbar events for your view, rather than | |
142 | allowing wxDynamicSashWindow to do it for you, things are a bit more | |
143 | complex. (You might want to handle scrollbar events yourself, if, | |
144 | for instance, you wish to scroll a subwindow of the view you add to | |
145 | your wxDynamicSashWindow object, rather than scrolling the whole view.) | |
146 | In this case, you will need to construct your wxDynamicSashWindow without | |
147 | the wxDS_MANAGE_SCROLLBARS style and you will need to use the | |
148 | GetHScrollBar() and GetVScrollBar() methods to retrieve the scrollbar | |
149 | controls and call SetEventHanler() on them to redirect the scrolling | |
150 | events whenever your window is reparented by wxDyanmicSashWindow. | |
151 | You will need to set the scrollbars' event handler at three times: | |
152 | <p> | |
153 | <ul> | |
154 | <li> When your view is created | |
155 | <li> When your view receives a wxDynamicSashSplitEvent | |
156 | <li> When your view receives a wxDynamicSashUnifyEvent | |
157 | </ul> | |
158 | </body></html> | |
159 | """ | |
160 | ||
161 | ||
162 | if __name__ == '__main__': | |
163 | import sys,os | |
164 | import run | |
165 | run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) | |
166 |