| 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 | |