]>
Commit | Line | Data |
---|---|---|
ebf4302c | 1 | |
8fa876ca RD |
2 | import wx |
3 | import wx.gizmos as gizmos | |
4 | import wx.stc as stc | |
ebf4302c RD |
5 | |
6 | #---------------------------------------------------------------------- | |
7 | # This is an example of the complex view that manages its own scrollbars | |
8 | # as described in the overview below. | |
9 | ||
8fa876ca | 10 | class TestView(stc.StyledTextCtrl): |
ebf4302c | 11 | def __init__(self, parent, ID, log): |
8fa876ca | 12 | stc.StyledTextCtrl.__init__(self, parent, ID, style=wx.NO_BORDER) |
ebf4302c RD |
13 | self.dyn_sash = parent |
14 | self.log = log | |
6e8a778a | 15 | self.SetupScrollBars() |
ebf4302c | 16 | self.SetMarginWidth(1,0) |
8fa876ca RD |
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) | |
a834585d | 23 | #self.SetScrollWidth(500) |
ebf4302c RD |
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) | |
8fa876ca RD |
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) | |
ebf4302c RD |
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 | |
8fa876ca | 72 | StyledTextCtrl that is used for the view class in this sample. |
ebf4302c RD |
73 | """ |
74 | ||
75 | #---------------------------------------------------------------------- | |
76 | # This one is simpler, but doesn't do anything with the scrollbars | |
77 | # except the default wxDynamicSashWindow behaviour | |
78 | ||
8fa876ca | 79 | class SimpleView(wx.Panel): |
ebf4302c | 80 | def __init__(self, parent, ID, log): |
8fa876ca | 81 | wx.Panel.__init__(self, parent, ID) |
ebf4302c RD |
82 | self.dyn_sash = parent |
83 | self.log = log | |
84 | self.SetBackgroundColour("LIGHT BLUE") | |
8fa876ca | 85 | self.Bind(gizmos.EVT_DYNAMIC_SASH_SPLIT, self.OnSplit) |
ebf4302c RD |
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): | |
8fa876ca RD |
94 | if wx.Platform == "__WXMAC__": |
95 | wx.MessageBox("This demo currently fails on the Mac. The problem is being looked into...", "Sorry") | |
1e4a197e RD |
96 | return |
97 | ||
ebf4302c | 98 | if 1: |
8fa876ca | 99 | win = gizmos.DynamicSashWindow(nb, -1, style = wx.CLIP_CHILDREN |
ebf4302c RD |
100 | #| wxDS_MANAGE_SCROLLBARS |
101 | #| wxDS_DRAG_CORNER | |
102 | ) | |
8fa876ca RD |
103 | |
104 | win.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL)) | |
ebf4302c RD |
105 | view = TestView(win, -1, log) |
106 | view.SetText(sampleText) | |
107 | else: | |
8fa876ca | 108 | win = wx.DynamicSashWindow(nb, -1) |
ebf4302c RD |
109 | view = SimpleView(win, -1, log) |
110 | return win | |
111 | ||
112 | #---------------------------------------------------------------------- | |
113 | ||
114 | overview = """\ | |
115 | <html><body> | |
8fa876ca | 116 | <h2>DynamicSashWindow</h2> |
ebf4302c RD |
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 | """ | |
1e4a197e RD |
158 | |
159 | ||
160 | if __name__ == '__main__': | |
161 | import sys,os | |
162 | import run | |
8eca4fef | 163 | run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) |
1e4a197e | 164 |