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