[Python-checkins] r65143 - in sandbox/trunk/ttk-gsoc/src/idlelib: EditorWindow.py IOBinding.py PyShell.py editorpage.py

guilherme.polo python-checkins at python.org
Sat Jul 19 16:33:45 CEST 2008


Author: guilherme.polo
Date: Sat Jul 19 16:33:44 2008
New Revision: 65143
Log:
Continuing the move to tabs support. New marks added to remember what to do next.
Modified:
 sandbox/trunk/ttk-gsoc/src/idlelib/EditorWindow.py
 sandbox/trunk/ttk-gsoc/src/idlelib/IOBinding.py
 sandbox/trunk/ttk-gsoc/src/idlelib/PyShell.py
 sandbox/trunk/ttk-gsoc/src/idlelib/editorpage.py
Modified: sandbox/trunk/ttk-gsoc/src/idlelib/EditorWindow.py
==============================================================================
--- sandbox/trunk/ttk-gsoc/src/idlelib/EditorWindow.py	(original)
+++ sandbox/trunk/ttk-gsoc/src/idlelib/EditorWindow.py	Sat Jul 19 16:33:44 2008
@@ -14,12 +14,9 @@
 import WindowList
 import PathBrowser
 import ClassBrowser
-from editorpage import EditorPage, classifyws
+from editorpage import EditorPage, classifyws, filename_to_unicode
 from tabbedpages import get_tabbedpage
 from configHandler import idleConf
-from IOBinding import IOBinding, filesystemencoding, encoding
-from Percolator import Percolator
-from UndoDelegator import UndoDelegator
 from MultiStatusBar import MultiStatusBar
 
 TabbedPageSet = get_tabbedpage()
@@ -49,7 +46,9 @@
 return file, filename, descr
 
 class EditorWindow(object):
- from ColorDelegator import ColorDelegator
+ from ColorDelegator import ColorDelegator # overridden by PyShell
+ from UndoDelegator import UndoDelegator # overridden by PyShell
+
 help_url = None
 rmenu = None
 rmenu_specs = [
@@ -126,10 +125,15 @@
 # create a Notebook where the text pages for this EditorWindow will
 # reside
 self.text_notebook = TabbedPageSet(top)
- self.text = text = self.new_tab()
+ self.text_notebook.bind('<<NotebookTabChanged>>',
+ self.update_controls)
+ self.new_tab(filename=filename)
+ self.text = text = self.current_page().text
 self.top.focused_widget = self.text
 self.text_notebook.pack(fill=BOTH, expand=True)
 
+ self.io = self.current_page().io
+
 # The following "width" attribute is used by PyShell, so keep it here
 self.width = idleConf.GetOption('main', 'EditorPage', 'width')
 
@@ -138,6 +142,7 @@
 self.top.protocol("WM_DELETE_WINDOW", self.close)
 self.top.bind("<<close-window>>", self.close_event)
 
+ # XXX This need to be done per tab too
 if flist:
 flist.inversedict[self] = key
 if key:
@@ -147,7 +152,8 @@
 text.bind("<<open-class-browser>>", self.open_class_browser)
 text.bind("<<open-path-browser>>", self.open_path_browser)
 
- self.set_status_bar()
+ self.create_statusbar()
+ top.after_idle(self.set_line_and_column)
 
 # usetabs true -> literal tab characters are used by indent and
 # dedent cmds, possibly mixed with spaces if
@@ -186,18 +192,6 @@
 # Making the initial values larger slows things down more often.
 self.num_context_lines = 50, 500, 5000000
 
- self.per = per = Percolator(text)
-
- self.undo = undo = 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 = 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',
@@ -205,15 +199,6 @@
 menu=self.recent_files_menu)
 self.update_recent_files_list()
 
- self.color = None # initialized below in self.ResetColorizer
- if filename:
- if os.path.exists(filename) and not os.path.isdir(filename):
- io.loadfile(filename)
- else:
- io.set_filename(filename)
- self.ResetColorizer()
- self.saved_change_hook()
-
 self.set_indentation_params(self.ispythonsource(filename))
 
 self.load_extensions()
@@ -234,27 +219,14 @@
 self.askinteger = tkSimpleDialog.askinteger
 self.showerror = tkMessageBox.showerror
 
