Use full package paths in imports.
[python/dscho.git] / Lib / idlelib / FileList.py
blobe01ce3c47cc165e2e580603b38c5b95543891663
1 # 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'.
6 import os
7 from Tkinter import *
8 import tkMessageBox
10 import WindowList
12 #$ event <<open-new-window>>
13 #$ win <Control-n>
14 #$ unix <Control-x><Control-n>
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>
21 class FileList:
23 from EditorWindow import EditorWindow
24 EditorWindow.Toplevel = WindowList.ListedToplevel # XXX Patch it!
26 def __init__(self, root):
27 self.root = root
28 self.dict = {}
29 self.inversedict = {}
30 self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables)
32 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",
38 "The path %s is a directory." % `filename`,
39 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",
49 "Opening non-existent file %s" % `filename`,
50 master=self.root)
51 if action is None:
52 return self.EditorWindow(self, filename, key)
53 else:
54 return action(filename)
56 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)
61 def new(self):
62 return self.EditorWindow(self)
64 def new_callback(self, event):
65 self.new()
66 return "break"
68 def close_all_callback(self, event):
69 for edit in self.inversedict.keys():
70 reply = edit.close()
71 if reply == "cancel":
72 break
73 return "break"
75 def close_edit(self, edit):
76 try:
77 key = self.inversedict[edit]
78 except KeyError:
79 print "Don't know this EditorWindow object. (close)"
80 return
81 if key:
82 del self.dict[key]
83 del self.inversedict[edit]
84 if not self.inversedict:
85 self.root.quit()
87 def filename_changed_edit(self, edit):
88 edit.saved_change_hook()
89 try:
90 key = self.inversedict[edit]
91 except KeyError:
92 print "Don't know this EditorWindow object. (rename)"
93 return
94 filename = edit.io.filename
95 if not filename:
96 if key:
97 del self.dict[key]
98 self.inversedict[edit] = None
99 return
100 filename = self.canonize(filename)
101 newkey = os.path.normcase(filename)
102 if newkey == key:
103 return
104 if self.dict.has_key(newkey):
105 conflict = self.dict[newkey]
106 self.inversedict[conflict] = None
107 tkMessageBox.showerror(
108 "Name Conflict",
109 "You now have multiple edit windows open for %s" % `filename`,
110 master=self.root)
111 self.dict[newkey] = edit
112 self.inversedict[edit] = newkey
113 if key:
114 try:
115 del self.dict[key]
116 except KeyError:
117 pass
119 def canonize(self, filename):
120 if not os.path.isabs(filename):
121 try:
122 pwd = os.getcwd()
123 except os.error:
124 pass
125 else:
126 filename = os.path.join(pwd, filename)
127 return os.path.normpath(filename)
130 def _test():
131 from EditorWindow import fixwordbreaks
132 import sys
133 root = Tk()
134 fixwordbreaks(root)
135 root.withdraw()
136 flist = FileList(root)
137 if sys.argv[1:]:
138 for filename in sys.argv[1:]:
139 flist.open(filename)
140 else:
141 flist.new()
142 if flist.inversedict:
143 root.mainloop()
145 if __name__ == '__main__':
146 _test()