/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/dock.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/dock.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 667 by jonathan, Mon Apr 14 17:12:38 2003 UTC revision 2700 by dpinte, Mon Sep 18 14:27:02 2006 UTC
# Line 5  Line 5 
5  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
6  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
7    
8  """Classes for creating dockable windows"""  """Classes for creating dockable windows.
9    
10    The DockFrame is the main window that will be the parent for the
11    dockable windows.
12    
13    The DockPanel is a panel that all windows that wish to be dockable
14    should derive from.
15    """
16    
17  __version__ = "$Revision$"  __version__ = "$Revision$"
18    
# Line 13  import resource Line 20  import resource
20    
21  from Thuban import _  from Thuban import _
22    
23  from wxPython.wx import *  import wx
24    
25  from Thuban.Lib.connector import Publisher  from Thuban.Lib.connector import Publisher
26    
# Line 30  DOCK_BMP   = "dock_12" Line 37  DOCK_BMP   = "dock_12"
37  UNDOCK_BMP = "undock_12"  UNDOCK_BMP = "undock_12"
38  CLOSE_BMP  = "close_12"  CLOSE_BMP  = "close_12"
39    
40  class DockPanel(wxPanel):  class DockPanel(wx.Panel):
41        """A DockPanel is a panel that should be derived from to create panels
42        that can be docked in a DockFrame.
43        """
44    
45      def __init__(self, parent, id):      def __init__(self, parent, id):
46            """parent should be a DockableWindow created from
47            DockFrame.CreateDock().
48            """
49    
50          if not isinstance(parent, DockableWindow):          if not isinstance(parent, DockableWindow):
51              raise TypeError("")              raise TypeError("")
52    
53          wxPanel.__init__(self, parent.GetCurrentParent(), id)          wx.Panel.__init__(self, parent.GetCurrentParent(), id)
54    
55          self.parent = parent          self.parent = parent
56    
# Line 46  class DockPanel(wxPanel): Line 59  class DockPanel(wxPanel):
59    
60      def Create(self):      def Create(self):
61          self.parent.SetPanel(self)          self.parent.SetPanel(self)
62            
63      def SetDockParent(self, parent):      def SetDockParent(self, parent):
64          self.__dockParent = parent          self.__dockParent = parent
65    
# Line 54  class DockPanel(wxPanel): Line 67  class DockPanel(wxPanel):
67          return self.__dockParent          return self.__dockParent
68    
69      def SetDock(self, dock):      def SetDock(self, dock):
70            """Specifically set the docked state of the panel
71            to dock (True or False).
72            """
73          #if dock == self.IsDocked(): return          #if dock == self.IsDocked(): return
74    
75          if dock:          if dock:
# Line 62  class DockPanel(wxPanel): Line 78  class DockPanel(wxPanel):
78              self.UnDock()              self.UnDock()
79    
80      def Dock(self):      def Dock(self):
81            """Dock the panel in the DockFrame."""
82          self.GetDockParent().Dock()          self.GetDockParent().Dock()
83    
84      def UnDock(self):      def UnDock(self):
85            """Undock the panel in the DockFrame."""
86          self.GetDockParent().UnDock()          self.GetDockParent().UnDock()
87    
88      def IsDocked(self):      def IsDocked(self):
89            """Return True if the panel is docked."""
90          return self.GetDockParent().IsDocked()          return self.GetDockParent().IsDocked()
91    
92  class DockableWindow(Publisher):  class DockableWindow(Publisher):
# Line 75  class DockableWindow(Publisher): Line 94  class DockableWindow(Publisher):
94      def __getattr__(self, attr):      def __getattr__(self, attr):
95          return getattr(self.__topWindow, attr)          return getattr(self.__topWindow, attr)
96    
97      def __init__(self, parent, id, name, title, dockWindow, orient):      def __init__(self, parent, id, name, title, dockWindow, orient):
98          """Create the dockable window.          """Create the dockable window.
99    
100          Initially, the window is hidden, but in an undocked state.          Initially, the window is hidden, but in an undocked state.
# Line 90  class DockableWindow(Publisher): Line 109  class DockableWindow(Publisher):
109          self.__orientation = orient          self.__orientation = orient
110    
111          self.__dockWindow  = dockWindow          self.__dockWindow  = dockWindow
112          self.__floatWindow = wxFrame(parent, id, title)          self.__floatWindow = wx.Frame(parent, id, title)
113    
114          self.__docked      = False          self.__docked      = False
115          if self.__docked:          if self.__docked:
# Line 107  class DockableWindow(Publisher): Line 126  class DockableWindow(Publisher):
126          self.__dockWindow.Hide()          self.__dockWindow.Hide()
127          self.__floatWindow.Hide()          self.__floatWindow.Hide()
128    
129          EVT_CLOSE(self, self._OnClose)          self.Bind(wx.EVT_CLOSE, self._OnClose)
130    
131      ##      ##
132      # Public methods      # Public methods
# Line 129  class DockableWindow(Publisher): Line 148  class DockableWindow(Publisher):
148    
149      def GetPanel(self):      def GetPanel(self):
150          return self.__panel          return self.__panel
151            
152      def GetCurrentParent(self):      def GetCurrentParent(self):
153          return self.__topWindow          return self.__topWindow
154    
155      def SetDock(self, dock):      def SetDock(self, dock):
156    
157          self.__CheckAllGood()          self.__CheckAllGood()
158    
159          if dock:          if dock:
160              self.Dock()              self.Dock()
161          else:          else:
162              self.UnDock()              self.UnDock()
163    
164      def Dock(self):      def Dock(self):
165            """Dock the window."""
166          self.__CheckAllGood()          self.__CheckAllGood()
167    
168          wasVisible = self.IsShown()          wasVisible = self.IsShown()
# Line 167  class DockableWindow(Publisher): Line 187  class DockableWindow(Publisher):
187          self.__dockButton.SetBitmapFocus(self.__bmpUnDock)          self.__dockButton.SetBitmapFocus(self.__bmpUnDock)
188          self.__dockButton.SetBitmapSelected(self.__bmpUnDock)          self.__dockButton.SetBitmapSelected(self.__bmpUnDock)
189          self.__dockButton.SetBitmapDisabled(self.__bmpUnDock)          self.__dockButton.SetBitmapDisabled(self.__bmpUnDock)
190          self.__dockButton.SetToolTip(wxToolTip(_("Undock")))          self.__dockButton.SetToolTip(wx.ToolTip(_("Undock")))
191    
192          self.SetDockSize(self.__dockWindow.GetSize())          self.SetDockSize(self.__dockWindow.GetSize())
193    
# Line 176  class DockableWindow(Publisher): Line 196  class DockableWindow(Publisher):
196          self.issue(DOCKABLE_DOCKED, self.__id, self)          self.issue(DOCKABLE_DOCKED, self.__id, self)
197    
198      def UnDock(self):      def UnDock(self):
199            """Undock the window."""
200          self.__CheckAllGood()          self.__CheckAllGood()
201    
202          wasVisible = self.IsShown()          wasVisible = self.IsShown()
# Line 183  class DockableWindow(Publisher): Line 204  class DockableWindow(Publisher):
204          if wasVisible: self.Show(False)          if wasVisible: self.Show(False)
205    
206          self.__docked = False          self.__docked = False
207    
208          #          #
209          # reparent          # reparent
210          #          #
# Line 194  class DockableWindow(Publisher): Line 215  class DockableWindow(Publisher):
215          self.__dockButton.SetBitmapFocus(self.__bmpDock)          self.__dockButton.SetBitmapFocus(self.__bmpDock)
216          self.__dockButton.SetBitmapSelected(self.__bmpDock)          self.__dockButton.SetBitmapSelected(self.__bmpDock)
217          self.__dockButton.SetBitmapDisabled(self.__bmpDock)          self.__dockButton.SetBitmapDisabled(self.__bmpDock)
218          self.__dockButton.SetToolTip(wxToolTip(_("Dock")))          self.__dockButton.SetToolTip(wx.ToolTip(_("Dock")))
219    
220          if wasVisible: self.Show()          if wasVisible: self.Show()
221    
222          #          #
223          # restore window information          # restore window information
224          #          #
225          if self.__floatPosition is not None:          if self.__floatPosition is not None:
226              self.SetPosition(self.__floatPosition)              self.SetPosition(self.__floatPosition)
227          if self.__floatSize is not None:          if self.__floatSize is not None:
228              self.SetSize(self.__floatSize)              self.SetSize(self.__floatSize)
229    
230          self.__dockPanel.SetSize(self.__topWindow.GetClientSize())          self.__dockPanel.SetSize(self.__topWindow.GetClientSize())
# Line 215  class DockableWindow(Publisher): Line 236  class DockableWindow(Publisher):
236          return self.__docked          return self.__docked
237    
238      def Show(self, show = True):      def Show(self, show = True):
239            """Show or hide the window."""
240          if show:          if show:
241              self.__DoShow()              self.__DoShow()
242          else:          else:
243              self.__DoHide()              self.__DoHide()
244    
245      def SetDockSize(self, rect = None):      def SetDockSize(self, rect = None):
246            """Set the size of the dock window to rect."""
247    
248          w0, h0 = self.__dockPanel.GetBestSize()          w0, h0 = self.__dockPanel.GetBestSize()
249          w, h = self.__panel.GetBestSize()          w, h = self.__panel.GetBestSize()
# Line 237  class DockableWindow(Publisher): Line 260  class DockableWindow(Publisher):
260          else:          else:
261              rw = w              rw = w
262              rh = h              rh = h
263                                                                                          
264          # these are to account for the border?!!?          # these are to account for the border?!!?
265          rw += 8 # XXX: without this the sash isn't visible!?!?!?!          rw += 8 # XXX: without this the sash isn't visible!?!?!?!
266          rh += 8 # XXX: without this the sash isn't visible!?!?!?!          rh += 8 # XXX: without this the sash isn't visible!?!?!?!
267                                                                                          
268          self.__dockWindow.SetDefaultSize(wxSize(rw, rh))          self.__dockWindow.SetDefaultSize(wx.Size(rw, rh))
269    
270    
271      def Destroy(self):      def Destroy(self):
# Line 250  class DockableWindow(Publisher): Line 273  class DockableWindow(Publisher):
273          self.__floatWindow.Destroy()          self.__floatWindow.Destroy()
274          self.__dockWindow.Destroy()          self.__dockWindow.Destroy()
275          self.__parent.OnDockDestroy(self)          self.__parent.OnDockDestroy(self)
276            
277      ##      ##
278      # Event handlers      # Event handlers
279      #      #
# Line 282  class DockableWindow(Publisher): Line 305  class DockableWindow(Publisher):
305    
306          if self.__topWindow is self.__dockWindow:          if self.__topWindow is self.__dockWindow:
307              self.__parent._UpdateDocks()              self.__parent._UpdateDocks()
308                
309      def __DoHide(self):      def __DoHide(self):
310          if not self.IsShown(): return          if not self.IsShown(): return
311    
# Line 293  class DockableWindow(Publisher): Line 316  class DockableWindow(Publisher):
316    
317      def __CreateBorder(self):      def __CreateBorder(self):
318    
319          self.__dockPanel = wxPanel(self.__topWindow, -1, style=wxSUNKEN_BORDER)          self.__dockPanel = wx.Panel(self.__topWindow, -1, style=wx.SUNKEN_BORDER)
320    
321          self.__panel.Reparent(self.__dockPanel)          self.__panel.Reparent(self.__dockPanel)
322          self.__panel.SetId(PANEL_ID)          self.__panel.SetId(PANEL_ID)
323    
324          if self.__orientation == wxLAYOUT_VERTICAL:          if self.__orientation == wx.LAYOUT_VERTICAL:
325              sizer = wxBoxSizer(wxVERTICAL)              sizer = wx.BoxSizer(wx.VERTICAL)
326              headerBoxOrient = wxHORIZONTAL              headerBoxOrient = wx.HORIZONTAL
327          else:          else:
328              sizer = wxBoxSizer(wxHORIZONTAL)              sizer = wx.BoxSizer(wx.HORIZONTAL)
329              headerBoxOrient = wxVERTICAL              headerBoxOrient = wx.VERTICAL
           
