summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorKurt B. Kaiser <kbk@shore.net>2007-09-06 04:03:04 (GMT)
committerKurt B. Kaiser <kbk@shore.net>2007-09-06 04:03:04 (GMT)
commit105f60ee628842a20f70526f9e994bc8acfaa9c7 (patch)
tree837b6989b04284bb28b753efb32e3cef81805dca /Lib
parent3da4c4bcaba549b27f3f3ba69ad7e58a585d5461 (diff)
downloadcpython-105f60ee628842a20f70526f9e994bc8acfaa9c7.zip
cpython-105f60ee628842a20f70526f9e994bc8acfaa9c7.tar.gz
cpython-105f60ee628842a20f70526f9e994bc8acfaa9c7.tar.bz2
1. Fail gracefully if the file fails to decode when loaded.
2. If the load fails, close the half-built edit window. 3. Don't reopen the file to check the shebang. 4. Clarify that we're setting tabs in Tk. M EditorWindow.py M FileList.py
Diffstat (limited to 'Lib')
-rw-r--r--Lib/idlelib/EditorWindow.py68
-rw-r--r--Lib/idlelib/FileList.py7
2 files changed, 31 insertions, 44 deletions
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index 82da730..a0a7b47 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -224,42 +224,32 @@ class EditorWindow(object):
# conceivable file).
# Making the initial values larger slows things down more often.
self.num_context_lines = 50, 500, 5000000
-
self.per = per = self.Percolator(text)
- if self.ispythonsource(filename):
- self.color = color = self.ColorDelegator()
- per.insertfilter(color)
- else:
- self.color = None
-
+ self.color = None
self.undo = undo = self.UndoDelegator()
per.insertfilter(undo)
text.undo_block_start = undo.undo_block_start
text.undo_block_stop = undo.undo_block_stop
undo.set_saved_change_hook(self.saved_change_hook)
-
# IOBinding implements file I/O and printing functionality
self.io = io = self.IOBinding(self)
io.set_filename_change_hook(self.filename_change_hook)
-
- # Create the recent files submenu
- self.recent_files_menu = Menu(self.menubar)
- self.menudict['file'].insert_cascade(3, label='Recent Files',
- underline=0,
- menu=self.recent_files_menu)
- self.update_recent_files_list()
-
+ self.good_load = False
+ self.set_indentation_params(False)
if filename:
if os.path.exists(filename) and not os.path.isdir(filename):
- io.loadfile(filename)
+ if io.loadfile(filename):
+ self.good_load = True
+ is_py_src = self.ispythonsource(filename)
+ self.set_indentation_params(is_py_src)
+ if is_py_src:
+ self.color = color = self.ColorDelegator()
+ per.insertfilter(color)
else:
io.set_filename(filename)
self.saved_change_hook()
-
- self.set_indentation_params(self.ispythonsource(filename))
-
+ self.update_recent_files_list()
self.load_extensions()
-
menu = self.menudict.get('windows')
if menu:
end = menu.index("end")
@@ -337,13 +327,15 @@ class EditorWindow(object):
underline, label = prepstr(label)
menudict[name] = menu = Menu(mbar, name=name)
mbar.add_cascade(label=label, menu=menu, underline=underline)
-
if sys.platform == 'darwin' and '.framework' in sys.executable:
# Insert the application menu
menudict['application'] = menu = Menu(mbar, name='apple')
mbar.add_cascade(label='IDLE', menu=menu)
-
self.fill_menus()
+ self.recent_files_menu = Menu(self.menubar)
+ self.menudict['file'].insert_cascade(3, label='Recent Files',
+ underline=0,
+ menu=self.recent_files_menu)
self.base_helpmenu_length = self.menudict['help'].index(END)
self.reset_help_menu_entries()
@@ -489,7 +481,7 @@ class EditorWindow(object):
text.see("insert")
def open_module(self, event=None):
- # XXX Shouldn't this be in IOBinding or in FileList?
+ # XXX Shouldn't this be in IOBinding?
try:
name = self.text.get("sel.first", "sel.last")
except TclError:
@@ -552,13 +544,8 @@ class EditorWindow(object):
base, ext = os.path.splitext(os.path.basename(filename))
if os.path.normcase(ext) in (".py", ".pyw"):
return True
- try:
- f = open(filename)
- line = f.readline()
- f.close()
- except IOError:
- return False
- return line.startswith('#!') and line.find('python') >= 0
+ line = self.text.get('1.0', '1.0 lineend')
+ return line.startswith('#!') and 'python' in line
def close_hook(self):
if self.flist:
@@ -1003,15 +990,16 @@ class EditorWindow(object):
# Return the text widget's current view of what a tab stop means
# (equivalent width in spaces).
- def get_tabwidth(self):
+ def get_tk_tabwidth(self):
current = self.text['tabs'] or TK_TABWIDTH_DEFAULT
return int(current)
# Set the text widget's current view of what a tab stop means.
- def set_tabwidth(self, newtabwidth):
+ def set_tk_tabwidth(self, newtabwidth):
text = self.text
- if self.get_tabwidth() != newtabwidth:
+ if self.get_tk_tabwidth() != newtabwidth:
+ # Set text widget tab width
pixels = text.tk.call("font", "measure", text["font"],
"-displayof", text.master,
"n" * newtabwidth)
@@ -1019,20 +1007,14 @@ class EditorWindow(object):
### begin autoindent code ### (configuration was moved to beginning of class)
- # If ispythonsource and guess are true, guess a good value for
- # indentwidth based on file content (if possible), and if
- # indentwidth != tabwidth set usetabs false.
- # In any case, adjust the Text widget's view of what a tab
- # character means.
-
- def set_indentation_params(self, ispythonsource, guess=True):
- if guess and ispythonsource:
+ def set_indentation_params(self, is_py_src, guess=True):
+ if is_py_src and guess:
i = self.guess_indent()
if 2 <= i <= 8:
self.indentwidth = i
if self.indentwidth != self.tabwidth:
self.usetabs = False
- self.set_tabwidth(self.tabwidth)
+ self.set_tk_tabwidth(self.tabwidth)
def smart_backspace_event(self, event):
text = self.text
diff --git a/Lib/idlelib/FileList.py b/Lib/idlelib/FileList.py
index 52b3eeb..2f5053f 100644
--- a/Lib/idlelib/FileList.py
+++ b/Lib/idlelib/FileList.py
@@ -33,7 +33,12 @@ class FileList:
# Don't create window, perform 'action', e.g. open in same window
return action(filename)
else:
- return self.EditorWindow(self, filename, key)
+ edit = self.EditorWindow(self, filename, key)
+ if edit.good_load:
+ return edit
+ else:
+ edit._close()
+ return None
def gotofileline(self, filename, lineno=None):
edit = self.open(filename)