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 from configHandler
import idleConf
15 #$ event <<open-window-from-file>>
17 #$ unix <Control-x><Control-f>
19 #$ event <<save-window>>
21 #$ unix <Control-x><Control-s>
23 #$ event <<save-window-as-file>>
25 #$ unix <Control-x><Control-w>
27 #$ event <<print-window>>
29 #$ unix <Control-x><Control-p>
31 #$ event <<save-copy-of-window-as-file>>
33 #$ unix <Control-x><w>
38 def __init__(self
, editwin
):
39 self
.editwin
= editwin
40 self
.text
= editwin
.text
41 self
.__id
_open
= self
.text
.bind("<<open-window-from-file>>", self
.open)
42 self
.__id
_save
= self
.text
.bind("<<save-window>>", self
.save
)
43 self
.__id
_saveas
= self
.text
.bind("<<save-window-as-file>>",
45 self
.__id
_savecopy
= self
.text
.bind("<<save-copy-of-window-as-file>>",
47 self
.__id
_print
= self
.text
.bind("<<print-window>>", self
.print_window
)
50 # Undo command bindings
51 self
.text
.unbind("<<open-window-from-file>>", self
.__id
_open
)
52 self
.text
.unbind("<<save-window>>", self
.__id
_save
)
53 self
.text
.unbind("<<save-window-as-file>>",self
.__id
_saveas
)
54 self
.text
.unbind("<<save-copy-of-window-as-file>>", self
.__id
_savecopy
)
55 self
.text
.unbind("<<print-window>>", self
.__id
_print
)
59 self
.filename_change_hook
= None
62 return self
.editwin
.get_saved()
64 def set_saved(self
, flag
):
65 self
.editwin
.set_saved(flag
)
68 self
.editwin
.reset_undo()
70 filename_change_hook
= None
72 def set_filename_change_hook(self
, hook
):
73 self
.filename_change_hook
= hook
77 def set_filename(self
, filename
):
78 self
.filename
= filename
80 if self
.filename_change_hook
:
81 self
.filename_change_hook()
83 def open(self
, event
=None, editFile
=None):
84 if self
.editwin
.flist
:
86 filename
= self
.askopenfile()
90 # If the current window has no filename and hasn't been
91 # modified, we replace its contents (no loss). Otherwise
92 # we open a new window. But we won't replace the
93 # shell window (which has an interp(reter) attribute), which
94 # gets set to "not modified" at every new prompt.
96 interp
= self
.editwin
.interp
99 if not self
.filename
and self
.get_saved() and not interp
:
100 self
.editwin
.flist
.open(filename
, self
.loadfile
)
102 self
.editwin
.flist
.open(filename
)
104 self
.text
.focus_set()
107 # Code for use outside IDLE:
109 reply
= self
.maybesave()
110 if reply
== "cancel":
111 self
.text
.focus_set()
114 filename
= self
.askopenfile()
118 self
.loadfile(filename
)
120 self
.text
.focus_set()
123 def loadfile(self
, filename
):
125 # open the file in binary mode so that we can handle
126 # end-of-line convention ourselves.
127 f
= open(filename
,'rb')
131 tkMessageBox
.showerror("I/O Error", str(msg
), master
=self
.text
)
134 # We now convert all end-of-lines to '\n's
135 eol
= r
"(\r\n)|\n|\r" # \r\n (Windows), \n (UNIX), or \r (Mac)
136 chars
= re
.compile( eol
).sub( r
"\n", chars
)
138 self
.text
.delete("1.0", "end")
139 self
.set_filename(None)
140 self
.text
.insert("1.0", chars
)
142 self
.set_filename(filename
)
143 self
.text
.mark_set("insert", "1.0")
144 self
.text
.see("insert")
150 message
= "Do you want to save %s before closing?" % (
151 self
.filename
or "this untitled document")
152 m
= tkMessageBox
.Message(
153 title
="Save On Close",
155 icon
=tkMessageBox
.QUESTION
,
156 type=tkMessageBox
.YESNOCANCEL
,
161 if not self
.get_saved():
163 self
.text
.focus_set()
166 def save(self
, event
):
167 if not self
.filename
:
170 if self
.writefile(self
.filename
):
172 self
.text
.focus_set()
175 def save_as(self
, event
):
176 filename
= self
.asksavefile()
178 if self
.writefile(filename
):
179 self
.set_filename(filename
)
181 self
.text
.focus_set()
184 def save_a_copy(self
, event
):
185 filename
= self
.asksavefile()
187 self
.writefile(filename
)
188 self
.text
.focus_set()
191 def writefile(self
, filename
):
194 f
= open(filename
, "w")
195 chars
= str(self
.text
.get("1.0", "end-1c"))
198 ## print "saved to", `filename`
201 tkMessageBox
.showerror("I/O Error", str(msg
),
205 def print_window(self
, event
):
208 filename
= self
.filename
210 filename
= tempfilename
= tempfile
.mktemp()
211 if not self
.writefile(filename
):
212 os
.unlink(tempfilename
)
216 if platform
== 'posix': #posix platform
217 command
= idleConf
.GetOption('main','General','print-command-posix')
218 command
= command
+ " 2>&1"
219 elif platform
== 'nt': #win32 platform
220 command
= idleConf
.GetOption('main','General','print-command-win')
221 else: #no printing for this platform
223 if printPlatform
: #we can try to print for this platform
224 command
= command
% filename
225 pipe
= os
.popen(command
, "r")
226 output
= pipe
.read().strip()
227 status
= pipe
.close()
229 output
= "Printing failed (exit status 0x%x)\n" % status
+ output
231 output
= "Printing command: %s\n" % repr(command
) + output
232 tkMessageBox
.showerror("Print status", output
, master
=self
.text
)
233 else: #no printing for this platform
234 message
="Printing is not enabled for this platform: %s" % platform
235 tkMessageBox
.showinfo("Print status", message
, master
=self
.text
)
238 def fixlastline(self
):
239 c
= self
.text
.get("end-2c")
241 self
.text
.insert("end-1c", "\n")
247 ("Python and text files", "*.py *.pyw *.txt", "TEXT"),
248 ("All text files", "*", "TEXT"),
252 def askopenfile(self
):
253 dir, base
= self
.defaultfilename("open")
254 if not self
.opendialog
:
255 self
.opendialog
= tkFileDialog
.Open(master
=self
.text
,
256 filetypes
=self
.filetypes
)
257 return self
.opendialog
.show(initialdir
=dir, initialfile
=base
)
259 def defaultfilename(self
, mode
="open"):
261 return os
.path
.split(self
.filename
)
269 def asksavefile(self
):
270 dir, base
= self
.defaultfilename("save")
271 if not self
.savedialog
:
272 self
.savedialog
= tkFileDialog
.SaveAs(master
=self
.text
,
273 filetypes
=self
.filetypes
)
274 return self
.savedialog
.show(initialdir
=dir, initialfile
=base
)
280 def __init__(self
, text
):
283 self
.text
.bind("<Control-o>", self
.open)
284 self
.text
.bind("<Control-s>", self
.save
)
285 self
.text
.bind("<Alt-s>", self
.save_as
)
286 self
.text
.bind("<Alt-z>", self
.save_a_copy
)
287 def get_saved(self
): return 0
288 def set_saved(self
, flag
): pass
289 def reset_undo(self
): pass
290 def open(self
, event
):
291 self
.text
.event_generate("<<open-window-from-file>>")
292 def save(self
, event
):
293 self
.text
.event_generate("<<save-window>>")
294 def save_as(self
, event
):
295 self
.text
.event_generate("<<save-window-as-file>>")
296 def save_a_copy(self
, event
):
297 self
.text
.event_generate("<<save-copy-of-window-as-file>>")
301 editwin
= MyEditWin(text
)
302 io
= IOBinding(editwin
)
305 if __name__
== "__main__":
306 from Tkinter
import *