import wx import wx.gizmos as gizmos import wx.stc as stc #---------------------------------------------------------------------- # This is an example of the complex view that manages its own scrollbars # as described in the overview below. class TestView(stc.StyledTextCtrl): def __init__(self, parent, ID, log): stc.StyledTextCtrl.__init__(self, parent, ID, style=wx.NO_BORDER) self.dyn_sash = parent self.log = log self.SetupScrollBars() self.SetMarginWidth(1,0) self.StyleSetFont(stc.STC_STYLE_DEFAULT, wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL)) self.Bind(gizmos.EVT_DYNAMIC_SASH_SPLIT, self.OnSplit) self.Bind(gizmos.EVT_DYNAMIC_SASH_UNIFY, self.OnUnify) #self.SetScrollWidth(500) def SetupScrollBars(self): # hook the scrollbars provided by the wxDynamicSashWindow # to this view v_bar = self.dyn_sash.GetVScrollBar(self) h_bar = self.dyn_sash.GetHScrollBar(self) v_bar.Bind(wx.EVT_SCROLL, self.OnSBScroll) h_bar.Bind(wx.EVT_SCROLL, self.OnSBScroll) v_bar.Bind(wx.EVT_SET_FOCUS, self.OnSBFocus) h_bar.Bind(wx.EVT_SET_FOCUS, self.OnSBFocus) # And set the wxStyledText to use these scrollbars instead # of its built-in ones. self.SetVScrollBar(v_bar) self.SetHScrollBar(h_bar) def __del__(self): self.log.write("TestView.__del__\n") def OnSplit(self, evt): self.log.write("TestView.OnSplit\n"); newview = TestView(self.dyn_sash, -1, self.log) newview.SetDocPointer(self.GetDocPointer()) # use the same document self.SetupScrollBars() def OnUnify(self, evt): self.log.write("TestView.OnUnify\n"); self.SetupScrollBars() def OnSBScroll(self, evt): # redirect the scroll events from the dyn_sash's scrollbars to the STC self.GetEventHandler().ProcessEvent(evt) def OnSBFocus(self, evt): # when the scrollbar gets the focus move it back to the STC self.SetFocus() sampleText="""\ You can drag the little tabs above the vertical scrollbar, or to the left of the horizontal scrollbar to split this view, and you can continue splitting the new views as much as you like. Try it and see. In this case the views also share the same document so changes in one are instantly seen in the others. This is a feature of the StyledTextCtrl that is used for the view class in this sample. """ #---------------------------------------------------------------------- # This one is simpler, but doesn't do anything with the scrollbars # except the default wxDynamicSashWindow behaviour class SimpleView(wx.Panel): def __init__(self, parent, ID, log): wx.Panel.__init__(self, parent, ID) self.dyn_sash = parent self.log = log self.SetBackgroundColour("LIGHT BLUE") self.Bind(gizmos.EVT_DYNAMIC_SASH_SPLIT, self.OnSplit) def OnSplit(self, evt): v = SimpleView(self.dyn_sash, -1, self.log) #---------------------------------------------------------------------- def runTest(frame, nb, log): ## if wx.Platform == "__WXMAC__": ## from Main import MessagePanel ## win = MessagePanel(nb, 'This demo currently fails on the Mac. The problem is being looked into...', ## 'Sorry', wx.ICON_WARNING) ## return win if 1: win = gizmos.DynamicSashWindow(nb, -1, style = wx.CLIP_CHILDREN #| wxDS_MANAGE_SCROLLBARS #| wxDS_DRAG_CORNER ) win.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL)) view = TestView(win, -1, log) view.SetText(sampleText) else: win = wx.DynamicSashWindow(nb, -1) view = SimpleView(win, -1, log) return win #---------------------------------------------------------------------- overview = """\
wxDynamicSashWindow widgets manages the way other widgets are viewed. When a wxDynamicSashWindow is first shown, it will contain one child view, a viewport for that child, and a pair of scrollbars to allow the user to navigate the child view area. Next to each scrollbar is a small tab. By clicking on either tab and dragging to the appropriate spot, a user can split the view area into two smaller views separated by a draggable sash. Later, when the user wishes to reunify the two subviews, the user simply drags the sash to the side of the window. wxDynamicSashWindow will automatically reparent the appropriate child view back up the window hierarchy, and the wxDynamicSashWindow will have only one child view once again.
As an application developer, you will simply create a wxDynamicSashWindow using either the Create() function or the more complex constructor provided below, and then create a view window whose parent is the wxDynamicSashWindow. The child should respond to wxDynamicSashSplitEvents -- perhaps with an OnSplit() event handler -- by constructing a new view window whose parent is also the wxDynamicSashWindow. That's it! Now your users can dynamically split and reunify the view you provided.
If you wish to handle the scrollbar events for your view, rather than allowing wxDynamicSashWindow to do it for you, things are a bit more complex. (You might want to handle scrollbar events yourself, if, for instance, you wish to scroll a subwindow of the view you add to your wxDynamicSashWindow object, rather than scrolling the whole view.) In this case, you will need to construct your wxDynamicSashWindow without the wxDS_MANAGE_SCROLLBARS style and you will need to use the GetHScrollBar() and GetVScrollBar() methods to retrieve the scrollbar controls and call SetEventHanler() on them to redirect the scrolling events whenever your window is reparented by wxDyanmicSashWindow. You will need to set the scrollbars' event handler at three times: