blob: 4c0076d3b6f5e05f035d1ad32712db1d0d1d57f1 [file] [log] [blame]
David Scherer7aced172000-08-15 01:13:23 +00001import os
Georg Brandl14fc4272008-05-17 18:39:55 +00002from tkinter import *
3import tkinter.messagebox as tkMessageBox
David Scherer7aced172000-08-15 01:13:23 +00004
David Scherer7aced172000-08-15 01:13:23 +00005
6class FileList:
7
Kurt B. Kaiser2d7f6a02007-08-22 23:01:33 +00008 # N.B. this import overridden in PyShellFileList.
9 from idlelib.EditorWindow import EditorWindow
David Scherer7aced172000-08-15 01:13:23 +000010
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
David Scherer7aced172000-08-15 01:13:23 +000017 def open(self, filename, action=None):
18 assert filename
19 filename = self.canonize(filename)
20 if os.path.isdir(filename):
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000021 # This can happen when bad filename is passed on command line:
David Scherer7aced172000-08-15 01:13:23 +000022 tkMessageBox.showerror(
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000023 "File Error",
24 "%r is a directory." % (filename,),
David Scherer7aced172000-08-15 01:13:23 +000025 master=self.root)
26 return None
27 key = os.path.normcase(filename)
Guido van Rossum811c4e02006-08-22 15:45:46 +000028 if key in self.dict:
David Scherer7aced172000-08-15 01:13:23 +000029 edit = self.dict[key]
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000030 edit.top.wakeup()
David Scherer7aced172000-08-15 01:13:23 +000031 return edit
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000032 if action:
33 # Don't create window, perform 'action', e.g. open in same window
David Scherer7aced172000-08-15 01:13:23 +000034 return action(filename)
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000035 else:
Kurt B. Kaiser105f60e2007-09-06 04:03:04 +000036 edit = self.EditorWindow(self, filename, key)
37 if edit.good_load:
38 return edit
39 else:
40 edit._close()
41 return None
David Scherer7aced172000-08-15 01:13:23 +000042
Kurt B. Kaiserdf8a40f2001-07-14 04:45:32 +000043 def gotofileline(self, filename, lineno=None):
44 edit = self.open(filename)
45 if edit is not None and lineno is not None:
46 edit.gotoline(lineno)
47
Kurt B. Kaiserd2f48612003-06-05 02:34:04 +000048 def new(self, filename=None):
49 return self.EditorWindow(self, filename)
David Scherer7aced172000-08-15 01:13:23 +000050
David Scherer7aced172000-08-15 01:13:23 +000051 def close_all_callback(self, event):
Guido van Rossumb5a755e2007-07-18 18:15:48 +000052 for edit in list(self.inversedict):
David Scherer7aced172000-08-15 01:13:23 +000053 reply = edit.close()
54 if reply == "cancel":
55 break
56 return "break"
57
Guido van Rossum8ce8a782007-11-01 19:42:39 +000058 def unregister_maybe_terminate(self, edit):
David Scherer7aced172000-08-15 01:13:23 +000059 try:
60 key = self.inversedict[edit]
61 except KeyError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000062 print("Don't know this EditorWindow object. (close)")
David Scherer7aced172000-08-15 01:13:23 +000063 return
64 if key:
65 del self.dict[key]
66 del self.inversedict[edit]
67 if not self.inversedict:
68 self.root.quit()
69
70 def filename_changed_edit(self, edit):
71 edit.saved_change_hook()
72 try:
73 key = self.inversedict[edit]
74 except KeyError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000075 print("Don't know this EditorWindow object. (rename)")
David Scherer7aced172000-08-15 01:13:23 +000076 return
77 filename = edit.io.filename
78 if not filename:
79 if key:
80 del self.dict[key]
81 self.inversedict[edit] = None
82 return
83 filename = self.canonize(filename)
84 newkey = os.path.normcase(filename)
85 if newkey == key:
86 return
Guido van Rossum811c4e02006-08-22 15:45:46 +000087 if newkey in self.dict:
David Scherer7aced172000-08-15 01:13:23 +000088 conflict = self.dict[newkey]
89 self.inversedict[conflict] = None
90 tkMessageBox.showerror(
91 "Name Conflict",
Walter Dörwald70a6b492004-02-12 17:35:32 +000092 "You now have multiple edit windows open for %r" % (filename,),
David Scherer7aced172000-08-15 01:13:23 +000093 master=self.root)
94 self.dict[newkey] = edit
95 self.inversedict[edit] = newkey
96 if key:
97 try:
98 del self.dict[key]
99 except KeyError:
100 pass
101
102 def canonize(self, filename):
103 if not os.path.isabs(filename):
104 try:
105 pwd = os.getcwd()
106 except os.error:
107 pass
108 else:
109 filename = os.path.join(pwd, filename)
110 return os.path.normpath(filename)
111
112
Kurt B. Kaiserdf8a40f2001-07-14 04:45:32 +0000113def _test():
Kurt B. Kaiser2d7f6a02007-08-22 23:01:33 +0000114 from idlelib.EditorWindow import fixwordbreaks
David Scherer7aced172000-08-15 01:13:23 +0000115 import sys
116 root = Tk()
117 fixwordbreaks(root)
118 root.withdraw()
119 flist = FileList(root)
120 if sys.argv[1:]:
121 for filename in sys.argv[1:]:
122 flist.open(filename)
123 else:
124 flist.new()
125 if flist.inversedict:
126 root.mainloop()
127
128if __name__ == '__main__':
Kurt B. Kaiserdf8a40f2001-07-14 04:45:32 +0000129 _test()