132 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| "idlelib.filelist"
 | |
| 
 | |
| import os
 | |
| from tkinter import messagebox
 | |
| 
 | |
| 
 | |
| class FileList:
 | |
| 
 | |
|     # N.B. this import overridden in PyShellFileList.
 | |
|     from idlelib.editor import EditorWindow
 | |
| 
 | |
|     def __init__(self, root):
 | |
|         self.root = root
 | |
|         self.dict = {}
 | |
|         self.inversedict = {}
 | |
|         self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables)
 | |
| 
 | |
|     def open(self, filename, action=None):
 | |
|         assert filename
 | |
|         filename = self.canonize(filename)
 | |
|         if os.path.isdir(filename):
 | |
|             # This can happen when bad filename is passed on command line:
 | |
|             messagebox.showerror(
 | |
|                 "File Error",
 | |
|                 "%r is a directory." % (filename,),
 | |
|                 master=self.root)
 | |
|             return None
 | |
|         key = os.path.normcase(filename)
 | |
|         if key in self.dict:
 | |
|             edit = self.dict[key]
 | |
|             edit.top.wakeup()
 | |
|             return edit
 | |
|         if action:
 | |
|             # Don't create window, perform 'action', e.g. open in same window
 | |
|             return action(filename)
 | |
|         else:
 | |
|             edit = self.EditorWindow(self, filename, key)
 | |
|             if edit.good_load:
 | |
|                 return edit
 | |
|             else:
 | |
|                 edit._close()
 | |
|                 return None
 | |
| 
 | |
|     def gotofileline(self, filename, lineno=None):
 | |
|         edit = self.open(filename)
 | |
|         if edit is not None and lineno is not None:
 | |
|             edit.gotoline(lineno)
 | |
| 
 | |
|     def new(self, filename=None):
 | |
|         return self.EditorWindow(self, filename)
 | |
| 
 | |
|     def close_all_callback(self, *args, **kwds):
 | |
|         for edit in list(self.inversedict):
 | |
|             reply = edit.close()
 | |
|             if reply == "cancel":
 | |
|                 break
 | |
|         return "break"
 | |
| 
 | |
|     def unregister_maybe_terminate(self, edit):
 | |
|         try:
 | |
|             key = self.inversedict[edit]
 | |
|         except KeyError:
 | |
|             print("Don't know this EditorWindow object.  (close)")
 | |
|             return
 | |
|         if key:
 | |
|             del self.dict[key]
 | |
|         del self.inversedict[edit]
 | |
|         if not self.inversedict:
 | |
|             self.root.quit()
 | |
| 
 | |
|     def filename_changed_edit(self, edit):
 | |
|         edit.saved_change_hook()
 | |
|         try:
 | |
|             key = self.inversedict[edit]
 | |
|         except KeyError:
 | |
|             print("Don't know this EditorWindow object.  (rename)")
 | |
|             return
 | |
|         filename = edit.io.filename
 | |
|         if not filename:
 | |
|             if key:
 | |
|                 del self.dict[key]
 | |
|             self.inversedict[edit] = None
 | |
|             return
 | |
|         filename = self.canonize(filename)
 | |
|         newkey = os.path.normcase(filename)
 | |
|         if newkey == key:
 | |
|             return
 | |
|         if newkey in self.dict:
 | |
|             conflict = self.dict[newkey]
 | |
|             self.inversedict[conflict] = None
 | |
|             messagebox.showerror(
 | |
|                 "Name Conflict",
 | |
|                 "You now have multiple edit windows open for %r" % (filename,),
 | |
|                 master=self.root)
 | |
|         self.dict[newkey] = edit
 | |
|         self.inversedict[edit] = newkey
 | |
|         if key:
 | |
|             try:
 | |
|                 del self.dict[key]
 | |
|             except KeyError:
 | |
|                 pass
 | |
| 
 | |
|     def canonize(self, filename):
 | |
|         if not os.path.isabs(filename):
 | |
|             try:
 | |
|                 pwd = os.getcwd()
 | |
|             except OSError:
 | |
|                 pass
 | |
|             else:
 | |
|                 filename = os.path.join(pwd, filename)
 | |
|         return os.path.normpath(filename)
 | |
| 
 | |
| 
 | |
| def _test():  # TODO check and convert to htest
 | |
|     from tkinter import Tk
 | |
|     from idlelib.editor import fixwordbreaks
 | |
|     from idlelib.run import fix_scaling
 | |
|     root = Tk()
 | |
|     fix_scaling(root)
 | |
|     fixwordbreaks(root)
 | |
|     root.withdraw()
 | |
|     flist = FileList(root)
 | |
|     flist.new()
 | |
|     if flist.inversedict:
 | |
|         root.mainloop()
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     from unittest import main
 | |
|     main('idlelib.idle_test.test_filelist', verbosity=2)
 | |
| 
 | |
| #    _test()
 |