- def _filename_to_unicode(self, filename):
- """convert filename to unicode in order to display it in Tk"""
- if isinstance(filename, unicode) or not filename:
- return filename
- else:
- try:
- return filename.decode(filesystemencoding)
- except UnicodeDecodeError:
- # XXX
- try:
- return filename.decode(encoding)
- except UnicodeDecodeError:
- # byte-to-byte conversion
- return filename.decode('iso8859-1')
-
 def new_callback(self, event):
- dirname, basename = self.io.defaultfilename()
- self.flist.new(dirname)
+ # XXX
+ current_page = self.current_page()
+ dirname, basename = current_page.io.defaultfilename()
+ current_page.flist.new(dirname)
 return "break"
 
- def new_tab(self, event=None):
+ def new_tab(self, event=None, filename=None):
 """Create a new EditorPage and insert it into the notebook."""
 page_title = "#%d" % (len(self.text_notebook.pages) + 1)
 page = self.text_notebook.add_page(page_title)
@@ -265,8 +237,8 @@
 parent = page.frame
 
 vbar = Scrollbar(parent, name='vbar')
- page.editpage = EditorPage(parent, self, name='text', padx=5,
- wrap='none')
+ page.editpage = EditorPage(parent, self, filename=filename, name='text',
+ padx=5, wrap='none')
 text = page.editpage.text
 
 vbar['command'] = text.yview
@@ -283,9 +255,13 @@
 
 self.apply_bindings()
 
- return text
+ return "break"
+
+ def update_controls(self, event):
+ self.io = self.current_page().io
+ self.set_line_and_column()
 
- def set_status_bar(self):
+ def create_statusbar(self):
 self.status_bar = MultiStatusBar(self.top)
 if macosxSupport.runningAsOSXApp():
 # Insert some padding to avoid obscuring some of the statusbar
@@ -294,13 +270,10 @@
 self.status_bar.set_label('column', 'Col: ?', side=RIGHT)
 self.status_bar.set_label('line', 'Ln: ?', side=RIGHT)
 self.status_bar.pack(side=BOTTOM, fill=X)
- self.text.bind("<<set-line-and-column>>", self.set_line_and_column)
- self.text.event_add("<<set-line-and-column>>",
- "<KeyRelease>", "<ButtonRelease>")
- self.text.after_idle(self.set_line_and_column)
 
 def set_line_and_column(self, event=None):
- line, column = self.text.index(INSERT).split('.')
+ # Used by PyShell too
+ line, column = self.current_page().text.index(INSERT).split('.')
 self.status_bar.set_label('column', 'Col: %s' % column)
 self.status_bar.set_label('line', 'Ln: %s' % line)
 
@@ -331,7 +304,7 @@
 menu.delete(self.wmenu_end+1, end)
 WindowList.add_windows_to_menu(menu)
 
- def open_module(self, event=None):
+ def open_module(self, event=None): # XXX depends on self.text
 # XXX Shouldn't this be in IOBinding or in FileList?
 try:
 name = self.text.get("sel.first", "sel.last")
@@ -360,11 +333,11 @@
 if f:
 f.close()
 if self.flist:
- self.flist.open(file)
+ self.flist.open(file) # XXX change this to create a new tab instead
 else:
 self.io.loadfile(file)
 
- def open_class_browser(self, event=None):
+ def open_class_browser(self, event=None): # XXX depends on self.text
 filename = self.io.filename
 if not filename:
 tkMessageBox.showerror(
@@ -434,49 +407,13 @@
 def set_close_hook(self, close_hook):
 self.close_hook = close_hook
 
- def filename_change_hook(self):
- if self.flist:
- self.flist.filename_changed_edit(self)
- self.saved_change_hook()
- self.top.update_windowlist_registry(self)
- self.ResetColorizer()
-
- def _addcolorizer(self):
- if self.color:
- return
- if self.ispythonsource(self.io.filename):
- self.color = self.ColorDelegator()
- # can add more colorizers here...
- if self.color:
- self.per.removefilter(self.undo)
- self.per.insertfilter(self.color)
- self.per.insertfilter(self.undo)
-
- def _rmcolorizer(self):
- if not self.color:
- return
- self.color.removecolors()
- self.per.removefilter(self.color)
- self.color = None
-
 def ResetColorizer(self):
 "Update the colour theme"
 # Called from self.filename_change_hook and from configDialog.py
- self._rmcolorizer()
- self._addcolorizer()
- theme = idleConf.GetOption('main','Theme','name')
- normal_colors = idleConf.GetHighlight(theme, 'normal')
- cursor_color = idleConf.GetHighlight(theme, 'cursor', fgBg='fg')
- select_colors = idleConf.GetHighlight(theme, 'hilite')
- self.text.config(
- foreground=normal_colors['foreground'],
- background=normal_colors['background'],
- insertbackground=cursor_color,
- selectforeground=select_colors['foreground'],
- selectbackground=select_colors['background'],
- )
+ for page in self.text_notebook.pages.itervalues():
+ page.editpage.reset_colorizer()
 
- def ResetFont(self):
+ def ResetFont(self): # XXX depends on self.text
 "Update the text widgets' font if it is changed"
 # Called from configDialog.py
 fontWeight = 'normal'
@@ -486,7 +423,7 @@
 idleConf.GetOption('main', 'EditorPage', 'font-size'),
 fontWeight))
 
