# This file defines the menu contents and key bindings. Note that # there is additional configuration information in the EditorWindow # class (and subclasses): the menus are created there based on the # menu_specs (class) variable, and menus not created are silently # skipped by the code here. This makes it possible to define the # Debug menu here, which is only present in the PythonShell window. import sys import string import re menudefs = [ # underscore prefixes character to underscore ('file', [ ('_New window', '<>'), ('_Open...', '<>'), ('Open _module...', '<>'), ('Class _browser...', '<>'), None, ('_Save', '<>'), ('Save _As...', '<>'), ('Save Co_py As...', '<>'), None, ('_Close', '<>'), ('E_xit', '<>'), ]), ('edit', [ ('_Undo', '<>'), ('_Redo', '<>'), None, ('Cu_t', '<>'), ('_Copy', '<>'), ('_Paste', '<>'), None, ('_Find...', '<>'), ('Find _next', '<>'), ('Find _same', '<>'), ('_Go to line', '<>'), None, ('_Dedent region', '<>'), ('_Indent region', '<>'), ('Comment _out region', '<>'), ('U_ncomment region', '<>'), ]), ('debug', [ ('_Go to line from traceback', '<>'), ('_Open stack viewer', '<>'), ('_Debugger toggle', '<>'), ]), ('help', [ ('_Help...', '<>'), None, ('_About IDLE...', '<>'), ]), ] windows_keydefs = { '<>': ['', ''], '<>': [''], '<>': ['', ''], '<>': [''], '<>': [''], '<>': [''], '<>': ['', ''], '<>': ['', ''], '<>': [''], '<>': [''], '<>': ['', ''], '<>': ['', ''], '<>': ['', ''], '<>': [''], '<>': [''], '<>': ['', ''], '<>': [''], '<>': [''], '<>': [''], '<>': [''], '<>': [''], '<>': [''], '<>': [''], '<>': [''], '<>': ['', ''], '<>': [''], } emacs_keydefs = { '<>': [''], '<>': [''], '<>': [''], '<>': [], '<>': ['', ''], '<>': [''], '<>': [''], '<>': [''], '<>': ['', ''], '<>': ['', '', ''], '<>': [''], '<>': [''], '<>': [''], '<>': ['', ''], '<>': [''], '<>': [''], '<>': [''], '<>': ['', ''], '<>': [], '<>': [], '<>': ['', ''], '<>': ['', ''], '<>': ['', '', ''], '<>': [''], '<>': ['', ''], '<>': [''], '<>': [''], '<>': [''], '<>': [], '<>': [''], '<>': [''], '<>': ['', ''], '<>': [''], '<>': [''], '<>': [''], '<>': [''], '<>': [], '<>': ['', ''], '<>': [''], } def prepstr(s): # Helper to extract the underscore from a string, # e.g. prepstr("Co_py") returns (2, "Copy"). i = string.find(s, '_') if i >= 0: s = s[:i] + s[i+1:] return i, s keynames = { 'bracketleft': '[', 'bracketright': ']', } def getaccelerator(keydefs, event): keylist = keydefs.get(event) if not keylist: return "" s = keylist[0] if s[:6] == "<", " ", s) s = re.sub("<", "", s) s = re.sub(">", "", s) return s if sys.platform == 'win32': default_keydefs = windows_keydefs else: default_keydefs = emacs_keydefs def apply_bindings(text, keydefs=default_keydefs): text.keydefs = keydefs for event, keylist in keydefs.items(): if keylist: apply(text.event_add, (event,) + tuple(keylist)) def fill_menus(text, menudict, defs=menudefs): # Fill the menus for the given text widget. The menudict argument is # a dictionary containing the menus, keyed by their lowercased name. # Menus that are absent or None are ignored. if hasattr(text, "keydefs"): keydefs = text.keydefs else: keydefs = default_keydefs for mname, itemlist in defs: menu = menudict.get(mname) if not menu: continue for item in itemlist: if not item: menu.add_separator() else: label, event = item underline, label = prepstr(label) accelerator = getaccelerator(keydefs, event) def command(text=text, event=event): text.event_generate(event) menu.add_command(label=label, underline=underline, command=command, accelerator=accelerator)