FileList.py 3.72 KB
Newer Older
David Scherer's avatar
David Scherer committed
1
import os
2 3
from tkinter import *
import tkinter.messagebox as tkMessageBox
David Scherer's avatar
David Scherer committed
4 5 6 7


class FileList:

8 9
    # N.B. this import overridden in PyShellFileList.
    from idlelib.EditorWindow import EditorWindow
David Scherer's avatar
David Scherer committed
10 11 12 13 14 15 16 17 18 19 20

    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):
21
            # This can happen when bad filename is passed on command line:
David Scherer's avatar
David Scherer committed
22
            tkMessageBox.showerror(
23 24
                "File Error",
                "%r is a directory." % (filename,),
David Scherer's avatar
David Scherer committed
25 26 27
                master=self.root)
            return None
        key = os.path.normcase(filename)
28
        if key in self.dict:
David Scherer's avatar
David Scherer committed
29
            edit = self.dict[key]
30
            edit.top.wakeup()
David Scherer's avatar
David Scherer committed
31
            return edit
32 33
        if action:
            # Don't create window, perform 'action', e.g. open in same window
David Scherer's avatar
David Scherer committed
34
            return action(filename)
35
        else:
36 37 38 39 40 41
            edit = self.EditorWindow(self, filename, key)
            if edit.good_load:
                return edit
            else:
                edit._close()
                return None
David Scherer's avatar
David Scherer committed
42

43 44 45 46 47
    def gotofileline(self, filename, lineno=None):
        edit = self.open(filename)
        if edit is not None and lineno is not None:
            edit.gotoline(lineno)

48 49
    def new(self, filename=None):
        return self.EditorWindow(self, filename)
David Scherer's avatar
David Scherer committed
50

51
    def close_all_callback(self, *args, **kwds):
52
        for edit in list(self.inversedict):
David Scherer's avatar
David Scherer committed
53 54 55 56 57
            reply = edit.close()
            if reply == "cancel":
                break
        return "break"

58
    def unregister_maybe_terminate(self, edit):
David Scherer's avatar
David Scherer committed
59 60 61
        try:
            key = self.inversedict[edit]
        except KeyError:
62
            print("Don't know this EditorWindow object.  (close)")
David Scherer's avatar
David Scherer committed
63 64 65 66 67 68 69 70 71 72 73 74
            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:
75
            print("Don't know this EditorWindow object.  (rename)")
David Scherer's avatar
David Scherer committed
76 77 78 79 80 81 82 83 84 85 86
            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
87
        if newkey in self.dict:
David Scherer's avatar
David Scherer committed
88 89 90 91
            conflict = self.dict[newkey]
            self.inversedict[conflict] = None
            tkMessageBox.showerror(
                "Name Conflict",
92
                "You now have multiple edit windows open for %r" % (filename,),
David Scherer's avatar
David Scherer committed
93 94 95 96 97 98 99 100 101 102 103 104 105
                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()
106
            except OSError:
David Scherer's avatar
David Scherer committed
107 108 109 110 111 112
                pass
            else:
                filename = os.path.join(pwd, filename)
        return os.path.normpath(filename)


113
def _test():
114
    from idlelib.EditorWindow import fixwordbreaks
David Scherer's avatar
David Scherer committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128
    import sys
    root = Tk()
    fixwordbreaks(root)
    root.withdraw()
    flist = FileList(root)
    if sys.argv[1:]:
        for filename in sys.argv[1:]:
            flist.open(filename)
    else:
        flist.new()
    if flist.inversedict:
        root.mainloop()

if __name__ == '__main__':
129
    _test()