- Got rid of newmodule.c
[python/dscho.git] / Tools / idle / FileList.py
blob0a1c81a7ca8d29e4c601a7570e5b2d73d475e648
1 import os
2 from Tkinter import *
3 import tkMessageBox
5 import WindowList
7 #$ event <<open-new-window>>
8 #$ win <Control-n>
9 #$ unix <Control-x><Control-n>
11 # (This is labeled as 'Exit'in the File menu)
12 #$ event <<close-all-windows>>
13 #$ win <Control-q>
14 #$ unix <Control-x><Control-c>
16 class FileList:
18 from EditorWindow import EditorWindow
19 EditorWindow.Toplevel = WindowList.ListedToplevel # XXX Patch it!
21 def __init__(self, root):
22 self.root = root
23 self.dict = {}
24 self.inversedict = {}
25 self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables)
27 def open(self, filename):
28 assert filename
29 filename = self.canonize(filename)
30 if os.path.isdir(filename):
31 tkMessageBox.showerror(
32 "Is A Directory",
33 "The path %s is a directory." % `filename`,
34 master=self.root)
35 return None
36 key = os.path.normcase(filename)
37 if self.dict.has_key(key):
38 edit = self.dict[key]
39 edit.wakeup()
40 return edit
41 if not os.path.exists(filename):
42 tkMessageBox.showinfo(
43 "New File",
44 "Opening non-existent file %s" % `filename`,
45 master=self.root)
46 return self.EditorWindow(self, filename, key)
48 def gotofileline(self, filename, lineno=None):
49 edit = self.open(filename)
50 if edit is not None and lineno is not None:
51 edit.gotoline(lineno)
53 def new(self):
54 return self.EditorWindow(self)
56 def new_callback(self, event):
57 self.new()
58 return "break"
60 def close_all_callback(self, event):
61 for edit in self.inversedict.keys():
62 reply = edit.close()
63 if reply == "cancel":
64 break
65 return "break"
67 def close_edit(self, edit):
68 try:
69 key = self.inversedict[edit]
70 except KeyError:
71 print "Don't know this EditorWindow object. (close)"
72 return
73 if key:
74 del self.dict[key]
75 del self.inversedict[edit]
76 if not self.inversedict:
77 self.root.quit()
79 def filename_changed_edit(self, edit):
80 edit.saved_change_hook()
81 try:
82 key = self.inversedict[edit]
83 except KeyError:
84 print "Don't know this EditorWindow object. (rename)"
85 return
86 filename = edit.io.filename
87 if not filename:
88 if key:
89 del self.dict[key]
90 self.inversedict[edit] = None
91 return
92 filename = self.canonize(filename)
93 newkey = os.path.normcase(filename)
94 if newkey == key:
95 return
96 if self.dict.has_key(newkey):
97 conflict = self.dict[newkey]
98 self.inversedict[conflict] = None
99 tkMessageBox.showerror(
100 "Name Conflict",
101 "You now have multiple edit windows open for %s" % `filename`,
102 master=self.root)
103 self.dict[newkey] = edit
104 self.inversedict[edit] = newkey
105 if key:
106 try:
107 del self.dict[key]
108 except KeyError:
109 pass
111 def canonize(self, filename):
112 if not os.path.isabs(filename):
113 try:
114 pwd = os.getcwd()
115 except os.error:
116 pass
117 else:
118 filename = os.path.join(pwd, filename)
119 return os.path.normpath(filename)
122 def _test():
123 from EditorWindow import fixwordbreaks
124 import sys
125 root = Tk()
126 fixwordbreaks(root)
127 root.withdraw()
128 flist = FileList(root)
129 if sys.argv[1:]:
130 for filename in sys.argv[1:]:
131 flist.open(filename)
132 else:
133 flist.new()
134 if flist.inversedict:
135 root.mainloop()
137 if __name__ == '__main__':
138 _test()