summaryrefslogtreecommitdiffstats
path: root/Mac/Tools/IDE/Wwindows.py
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Tools/IDE/Wwindows.py')
-rw-r--r--Mac/Tools/IDE/Wwindows.py1202
1 files changed, 601 insertions, 601 deletions
diff --git a/Mac/Tools/IDE/Wwindows.py b/Mac/Tools/IDE/Wwindows.py
index d646bcf..cb8d855 100644
--- a/Mac/Tools/IDE/Wwindows.py
+++ b/Mac/Tools/IDE/Wwindows.py
@@ -8,629 +8,629 @@ import traceback
from types import InstanceType, StringType
if hasattr(Win, "FrontNonFloatingWindow"):
- MyFrontWindow = Win.FrontNonFloatingWindow
+ MyFrontWindow = Win.FrontNonFloatingWindow
else:
- MyFrontWindow = Win.FrontWindow
+ MyFrontWindow = Win.FrontWindow
class Window(FrameWork.Window, Wbase.SelectableWidget):
-
- windowkind = Windows.documentProc
-
- def __init__(self, possize, title="", minsize=None, maxsize=None,
- tabbable=1, show=1, fontsettings=None):
- import W
- if fontsettings is None:
- fontsettings = W.getdefaultfont()
- self._fontsettings = fontsettings
- W.SelectableWidget.__init__(self, possize)
- self._globalbounds = l, t, r, b = self.getwindowbounds(possize, minsize)
- self._bounds = (0, 0, r - l, b - t)
- self._tabchain = []
- self._currentwidget = None
- self.title = title
- self._parentwindow = self
- self._tabbable = tabbable
- self._defaultbutton = None
- self._drawwidgetbounds = 0
- self._show = show
- self._lastrollover = None
- self.hasclosebox = 1
- # XXX the following is not really compatible with the
- # new (system >= 7.5) window procs.
- if minsize:
- self._hasgrowbox = 1
- self.windowkind = self.windowkind | 8
- l, t = minsize
- if maxsize:
- r, b = maxsize[0] + 1, maxsize[1] + 1
- else:
- r, b = 32000, 32000
- self.growlimit = (l, t, r, b)
- else:
- self._hasgrowbox = 0
- if (self.windowkind == 0 or self.windowkind >= 8) and self.windowkind < 1000:
- self.windowkind = self.windowkind | 4
- FrameWork.Window.__init__(self, W.getapplication())
-
- def gettitle(self):
- return self.title
-
- def settitle(self, title):
- self.title = title
- if self.wid:
- self.wid.SetWTitle(title)
-
- def getwindowbounds(self, size, minsize = None):
- return windowbounds(size, minsize)
-
- def getcurrentwidget(self):
- return self._currentwidget
-
- def show(self, onoff):
- if onoff:
- self.wid.ShowWindow()
- else:
- self.wid.HideWindow()
-
- def isvisible(self):
- return self.wid.IsWindowVisible()
-
- def select(self):
- self.wid.SelectWindow()
- # not sure if this is the best place, I need it when
- # an editor gets selected, and immediately scrolled
- # to a certain line, waste scroll assumes everything
- # to be in tact.
- self.do_rawupdate(self.wid, "DummyEvent")
-
- def open(self):
- self.wid = Win.NewCWindow(self._globalbounds, self.title, self._show,
- self.windowkind, -1, self.hasclosebox, 0)
- self.SetPort()
- fontname, fontstyle, fontsize, fontcolor = self._fontsettings
- fnum = Fm.GetFNum(fontname)
- if fnum == 0:
- fnum = Fm.GetFNum("Geneva")
- Qd.TextFont(fnum)
- Qd.TextFace(fontstyle)
- Qd.TextSize(fontsize)
- if self._bindings.has_key("<open>"):
- callback = self._bindings["<open>"]
- callback()
- for w in self._widgets:
- w.forall_frombottom("open")
- self._maketabchain()
- if self._tabbable:
- self.bind('tab', self.nextwidget)
- self.bind('shifttab', self.previouswidget)
- else:
- self._hasselframes = 0
- if self._tabchain:
- self._tabchain[0].select(1)
- self.do_postopen()
-
- def close(self):
- if not self.wid:
- return # we are already closed
- if self._bindings.has_key("<close>"):
- callback = self._bindings["<close>"]
- try:
- rv = callback()
- except:
- print 'error in <close> callback'
- traceback.print_exc()
- else:
- if rv:
- return rv
- #for key in self._widgetsdict.keys():
- # self._removewidget(key)
- self.forall_butself("close")
- Wbase.SelectableWidget.close(self)
- self._tabchain = []
- self._currentwidget = None
- self.wid.HideWindow()
- self.do_postclose()
-
- def domenu_close(self, *args):
- self.close()
-
- def getbounds(self):
- return self._globalbounds
-
- def setbounds(self, bounds):
- l, t, r, b = bounds
- self.move(l, t)
- self.resize(r-l, b-t)
-
- def move(self, x, y = None):
- """absolute move"""
- if y == None:
- x, y = x
- self.wid.MoveWindow(x, y, 0)
-
- def resize(self, x, y = None):
- if not self._hasgrowbox:
- return # hands off!
- if y == None:
- x, y = x
- self.SetPort()
- self.GetWindow().InvalWindowRect(self.getgrowrect())
- self.wid.SizeWindow(x, y, 1)
- self._calcbounds()
-
- def test(self, point):
- return 1
-
- def draw(self, visRgn = None):
- if self._hasgrowbox:
- self.tempcliprect(self.getgrowrect())
- self.wid.DrawGrowIcon()
- self.restoreclip()
-
- def idle(self, *args):
- self.SetPort()
- point = Evt.GetMouse()
- widget = self.findwidget(point, 0)
- if self._bindings.has_key("<idle>"):
- callback = self._bindings["<idle>"]
- if callback():
- return
- if self._currentwidget is not None and hasattr(self._currentwidget, "idle"):
- if self._currentwidget._bindings.has_key("<idle>"):
- callback = self._currentwidget._bindings["<idle>"]
- if callback():
- return
- if self._currentwidget.idle():
- return
- if widget is not None and hasattr(widget, "rollover"):
- if 1: #self._lastrollover <> widget:
- if self._lastrollover:
- self._lastrollover.rollover(point, 0)
- self._lastrollover = widget
- self._lastrollover.rollover(point, 1)
- else:
- if self._lastrollover:
- self._lastrollover.rollover(point, 0)
- self._lastrollover = None
- Wbase.SetCursor("arrow")
-
- def xxx___select(self, widget):
- if self._currentwidget == widget:
- return
- if self._bindings.has_key("<select>"):
- callback = self._bindings["<select>"]
- if callback(widget):
- return
- if widget is None:
- if self._currentwidget is not None:
- self._currentwidget.select(0)
- elif type(widget) == InstanceType and widget._selectable:
- widget.select(1)
- elif widget == -1 or widget == 1:
- if len(self._tabchain) <= 1:
- return
- temp = self._tabchain[(self._tabchain.index(self._currentwidget) + widget) % len(self._tabchain)]
- temp.select(1)
- else:
- raise TypeError, "Widget is not selectable"
-
- def setdefaultbutton(self, newdefaultbutton = None, *keys):
- if newdefaultbutton == self._defaultbutton:
- return
- if self._defaultbutton:
- self._defaultbutton._setdefault(0)
- if not newdefaultbutton:
- self.bind("return", None)
- self.bind("enter", None)
- return
- import Wcontrols
- if not isinstance(newdefaultbutton, Wcontrols.Button):
- raise TypeError, "widget is not a button"
- self._defaultbutton = newdefaultbutton
- self._defaultbutton._setdefault(1)
- if not keys:
- self.bind("return", self._defaultbutton.push)
- self.bind("enter", self._defaultbutton.push)
- else:
- for key in keys:
- self.bind(key, self._defaultbutton.push)
-
- def nextwidget(self):
- self.xxx___select(1)
-
- def previouswidget(self):
- self.xxx___select(-1)
-
- def drawwidgetbounds(self, onoff):
- self._drawwidgetbounds = onoff
- self.SetPort()
- self.GetWindow().InvalWindowRect(self._bounds)
-
- def _drawbounds(self):
- pass
-
- def _maketabchain(self):
- # XXX This has to change, it's no good when we are adding or deleting widgets.
- # XXX Perhaps we shouldn't keep a "tabchain" at all.
- self._hasselframes = 0
- self._collectselectablewidgets(self._widgets)
- if self._hasselframes and len(self._tabchain) > 1:
- self._hasselframes = 1
- else:
- self._hasselframes = 0
-
- def _collectselectablewidgets(self, widgets):
- import W
- for w in widgets:
- if w._selectable:
- self._tabchain.append(w)
- if isinstance(w, W.List):
- self._hasselframes = 1
- self._collectselectablewidgets(w._widgets)
-
- def _calcbounds(self):
- self._possize = self.wid.GetWindowPort().GetPortBounds()[2:]
- w, h = self._possize
- self._bounds = (0, 0, w, h)
- self.wid.GetWindowContentRgn(scratchRegion)
- l, t, r, b = GetRgnBounds(scratchRegion)
- self._globalbounds = l, t, l + w, t + h
- for w in self._widgets:
- w._calcbounds()
-
- # FrameWork override methods
- def do_inDrag(self, partcode, window, event):
- where = event[3]
- self.wid.GetWindowContentRgn(scratchRegion)
- was_l, was_t, r, b = GetRgnBounds(scratchRegion)
- window.DragWindow(where, self.draglimit)
- self.wid.GetWindowContentRgn(scratchRegion)
- is_l, is_t, r, b = GetRgnBounds(scratchRegion)
- self._globalbounds = Qd.OffsetRect(self._globalbounds,
- is_l - was_l, is_t - was_t)
-
- def do_char(self, char, event):
- import Wkeys
- (what, message, when, where, modifiers) = event
- key = char
- if Wkeys.keynames.has_key(key):
- key = Wkeys.keynames[key]
- if modifiers & Events.shiftKey:
- key = 'shift' + key
- if modifiers & Events.cmdKey:
- key = 'cmd' + key
- if modifiers & Events.controlKey:
- key = 'control' + key
- if self._bindings.has_key("<key>"):
- callback = self._bindings["<key>"]
- if Wbase.CallbackCall(callback, 0, char, event):
- return
- if self._bindings.has_key(key):
- callback = self._bindings[key]
- Wbase.CallbackCall(callback, 0, char, event)
- elif self._currentwidget is not None:
- if self._currentwidget._bindings.has_key(key):
- callback = self._currentwidget._bindings[key]
- Wbase.CallbackCall(callback, 0, char, event)
- else:
- if self._currentwidget._bindings.has_key("<key>"):
- callback = self._currentwidget._bindings["<key>"]
- if Wbase.CallbackCall(callback, 0, char, event):
- return
- self._currentwidget.key(char, event)
-
- def do_contentclick(self, point, modifiers, event):
- widget = self.findwidget(point)
- if widget is not None:
- if self._bindings.has_key("<click>"):
- callback = self._bindings["<click>"]
- if Wbase.CallbackCall(callback, 0, point, modifiers):
- return
- if widget._bindings.has_key("<click>"):
- callback = widget._bindings["<click>"]
- if Wbase.CallbackCall(callback, 0, point, modifiers):
- return
- if widget._selectable:
- widget.select(1, 1)
- widget.click(point, modifiers)
-
- def do_update(self, window, event):
- Qd.EraseRgn(window.GetWindowPort().visRgn)
- self.forall_frombottom("draw", window.GetWindowPort().visRgn)
- if self._drawwidgetbounds:
- self.forall_frombottom("_drawbounds")
-
- def do_activate(self, onoff, event):
- if not onoff:
- if self._lastrollover:
- self._lastrollover.rollover((0, 0), 0)
- self._lastrollover = None
- self.SetPort()
- self.forall("activate", onoff)
- self.draw()
-
- def do_postresize(self, width, height, window):
- self.GetWindow().InvalWindowRect(self.getgrowrect())
- self._calcbounds()
-
- def do_inGoAway(self, partcode, window, event):
- where = event[3]
- closeall = event[4] & Events.optionKey
- if window.TrackGoAway(where):
- if not closeall:
- self.close()
- else:
- for window in self.parent._windows.values():
- rv = window.close()
- if rv and rv > 0:
- return
-
- # utilities
- def tempcliprect(self, tempcliprect):
- tempclip = Qd.NewRgn()
- Qd.RectRgn(tempclip, tempcliprect)
- self.tempclip(tempclip)
- Qd.DisposeRgn(tempclip)
-
- def tempclip(self, tempclip):
- if not hasattr(self, "saveclip"):
- self.saveclip = []
- saveclip = Qd.NewRgn()
- Qd.GetClip(saveclip)
- self.saveclip.append(saveclip)
- Qd.SetClip(tempclip)
-
- def restoreclip(self):
- Qd.SetClip(self.saveclip[-1])
- Qd.DisposeRgn(self.saveclip[-1])
- del self.saveclip[-1]
-
- def getgrowrect(self):
- l, t, r, b = self.wid.GetWindowPort().GetPortBounds()
- return (r - 15, b - 15, r, b)
-
- def has_key(self, key):
- return self._widgetsdict.has_key(key)
-
- def __getattr__(self, attr):
- global _successcount, _failcount, _magiccount
- if self._widgetsdict.has_key(attr):
- _successcount = _successcount + 1
- return self._widgetsdict[attr]
- if self._currentwidget is None or (attr[:7] <> 'domenu_' and
- attr[:4] <> 'can_' and attr <> 'insert'):
- _failcount = _failcount + 1
- raise AttributeError, attr
- # special case: if a domenu_xxx, can_xxx or insert method is asked for,
- # see if the active widget supports it
- _magiccount = _magiccount + 1
- return getattr(self._currentwidget, attr)
+
+ windowkind = Windows.documentProc
+
+ def __init__(self, possize, title="", minsize=None, maxsize=None,
+ tabbable=1, show=1, fontsettings=None):
+ import W
+ if fontsettings is None:
+ fontsettings = W.getdefaultfont()
+ self._fontsettings = fontsettings
+ W.SelectableWidget.__init__(self, possize)
+ self._globalbounds = l, t, r, b = self.getwindowbounds(possize, minsize)
+ self._bounds = (0, 0, r - l, b - t)
+ self._tabchain = []
+ self._currentwidget = None
+ self.title = title
+ self._parentwindow = self
+ self._tabbable = tabbable
+ self._defaultbutton = None
+ self._drawwidgetbounds = 0
+ self._show = show
+ self._lastrollover = None
+ self.hasclosebox = 1
+ # XXX the following is not really compatible with the
+ # new (system >= 7.5) window procs.
+ if minsize:
+ self._hasgrowbox = 1
+ self.windowkind = self.windowkind | 8
+ l, t = minsize
+ if maxsize:
+ r, b = maxsize[0] + 1, maxsize[1] + 1
+ else:
+ r, b = 32000, 32000
+ self.growlimit = (l, t, r, b)
+ else:
+ self._hasgrowbox = 0
+ if (self.windowkind == 0 or self.windowkind >= 8) and self.windowkind < 1000:
+ self.windowkind = self.windowkind | 4
+ FrameWork.Window.__init__(self, W.getapplication())
+
+ def gettitle(self):
+ return self.title
+
+ def settitle(self, title):
+ self.title = title
+ if self.wid:
+ self.wid.SetWTitle(title)
+
+ def getwindowbounds(self, size, minsize = None):
+ return windowbounds(size, minsize)
+
+ def getcurrentwidget(self):
+ return self._currentwidget
+
+ def show(self, onoff):
+ if onoff:
+ self.wid.ShowWindow()
+ else:
+ self.wid.HideWindow()
+
+ def isvisible(self):
+ return self.wid.IsWindowVisible()
+
+ def select(self):
+ self.wid.SelectWindow()
+ # not sure if this is the best place, I need it when
+ # an editor gets selected, and immediately scrolled
+ # to a certain line, waste scroll assumes everything
+ # to be in tact.
+ self.do_rawupdate(self.wid, "DummyEvent")
+
+ def open(self):
+ self.wid = Win.NewCWindow(self._globalbounds, self.title, self._show,
+ self.windowkind, -1, self.hasclosebox, 0)
+ self.SetPort()
+ fontname, fontstyle, fontsize, fontcolor = self._fontsettings
+ fnum = Fm.GetFNum(fontname)
+ if fnum == 0:
+ fnum = Fm.GetFNum("Geneva")
+ Qd.TextFont(fnum)
+ Qd.TextFace(fontstyle)
+ Qd.TextSize(fontsize)
+ if self._bindings.has_key("<open>"):
+ callback = self._bindings["<open>"]
+ callback()
+ for w in self._widgets:
+ w.forall_frombottom("open")
+ self._maketabchain()
+ if self._tabbable:
+ self.bind('tab', self.nextwidget)
+ self.bind('shifttab', self.previouswidget)
+ else:
+ self._hasselframes = 0
+ if self._tabchain:
+ self._tabchain[0].select(1)
+ self.do_postopen()
+
+ def close(self):
+ if not self.wid:
+ return # we are already closed
+ if self._bindings.has_key("<close>"):
+ callback = self._bindings["<close>"]
+ try:
+ rv = callback()
+ except:
+ print 'error in <close> callback'
+ traceback.print_exc()
+ else:
+ if rv:
+ return rv
+ #for key in self._widgetsdict.keys():
+ # self._removewidget(key)
+ self.forall_butself("close")
+ Wbase.SelectableWidget.close(self)
+ self._tabchain = []
+ self._currentwidget = None
+ self.wid.HideWindow()
+ self.do_postclose()
+
+ def domenu_close(self, *args):
+ self.close()
+
+ def getbounds(self):
+ return self._globalbounds
+
+ def setbounds(self, bounds):
+ l, t, r, b = bounds
+ self.move(l, t)
+ self.resize(r-l, b-t)
+
+ def move(self, x, y = None):
+ """absolute move"""
+ if y == None:
+ x, y = x
+ self.wid.MoveWindow(x, y, 0)
+
+ def resize(self, x, y = None):
+ if not self._hasgrowbox:
+ return # hands off!
+ if y == None:
+ x, y = x
+ self.SetPort()
+ self.GetWindow().InvalWindowRect(self.getgrowrect())
+ self.wid.SizeWindow(x, y, 1)
+ self._calcbounds()
+
+ def test(self, point):
+ return 1
+
+ def draw(self, visRgn = None):
+ if self._hasgrowbox:
+ self.tempcliprect(self.getgrowrect())
+ self.wid.DrawGrowIcon()
+ self.restoreclip()
+
+ def idle(self, *args):
+ self.SetPort()
+ point = Evt.GetMouse()
+ widget = self.findwidget(point, 0)
+ if self._bindings.has_key("<idle>"):
+ callback = self._bindings["<idle>"]
+ if callback():
+ return
+ if self._currentwidget is not None and hasattr(self._currentwidget, "idle"):
+ if self._currentwidget._bindings.has_key("<idle>"):
+ callback = self._currentwidget._bindings["<idle>"]
+ if callback():
+ return
+ if self._currentwidget.idle():
+ return
+ if widget is not None and hasattr(widget, "rollover"):
+ if 1: #self._lastrollover <> widget:
+ if self._lastrollover:
+ self._lastrollover.rollover(point, 0)
+ self._lastrollover = widget
+ self._lastrollover.rollover(point, 1)
+ else:
+ if self._lastrollover:
+ self._lastrollover.rollover(point, 0)
+ self._lastrollover = None
+ Wbase.SetCursor("arrow")
+
+ def xxx___select(self, widget):
+ if self._currentwidget == widget:
+ return
+ if self._bindings.has_key("<select>"):
+ callback = self._bindings["<select>"]
+ if callback(widget):
+ return
+ if widget is None:
+ if self._currentwidget is not None:
+ self._currentwidget.select(0)
+ elif type(widget) == InstanceType and widget._selectable:
+ widget.select(1)
+ elif widget == -1 or widget == 1:
+ if len(self._tabchain) <= 1:
+ return
+ temp = self._tabchain[(self._tabchain.index(self._currentwidget) + widget) % len(self._tabchain)]
+ temp.select(1)
+ else:
+ raise TypeError, "Widget is not selectable"
+
+ def setdefaultbutton(self, newdefaultbutton = None, *keys):
+ if newdefaultbutton == self._defaultbutton:
+ return
+ if self._defaultbutton:
+ self._defaultbutton._setdefault(0)
+ if not newdefaultbutton:
+ self.bind("return", None)
+ self.bind("enter", None)
+ return
+ import Wcontrols
+ if not isinstance(newdefaultbutton, Wcontrols.Button):
+ raise TypeError, "widget is not a button"
+ self._defaultbutton = newdefaultbutton
+ self._defaultbutton._setdefault(1)
+ if not keys:
+ self.bind("return", self._defaultbutton.push)
+ self.bind("enter", self._defaultbutton.push)
+ else:
+ for key in keys:
+ self.bind(key, self._defaultbutton.push)
+
+ def nextwidget(self):
+ self.xxx___select(1)
+
+ def previouswidget(self):
+ self.xxx___select(-1)
+
+ def drawwidgetbounds(self, onoff):
+ self._drawwidgetbounds = onoff
+ self.SetPort()
+ self.GetWindow().InvalWindowRect(self._bounds)
+
+ def _drawbounds(self):
+ pass
+
+ def _maketabchain(self):
+ # XXX This has to change, it's no good when we are adding or deleting widgets.
+ # XXX Perhaps we shouldn't keep a "tabchain" at all.
+ self._hasselframes = 0
+ self._collectselectablewidgets(self._widgets)
+ if self._hasselframes and len(self._tabchain) > 1:
+ self._hasselframes = 1
+ else:
+ self._hasselframes = 0
+
+ def _collectselectablewidgets(self, widgets):
+ import W
+ for w in widgets:
+ if w._selectable:
+ self._tabchain.append(w)
+ if isinstance(w, W.List):
+ self._hasselframes = 1
+ self._collectselectablewidgets(w._widgets)
+
+ def _calcbounds(self):
+ self._possize = self.wid.GetWindowPort().GetPortBounds()[2:]
+ w, h = self._possize
+ self._bounds = (0, 0, w, h)
+ self.wid.GetWindowContentRgn(scratchRegion)
+ l, t, r, b = GetRgnBounds(scratchRegion)
+ self._globalbounds = l, t, l + w, t + h
+ for w in self._widgets:
+ w._calcbounds()
+
+ # FrameWork override methods
+ def do_inDrag(self, partcode, window, event):
+ where = event[3]
+ self.wid.GetWindowContentRgn(scratchRegion)
+ was_l, was_t, r, b = GetRgnBounds(scratchRegion)
+ window.DragWindow(where, self.draglimit)
+ self.wid.GetWindowContentRgn(scratchRegion)
+ is_l, is_t, r, b = GetRgnBounds(scratchRegion)
+ self._globalbounds = Qd.OffsetRect(self._globalbounds,
+ is_l - was_l, is_t - was_t)
+
+ def do_char(self, char, event):
+ import Wkeys
+ (what, message, when, where, modifiers) = event
+ key = char
+ if Wkeys.keynames.has_key(key):
+ key = Wkeys.keynames[key]
+ if modifiers & Events.shiftKey:
+ key = 'shift' + key
+ if modifiers & Events.cmdKey:
+ key = 'cmd' + key
+ if modifiers & Events.controlKey:
+ key = 'control' + key
+ if self._bindings.has_key("<key>"):
+ callback = self._bindings["<key>"]
+ if Wbase.CallbackCall(callback, 0, char, event):
+ return
+ if self._bindings.has_key(key):
+ callback = self._bindings[key]
+ Wbase.CallbackCall(callback, 0, char, event)
+ elif self._currentwidget is not None:
+ if self._currentwidget._bindings.has_key(key):
+ callback = self._currentwidget._bindings[key]
+ Wbase.CallbackCall(callback, 0, char, event)
+ else:
+ if self._currentwidget._bindings.has_key("<key>"):
+ callback = self._currentwidget._bindings["<key>"]
+ if Wbase.CallbackCall(callback, 0, char, event):
+ return
+ self._currentwidget.key(char, event)
+
+ def do_contentclick(self, point, modifiers, event):
+ widget = self.findwidget(point)
+ if widget is not None:
+ if self._bindings.has_key("<click>"):
+ callback = self._bindings["<click>"]
+ if Wbase.CallbackCall(callback, 0, point, modifiers):
+ return
+ if widget._bindings.has_key("<click>"):
+ callback = widget._bindings["<click>"]
+ if Wbase.CallbackCall(callback, 0, point, modifiers):
+ return
+ if widget._selectable:
+ widget.select(1, 1)
+ widget.click(point, modifiers)
+
+ def do_update(self, window, event):
+ Qd.EraseRgn(window.GetWindowPort().visRgn)
+ self.forall_frombottom("draw", window.GetWindowPort().visRgn)
+ if self._drawwidgetbounds:
+ self.forall_frombottom("_drawbounds")
+
+ def do_activate(self, onoff, event):
+ if not onoff:
+ if self._lastrollover:
+ self._lastrollover.rollover((0, 0), 0)
+ self._lastrollover = None
+ self.SetPort()
+ self.forall("activate", onoff)
+ self.draw()
+
+ def do_postresize(self, width, height, window):
+ self.GetWindow().InvalWindowRect(self.getgrowrect())
+ self._calcbounds()
+
+ def do_inGoAway(self, partcode, window, event):
+ where = event[3]
+ closeall = event[4] & Events.optionKey
+ if window.TrackGoAway(where):
+ if not closeall:
+ self.close()
+ else:
+ for window in self.parent._windows.values():
+ rv = window.close()
+ if rv and rv > 0:
+ return
+
+ # utilities
+ def tempcliprect(self, tempcliprect):
+ tempclip = Qd.NewRgn()
+ Qd.RectRgn(tempclip, tempcliprect)
+ self.tempclip(tempclip)
+ Qd.DisposeRgn(tempclip)
+
+ def tempclip(self, tempclip):
+ if not hasattr(self, "saveclip"):
+ self.saveclip = []
+ saveclip = Qd.NewRgn()
+ Qd.GetClip(saveclip)
+ self.saveclip.append(saveclip)
+ Qd.SetClip(tempclip)
+
+ def restoreclip(self):
+ Qd.SetClip(self.saveclip[-1])
+ Qd.DisposeRgn(self.saveclip[-1])
+ del self.saveclip[-1]
+
+ def getgrowrect(self):
+ l, t, r, b = self.wid.GetWindowPort().GetPortBounds()
+ return (r - 15, b - 15, r, b)
+
+ def has_key(self, key):
+ return self._widgetsdict.has_key(key)
+
+ def __getattr__(self, attr):
+ global _successcount, _failcount, _magiccount
+ if self._widgetsdict.has_key(attr):
+ _successcount = _successcount + 1
+ return self._widgetsdict[attr]
+ if self._currentwidget is None or (attr[:7] <> 'domenu_' and
+ attr[:4] <> 'can_' and attr <> 'insert'):
+ _failcount = _failcount + 1
+ raise AttributeError, attr
+ # special case: if a domenu_xxx, can_xxx or insert method is asked for,
+ # see if the active widget supports it
+ _magiccount = _magiccount + 1
+ return getattr(self._currentwidget, attr)
_successcount = 0
_failcount = 0
_magiccount = 0
class Dialog(Window):
-
- windowkind = Windows.movableDBoxProc
-
- # this __init__ seems redundant, but it's not: it has less args
- def __init__(self, possize, title = ""):
- Window.__init__(self, possize, title)
-
- def can_close(self, *args):
- return 0
-
- def getwindowbounds(self, size, minsize = None):
- screenbounds = sl, st, sr, sb = Qd.GetQDGlobalsScreenBits().bounds
- w, h = size
- l = sl + (sr - sl - w) / 2
- t = st + (sb - st - h) / 3
- return l, t, l + w, t + h
+
+ windowkind = Windows.movableDBoxProc
+
+ # this __init__ seems redundant, but it's not: it has less args
+ def __init__(self, possize, title = ""):
+ Window.__init__(self, possize, title)
+
+ def can_close(self, *args):
+ return 0
+
+ def getwindowbounds(self, size, minsize = None):
+ screenbounds = sl, st, sr, sb = Qd.GetQDGlobalsScreenBits().bounds
+ w, h = size
+ l = sl + (sr - sl - w) / 2
+ t = st + (sb - st - h) / 3
+ return l, t, l + w, t + h
class ModalDialog(Dialog):
-
- def __init__(self, possize, title = ""):
- Dialog.__init__(self, possize, title)
- if title:
- self.windowkind = Windows.movableDBoxProc
- else:
- self.windowkind = Windows.dBoxProc
-
- def open(self):
- import W
- Dialog.open(self)
- self.app = W.getapplication()
- self.done = 0
- Menu.HiliteMenu(0)
- app = self.parent
- app.enablemenubar(0)
- try:
- self.mainloop()
- finally:
- app.enablemenubar(1)
-
- def close(self):
- if not self.wid:
- return # we are already closed
- self.done = 1
- del self.app
- Dialog.close(self)
-
- def mainloop(self):
- if hasattr(MacOS, 'EnableAppswitch'):
- saveyield = MacOS.EnableAppswitch(-1)
- while not self.done:
- #self.do1event()
- self.do1event( Events.keyDownMask +
- Events.autoKeyMask +
- Events.activMask +
- Events.updateMask +
- Events.mDownMask +
- Events.mUpMask,
- 10)
- if hasattr(MacOS, 'EnableAppswitch'):
- MacOS.EnableAppswitch(saveyield)
-
- def do1event(self, mask = Events.everyEvent, wait = 0):
- ok, event = self.app.getevent(mask, wait)
- if Dlg.IsDialogEvent(event):
- if self.app.do_dialogevent(event):
- return
- if ok:
- self.dispatch(event)
- else:
- self.app.idle(event)
-
- def do_keyDown(self, event):
- self.do_key(event)
-
- def do_autoKey(self, event):
- if not event[-1] & Events.cmdKey:
- self.do_key(event)
-
- def do_key(self, event):
- (what, message, when, where, modifiers) = event
- #w = Win.FrontWindow()
- #if w <> self.wid:
- # return
- c = chr(message & Events.charCodeMask)
- if modifiers & Events.cmdKey:
- self.app.checkmenus(self)
- result = Menu.MenuKey(ord(c))
- id = (result>>16) & 0xffff # Hi word
- item = result & 0xffff # Lo word
- if id:
- self.app.do_rawmenu(id, item, None, event)
- return
- self.do_char(c, event)
-
- def do_mouseDown(self, event):
- (what, message, when, where, modifiers) = event
- partcode, wid = Win.FindWindow(where)
- #
- # Find the correct name.
- #
- if FrameWork.partname.has_key(partcode):
- name = "do_" + FrameWork.partname[partcode]
- else:
- name = "do_%d" % partcode
-
- if name == "do_inDesk":
- if hasattr(MacOS, "HandleEvent"):
- MacOS.HandleEvent(event)
- else:
- print 'Unexpected inDesk event:', event
- return
- if wid == self.wid:
- try:
- handler = getattr(self, name)
- except AttributeError:
- handler = self.app.do_unknownpartcode
- else:
- #MacOS.HandleEvent(event)
- if name == 'do_inMenuBar':
- handler = getattr(self.parent, name)
- else:
- return
- handler(partcode, wid, event)
-
- def dispatch(self, event):
- (what, message, when, where, modifiers) = event
- if FrameWork.eventname.has_key(what):
- name = "do_" + FrameWork.eventname[what]
- else:
- name = "do_%d" % what
- try:
- handler = getattr(self, name)
- except AttributeError:
- try:
- handler = getattr(self.app, name)
- except AttributeError:
- handler = self.app.do_unknownevent
- handler(event)
-
+
+ def __init__(self, possize, title = ""):
+ Dialog.__init__(self, possize, title)
+ if title:
+ self.windowkind = Windows.movableDBoxProc
+ else:
+ self.windowkind = Windows.dBoxProc
+
+ def open(self):
+ import W
+ Dialog.open(self)
+ self.app = W.getapplication()
+ self.done = 0
+ Menu.HiliteMenu(0)
+ app = self.parent
+ app.enablemenubar(0)
+ try:
+ self.mainloop()
+ finally:
+ app.enablemenubar(1)
+
+ def close(self):
+ if not self.wid:
+ return # we are already closed
+ self.done = 1
+ del self.app
+ Dialog.close(self)
+
+ def mainloop(self):
+ if hasattr(MacOS, 'EnableAppswitch'):
+ saveyield = MacOS.EnableAppswitch(-1)
+ while not self.done:
+ #self.do1event()
+ self.do1event( Events.keyDownMask +
+ Events.autoKeyMask +
+ Events.activMask +
+ Events.updateMask +
+ Events.mDownMask +
+ Events.mUpMask,
+ 10)
+ if hasattr(MacOS, 'EnableAppswitch'):
+ MacOS.EnableAppswitch(saveyield)
+
+ def do1event(self, mask = Events.everyEvent, wait = 0):
+ ok, event = self.app.getevent(mask, wait)
+ if Dlg.IsDialogEvent(event):
+ if self.app.do_dialogevent(event):
+ return
+ if ok:
+ self.dispatch(event)
+ else:
+ self.app.idle(event)
+
+ def do_keyDown(self, event):
+ self.do_key(event)
+
+ def do_autoKey(self, event):
+ if not event[-1] & Events.cmdKey:
+ self.do_key(event)
+
+ def do_key(self, event):
+ (what, message, when, where, modifiers) = event
+ #w = Win.FrontWindow()
+ #if w <> self.wid:
+ # return
+ c = chr(message & Events.charCodeMask)
+ if modifiers & Events.cmdKey:
+ self.app.checkmenus(self)
+ result = Menu.MenuKey(ord(c))
+ id = (result>>16) & 0xffff # Hi word
+ item = result & 0xffff # Lo word
+ if id:
+ self.app.do_rawmenu(id, item, None, event)
+ return
+ self.do_char(c, event)
+
+ def do_mouseDown(self, event):
+ (what, message, when, where, modifiers) = event
+ partcode, wid = Win.FindWindow(where)
+ #
+ # Find the correct name.
+ #
+ if FrameWork.partname.has_key(partcode):
+ name = "do_" + FrameWork.partname[partcode]
+ else:
+ name = "do_%d" % partcode
+
+ if name == "do_inDesk":
+ if hasattr(MacOS, "HandleEvent"):
+ MacOS.HandleEvent(event)
+ else:
+ print 'Unexpected inDesk event:', event
+ return
+ if wid == self.wid:
+ try:
+ handler = getattr(self, name)
+ except AttributeError:
+ handler = self.app.do_unknownpartcode
+ else:
+ #MacOS.HandleEvent(event)
+ if name == 'do_inMenuBar':
+ handler = getattr(self.parent, name)
+ else:
+ return
+ handler(partcode, wid, event)
+
+ def dispatch(self, event):
+ (what, message, when, where, modifiers) = event
+ if FrameWork.eventname.has_key(what):
+ name = "do_" + FrameWork.eventname[what]
+ else:
+ name = "do_%d" % what
+ try:
+ handler = getattr(self, name)
+ except AttributeError:
+ try:
+ handler = getattr(self.app, name)
+ except AttributeError:
+ handler = self.app.do_unknownevent
+ handler(event)
+
def FrontWindowInsert(stuff):
- if not stuff:
- return
- if type(stuff) <> StringType:
- raise TypeError, 'string expected'
- import W
- app = W.getapplication()
- wid = MyFrontWindow()
- if wid and app._windows.has_key(wid):
- window = app._windows[wid]
- if hasattr(window, "insert"):
- try:
- window.insert(stuff)
- return
- except:
- pass
- import EasyDialogs
- if EasyDialogs.AskYesNoCancel(
- "Can't find window or widget to insert text into; copy to clipboard instead?",
- 1) == 1:
- from Carbon import Scrap
- if hasattr(Scrap, 'PutScrap'):
- Scrap.ZeroScrap()
- Scrap.PutScrap('TEXT', stuff)
- else:
- Scrap.ClearCurrentScrap()
- sc = Scrap.GetCurrentScrap()
- sc.PutScrapFlavor('TEXT', 0, stuff)
-
-
-# not quite based on the same function in FrameWork
+ if not stuff:
+ return
+ if type(stuff) <> StringType:
+ raise TypeError, 'string expected'
+ import W
+ app = W.getapplication()
+ wid = MyFrontWindow()
+ if wid and app._windows.has_key(wid):
+ window = app._windows[wid]
+ if hasattr(window, "insert"):
+ try:
+ window.insert(stuff)
+ return
+ except:
+ pass
+ import EasyDialogs
+ if EasyDialogs.AskYesNoCancel(
+ "Can't find window or widget to insert text into; copy to clipboard instead?",
+ 1) == 1:
+ from Carbon import Scrap
+ if hasattr(Scrap, 'PutScrap'):
+ Scrap.ZeroScrap()
+ Scrap.PutScrap('TEXT', stuff)
+ else:
+ Scrap.ClearCurrentScrap()
+ sc = Scrap.GetCurrentScrap()
+ sc.PutScrapFlavor('TEXT', 0, stuff)
+
+
+# not quite based on the same function in FrameWork
_windowcounter = 0
def getnextwindowpos():
- global _windowcounter
- rows = 8
- l = 4 * (rows + 1 - (_windowcounter % rows) + _windowcounter / rows)
- t = 44 + 20 * (_windowcounter % rows)
- _windowcounter = _windowcounter + 1
- return l, t
+ global _windowcounter
+ rows = 8
+ l = 4 * (rows + 1 - (_windowcounter % rows) + _windowcounter / rows)
+ t = 44 + 20 * (_windowcounter % rows)
+ _windowcounter = _windowcounter + 1
+ return l, t
def windowbounds(preferredsize, minsize=None):
- "Return sensible window bounds"
-
- global _windowcounter
- if len(preferredsize) == 4:
- bounds = l, t, r, b = preferredsize
- desktopRgn = Win.GetGrayRgn()
- tempRgn = Qd.NewRgn()
- Qd.RectRgn(tempRgn, bounds)
- union = Qd.UnionRgn(tempRgn, desktopRgn, tempRgn)
- equal = Qd.EqualRgn(tempRgn, desktopRgn)
- Qd.DisposeRgn(tempRgn)
- if equal:
- return bounds
- else:
- preferredsize = r - l, b - t
- if not minsize:
- minsize = preferredsize
- minwidth, minheight = minsize
- width, height = preferredsize
-
- sl, st, sr, sb = screenbounds = Qd.InsetRect(Qd.GetQDGlobalsScreenBits().bounds, 4, 4)
- l, t = getnextwindowpos()
- if (l + width) > sr:
- _windowcounter = 0
- l, t = getnextwindowpos()
- r = l + width
- b = t + height
- if (t + height) > sb:
- b = sb
- if (b - t) < minheight:
- b = t + minheight
- return l, t, r, b
+ "Return sensible window bounds"
+
+ global _windowcounter
+ if len(preferredsize) == 4:
+ bounds = l, t, r, b = preferredsize
+ desktopRgn = Win.GetGrayRgn()
+ tempRgn = Qd.NewRgn()
+ Qd.RectRgn(tempRgn, bounds)
+ union = Qd.UnionRgn(tempRgn, desktopRgn, tempRgn)
+ equal = Qd.EqualRgn(tempRgn, desktopRgn)
+ Qd.DisposeRgn(tempRgn)
+ if equal:
+ return bounds
+ else:
+ preferredsize = r - l, b - t
+ if not minsize:
+ minsize = preferredsize
+ minwidth, minheight = minsize
+ width, height = preferredsize
+
+ sl, st, sr, sb = screenbounds = Qd.InsetRect(Qd.GetQDGlobalsScreenBits().bounds, 4, 4)
+ l, t = getnextwindowpos()
+ if (l + width) > sr:
+ _windowcounter = 0
+ l, t = getnextwindowpos()
+ r = l + width
+ b = t + height
+ if (t + height) > sb:
+ b = sb
+ if (b - t) < minheight:
+ b = t + minheight
+ return l, t, r, b
scratchRegion = Qd.NewRgn()
# util -- move somewhere convenient???
def GetRgnBounds(the_Rgn):
- (t, l, b, r) = struct.unpack("hhhh", the_Rgn.data[2:10])
- return (l, t, r, b)
+ (t, l, b, r) = struct.unpack("hhhh", the_Rgn.data[2:10])
+ return (l, t, r, b)