blob: 5d41d3592e4724d70b99eeaf35994258838d148a [file] [log] [blame]
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +00001import os
2import tkFileDialog
3import tkMessageBox
4
Guido van Rossum504b0bf1999-01-02 21:28:54 +00005#$ event <<open-window-from-file>>
6#$ win <Control-o>
7#$ unix <Control-x><Control-f>
8
9#$ event <<save-window>>
10#$ win <Control-s>
11#$ unix <Control-x><Control-s>
12
13#$ event <<save-window-as-file>>
14#$ win <Alt-s>
15#$ unix <Control-x><Control-w>
16
17#$ event <<save-copy-of-window-as-file>>
18#$ win <Alt-Shift-s>
19#$ unix <Control-x><w>
20
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000021
22class IOBinding:
23
Guido van Rossum504b0bf1999-01-02 21:28:54 +000024 def __init__(self, editwin):
25 self.editwin = editwin
26 self.text = editwin.text
Guido van Rossume689f001999-06-25 16:02:22 +000027 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)
33
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
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000044
Guido van Rossum504b0bf1999-01-02 21:28:54 +000045 def get_saved(self):
46 return self.editwin.get_saved()
47
48 def set_saved(self, flag):
49 self.editwin.set_saved(flag)
50
51 def reset_undo(self):
52 self.editwin.reset_undo()
53
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000054 filename_change_hook = None
55
56 def set_filename_change_hook(self, hook):
57 self.filename_change_hook = hook
58
59 filename = None
60
61 def set_filename(self, filename):
62 self.filename = filename
Guido van Rossum504b0bf1999-01-02 21:28:54 +000063 self.set_saved(1)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000064 if self.filename_change_hook:
65 self.filename_change_hook()
66
67 def open(self, event):
Guido van Rossum504b0bf1999-01-02 21:28:54 +000068 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():
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000077 reply = self.maybesave()
78 if reply == "cancel":
Guido van Rossum504b0bf1999-01-02 21:28:54 +000079 self.text.focus_set()
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000080 return "break"
81 filename = self.askopenfile()
82 if filename:
83 self.loadfile(filename)
Guido van Rossum504b0bf1999-01-02 21:28:54 +000084 else:
85 self.text.focus_set()
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000086 return "break"
87
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)
Guido van Rossum504b0bf1999-01-02 21:28:54 +000099 self.reset_undo()
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000100 self.set_filename(filename)
101 self.text.mark_set("insert", "1.0")
102 self.text.see("insert")
103 return 1
104
105 def maybesave(self):
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000106 if self.get_saved():
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000107 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)
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000119 if not self.get_saved():
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000120 reply = "cancel"
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000121 self.text.focus_set()
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000122 return reply
123
124 def save(self, event):
125 if not self.filename:
126 self.save_as(event)
127 else:
128 if self.writefile(self.filename):
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000129 self.set_saved(1)
130 self.text.focus_set()
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000131 return "break"
132
133 def save_as(self, event):
134 filename = self.asksavefile()
135 if filename:
136 if self.writefile(filename):
137 self.set_filename(filename)
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000138 self.set_saved(1)
139 self.text.focus_set()
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000140 return "break"
141
142 def save_a_copy(self, event):
143 filename = self.asksavefile()
144 if filename:
145 self.writefile(filename)
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000146 self.text.focus_set()
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000147 return "break"
148
149 def writefile(self, filename):
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000150 self.fixlastline()
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000151 try:
152 f = open(filename, "w")
153 chars = self.text.get("1.0", "end-1c")
154 f.write(chars)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000155 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
162
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000163 def fixlastline(self):
164 c = self.text.get("end-2c")
165 if c != '\n':
166 self.text.insert("end-1c", "\n")
167
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000168 opendialog = None
169 savedialog = None
170
171 filetypes = [
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000172 ("Python and text files", "*.py *.pyw *.txt", "TEXT"),
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000173 ("All text files", "*", "TEXT"),
174 ("All files", "*"),
175 ]
176
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)
183
184 def defaultfilename(self, mode="open"):
185 if self.filename:
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000186 return os.path.split(self.filename)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000187 else:
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000188 try:
189 pwd = os.getcwd()
190 except os.error:
191 pwd = ""
192 return pwd, ""
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000193
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)
200
201
202def test():
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000203 root = Tk()
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000204 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
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000213 def set_saved(self, flag): pass
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000214 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)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000224 text.pack()
225 text.focus_set()
Guido van Rossum504b0bf1999-01-02 21:28:54 +0000226 editwin = MyEditWin(text)
227 io = IOBinding(editwin)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000228 root.mainloop()
229
230if __name__ == "__main__":
Jeremy Hylton1eab0022001-02-02 20:07:46 +0000231 from Tkinter import *
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +0000232 test()