330    
331          headerBox = wxStaticBoxSizer(  
332                          wxStaticBox(self.__dockPanel, -1, ""), headerBoxOrient)          headerBox = wx.StaticBoxSizer(
333                            wx.StaticBox(self.__dockPanel, -1, ""), headerBoxOrient)
334    
335          #          #
336          # ideally, we should be able to rotate this text depending on          # ideally, we should be able to rotate this text depending on
337          # our orientation          # our orientation
338          #          #
339          text = wxStaticText(self.__dockPanel, -1, self.GetTitle(),          text = wx.StaticText(self.__dockPanel, -1, self.GetTitle(),
340                               style = wxALIGN_CENTRE)                               style = wx.ALIGN_CENTRE)
341          font = text.GetFont()          font = text.GetFont()
342          font.SetPointSize(10)          font.SetPointSize(10)
343          text.SetFont(font)          text.SetFont(font)
# Line 324  class DockableWindow(Publisher): Line 347  class DockableWindow(Publisher):
347          # and create the buttons          # and create the buttons
348          #          #
349          self.__bmpDock   = \          self.__bmpDock   = \
350              resource.GetBitmapResource(DOCK_BMP, wxBITMAP_TYPE_XPM)              resource.GetBitmapResource(DOCK_BMP, wx.BITMAP_TYPE_XPM)
351          self.__bmpUnDock = \          self.__bmpUnDock = \
352              resource.GetBitmapResource(UNDOCK_BMP, wxBITMAP_TYPE_XPM)              resource.GetBitmapResource(UNDOCK_BMP, wx.BITMAP_TYPE_XPM)
353    
354          if self.__docked:          if self.__docked:
355              bmp = self.__bmpDock              bmp = self.__bmpDock
356          else:          else:
357              bmp = self.__bmpUnDock              bmp = self.__bmpUnDock
358    
359          self.__dockButton = wxBitmapButton(          self.__dockButton = wx.BitmapButton(
360              self.__dockPanel, ID_BUTTON_DOCK,              self.__dockPanel, ID_BUTTON_DOCK,
361              bmp,              bmp,
362              size = wxSize(bmp.GetWidth() + 4, bmp.GetHeight() + 4),              size = wx.Size(bmp.GetWidth() + 4, bmp.GetHeight() + 4),
363              style = wxBU_EXACTFIT | wxADJUST_MINSIZE)              style = wx.BU_EXACTFIT | wx.ADJUST_MINSIZE)
364    
365          bmp = resource.GetBitmapResource(CLOSE_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(CLOSE_BMP, wx.BITMAP_TYPE_XPM)
366    
367          closeX = wxBitmapButton(self.__dockPanel, ID_BUTTON_CLOSE, bmp,          closeX = wx.BitmapButton(self.__dockPanel, ID_BUTTON_CLOSE, bmp,
368                            size = wxSize(bmp.GetWidth() + 4,                            size = wx.Size(bmp.GetWidth() + 4,
369                                          bmp.GetHeight() + 4),                                          bmp.GetHeight() + 4),
370                            style = wxBU_EXACTFIT | wxADJUST_MINSIZE)                            style = wx.BU_EXACTFIT | wx.ADJUST_MINSIZE)
371          closeX.SetToolTip(wxToolTip(_("Close")))          closeX.SetToolTip(wx.ToolTip(_("Close")))
372    
373          #          #
374          # fill in the sizer in an order appropriate to the orientation          # fill in the sizer in an order appropriate to the orientation
375          #          #
376          if self.__orientation == wxLAYOUT_VERTICAL:          if self.__orientation == wx.LAYOUT_VERTICAL:
377              headerBox.Add(text, 0, wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL, 0)              headerBox.Add(text, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTRE_VERTICAL, 0)
378              headerBox.Add(1, 5, 1, wxGROW)              headerBox.Add((1, 5), 1, wx.GROW)
379              headerBox.Add(self.__dockButton, 0, wxALIGN_RIGHT, 0)              headerBox.Add(self.__dockButton, 0, wx.ALIGN_RIGHT, 0)
380              headerBox.Add(closeX, 0, wxALIGN_RIGHT | wxLEFT, 4)              headerBox.Add(closeX, 0, wx.ALIGN_RIGHT | wx.LEFT, 4)
381          else:          else:
382              headerBox.Add(closeX, 0, wxALIGN_RIGHT | wxBOTTOM, 4)              headerBox.Add(closeX, 0, wx.ALIGN_RIGHT | wx.BOTTOM, 4)
383              headerBox.Add(self.__dockButton, 0, wxALIGN_RIGHT, 0)              headerBox.Add(self.__dockButton, 0, wx.ALIGN_RIGHT, 0)
384              headerBox.Add(text, 0, wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL, 0)              headerBox.Add(text, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTRE_VERTICAL, 0)
385    
386          sizer.Add(headerBox, 0, wxGROW, 0)          sizer.Add(headerBox, 0, wx.GROW, 0)
387          sizer.Add(self.__panel, 1, wxGROW, 0)          sizer.Add(self.__panel, 1, wx.GROW, 0)
388    
389    
390          self.__dockPanel.SetAutoLayout(True)          self.__dockPanel.SetAutoLayout(True)
# Line 369  class DockableWindow(Publisher): Line 392  class DockableWindow(Publisher):
392          sizer.SetSizeHints(self.__dockPanel)          sizer.SetSizeHints(self.__dockPanel)
393          sizer.SetSizeHints(self.__floatWindow)          sizer.SetSizeHints(self.__floatWindow)
394    
395          EVT_BUTTON(self.__dockPanel, ID_BUTTON_DOCK, self._OnToggleDock)          self.Bind(wx.EVT_BUTTON, self._OnToggleDock, self.__dockPanel, id=ID_BUTTON_DOCK)
396          EVT_BUTTON(self.__dockPanel, ID_BUTTON_CLOSE, self._OnButtonClose)          self.Bind(wx.EVT_BUTTON, self._OnButtonClose, self.__dockPanel, id=ID_BUTTON_CLOSE)
397    
398    
399  class DockFrame(wxFrame):  class DockFrame(wx.Frame):
400        """A DockFrame is a frame that will contain dockable panels."""
401    
402      def __init__(self, parent, id, title, position, size):      def __init__(self, parent, id, title, position, size):
403          wxFrame.__init__(self, parent, id, title, position, size)          wx.Frame.__init__(self, parent, id, title, position, size)
404    
405          self.openWindows = {}          self.openWindows = {}
406    
# Line 385  class DockFrame(wxFrame): Line 409  class DockFrame(wxFrame):
409          self.SetMainWindow(None)          self.SetMainWindow(None)
410    
411    
412          EVT_SIZE(self, self._OnSashSize)          self.Bind(wx.EVT_SIZE, self._OnSashSize)
413          EVT_CLOSE(self, self._OnClose)          self.Bind(wx.EVT_CLOSE, self.OnClose)
414    
415      layout2oppSash = {      layout2oppSash = {
416              wxLAYOUT_NONE   : wxSASH_NONE,              wx.LAYOUT_NONE   : wx.SASH_NONE,
417              wxLAYOUT_TOP    : wxSASH_BOTTOM,              wx.LAYOUT_TOP    : wx.SASH_BOTTOM,
418              wxLAYOUT_LEFT   : wxSASH_RIGHT,              wx.LAYOUT_LEFT   : wx.SASH_RIGHT,
419              wxLAYOUT_RIGHT  : wxSASH_LEFT,              wx.LAYOUT_RIGHT  : wx.SASH_LEFT,
420              wxLAYOUT_BOTTOM : wxSASH_TOP }              wx.LAYOUT_BOTTOM : wx.SASH_TOP }
421    
422    
423      def _OnClose(self, event):      def OnClose(self, event):
424    
425          self.__update_lock += 1          self.__update_lock += 1
426    
# Line 415  class DockFrame(wxFrame): Line 439  class DockFrame(wxFrame):
439          # since we're going away          # since we're going away
440    
441      def CreateDock(self, name, id, title, align):      def CreateDock(self, name, id, title, align):
442            """Create a new dock. align specifies where the dock will
443            be placed. It can be one of wxLAYOUT_NONE, wxLAYOUT_LEFT,
444            wxLAYOUT_RIGHT.
445            """
446    
447          if align in (wxLAYOUT_NONE, wxLAYOUT_LEFT, wxLAYOUT_RIGHT):          if align in (wx.LAYOUT_NONE, wx.LAYOUT_LEFT, wx.LAYOUT_RIGHT):
448              orient = wxLAYOUT_VERTICAL              orient = wx.LAYOUT_VERTICAL
449          else:          else:
450              orient = wxLAYOUT_HORIZONTAL              orient = wx.LAYOUT_HORIZONTAL
451    
452          sash = wxSashLayoutWindow(self, id, style=wxNO_BORDER|wxSW_3D)          sash = wx.SashLayoutWindow(self, id, style=wx.NO_BORDER|wx.SW_3D)
453          sash.SetOrientation(orient)          sash.SetOrientation(orient)
454          sash.SetAlignment(align)          sash.SetAlignment(align)
455          sash.SetSashVisible(DockFrame.layout2oppSash[align], True)          sash.SetSashVisible(DockFrame.layout2oppSash[align], True)
# Line 430  class DockFrame(wxFrame): Line 458  class DockFrame(wxFrame):
458          win = DockableWindow(self, id, name, title, sash, orient)          win = DockableWindow(self, id, name, title, sash, orient)
459    
460          self.__RegisterDock(name, win)          self.__RegisterDock(name, win)
461          EVT_SASH_DRAGGED(self, id, self._OnSashDragged)          self.Bind(wx.EVT_SASH_DRAGGED, self._OnSashDragged, id=id)
462    
463          return win          return win
464    
465      def FindRegisteredDock(self, name):      def FindRegisteredDock(self, name):
466            """Return a reference to a dock that has name."""
467          return self.openWindows.get(name)          return self.openWindows.get(name)
468    
469      def OnDockDestroy(self, win):      def OnDockDestroy(self, win):
# Line 444  class DockFrame(wxFrame): Line 473  class DockFrame(wxFrame):
473      def SetMainWindow(self, main):      def SetMainWindow(self, main):
474          self.__mainWindow = main          self.__mainWindow = main
475          self._UpdateDocks()          self._UpdateDocks()
476            
477      def _UpdateDocks(self):      def _UpdateDocks(self):
478          if self.__update_lock == 0:          if self.__update_lock == 0:
479              wxLayoutAlgorithm().LayoutWindow(self, self.__mainWindow)              wx.LayoutAlgorithm().LayoutWindow(self, self.__mainWindow)
480    
481      def _OnSashDragged(self, event):      def _OnSashDragged(self, event):
482          if event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE:          if event.GetDragStatus() == wx.SASH_STATUS_OUT_OF_RANGE:
483              return              return
484    
485          id = event.GetId()          id = event.GetId()

Legend:
Removed from v.667  
changed lines
  Added in v.2700

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26