+#----------------------------------------------------------------------------
+# Name: floatbar.py
+# Purpose: Contains floating toolbar class
+#
+# Author: Bryn Keller
+#
+# Created: 10/4/99
+#----------------------------------------------------------------------------
+# 12/02/2003 - Jeff Grimmett (grimmtooth@softhome.net)
+#
+# o 2.5 Compatability changes
+#
+# 12/07/2003 - Jeff Grimmett (grimmtooth@softhome.net)
+#
+# o Added deprecation warning.
+#
+
+"""
+NOTE: This module is *not* supported in any way. Use it however you
+ wish, but be warned that dealing with any consequences is
+ entirly up to you.
+ --Robin
+"""
+
+import warnings
+import wx
+
+warningmsg = r"""\
+
+################################################\
+# This module is not supported in any way! |
+# |
+# See cource code for wx.lib.floatbar for more |
+# information. |
+################################################/
+
+"""
+
+warnings.warn(warningmsg, DeprecationWarning, stacklevel=2)
+
+if wx.Platform == '__WXGTK__':
+ #
+ # For wxGTK all we have to do is set the wxTB_DOCKABLE flag
+ #
+ class wxFloatBar(wx.ToolBar):
+ def __init__(self, parent, ID,
+ pos = wx.DefaultPosition,
+ size = wx.DefaultSize,
+ style = 0,
+ name = 'toolbar'):
+ wx.ToolBar.__init__(self, parent, ID, pos, size,
+ style|wx.TB_DOCKABLE, name)
+
+ # these other methods just become no-ops
+ def SetFloatable(self, float):
+ pass
+
+ def IsFloating(self):
+ return 1
+
+ def GetTitle(self):
+ return ""
+
+
+ def SetTitle(self, title):
+ pass
+
+else:
+ _DOCKTHRESHOLD = 25
+
+ class wxFloatBar(wx.ToolBar):
+ """
+ wxToolBar subclass which can be dragged off its frame and later
+ replaced there. Drag on the toolbar to release it, close it like
+ a normal window to make it return to its original
+ position. Programmatically, call SetFloatable(True) and then
+ Float(True) to float, Float(False) to dock.
+ """
+
+ def __init__(self,*_args,**_kwargs):
+ """
+ In addition to the usual arguments, wxFloatBar accepts keyword
+ args of: title(string): the title that should appear on the
+ toolbar's frame when it is floating. floatable(bool): whether
+ user actions (i.e., dragging) can float the toolbar or not.
+ """
+ args = (self,) + _args
+ apply(wx.ToolBar.__init__, args, _kwargs)
+ if _kwargs.has_key('floatable'):
+ self.floatable = _kwargs['floatable']
+ assert type(self.floatable) == type(0)
+ else:
+ self.floatable = 0
+ self.floating = 0
+ if _kwargs.has_key('title'):
+ self.title = _kwargs['title']
+ assert type(self.title) == type("")
+ else:
+ self.title = ""
+ self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
+ self.parentframe = args[1]
+
+
+ def IsFloatable(self):
+ return self.floatable
+
+
+ def SetFloatable(self, float):
+ self.floatable = float
+ #Find the size of a title bar.
+ if not hasattr(self, 'titleheight'):
+ test = wx.MiniFrame(None, -1, "TEST")
+ test.SetClientSize((0,0))
+ self.titleheight = test.GetSize()[1]
+ test.Destroy()
+
+
+ def IsFloating(self):
+ return self.floating
+
+
+ def Realize(self):
+ wx.ToolBar.Realize(self)
+
+
+ def GetTitle(self):
+ return self.title
+
+
+ def SetTitle(self, title):
+ print 'SetTitle', title
+ self.title = title
+ if self.IsFloating():
+ self.floatframe.SetTitle(self.title)
+
+
+ ## def GetHome(self):
+ ## """
+ ## Returns the frame which this toolbar will return to when
+ ## docked, or the parent if currently docked.
+ ## """
+ ## if hasattr(self, 'parentframe'):
+ ## return self.parentframe
+ ## else:
+ ## return (self.GetParent())
+
+
+ ## def SetHome(self, frame):
+ ## """
+ ## Called when docked, this will remove the toolbar from its
+ ## current frame and attach it to another. If called when
+ ## floating, it will dock to the frame specified when the toolbar
+ ## window is closed.
+ ## """
+ ## if self.IsFloating():
+ ## self.parentframe = frame
+ ## self.floatframe.Reparent(frame)
+ ## else:
+ ## parent = self.GetParent()
+ ## self.Reparent(frame)
+ ## parent.SetToolBar(None)
+ ## size = parent.GetSize()
+ ## parent.SetSize(wxSize(0,0))
+ ## parent.SetSize(size)
+ ## frame.SetToolBar(self)
+ ## size = frame.GetSize()
+ ## frame.SetSize(wxSize(0,0))
+ ## frame.SetSize(size)
+
+
+ def Float(self, bool):
+ "Floats or docks the toolbar programmatically."
+ if bool:
+ self.parentframe = self.GetParent()
+ print self.title
+ if self.title:
+ useStyle = wx.DEFAULT_FRAME_STYLE
+ else:
+ useStyle = wx.THICK_FRAME
+ self.floatframe = wx.MiniFrame(self.parentframe, -1, self.title,
+ style = useStyle)
+
+ self.Reparent(self.floatframe)
+ self.parentframe.SetToolBar(None)
+ self.floating = 1
+ psize = self.parentframe.GetSize()
+ self.parentframe.SetSize((0,0))
+ self.parentframe.SetSize(psize)
+ self.floatframe.SetToolBar(self)
+ self.oldcolor = self.GetBackgroundColour()
+
+ w = psize[0]
+ h = self.GetSize()[1]
+ if self.title:
+ h = h + self.titleheight
+ self.floatframe.SetSize((w,h))
+ self.floatframe.SetClientSize(self.GetSize())
+ newpos = self.parentframe.GetPosition()
+ newpos.y = newpos.y + _DOCKTHRESHOLD * 2
+ self.floatframe.SetPosition(newpos)
+ self.floatframe.Show(True)
+
+ self.floatframe.Bind(wx.EVT_CLOSE, self.OnDock)
+ #self.floatframe.Bind(wx.EVT_MOVE, self.OnMove)
+
+ else:
+ self.Reparent(self.parentframe)
+ self.parentframe.SetToolBar(self)
+ self.floating = 0
+ self.floatframe.SetToolBar(None)
+ self.floatframe.Destroy()
+ size = self.parentframe.GetSize()
+ self.parentframe.SetSize((0,0))
+ self.parentframe.SetSize(size)
+ self.SetBackgroundColour(self.oldcolor)
+
+
+ def OnDock(self, e):
+ self.Float(0)
+ if hasattr(self, 'oldpos'):
+ del self.oldpos
+
+
+ def OnMove(self, e):
+ homepos = self.parentframe.ClientToScreen((0,0))
+ floatpos = self.floatframe.GetPosition()
+ if (abs(homepos.x - floatpos.x) < _DOCKTHRESHOLD and
+ abs(homepos.y - floatpos.y) < _DOCKTHRESHOLD):
+ self.Float(0)
+ #homepos = self.parentframe.GetPositionTuple()
+ #homepos = homepos[0], homepos[1] + self.titleheight
+ #floatpos = self.floatframe.GetPositionTuple()
+ #if abs(homepos[0] - floatpos[0]) < 35 and abs(homepos[1] - floatpos[1]) < 35:
+ # self._SetFauxBarVisible(True)
+ #else:
+ # self._SetFauxBarVisible(False)
+
+
+ def OnMouse(self, e):
+ if not self.IsFloatable():
+ e.Skip()
+ return
+
+ if e.ButtonDClick(1) or e.ButtonDClick(2) or e.ButtonDClick(3) or e.ButtonDown() or e.ButtonUp():
+ e.Skip()
+
+ if e.ButtonDown():
+ self.CaptureMouse()
+ self.oldpos = (e.GetX(), e.GetY())
+
+ if e.Entering():
+ self.oldpos = (e.GetX(), e.GetY())
+
+ if e.ButtonUp():
+ self.ReleaseMouse()
+ if self.IsFloating():
+ homepos = self.parentframe.ClientToScreen((0,0))
+ floatpos = self.floatframe.GetPosition()
+ if (abs(homepos.x - floatpos.x) < _DOCKTHRESHOLD and
+ abs(homepos.y - floatpos.y) < _DOCKTHRESHOLD):
+ self.Float(0)
+ return
+
+ if e.Dragging():
+ if not self.IsFloating():
+ self.Float(True)
+ self.oldpos = (e.GetX(), e.GetY())
+ else:
+ if hasattr(self, 'oldpos'):
+ loc = self.floatframe.GetPosition()
+ pt = (loc.x - (self.oldpos[0]-e.GetX()), loc.y - (self.oldpos[1]-e.GetY()))
+ self.floatframe.Move(pt)
+
+
+
+ def _SetFauxBarVisible(self, vis):
+ return
+ if vis:
+ if self.parentframe.GetToolBar() == None:
+ if not hasattr(self, 'nullbar'):
+ self.nullbar = wx.ToolBar(self.parentframe, -1)
+ print "Adding fauxbar."
+ self.nullbar.Reparent(self.parentframe)
+ print "Reparented."
+ self.parentframe.SetToolBar(self.nullbar)
+ print "Set toolbar"
+ col = wx.NamedColour("GREY")
+ self.nullbar.SetBackgroundColour(col)
+ print "Set color"
+ size = self.parentframe.GetSize()
+ self.parentframe.SetSize((0,0))
+ self.parentframe.SetSize(size)
+ print "Set size"
+ else:
+ print self.parentframe.GetToolBar()
+ else:
+ if self.parentframe.GetToolBar() != None:
+ print "Removing fauxbar"
+ self.nullbar.Reparent(self.floatframe)
+ self.parentframe.SetToolBar(None)
+ size = self.parentframe.GetSize()
+ self.parentframe.SetSize((0,0))
+ self.parentframe.SetSize(size)
+