| Tim Peters | 231c3c8 | 2006-06-11 19:43:49 +0000 | [diff] [blame] | 1 | """ | 
 | 2 | A number of function that enhance IDLE on MacOSX when it used as a normal | 
 | 3 | GUI application (as opposed to an X11 application). | 
 | 4 | """ | 
 | 5 | import sys | 
| Ronald Oussoren | 43f1f68 | 2007-07-09 05:46:04 +0000 | [diff] [blame^] | 6 | import Tkinter | 
| Tim Peters | 231c3c8 | 2006-06-11 19:43:49 +0000 | [diff] [blame] | 7 |  | 
 | 8 | def runningAsOSXApp(): | 
 | 9 |     """ Returns True iff running from the IDLE.app bundle on OSX """ | 
 | 10 |     return (sys.platform == 'darwin' and 'IDLE.app' in sys.argv[0]) | 
 | 11 |  | 
 | 12 | def addOpenEventSupport(root, flist): | 
 | 13 |     """ | 
 | 14 |     This ensures that the application will respont to open AppleEvents, which | 
 | 15 |     makes is feaseable to use IDLE as the default application for python files. | 
 | 16 |     """ | 
 | 17 |     def doOpenFile(*args): | 
 | 18 |         for fn in args: | 
 | 19 |             flist.open(fn) | 
 | 20 |  | 
 | 21 |     # The command below is a hook in aquatk that is called whenever the app | 
 | 22 |     # receives a file open event. The callback can have multiple arguments, | 
 | 23 |     # one for every file that should be opened. | 
 | 24 |     root.createcommand("::tk::mac::OpenDocument", doOpenFile) | 
 | 25 |  | 
 | 26 | def hideTkConsole(root): | 
| Ronald Oussoren | 43f1f68 | 2007-07-09 05:46:04 +0000 | [diff] [blame^] | 27 |     try: | 
 | 28 |         root.tk.call('console', 'hide') | 
 | 29 |     except Tkinter.TclError: | 
 | 30 |         # Some versions of the Tk framework don't have a console object | 
 | 31 |         pass | 
| Tim Peters | 231c3c8 | 2006-06-11 19:43:49 +0000 | [diff] [blame] | 32 |  | 
| Ronald Oussoren | 8133f9d | 2006-07-23 09:46:11 +0000 | [diff] [blame] | 33 | def overrideRootMenu(root, flist): | 
 | 34 |     """ | 
 | 35 |     Replace the Tk root menu by something that's more appropriate for | 
 | 36 |     IDLE. | 
 | 37 |     """ | 
