diff options
Diffstat (limited to 'Mac/Lib')
-rw-r--r-- | Mac/Lib/FrameWork.py | 88 |
1 files changed, 76 insertions, 12 deletions
diff --git a/Mac/Lib/FrameWork.py b/Mac/Lib/FrameWork.py index dc07f5e..5741972 100644 --- a/Mac/Lib/FrameWork.py +++ b/Mac/Lib/FrameWork.py @@ -23,6 +23,7 @@ from QuickDraw import * #from Sound import * from Win import * from Windows import * +import types import EasyDialogs @@ -95,6 +96,7 @@ class Application: def __init__(self, nomenubar=0): self.quitting = 0 + self.needmenubarredraw = 0 self._windows = {} if nomenubar: self.menubar = None @@ -102,7 +104,7 @@ class Application: self.makemenubar() def makemenubar(self): - self.menubar = MenuBar() + self.menubar = MenuBar(self) AppleMenu(self.menubar, self.getabouttext(), self.do_about) self.makeusermenus() @@ -165,6 +167,9 @@ class Application: pass def getevent(self, mask = everyEvent, wait = 0): + if self.needmenubarredraw: + DrawMenuBar() + self.needmenubarredraw = 0 ok, event = WaitNextEvent(mask, wait) return ok, event @@ -391,21 +396,30 @@ class MenuBar: nextid = 1 # Necessarily a class variable def getnextid(self): - id = self.nextid - self.nextid = id+1 + id = MenuBar.nextid + MenuBar.nextid = id+1 return id - def __init__(self): + def __init__(self, parent=None): + self.parent = parent ClearMenuBar() self.bar = GetMenuBar() self.menus = {} + # XXX necessary? + def close(self): + self.parent = None + self.bar = None + def addmenu(self, title, after = 0): id = self.getnextid() if DEBUG: print 'Newmenu', title, id # XXXX m = NewMenu(id, title) m.InsertMenu(after) - DrawMenuBar() # XXX appears slow! better do this when we're done. jvr + if self.parent: + self.parent.needmenubarredraw = 1 + else: + DrawMenuBar() return id, m def delmenu(self, id): @@ -414,11 +428,40 @@ class MenuBar: def addpopup(self, title = ''): return self.addmenu(title, -1) - - def install(self): - self.bar.SetMenuBar() - DrawMenuBar() - + +# Useless: +# def install(self): +# if not self.bar: return +# SetMenuBar(self.bar) +# if self.parent: +# self.parent.needmenubarredraw = 1 +# else: +# DrawMenuBar() + + def fixmenudimstate(self): + for m in self.menus.keys(): + menu = self.menus[m] + if menu.__class__ == FrameWork.AppleMenu: + continue + for i in range(len(menu.items)): + label, shortcut, callback, kind = menu.items[i] + if type(callback) == types.StringType: + wid = Win.FrontWindow() + if wid and self.parent._windows.has_key(wid): + window = self.parent._windows[wid] + if hasattr(window, "domenu_" + callback): + menu.menu.EnableItem(i + 1) + elif hasattr(self.parent, "domenu_" + callback): + menu.menu.EnableItem(i + 1) + else: + menu.menu.DisableItem(i + 1) + elif hasattr(self.parent, "domenu_" + callback): + menu.menu.EnableItem(i + 1) + else: + menu.menu.DisableItem(i + 1) + elif callback: + pass + def dispatch(self, id, item, window, event): if self.menus.has_key(id): self.menus[id].dispatch(id, item, window, event) @@ -472,9 +515,30 @@ class Menu: return sub def dispatch(self, id, item, window, event): - title, shortcut, callback, type = self.items[item-1] + title, shortcut, callback, mtype = self.items[item-1] if callback: - callback(id, item, window, event) + if not self.bar.parent or type(callback) <> types.StringType: + menuhandler = callback + else: + # callback is string + wid = Win.FrontWindow() + if wid and self.bar.parent._windows.has_key(wid): + window = self.bar.parent._windows[wid] + if hasattr(window, "domenu_" + callback): + menuhandler = getattr(window, "domenu_" + callback) + elif hasattr(self.bar.parent, "domenu_" + callback): + menuhandler = getattr(self.bar.parent, "domenu_" + callback) + else: + # nothing we can do. we shouldn't have come this far + # since the menu item should have been disabled... + return + elif hasattr(self.bar.parent, "domenu_" + callback): + menuhandler = getattr(self.bar.parent, "domenu_" + callback) + else: + # nothing we can do. we shouldn't have come this far + # since the menu item should have been disabled... + return + menuhandler(id, item, window, event) def enable(self, onoff): if onoff: |