blob: 198055a2f113a2db410e866fa392cd2d3a3adbb5 [file] [log] [blame]
David Scherer7aced172000-08-15 01:13:23 +00001# changes by dscherer@cmu.edu
2# - FileList.open() takes an optional 3rd parameter action, which is
3# called instead of creating a new EditorWindow. This enables
4# things like 'open in same window'.
5
6import os
7from Tkinter import *
8import tkMessageBox
9
10import WindowList
11
12#$ event <<open-new-window>>
13#$ win <Control-n>
14#$ unix <Control-x><Control-n>
15
16# (This is labeled as 'Exit'in the File menu)
17#$ event <<close-all-windows>>
18#$ win <Control-q>
19#$ unix <Control-x><Control-c>
20
21class FileList:
22
23 from EditorWindow import EditorWindow
24 EditorWindow.Toplevel = WindowList.ListedToplevel # XXX Patch it!
25
26 def __init__(self, root):
27 self.root = root
28 self.dict = {}
29 self.inversedict = {}
30 self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables)
31
David Scherer7aced172000-08-15 01:13:23 +000032 def open(self, filename, action=None):
33 assert filename
34 filename = self.canonize(filename)
35 if os.path.isdir(filename):
36 tkMessageBox.showerror(
37 "Is A Directory",
Walter Dörwald70a6b492004-02-12 17:35:32 +000038 "The path %r is a directory." % (filename,),
David Scherer7aced172000-08-15 01:13:23 +000039 master=self.root)
40 return None
41 key = os.path.normcase(filename)
42 if self.dict.has_key(key):
43 edit = self.dict[key]
44 edit.wakeup()
45 return edit
46 if not os.path.exists(filename):
47 tkMessageBox.showinfo(
48 "New File",
Walter Dörwald70a6b492004-02-12 17:35:32 +000049 "Opening non-existent file %r" % (filename,),
David Scherer7aced172000-08-15 01:13:23 +000050 master=self.root)
51 if action is None:
52 return self.EditorWindow(self, filename, key)
53 else:
54 return action(filename)
55
Kurt B. Kaiserdf8a40f2001-07-14 04:45:32 +000056 def gotofileline(self, filename, lineno=None):
57 edit = self.open(filename)
58 if edit is not None and lineno is not None:
59 edit.gotoline(lineno)
60
Kurt B. Kaiserd2f48612003-06-05 02:34:04 +000061 def new(self, filename=None):
62 return self.EditorWindow(self, filename)
David Scherer7aced172000-08-15 01:13:23 +000063
David Scherer7aced172000-08-15 01:13:23 +000064 def close_all_callback(self, event):
65 for edit in self.inversedict.keys():
66 reply = edit.close()
67 if reply == "cancel":
68 break
69 return "break"
70
71 def close_edit(self, edit):
72 try:
73 key = self.inversedict[edit]
74 except KeyError:
75 print "Don't know this EditorWindow object. (close)"
76 return
77 if key:
78 del self.dict[key]
79 del self.inversedict[edit]
80 if not self.inversedict:
81 self.root.quit()
82
83 def filename_changed_edit(self, edit):
84 edit.saved_change_hook()
85 try:
86 key = self.inversedict[edit]
87 except KeyError:
88 print "Don't know this EditorWindow object. (rename)"
89 return
90 filename = edit.io.filename
91 if not filename:
92 if key:
93 del self.dict[key]
94 self.inversedict[edit] = None
95 return
96 filename = self.canonize(filename)
97 newkey = os.path.normcase(filename)
98 if newkey == key:
99 return
100 if self.dict.has_key(newkey):
101 conflict = self.dict[newkey]
102 self.inversedict[conflict] = None
103 tkMessageBox.showerror(
104 "Name Conflict",
Walter Dörwald70a6b492004-02-12 17:35:32 +0000105 "You now have multiple edit windows open for %r" % (filename,),
David Scherer7aced172000-08-15 01:13:23 +0000106 master=self.root)
107 self.dict[newkey] = edit
108 self.inversedict[edit] = newkey
109 if key:
110 try:
111 del self.dict[key]
112 except KeyError:
113 pass
114
115 def canonize(self, filename):
116 if not os.path.isabs(filename):
117 try:
118 pwd = os.getcwd()
119 except os.error:
120 pass
121 else:
122 filename = os.path.join(pwd, filename)
123 return os.path.normpath(filename)
124
125
Kurt B. Kaiserdf8a40f2001-07-14 04:45:32 +0000126def _test():
David Scherer7aced172000-08-15 01:13:23 +0000127 from EditorWindow import fixwordbreaks
128 import sys
129 root = Tk()
130 fixwordbreaks(root)
131 root.withdraw()
132 flist = FileList(root)
133 if sys.argv[1:]:
134 for filename in sys.argv[1:]:
135 flist.open(filename)
136 else:
137 flist.new()
138 if flist.inversedict:
139 root.mainloop()
140
141if __name__ == '__main__':
Kurt B. Kaiserdf8a40f2001-07-14 04:45:32 +0000142 _test()