| Tim Peters | 0bbfd83 | 2006-07-24 21:02:15 +0000 | [diff] [blame] | 38 |     # The menu that is attached to the Tk root (".") is also used by AquaTk for | 
| Ronald Oussoren | 8133f9d | 2006-07-23 09:46:11 +0000 | [diff] [blame] | 39 |     # all windows that don't specify a menu of their own. The default menubar | 
 | 40 |     # contains a number of menus, none of which are appropriate for IDLE. The | 
 | 41 |     # Most annoying of those is an 'About Tck/Tk...' menu in the application | 
 | 42 |     # menu. | 
 | 43 |     # | 
 | 44 |     # This function replaces the default menubar by a mostly empty one, it | 
 | 45 |     # should only contain the correct application menu and the window menu. | 
 | 46 |     # | 
 | 47 |     # Due to a (mis-)feature of TkAqua the user will also see an empty Help | 
 | 48 |     # menu. | 
 | 49 |     from Tkinter import Menu, Text, Text | 
 | 50 |     from EditorWindow import prepstr, get_accelerator | 
 | 51 |     import Bindings | 
 | 52 |     import WindowList | 
 | 53 |     from MultiCall import MultiCallCreator | 
 | 54 |  | 
 | 55 |     menubar = Menu(root) | 
 | 56 |     root.configure(menu=menubar) | 
 | 57 |     menudict = {} | 
 | 58 |  | 
 | 59 |     menudict['windows'] = menu = Menu(menubar, name='windows') | 
 | 60 |     menubar.add_cascade(label='Window', menu=menu, underline=0) | 
 | 61 |  | 
 | 62 |     def postwindowsmenu(menu=menu): | 
 | 63 |         end = menu.index('end') | 
 | 64 |         if end is None: | 
 | 65 |             end = -1 | 
 | 66 |  | 
 | 67 |         if end > 0: | 
 | 68 |             menu.delete(0, end) | 
 | 69 |         WindowList.add_windows_to_menu(menu) | 
 | 70 |     WindowList.register_callback(postwindowsmenu) | 
 | 71 |  | 
 | 72 |     menudict['application'] = menu = Menu(menubar, name='apple') | 
 | 73 |     menubar.add_cascade(label='IDLE', menu=menu) | 
 | 74 |  | 
 | 75 |     def about_dialog(event=None): | 
 | 76 |         import aboutDialog | 
 | 77 |         aboutDialog.AboutDialog(root, 'About IDLE') | 
 | 78 |  | 
 | 79 |     def config_dialog(event=None): | 
 | 80 |         import configDialog | 
 | 81 |         configDialog.ConfigDialog(root, 'Settings') | 
 | 82 |  | 
 | 83 |     root.bind('<<about-idle>>', about_dialog) | 
 | 84 |     root.bind('<<open-config-dialog>>', config_dialog) | 
 | 85 |     if flist: | 
 | 86 |         root.bind('<<close-all-windows>>', flist.close_all_callback) | 
 | 87 |  | 
 | 88 |     for mname, entrylist in Bindings.menudefs: | 
 | 89 |         menu = menudict.get(mname) | 
| Tim Peters | 0bbfd83 | 2006-07-24 21:02:15 +0000 | [diff] [blame] | 90 |         if not menu: | 
| Ronald Oussoren | 8133f9d | 2006-07-23 09:46:11 +0000 | [diff] [blame] | 91 |             continue | 
 | 92 |         for entry in entrylist: | 
 | 93 |             if not entry: | 
 | 94 |                 menu.add_separator() | 
 | 95 |             else: | 
 | 96 |                 label, eventname = entry | 
 | 97 |                 underline, label = prepstr(label) | 
| Tim Peters | 0bbfd83 | 2006-07-24 21:02:15 +0000 | [diff] [blame] | 98 |                 accelerator = get_accelerator(Bindings.default_keydefs, | 
| Ronald Oussoren | 8133f9d | 2006-07-23 09:46:11 +0000 | [diff] [blame] | 99 |                         eventname) | 
 | 100 |                 def command(text=root, eventname=eventname): | 
 | 101 |                     text.event_generate(eventname) | 
 | 102 |                 menu.add_command(label=label, underline=underline, | 
 | 103 |                         command=command, accelerator=accelerator) | 
 | 104 |  | 
| Tim Peters | 0bbfd83 | 2006-07-24 21:02:15 +0000 | [diff] [blame] | 105 |  | 
| Ronald Oussoren | 8133f9d | 2006-07-23 09:46:11 +0000 | [diff] [blame] | 106 |  | 
 | 107 |  | 
| Tim Peters | 231c3c8 | 2006-06-11 19:43:49 +0000 | [diff] [blame] | 108 |  | 
 | 109 | def setupApp(root, flist): | 
 | 110 |     """ | 
 | 111 |     Perform setup for the OSX application bundle. | 
 | 112 |     """ | 
 | 113 |     if not runningAsOSXApp(): return | 
 | 114 |  | 
 | 115 |     hideTkConsole(root) | 
| Ronald Oussoren | 8133f9d | 2006-07-23 09:46:11 +0000 | [diff] [blame] | 116 |     overrideRootMenu(root, flist) | 
| Tim Peters | 231c3c8 | 2006-06-11 19:43:49 +0000 | [diff] [blame] | 117 |     addOpenEventSupport(root, flist) |