1 # changes by dscherer@cmu.edu
2 # - IOBinding.open() replaces the current window with the opened file,
3 # if the current window is both unmodified and unnamed
4 # - IOBinding.loadfile() interprets Windows, UNIX, and Macintosh
5 # end-of-line conventions, instead of relying on the standard library,
6 # which will only understand the local convention.
13 #$ event <<open-window-from-file>>
15 #$ unix <Control-x><Control-f>
17 #$ event <<save-window>>
19 #$ unix <Control-x><Control-s>
21 #$ event <<save-window-as-file>>
23 #$ unix <Control-x><Control-w>
25 #$ event <<save-copy-of-window-as-file>>
27 #$ unix <Control-x><w>
32 def __init__(self
, editwin
):
33 self
.editwin
= editwin
34 self
.text
= editwin
.text
35 self
.__id
_open
= self
.text
.bind("<<open-window-from-file>>", self
.open)
36 self
.__id
_save
= self
.text
.bind("<<save-window>>", self
.save
)
37 self
.__id
_saveas
= self
.text
.bind("<<save-window-as-file>>",
39 self
.__id
_savecopy
= self
.text
.bind("<<save-copy-of-window-as-file>>",
43 # Undo command bindings
44 self
.text
.unbind("<<open-window-from-file>>", self
.__id
_open
)
45 self
.text
.unbind("<<save-window>>", self
.__id
_save
)
46 self
.text
.unbind("<<save-window-as-file>>",self
.__id
_saveas
)
47 self
.text
.unbind("<<save-copy-of-window-as-file>>", self
.__id
_savecopy
)
51 self
.filename_change_hook
= None
54 return self
.editwin
.get_saved()
56 def set_saved(self
, flag
):
57 self
.editwin
.set_saved(flag
)
60 self
.editwin
.reset_undo()
62 filename_change_hook
= None
64 def set_filename_change_hook(self
, hook
):
65 self
.filename_change_hook
= hook
69 def set_filename(self
, filename
):
70 self
.filename
= filename
72 if self
.filename_change_hook
:
73 self
.filename_change_hook()
75 def open(self
, event
):
76 if self
.editwin
.flist
:
77 filename
= self
.askopenfile()
79 # if the current window has no filename and hasn't been
80 # modified, we replace it's contents (no loss). Otherwise
81 # we open a new window.
82 if not self
.filename
and self
.get_saved():
83 self
.editwin
.flist
.open(filename
, self
.loadfile
)
85 self
.editwin
.flist
.open(filename
)
90 # Code for use outside IDLE:
92 reply
= self
.maybesave()
96 filename
= self
.askopenfile()
98 self
.loadfile(filename
)
100 self
.text
.focus_set()
103 def loadfile(self
, filename
):
105 # open the file in binary mode so that we can handle
106 # end-of-line convention ourselves.
107 f
= open(filename
,'rb')
111 tkMessageBox
.showerror("I/O Error", str(msg
), master
=self
.text
)
114 # We now convert all end-of-lines to '\n's
115 eol
= r
"(\r\n)|\n|\r" # \r\n (Windows), \n (UNIX), or \r (Mac)
116 chars
= re
.compile( eol
).sub( r
"\n", chars
)
118 self
.text
.delete("1.0", "end")
119 self
.set_filename(None)
120 self
.text
.insert("1.0", chars
)
122 self
.set_filename(filename
)
123 self
.text
.mark_set("insert", "1.0")
124 self
.text
.see("insert")
130 message
= "Do you want to save %s before closing?" % (
131 self
.filename
or "this untitled document")
132 m
= tkMessageBox
.Message(
133 title
="Save On Close",
135 icon
=tkMessageBox
.QUESTION
,
136 type=tkMessageBox
.YESNOCANCEL
,
141 if not self
.get_saved():
143 self
.text
.focus_set()
146 def save(self
, event
):
147 if not self
.filename
:
150 if self
.writefile(self
.filename
):
152 self
.text
.focus_set()
155 def save_as(self
, event
):
156 filename
= self
.asksavefile()
158 if self
.writefile(filename
):
159 self
.set_filename(filename
)
161 self
.text
.focus_set()
164 def save_a_copy(self
, event
):
165 filename
= self
.asksavefile()
167 self
.writefile(filename
)
168 self
.text
.focus_set()
171 def writefile(self
, filename
):
174 f
= open(filename
, "w")
175 chars
= self
.text
.get("1.0", "end-1c")
178 ## print "saved to", `filename`
181 tkMessageBox
.showerror("I/O Error", str(msg
),
185 def fixlastline(self
):
186 c
= self
.text
.get("end-2c")
188 self
.text
.insert("end-1c", "\n")
194 ("Python and text files", "*.py *.pyw *.txt", "TEXT"),
195 ("All text files", "*", "TEXT"),
199 def askopenfile(self
):
200 dir, base
= self
.defaultfilename("open")
201 if not self
.opendialog
:
202 self
.opendialog
= tkFileDialog
.Open(master
=self
.text
,
203 filetypes
=self
.filetypes
)
204 return self
.opendialog
.show(initialdir
=dir, initialfile
=base
)
206 def defaultfilename(self
, mode
="open"):
208 return os
.path
.split(self
.filename
)
216 def asksavefile(self
):
217 dir, base
= self
.defaultfilename("save")
218 if not self
.savedialog
:
219 self
.savedialog
= tkFileDialog
.SaveAs(master
=self
.text
,
220 filetypes
=self
.filetypes
)
221 return self
.savedialog
.show(initialdir
=dir, initialfile
=base
)
225 from Tkinter
import *
228 def __init__(self
, text
):
231 self
.text
.bind("<Control-o>", self
.open)
232 self
.text
.bind("<Control-s>", self
.save
)
233 self
.text
.bind("<Alt-s>", self
.save_as
)
234 self
.text
.bind("<Alt-z>", self
.save_a_copy
)
235 def get_saved(self
): return 0
236 def set_saved(self
, flag
): pass
237 def reset_undo(self
): pass
238 def open(self
, event
):
239 self
.text
.event_generate("<<open-window-from-file>>")
240 def save(self
, event
):
241 self
.text
.event_generate("<<save-window>>")
242 def save_as(self
, event
):
243 self
.text
.event_generate("<<save-window-as-file>>")
244 def save_a_copy(self
, event
):
245 self
.text
.event_generate("<<save-copy-of-window-as-file>>")
249 editwin
= MyEditWin(text
)
250 io
= IOBinding(editwin
)
253 if __name__
== "__main__":