blob: db862a13f675e27a67323d5c0e8a9694b2450aa2 [file] [log] [blame]
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +00001import os
2from Tkinter import *
3import tkMessageBox
4
Guido van Rossum504b0bf1999-01-02 21:28:54 +00005import WindowList
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +00006
Guido van Rossum504b0bf1999-01-02 21:28:54 +00007#$ event <<open-new-window>>
8#$ win <Control-n>
9#$ unix <Control-x><Control-n>
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000010
Guido van Rossum504b0bf1999-01-02 21:28:54 +000011# (This is labeled as 'Exit'in the File menu)
12#$ event <<close-all-windows>>
13#$ win <Control-q>
14#$ unix <Control-x><Control-c>
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000015
16class FileList:
Guido van Rossum504b0bf1999-01-02 21:28:54 +000017
18 from EditorWindow import EditorWindow
19 EditorWindow.Toplevel = WindowList.ListedToplevel # XXX Patch it!
20
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000021 def __init__(self, root):
22 self.root = root
23 self.dict = {}
24 self.inversedict = {}
Guido van Rossumb7ebb831999-01-28 22:24:30 +000025 self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000026
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000027
Guido van Rossum504b0bf1999-01-02 21:28:54 +000028 def goodname(self, filename):
Tim Peters70c43782001-01-17 08:48:39 +000029 filename = self.canonize(filename)
30 key = os.path.normcase(filename)
31 if self.dict.has_key(key):
32 edit = self.dict[key]
33 filename = edit.io.filename or filename
34 return filename
Guido van Rossum504b0bf1999-01-02 21:28:54 +000035
36 def open(self, filename):
37 assert filename
38 filename = self.canonize(filename)
39 if os.path.isdir(filename):
40 tkMessageBox.showerror(
41 "Is A Directory",
42 "The path %s is a directory." % `filename`,
43 master=self.root)
44 return None
45 key = os.path.normcase(filename)
46 if self.dict.has_key(key):
47 edit = self.dict[key]
48 edit.wakeup()
49 return edit
50 if not os.path.exists(filename):
51 tkMessageBox.showinfo(
52 "New File",
53 "Opening non-existent file %s" % `filename`,
54 master=self.root)
55 return self.EditorWindow(self, filename, key)
56
57 def new(self):
58 return self.EditorWindow(self)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000059
60 def new_callback(self, event):
61 self.new()
62 return "break"
63
64 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",
105 "You now have multiple edit windows open for %s" % `filename`,
106 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
126def test():
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000127 from EditorWindow import fixwordbreaks
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000128 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__':
142 test()