17db96d56Sopenharmony_ci"idlelib.filelist" 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciimport os 47db96d56Sopenharmony_cifrom tkinter import messagebox 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ciclass FileList: 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci # N.B. this import overridden in PyShellFileList. 107db96d56Sopenharmony_ci from idlelib.editor import EditorWindow 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci def __init__(self, root): 137db96d56Sopenharmony_ci self.root = root 147db96d56Sopenharmony_ci self.dict = {} 157db96d56Sopenharmony_ci self.inversedict = {} 167db96d56Sopenharmony_ci self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables) 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci def open(self, filename, action=None): 197db96d56Sopenharmony_ci assert filename 207db96d56Sopenharmony_ci filename = self.canonize(filename) 217db96d56Sopenharmony_ci if os.path.isdir(filename): 227db96d56Sopenharmony_ci # This can happen when bad filename is passed on command line: 237db96d56Sopenharmony_ci messagebox.showerror( 247db96d56Sopenharmony_ci "File Error", 257db96d56Sopenharmony_ci f"{filename!r} is a directory.", 267db96d56Sopenharmony_ci master=self.root) 277db96d56Sopenharmony_ci return None 287db96d56Sopenharmony_ci key = os.path.normcase(filename) 297db96d56Sopenharmony_ci if key in self.dict: 307db96d56Sopenharmony_ci edit = self.dict[key] 317db96d56Sopenharmony_ci edit.top.wakeup() 327db96d56Sopenharmony_ci return edit 337db96d56Sopenharmony_ci if action: 347db96d56Sopenharmony_ci # Don't create window, perform 'action', e.g. open in same window 357db96d56Sopenharmony_ci return action(filename) 367db96d56Sopenharmony_ci else: 377db96d56Sopenharmony_ci edit = self.EditorWindow(self, filename, key) 387db96d56Sopenharmony_ci if edit.good_load: 397db96d56Sopenharmony_ci return edit 407db96d56Sopenharmony_ci else: 417db96d56Sopenharmony_ci edit._close() 427db96d56Sopenharmony_ci return None 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci def gotofileline(self, filename, lineno=None): 457db96d56Sopenharmony_ci edit = self.open(filename) 467db96d56Sopenharmony_ci if edit is not None and lineno is not None: 477db96d56Sopenharmony_ci edit.gotoline(lineno) 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci def new(self, filename=None): 507db96d56Sopenharmony_ci return self.EditorWindow(self, filename) 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci def close_all_callback(self, *args, **kwds): 537db96d56Sopenharmony_ci for edit in list(self.inversedict): 547db96d56Sopenharmony_ci reply = edit.close() 557db96d56Sopenharmony_ci if reply == "cancel": 567db96d56Sopenharmony_ci break 577db96d56Sopenharmony_ci return "break" 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci def unregister_maybe_terminate(self, edit): 607db96d56Sopenharmony_ci try: 617db96d56Sopenharmony_ci key = self.inversedict[edit] 627db96d56Sopenharmony_ci except KeyError: 637db96d56Sopenharmony_ci print("Don't know this EditorWindow object. (close)") 647db96d56Sopenharmony_ci return 657db96d56Sopenharmony_ci if key: 667db96d56Sopenharmony_ci del self.dict[key] 677db96d56Sopenharmony_ci del self.inversedict[edit] 687db96d56Sopenharmony_ci if not self.inversedict: 697db96d56Sopenharmony_ci self.root.quit() 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci def filename_changed_edit(self, edit): 727db96d56Sopenharmony_ci edit.saved_change_hook() 737db96d56Sopenharmony_ci try: 747db96d56Sopenharmony_ci key = self.inversedict[edit] 757db96d56Sopenharmony_ci except KeyError: 767db96d56Sopenharmony_ci print("Don't know this EditorWindow object. (rename)") 777db96d56Sopenharmony_ci return 787db96d56Sopenharmony_ci filename = edit.io.filename 797db96d56Sopenharmony_ci if not filename: 807db96d56Sopenharmony_ci if key: 817db96d56Sopenharmony_ci del self.dict[key] 827db96d56Sopenharmony_ci self.inversedict[edit] = None 837db96d56Sopenharmony_ci return 847db96d56Sopenharmony_ci filename = self.canonize(filename) 857db96d56Sopenharmony_ci newkey = os.path.normcase(filename) 867db96d56Sopenharmony_ci if newkey == key: 877db96d56Sopenharmony_ci return 887db96d56Sopenharmony_ci if newkey in self.dict: 897db96d56Sopenharmony_ci conflict = self.dict[newkey] 907db96d56Sopenharmony_ci self.inversedict[conflict] = None 917db96d56Sopenharmony_ci messagebox.showerror( 927db96d56Sopenharmony_ci "Name Conflict", 937db96d56Sopenharmony_ci f"You now have multiple edit windows open for {filename!r}", 947db96d56Sopenharmony_ci master=self.root) 957db96d56Sopenharmony_ci self.dict[newkey] = edit 967db96d56Sopenharmony_ci self.inversedict[edit] = newkey 977db96d56Sopenharmony_ci if key: 987db96d56Sopenharmony_ci try: 997db96d56Sopenharmony_ci del self.dict[key] 1007db96d56Sopenharmony_ci except KeyError: 1017db96d56Sopenharmony_ci pass 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci def canonize(self, filename): 1047db96d56Sopenharmony_ci if not os.path.isabs(filename): 1057db96d56Sopenharmony_ci try: 1067db96d56Sopenharmony_ci pwd = os.getcwd() 1077db96d56Sopenharmony_ci except OSError: 1087db96d56Sopenharmony_ci pass 1097db96d56Sopenharmony_ci else: 1107db96d56Sopenharmony_ci filename = os.path.join(pwd, filename) 1117db96d56Sopenharmony_ci return os.path.normpath(filename) 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci 1147db96d56Sopenharmony_cidef _test(): # TODO check and convert to htest 1157db96d56Sopenharmony_ci from tkinter import Tk 1167db96d56Sopenharmony_ci from idlelib.editor import fixwordbreaks 1177db96d56Sopenharmony_ci from idlelib.run import fix_scaling 1187db96d56Sopenharmony_ci root = Tk() 1197db96d56Sopenharmony_ci fix_scaling(root) 1207db96d56Sopenharmony_ci fixwordbreaks(root) 1217db96d56Sopenharmony_ci root.withdraw() 1227db96d56Sopenharmony_ci flist = FileList(root) 1237db96d56Sopenharmony_ci flist.new() 1247db96d56Sopenharmony_ci if flist.inversedict: 1257db96d56Sopenharmony_ci root.mainloop() 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ciif __name__ == '__main__': 1287db96d56Sopenharmony_ci from unittest import main 1297db96d56Sopenharmony_ci main('idlelib.idle_test.test_filelist', verbosity=2) 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci# _test() 132