summaryrefslogtreecommitdiffstats
path: root/Mac/Tools/IDE/Wmenus.py
diff options
context:
space:
mode:
authorJust van Rossum <just@lettererror.com>1999-01-30 22:39:17 (GMT)
committerJust van Rossum <just@lettererror.com>1999-01-30 22:39:17 (GMT)
commit40f9b7bd7cb54645a7c15668b683a8d830ba5219 (patch)
treebaea660d6ef599cd9c4ecc72d009fa75853de577 /Mac/Tools/IDE/Wmenus.py
parentf59a89b5e34ac7db9e69b02a5b558c7cb49a4d9a (diff)
downloadcpython-40f9b7bd7cb54645a7c15668b683a8d830ba5219.zip
cpython-40f9b7bd7cb54645a7c15668b683a8d830ba5219.tar.gz
cpython-40f9b7bd7cb54645a7c15668b683a8d830ba5219.tar.bz2
First Checked In.
Diffstat (limited to 'Mac/Tools/IDE/Wmenus.py')
-rw-r--r--Mac/Tools/IDE/Wmenus.py196
1 files changed, 196 insertions, 0 deletions
diff --git a/Mac/Tools/IDE/Wmenus.py b/Mac/Tools/IDE/Wmenus.py
new file mode 100644
index 0000000..387590b
--- /dev/null
+++ b/Mac/Tools/IDE/Wmenus.py
@@ -0,0 +1,196 @@
+import FrameWork
+import Qd
+import Wbase
+from types import *
+import Wapplication
+
+_arrowright = Qd.GetPicture(472)
+_arrowdown = Qd.GetPicture(473)
+
+
+
+class PopupWidget(Wbase.ClickableWidget):
+
+ """Simple title-less popup widget. Should be 16x16 pixels.
+ Builds the menu items on the fly, good for dynamic popup menus."""
+
+ def __init__(self, possize, items = [], callback = None):
+ Wbase.Widget.__init__(self, possize)
+ self._items = items
+ self._itemsdict = {}
+ self._callback = callback
+ self._enabled = 1
+
+ def close(self):
+ Wbase.Widget.close(self)
+ self._items = None
+ self._itemsdict = {}
+
+ def draw(self, visRgn = None):
+ if self._visible:
+ Qd.FrameRect(self._bounds)
+ Qd.EraseRect(Qd.InsetRect(self._bounds, 1, 1))
+ l, t, r, b = self._bounds
+ l = l + 2
+ t = t + 3
+ pictframe = (l, t, l + 10, t + 10)
+ Qd.DrawPicture(_arrowright, pictframe)
+
+ def click(self, point, modifiers):
+ if not self._enabled:
+ return
+ self.menu = FrameWork.Menu(self._parentwindow.parent.menubar, 'Foo', -1)
+ self._additems(self._items, self.menu)
+ self.SetPort()
+ l, t, r, b = self._bounds
+ l, t = Qd.LocalToGlobal((l+1, t+1))
+ Wbase.SetCursor("arrow")
+ self.menu.menu.EnableItem(0)
+ reply = self.menu.menu.PopUpMenuSelect(t, l, 1)
+ if reply:
+ id = (reply & 0xffff0000) >> 16
+ item = reply & 0xffff
+ self._menu_callback(id, item)
+ self._emptymenu()
+
+ def set(self, items):
+ self._items = items
+
+ def get(self):
+ return self._items
+
+ def _additems(self, items, menu):
+ from FrameWork import SubMenu, MenuItem
+ menu_id = menu.id
+ for item in items:
+ if item == "-":
+ menu.addseparator()
+ continue
+ elif type(item) == ListType:
+ submenu = SubMenu(menu, item[0])
+ self._additems(item[1:], submenu)
+ continue
+ elif type(item) == StringType:
+ menuitemtext = object = item
+ elif type(item) == TupleType and len(item) == 2:
+ menuitemtext, object = item
+ else:
+ raise Wbase.WidgetsError, "illegal itemlist for popup menu"
+
+ if menuitemtext[:1] == '\0':
+ check = ord(menuitemtext[1])
+ menuitemtext = menuitemtext[2:]
+ else:
+ check = 0
+ menuitem = MenuItem(menu, menuitemtext, None, None)
+ if check:
+ menuitem.check(1)
+ self._itemsdict[(menu_id, menuitem.item)] = object
+
+ def _emptymenu(self):
+ menus = self._parentwindow.parent.menubar.menus
+ for id, item in self._itemsdict.keys():
+ if menus.has_key(id):
+ self.menu = menus[id]
+ self.menu.delete()
+ self._itemsdict = {}
+
+ def _menu_callback(self, id, item):
+ thing = self._itemsdict[(id, item)]
+ if callable(thing):
+ thing()
+ elif self._callback:
+ Wbase.CallbackCall(self._callback, 0, thing)
+
+
+class PopupMenu(PopupWidget):
+
+ """Simple title-less popup widget. Should be 16x16 pixels.
+ Prebuilds the menu items, good for static (non changing) popup menus."""
+
+ def open(self):
+ self._calcbounds()
+ self.menu = Wapplication.Menu(self._parentwindow.parent.menubar, 'Foo', -1)
+ self._additems(self._items, self.menu)
+
+ def close(self):
+ self._emptymenu()
+ Wbase.Widget.close(self)
+ self._items = None
+ self._itemsdict = {}
+ self.menu = None
+
+ def set(self, items):
+ if self._itemsdict:
+ self._emptymenu()
+ self.menu = Wapplication.Menu(self._parentwindow.parent.menubar, 'Foo', -1)
+ self._items = items
+ self._additems(self._items, self.menu)
+
+ def click(self, point, modifiers):
+ if not self._enabled:
+ return
+ self.SetPort()
+ l, t, r, b = self._bounds
+ l, t = Qd.LocalToGlobal((l+1, t+1))
+ Wbase.SetCursor("arrow")
+ self.menu.menu.EnableItem(0)
+ reply = self.menu.menu.PopUpMenuSelect(t, l, 1)
+ if reply:
+ id = (reply & 0xffff0000) >> 16
+ item = reply & 0xffff
+ self._menu_callback(id, item)
+
+
+class FontMenu(PopupMenu):
+
+ """A font popup menu."""
+
+ menu = None
+
+ def __init__(self, possize, callback):
+ PopupMenu.__init__(self, possize)
+ _makefontmenu()
+ self._callback = callback
+ self._enabled = 1
+
+ def open(self):
+ self._calcbounds()
+
+ def close(self):
+ del self._callback
+
+ def set(self):
+ raise Wbase.WidgetsError, "can't change font menu widget"
+
+ def _menu_callback(self, id, item):
+ fontname = self.menu.menu.GetMenuItemText(item)
+ if self._callback:
+ Wbase.CallbackCall(self._callback, 0, fontname)
+
+ def click(self, point, modifiers):
+ if not self._enabled:
+ return
+ _makefontmenu()
+ return PopupMenu.click(self, point, modifiers)
+
+
+def _makefontmenu():
+ """helper for font menu"""
+ if FontMenu.menu is not None:
+ return
+ import W
+ FontMenu.menu = Wapplication.Menu(W.getapplication().menubar, 'Foo', -1)
+ W.SetCursor('watch')
+ for i in range(FontMenu.menu.menu.CountMItems(), 0, -1):
+ FontMenu.menu.menu.DeleteMenuItem(i)
+ FontMenu.menu.menu.AppendResMenu('FOND')
+
+
+def _getfontlist():
+ import Res
+ fontnames = []
+ for i in range(1, Res.CountResources('FOND') + 1):
+ r = Res.GetIndResource('FOND', i)
+ fontnames.append(r.GetResInfo()[2])
+ return fontnames