]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/DynamicSashWindow.py
   3 import  wx
.gizmos   
as  gizmos
 
   6 #---------------------------------------------------------------------- 
   7 # This is an example of the complex view that manages its own scrollbars 
   8 # as described in the overview below. 
  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
 
  15         self
.SetupScrollBars() 
  16         self
.SetMarginWidth(1,0) 
  18         self
.StyleSetFont(stc
.STC_STYLE_DEFAULT
, 
  19                           wx
.Font(10, wx
.MODERN
, wx
.NORMAL
, wx
.NORMAL
)) 
  21         self
.Bind(gizmos
.EVT_DYNAMIC_SASH_SPLIT
, self
.OnSplit
) 
  22         self
.Bind(gizmos
.EVT_DYNAMIC_SASH_UNIFY
, self
.OnUnify
) 
  23         #self.SetScrollWidth(500) 
  25     def SetupScrollBars(self
): 
  26         # hook the scrollbars provided by the wxDynamicSashWindow 
  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
) 
  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
) 
  42         self
.log
.write("TestView.__del__\n") 
  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() 
  51     def OnUnify(self
, evt
): 
  52         self
.log
.write("TestView.OnUnify\n"); 
  53         self
.SetupScrollBars() 
  56     def OnSBScroll(self
, evt
): 
  57         # redirect the scroll events from the dyn_sash's scrollbars to the STC 
  58         self
.GetEventHandler().ProcessEvent(evt
) 
  60     def OnSBFocus(self
, evt
): 
  61         # when the scrollbar gets the focus move it back to the STC 
  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. 
  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. 
  75 #---------------------------------------------------------------------- 
  76 # This one is simpler, but doesn't do anything with the scrollbars 
  77 # except the default wxDynamicSashWindow behaviour 
  79 class SimpleView(wx
.Panel
): 
  80     def __init__(self
, parent
, ID
, log
): 
  81         wx
.Panel
.__init
__(self
, parent
, ID
) 
  82         self
.dyn_sash 
= parent
 
  84         self
.SetBackgroundColour("LIGHT BLUE") 
  85         self
.Bind(gizmos
.EVT_DYNAMIC_SASH_SPLIT
, self
.OnSplit
) 
  87     def OnSplit(self
, evt
): 
  88         v 
= SimpleView(self
.dyn_sash
, -1, self
.log
) 
  91 #---------------------------------------------------------------------- 
  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
) 
 101         win 
= gizmos
.DynamicSashWindow(nb
, -1, style 
=  wx
.CLIP_CHILDREN
 
 102                                   #| wxDS_MANAGE_SCROLLBARS 
 106         win
.SetFont(wx
.Font(10, wx
.MODERN
, wx
.NORMAL
, wx
.NORMAL
)) 
 107         view 
= TestView(win
, -1, log
) 
 108         view
.SetText(sampleText
) 
 110         win 
= wx
.DynamicSashWindow(nb
, -1) 
 111         view 
= SimpleView(win
, -1, log
) 
 114 #---------------------------------------------------------------------- 
 118 <h2>DynamicSashWindow</h2> 
 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. 
 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. 
 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: 
 154 <li>  When your view is created 
 155 <li>  When your view receives a wxDynamicSashSplitEvent 
 156 <li>  When your view receives a wxDynamicSashUnifyEvent 
 162 if __name__ 
== '__main__': 
 165     run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])