- def RemoveKeybindings(self):
+ def RemoveKeybindings(self): # XXX depends on self.text
 "Remove the keybindings before they are changed."
 # Called from configDialog.py
 Bindings.default_keydefs = keydefs = idleConf.GetCurrentKeySet()
@@ -599,7 +536,7 @@
 for i, file in enumerate(rf_list):
 file_name = file[0:-1] # zap \n
 # make unicode string to display non-ASCII chars correctly
- ufile_name = self._filename_to_unicode(file_name)
+ ufile_name = filename_to_unicode(file_name)
 callback = instance.__recent_file_callback(file_name)
 menu.add_command(label=ulchars[i] + " " + ufile_name,
 command=callback,
@@ -610,43 +547,8 @@
 self.io.open(editFile=fn_closure)
 return open_recent_file
 
- def saved_change_hook(self):
- short = self.short_title()
- long = self.long_title()
- if short and long:
- title = short + " - " + long
- elif short:
- title = short
- elif long:
- title = long
- else:
- title = "Untitled"
- icon = short or long or title
- if not self.get_saved():
- title = "*%s*" % title
- icon = "*%s" % icon
- self.top.wm_title(title)
- self.top.wm_iconname(icon)
-
 def get_saved(self):
- return self.undo.get_saved()
-
- def set_saved(self, flag):
- self.undo.set_saved(flag)
-
- def reset_undo(self):
- self.undo.reset_undo()
-
- def short_title(self):
- filename = self.io.filename
- if filename:
- filename = os.path.basename(filename)
- # return unicode string to display non-ASCII chars correctly
- return self._filename_to_unicode(filename)
-
- def long_title(self):
- # return unicode string to display non-ASCII chars correctly
- return self._filename_to_unicode(self.io.filename or "")
+ return self.current_page().undo.get_saved() # XXX Pretty wrong
 
 def get_geometry(self):
 "Return (width, height, x, y)"
@@ -673,21 +575,17 @@
 self._close()
 return reply
 
- def _close(self):
+ def _close(self): # XXX There should be one like this per EditorPage
 if self.io.filename:
 self.update_recent_files_list(new_file=self.io.filename)
 WindowList.unregister_callback(self.postwindowsmenu)
- self.unload_extensions()
- self.io.close()
- self.io = None
- self.undo = None
- if self.color:
- self.color.close(False)
- self.color = None
+ self.unload_extensions() # XXX maybe this should be done per tab
 self.text = None
 self.tkinter_vars = None
- self.per.close()
- self.per = None
+
+ for page in self.text_notebook.pages.itervalues():
+ page.editpage.close()
+
 self.top.destroy()
 if self.close_hook:
 # unless override: unregister from flist, terminate if last window
@@ -714,7 +612,7 @@
 def get_standard_extension_names(self):
 return idleConf.GetExtensions(editor_only=True)
 
- def load_extension(self, name):
+ def load_extension(self, name): # XXX depends on self.text
 try:
 mod = __import__(name, globals(), locals(), [])
 except ImportError:
@@ -749,7 +647,7 @@
 if keylist:
 text.event_add(event, *keylist)
 
- def fill_menus(self, menudefs=None, keydefs=None):
+ def fill_menus(self, menudefs=None, keydefs=None):# XXX depends on self.text
 """Add appropriate entries to the menus and submenus
 
 Menus that are absent or None in self.menudict are ignored.
@@ -801,7 +699,7 @@
 else:
 raise NameError, name
 
- def get_var_obj(self, name, vartype=None):
+ def get_var_obj(self, name, vartype=None): # XXX depends on self.text
 var = self.tkinter_vars.get(name)
 if not var and vartype:
 # create a Tkinter variable object with self.text as master:
@@ -814,12 +712,12 @@
 
 # Return the text widget's current view of what a tab stop means
 # (equivalent width in spaces).
- def get_tabwidth(self):
+ def get_tabwidth(self): # XXX depends on self.text
 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_tabwidth(self, newtabwidth): # XXX depends on self.text
 text = self.text
 if self.get_tabwidth() != newtabwidth:
 pixels = text.tk.call("font", "measure", text["font"],
@@ -845,7 +743,7 @@
 # Return guessed indentwidth. This should not be believed unless
 # it's in a reasonable range (e.g., it will be 0 if no indented
 # blocks are found).
- def guess_indent(self):
+ def guess_indent(self): # XXX depends on self.text
 opener, indented = IndentSearcher(self.text, self.tabwidth).run()
 if opener and indented:
 raw, indentsmall = classifyws(opener, self.tabwidth)
Modified: sandbox/trunk/ttk-gsoc/src/idlelib/IOBinding.py
==============================================================================
--- sandbox/trunk/ttk-gsoc/src/idlelib/IOBinding.py	(original)
+++ sandbox/trunk/ttk-gsoc/src/idlelib/IOBinding.py	Sat Jul 19 16:33:44 2008
@@ -145,10 +145,14 @@
 
 
 class IOBinding:
+ # XXX will need to change this too
 
- def __init__(self, editwin):
- self.editwin = editwin
- self.text = editwin.text
+ #def __init__(self, editwin):
+ def __init__(self, editpage):
+ #self.editwin = editwin
+ #self.text = editwin.text
+ self.editpage = editpage
+ self.text = editpage.text
 self.__id_open = self.text.bind("<<open-window-from-file>>", self.open)
 self.__id_save = self.text.bind("<<save-window>>", self.save)
 self.__id_saveas = self.text.bind("<<save-window-as-file>>",
@@ -166,18 +170,22 @@
 self.text.unbind("<<save-copy-of-window-as-file>>", self.__id_savecopy)
 self.text.unbind("<<print-window>>", self.__id_print)
 # Break cycles
- self.editwin = None
+ #self.editwin = None
+ self.editpage = None
 self.text = None
 self.filename_change_hook = None
 
 def get_saved(self):
- return self.editwin.get_saved()
+ #return self.editwin.get_saved()
+ return self.editpage.get_saved()
 
 def set_saved(self, flag):
- self.editwin.set_saved(flag)
+ #self.editwin.set_saved(flag)
+ self.editpage.set_saved(flag)
 
 def reset_undo(self):
- self.editwin.reset_undo()
+ #self.editwin.reset_undo()
+ self.editpage.reset_undo()
 
 filename_change_hook = None
 
@@ -357,7 +365,8 @@
 self.set_filename(filename)
 self.set_saved(1)
 try:
- self.editwin.store_file_breaks()
+ #self.editwin.store_file_breaks()
+ self.editpage.editwin.store_file_breaks()
 except AttributeError:
 pass
 self.text.focus_set()
@@ -447,7 +456,8 @@
 enc = "utf-8"
 if not ask_user:
 return chars
- dialog = EncodingMessage(self.editwin.top, enc)
+ #dialog = EncodingMessage(self.editwin.top, enc)
+ dialog = EncodingMessage(self.editpage.editwin.top, enc)
 dialog.go()
 if dialog.num == 1:
 # User asked us to edit the file
@@ -562,7 +572,8 @@
 
 def updaterecentfileslist(self,filename):
 "Update recent file list on all editor windows"
- self.editwin.update_recent_files_list(filename)
+ #self.editwin.update_recent_files_list(filename)
+ self.editpage.editwin.update_recent_files_list(filename)
 
 def test():
 from Tkinter import Tk, Text
Modified: sandbox/trunk/ttk-gsoc/src/idlelib/PyShell.py
==============================================================================
--- sandbox/trunk/ttk-gsoc/src/idlelib/PyShell.py	(original)
+++ sandbox/trunk/ttk-gsoc/src/idlelib/PyShell.py	Sat Jul 19 16:33:44 2008
@@ -111,6 +111,7 @@
 def __init__(self, *args):
 self.breakpoints = []
 EditorWindow.__init__(self, *args)
+ # XXX more things to be done after page is created
 self.text.bind("<<set-breakpoint-here>>", self.set_breakpoint_here)
 self.text.bind("<<clear-breakpoint-here>>", self.clear_breakpoint_here)
 self.text.bind("<<open-python-shell>>", self.flist.open_shell)
@@ -823,13 +824,13 @@
 #
 OutputWindow.__init__(self, flist, None, None)
 #
-## self.config(usetabs=1, indentwidth=8, context_use_ps1=1)
 self.usetabs = True
 # indentwidth must be 8 when using tabs. See note in EditorWindow:
 self.indentwidth = 8
 self.context_use_ps1 = True
 #
 text = self.text
+ # XXX needs to be done after a page is created
 text.configure(wrap="char")
 text.bind("<<newline-and-indent>>", self.enter_callback)
 text.bind("<<plain-newline-and-indent>>", self.linefeed_callback)
@@ -1217,9 +1218,11 @@
 except:
 s = ""
 self.console.write(s)
- self.text.mark_set("insert", "end-1c")
+
+ curr_page = self.current_page()
+ curr_page.text.mark_set("insert", "end-1c")
 self.set_line_and_column()
- self.io.reset_undo()
+ curr_page.io.reset_undo()
 
 def resetoutput(self):
 source = self.text.get("iomark", "end-1c")
@@ -1417,7 +1420,7 @@
 if enable_edit:
 if not (cmd or script):
 for filename in args:
- flist.open(filename)
+ flist.open(filename) # XXX this creates a new EditorWindow
 if not args:
 flist.new()
 if enable_shell:
Modified: sandbox/trunk/ttk-gsoc/src/idlelib/editorpage.py
==============================================================================
--- sandbox/trunk/ttk-gsoc/src/idlelib/editorpage.py	(original)
+++ sandbox/trunk/ttk-gsoc/src/idlelib/editorpage.py	Sat Jul 19 16:33:44 2008
@@ -9,20 +9,13 @@
 import configDialog
 import macosxSupport
 import PyParse
+import IOBinding
 import GrepDialog
 import SearchDialog
 import ReplaceDialog
 from configHandler import idleConf
 from MultiCall import MultiCallCreator
-
-#def callback(method, widget=None):
-# def func(*args):
-# if widget:
-# return method(widget=widget, *args)
-# else:
-# return method(*args)
-
-# return func
+from Percolator import Percolator
 
 def classifyws(s, tabwidth):
 raw = effective = 0
@@ -37,21 +30,135 @@
 break
 return raw, effective
 
-# "line.col" -> line, as an int
 def index2line(index):
+ """"line.col" -> line, as an int"""
 return int(float(index))
 
+def filename_to_unicode(filename):
+ """Convert filename to unicode in order to display it in Tk"""
+ if isinstance(filename, unicode) or not filename:
+ return filename
+ else:
+ try:
+ return filename.decode(IOBinding.filesystemencoding)
+ except UnicodeDecodeError:
+ # XXX
+ try:
+ return filename.decode(IOBinding.encoding)
+ except UnicodeDecodeError:
+ # byte-to-byte conversion
+ return filename.decode('iso8859-1')
+
 class EditorPage:
- def __init__(self, parent, editwin, **kwargs):
+ def __init__(self, parent_frame, editwin, filename=None, **kwargs):
 self.editwin = editwin
 kwargs.setdefault('width', idleConf.GetOption('main', 'EditorPage',
 'width'))
 kwargs.setdefault('height', idleConf.GetOption('main', 'EditorPage',
 'height'))
 
- self.text = MultiCallCreator(Text)(parent, **kwargs)
+ self.text = MultiCallCreator(Text)(parent_frame, **kwargs)
+
+ self.per = Percolator(self.text)
+ self.undo = self.editwin.UndoDelegator()
+ self.per.insertfilter(self.undo)
+ self.text.undo_block_start = self.undo.undo_block_start
+ self.text.undo_block_stop = self.undo.undo_block_stop
+ self.undo.set_saved_change_hook(self.saved_change_hook)
+
+ self.io = IOBinding.IOBinding(self)
+ self.io.set_filename_change_hook(self.filename_change_hook)
+ if filename:
+ fail = self.io.loadfile(filename)
+ if fail:
+ self.io.set_filename(filename)
+ self.saved_change_hook()
+
+ self.color = None # initialized below in reset_colorizer
+ self.reset_colorizer()
+
 self._setup_bindings()
 
+ def close(self):
+ """Perform necessary cleanup for this page before closing it."""
+ self.io.close()
+ self.io = None
+
+ self.undo = None
+
+ if self.color:
+ self.color.close(False)
+ self.color = None
+
+ self.per.close()
+ self.per = None
+
+ # XXX (1) mark where these functions are used
+ def saved_change_hook(self):
+ short = self.short_title()
+ long = self.long_title()
+
+ if short and long:
+ title = short + " - " + long
+ elif short:
+ title = short
+ elif long:
+ title = long
+ else:
+ title = "Untitled"
+ icon = short or long or title
+ if not self.get_saved():
+ title = "*%s*" % title
+ icon = "*%s" % icon
+
+ self.editwin.top.wm_title(title)
+ self.editwin.top.wm_iconname(icon)
+
+ def get_saved(self):
+ return self.undo.get_saved()
+
+ def set_saved(self, flag):
+ self.undo.set_saved(flag)
+
+ def filename_change_hook(self):
+ if self.editwin.flist:
+ self.editwin.flist.filename_changed_edit(self)
+ self.saved_change_hook()
+ self.editwin.top.update_windowlist_registry(self)
+ self.reset_colorizer()
+
+ def reset_undo(self):
+ self.undo.reset_undo()
+
+ def reset_colorizer(self):
+ "Update the colour theme"
+ # Called from self.filename_change_hook and from configDialog.py
+ self.__rmcolorizer()
+ self.__addcolorizer()
+ theme = idleConf.GetOption('main','Theme','name')
+ normal_colors = idleConf.GetHighlight(theme, 'normal')
+ cursor_color = idleConf.GetHighlight(theme, 'cursor', fgBg='fg')
+ select_colors = idleConf.GetHighlight(theme, 'hilite')
+
+ self.text.config(
+ foreground=normal_colors['foreground'],
+ background=normal_colors['background'],
+ insertbackground=cursor_color,
+ selectforeground=select_colors['foreground'],
+ selectbackground=select_colors['background'])
+
+ def short_title(self):
+ filename = self.io.filename
+ if filename:
+ filename = os.path.basename(filename)
+ # return unicode string to display non-ASCII chars correctly
+ return filename_to_unicode(filename)
+
+ def long_title(self):
+ # return unicode string to display non-ASCII chars correctly
+ return filename_to_unicode(self.io.filename or "")
+ # XXX (1) end
+
 def center(self, mark="insert"):
 # Used by EditorWindow.gotoline
 text = self.text
@@ -225,6 +332,9 @@
 text.bind("<Left>", self._move_at_edge_if_selection(0))
 text.bind("<Right>", self._move_at_edge_if_selection(1))
 text.bind("<3>", self._right_menu)
+ text.bind('<<set-line-and-column>>', self.editwin.set_line_and_column)
+ text.event_add("<<set-line-and-column>>",
+ "<KeyRelease>", "<ButtonRelease>")
 
 if macosxSupport.runningAsOSXApp():
 # Command-W on editorwindows doesn't work without this.
@@ -601,6 +711,25 @@
 
 self.editwin.rmenu = rmenu
 
+ def __rmcolorizer(self):
+ if not self.color:
+ return
+ self.color.removecolors()
+ self.per.removefilter(self.color)
+ self.color = None
+
+ def __addcolorizer(self):
+ if self.color:
+ return
+ if self.editwin.ispythonsource(self.io.filename):
+ self.color = self.editwin.ColorDelegator()
+
+ # can add more colorizers here...
+ if self.color:
+ self.per.removefilter(self.undo)
+ self.per.insertfilter(self.color)
+ self.per.insertfilter(self.undo)
+
 def __asktabwidth(self):
 return self.editwin.askinteger(
 "Tab width",


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /