1 import os 2 from Tkinter import * 3 import tkMessageBox 4 5 6 class FileList: 7 8 # N.B. this import overridden in PyShellFileList. 9 from idlelib.EditorWindow import EditorWindow 10 11 def __init__(self, root): 12 self.root = root 13 self.dict = {} 14 self.inversedict = {} 15 self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables) 16 17 def open(self, filename, action=None): 18 assert filename 19 filename = self.canonize(filename) 20 if os.path.isdir(filename): 21 # This can happen when bad filename is passed on command line: 22 tkMessageBox.showerror( 23 "File Error", 24 "%r is a directory." % (filename,), 25 master=self.root) 26 return None 27 key = os.path.normcase(filename) 28 if key in self.dict: 29 edit = self.dict[key] 30 edit.top.wakeup() 31 return edit 32 if action: 33 # Don't create window, perform 'action', e.g. open in same window 34 return action(filename) 35 else: 36 return self.EditorWindow(self, filename, key) 37 38 def gotofileline(self, filename, lineno=None): 39 edit = self.open(filename) 40 if edit is not None and lineno is not None: 41 edit.gotoline(lineno) 42 43 def new(self, filename=None): 44 return self.EditorWindow(self, filename) 45 46 def close_all_callback(self, *args, **kwds): 47 for edit in self.inversedict.keys(): 48 reply = edit.close() 49 if reply == "cancel": 50 break 51 return "break" 52 53 def unregister_maybe_terminate(self, edit): 54 try: 55 key = self.inversedict[edit] 56 except KeyError: 57 print "Don't know this EditorWindow object. (close)" 58 return 59 if key: 60 del self.dict[key] 61 del self.inversedict[edit] 62 if not self.inversedict: 63 self.root.quit() 64 65 def filename_changed_edit(self, edit): 66 edit.saved_change_hook() 67 try: 68 key = self.inversedict[edit] 69 except KeyError: 70 print "Don't know this EditorWindow object. (rename)" 71 return 72 filename = edit.io.filename 73 if not filename: 74 if key: 75 del self.dict[key] 76 self.inversedict[edit] = None 77 return 78 filename = self.canonize(filename) 79 newkey = os.path.normcase(filename) 80 if newkey == key: 81 return 82 if newkey in self.dict: 83 conflict = self.dict[newkey] 84 self.inversedict[conflict] = None 85 tkMessageBox.showerror( 86 "Name Conflict", 87 "You now have multiple edit windows open for %r" % (filename,), 88 master=self.root) 89 self.dict[newkey] = edit 90 self.inversedict[edit] = newkey 91 if key: 92 try: 93 del self.dict[key] 94 except KeyError: 95 pass 96 97 def canonize(self, filename): 98 if not os.path.isabs(filename): 99 try: 100 pwd = os.getcwd() 101 except os.error: 102 pass 103 else: 104 filename = os.path.join(pwd, filename) 105 return os.path.normpath(filename) 106 107 108 def _test(): 109 from idlelib.EditorWindow import fixwordbreaks 110 import sys 111 root = Tk() 112 fixwordbreaks(root) 113 root.withdraw() 114 flist = FileList(root) 115 if sys.argv[1:]: 116 for filename in sys.argv[1:]: 117 flist.open(filename) 118 else: 119 flist.new() 120 if flist.inversedict: 121 root.mainloop() 122 123 if __name__ == '__main__': 124 _test() 125