Files for 2.1b1 distribution.
[python/dscho.git] / Tools / idle / IOBinding.py
blob5d41d3592e4724d70b99eeaf35994258838d148a
1 import os
2 import tkFileDialog
3 import tkMessageBox
5 #$ event <<open-window-from-file>>
6 #$ win <Control-o>
7 #$ unix <Control-x><Control-f>
9 #$ event <<save-window>>
10 #$ win <Control-s>
11 #$ unix <Control-x><Control-s>
13 #$ event <<save-window-as-file>>
14 #$ win <Alt-s>
15 #$ unix <Control-x><Control-w>
17 #$ event <<save-copy-of-window-as-file>>
18 #$ win <Alt-Shift-s>
19 #$ unix <Control-x><w>
22 class IOBinding:
24 def __init__(self, editwin):
25 self.editwin = editwin
26 self.text = editwin.text
27 self.__id_open = self.text.bind("<<open-window-from-file>>", self.open)
28 self.__id_save = self.text.bind("<<save-window>>", self.save)
29 self.__id_saveas = self.text.bind("<<save-window-as-file>>",
30 self.save_as)
31 self.__id_savecopy = self.text.bind("<<save-copy-of-window-as-file>>",
32 self.save_a_copy)
34 def close(self):
35 # Undo command bindings
36 self.text.unbind("<<open-window-from-file>>", self.__id_open)
37 self.text.unbind("<<save-window>>", self.__id_save)
38 self.text.unbind("<<save-window-as-file>>",self.__id_saveas)
39 self.text.unbind("<<save-copy-of-window-as-file>>", self.__id_savecopy)
40 # Break cycles
41 self.editwin = None
42 self.text = None
43 self.filename_change_hook = None
45 def get_saved(self):
46 return self.editwin.get_saved()
48 def set_saved(self, flag):
49 self.editwin.set_saved(flag)
51 def reset_undo(self):
52 self.editwin.reset_undo()
54 filename_change_hook = None
56 def set_filename_change_hook(self, hook):
57 self.filename_change_hook = hook
59 filename = None
61 def set_filename(self, filename):
62 self.filename = filename
63 self.set_saved(1)
64 if self.filename_change_hook:
65 self.filename_change_hook()
67 def open(self, event):
68 if self.editwin.flist:
69 filename = self.askopenfile()
70 if filename:
71 self.editwin.flist.open(filename)
72 else:
73 self.text.focus_set()
74 return "break"
75 # Code for use outside IDLE:
76 if self.get_saved():
77 reply = self.maybesave()
78 if reply == "cancel":
79 self.text.focus_set()
80 return "break"
81 filename = self.askopenfile()
82 if filename:
83 self.loadfile(filename)
84 else:
85 self.text.focus_set()
86 return "break"
88 def loadfile(self, filename):
89 try:
90 f = open(filename)
91 chars = f.read()
92 f.close()
93 except IOError, msg:
94 tkMessageBox.showerror("I/O Error", str(msg), master=self.text)
95 return 0
96 self.text.delete("1.0", "end")
97 self.set_filename(None)
98 self.text.insert("1.0", chars)
99 self.reset_undo()
100 self.set_filename(filename)
101 self.text.mark_set("insert", "1.0")
102 self.text.see("insert")
103 return 1
105 def maybesave(self):
106 if self.get_saved():
107 return "yes"
108 message = "Do you want to save %s before closing?" % (
109 self.filename or "this untitled document")
110 m = tkMessageBox.Message(
111 title="Save On Close",
112 message=message,
113 icon=tkMessageBox.QUESTION,
114 type=tkMessageBox.YESNOCANCEL,
115 master=self.text)
116 reply = m.show()
117 if reply == "yes":
118 self.save(None)
119 if not self.get_saved():
120 reply = "cancel"
121 self.text.focus_set()
122 return reply
124 def save(self, event):
125 if not self.filename:
126 self.save_as(event)
127 else:
128 if self.writefile(self.filename):
129 self.set_saved(1)
130 self.text.focus_set()
131 return "break"
133 def save_as(self, event):
134 filename = self.asksavefile()
135 if filename:
136 if self.writefile(filename):
137 self.set_filename(filename)
138 self.set_saved(1)
139 self.text.focus_set()
140 return "break"
142 def save_a_copy(self, event):
143 filename = self.asksavefile()
144 if filename:
145 self.writefile(filename)
146 self.text.focus_set()
147 return "break"
149 def writefile(self, filename):
150 self.fixlastline()
151 try:
152 f = open(filename, "w")
153 chars = self.text.get("1.0", "end-1c")
154 f.write(chars)
155 f.close()
156 ## print "saved to", `filename`
157 return 1
158 except IOError, msg:
159 tkMessageBox.showerror("I/O Error", str(msg),
160 master=self.text)
161 return 0
163 def fixlastline(self):
164 c = self.text.get("end-2c")
165 if c != '\n':
166 self.text.insert("end-1c", "\n")
168 opendialog = None
169 savedialog = None
171 filetypes = [
172 ("Python and text files", "*.py *.pyw *.txt", "TEXT"),
173 ("All text files", "*", "TEXT"),
174 ("All files", "*"),
177 def askopenfile(self):
178 dir, base = self.defaultfilename("open")
179 if not self.opendialog:
180 self.opendialog = tkFileDialog.Open(master=self.text,
181 filetypes=self.filetypes)
182 return self.opendialog.show(initialdir=dir, initialfile=base)
184 def defaultfilename(self, mode="open"):
185 if self.filename:
186 return os.path.split(self.filename)
187 else:
188 try:
189 pwd = os.getcwd()
190 except os.error:
191 pwd = ""
192 return pwd, ""
194 def asksavefile(self):
195 dir, base = self.defaultfilename("save")
196 if not self.savedialog:
197 self.savedialog = tkFileDialog.SaveAs(master=self.text,
198 filetypes=self.filetypes)
199 return self.savedialog.show(initialdir=dir, initialfile=base)
202 def test():
203 root = Tk()
204 class MyEditWin:
205 def __init__(self, text):
206 self.text = text
207 self.flist = None
208 self.text.bind("<Control-o>", self.open)
209 self.text.bind("<Control-s>", self.save)
210 self.text.bind("<Alt-s>", self.save_as)
211 self.text.bind("<Alt-z>", self.save_a_copy)
212 def get_saved(self): return 0
213 def set_saved(self, flag): pass
214 def reset_undo(self): pass
215 def open(self, event):
216 self.text.event_generate("<<open-window-from-file>>")
217 def save(self, event):
218 self.text.event_generate("<<save-window>>")
219 def save_as(self, event):
220 self.text.event_generate("<<save-window-as-file>>")
221 def save_a_copy(self, event):
222 self.text.event_generate("<<save-copy-of-window-as-file>>")
223 text = Text(root)
224 text.pack()
225 text.focus_set()
226 editwin = MyEditWin(text)
227 io = IOBinding(editwin)
228 root.mainloop()
230 if __name__ == "__main__":
231 from Tkinter import *
232 test()