/
usr
/
lib64
/
python2.6
/
idlelib
/
/usr/lib64/python2.6/idlelib
mkdir
upload
Name
Size
Mode
Actions
Icons/
-
0755
rm
aboutDialog.py
6825
0644
edit
dl
rm
aboutDialog.pyc
6965
0644
edit
dl
rm
aboutDialog.pyo
6965
0644
edit
dl
rm
AutoComplete.py
9061
0644
edit
dl
rm
AutoComplete.pyc
8023
0644
edit
dl
rm
AutoComplete.pyo
8023
0644
edit
dl
rm
AutoCompleteWindow.py
17201
0644
edit
dl
rm
AutoCompleteWindow.pyc
12580
0644
edit
dl
rm
AutoCompleteWindow.pyo
12517
0644
edit
dl
rm
AutoExpand.py
2483
0644
edit
dl
rm
AutoExpand.pyc
2587
0644
edit
dl
rm
AutoExpand.pyo
2587
0644
edit
dl
rm
Bindings.py
3502
0644
edit
dl
rm
Bindings.pyc
5064
0644
edit
dl
rm
Bindings.pyo
5064
0644
edit
dl
rm
CallTips.py
7608
0644
edit
dl
rm
CallTips.pyc
10287
0644
edit
dl
rm
CallTips.pyo
10287
0644
edit
dl
rm
CallTipWindow.py
5924
0644
edit
dl
rm
CallTipWindow.pyc
6217
0644
edit
dl
rm
CallTipWindow.pyo
6217
0644
edit
dl
rm
ChangeLog
56393
0644
edit
dl
rm
ClassBrowser.py
6369
0644
edit
dl
rm
ClassBrowser.pyc
9220
0644
edit
dl
rm
ClassBrowser.pyo
9220
0644
edit
dl
rm
CodeContext.py
8347
0644
edit
dl
rm
CodeContext.pyc
6733
0644
edit
dl
rm
CodeContext.pyo
6687
0644
edit
dl
rm
ColorDelegator.py
10150
0644
edit
dl
rm
ColorDelegator.pyc
8976
0644
edit
dl
rm
ColorDelegator.pyo
8976
0644
edit
dl
rm
config-extensions.def
2697
0644
edit
dl
rm
config-highlight.def
1740
0644
edit
dl
rm
config-keys.def
7517
0644
edit
dl
rm
config-main.def
2512
0644
edit
dl
rm
configDialog.py
53229
0644
edit
dl
rm
configDialog.pyc
44986
0644
edit
dl
rm
configDialog.pyo
44986
0644
edit
dl
rm
configHandler.py
28803
0644
edit
dl
rm
configHandler.pyc
27360
0644
edit
dl
rm
configHandler.pyo
27360
0644
edit
dl
rm
configHelpSourceEdit.py
6680
0644
edit
dl
rm
configHelpSourceEdit.pyc
6751
0644
edit
dl
rm
configHelpSourceEdit.pyo
6751
0644
edit
dl
rm
configSectionNameDialog.py
3720
0644
edit
dl
rm
configSectionNameDialog.pyc
4321
0644
edit
dl
rm
configSectionNameDialog.pyo
4321
0644
edit
dl
rm
CREDITS.txt
1856
0644
edit
dl
rm
Debugger.py
15818
0644
edit
dl
rm
Debugger.pyc
17074
0644
edit
dl
rm
Debugger.pyo
17074
0644
edit
dl
rm
Delegator.py
831
0644
edit
dl
rm
Delegator.pyc
1623
0644
edit
dl
rm
Delegator.pyo
1623
0644
edit
dl
rm
dynOptionMenuWidget.py
1302
0644
edit
dl
rm
dynOptionMenuWidget.pyc
1707
0644
edit
dl
rm
dynOptionMenuWidget.pyo
1707
0644
edit
dl
rm
EditorWindow.py
59734
0644
edit
dl
rm
EditorWindow.pyc
53007
0644
edit
dl
rm
EditorWindow.pyo
52904
0644
edit
dl
rm
extend.txt
3652
0644
edit
dl
rm
FileList.py
3660
0644
edit
dl
rm
FileList.pyc
4010
0644
edit
dl
rm
FileList.pyo
3975
0644
edit
dl
rm
FormatParagraph.py
5734
0644
edit
dl
rm
FormatParagraph.pyc
4827
0644
edit
dl
rm
FormatParagraph.pyo
4827
0644
edit
dl
rm
GrepDialog.py
4052
0644
edit
dl
rm
GrepDialog.pyc
5061
0644
edit
dl
rm
GrepDialog.pyo
5061
0644
edit
dl
rm
help.txt
11223
0644
edit
dl
rm
HISTORY.txt
10317
0644
edit
dl
rm
HyperParser.py
10310
0644
edit
dl
rm
HyperParser.pyc
6640
0644
edit
dl
rm
HyperParser.pyo
6640
0644
edit
dl
rm
idle.py
664
0644
edit
dl
rm
idle.pyc
596
0644
edit
dl
rm
idle.pyo
596
0644
edit
dl
rm
idle.pyw
664
0644
edit
dl
rm
IdleHistory.py
3145
0644
edit
dl
rm
IdleHistory.pyc
3231
0644
edit
dl
rm
IdleHistory.pyo
3231
0644
edit
dl
rm
idlever.py
23
0644
edit
dl
rm
idlever.pyc
159
0644
edit
dl
rm
idlever.pyo
159
0644
edit
dl
rm
IOBinding.py
20972
0644
edit
dl
rm
IOBinding.pyc
17791
0644
edit
dl
rm
IOBinding.pyo
17791
0644
edit
dl
rm
keybindingDialog.py
12407
0644
edit
dl
rm
keybindingDialog.pyc
12416
0644
edit
dl
rm
keybindingDialog.pyo
12416
0644
edit
dl
rm
macosxSupport.py
4724
0644
edit
dl
rm
macosxSupport.pyc
4886
0644
edit
dl
rm
macosxSupport.pyo
4886
0644
edit
dl
rm
MultiCall.py
17470
0644
edit
dl
rm
MultiCall.pyc
16208
0644
edit
dl
rm
MultiCall.pyo
16132
0644
edit
dl
rm
MultiStatusBar.py
789
0644
edit
dl
rm
MultiStatusBar.pyc
1548
0644
edit
dl
rm
MultiStatusBar.pyo
1548
0644
edit
dl
rm
NEWS.txt
27165
0644
edit
dl
rm
ObjectBrowser.py
4156
0644
edit
dl
rm
ObjectBrowser.pyc
6747
0644
edit
dl
rm
ObjectBrowser.pyo
6747
0644
edit
dl
rm
OutputWindow.py
4392
0644
edit
dl
rm
OutputWindow.pyc
5020
0644
edit
dl
rm
OutputWindow.pyo
5020
0644
edit
dl
rm
ParenMatch.py
6627
0644
edit
dl
rm
ParenMatch.pyc
7007
0644
edit
dl
rm
ParenMatch.pyo
7007
0644
edit
dl
rm
PathBrowser.py
2646
0644
edit
dl
rm
PathBrowser.pyc
4165
0644
edit
dl
rm
PathBrowser.pyo
4165
0644
edit
dl
rm
Percolator.py
2616
0644
edit
dl
rm
Percolator.pyc
3660
0644
edit
dl
rm
Percolator.pyo
3466
0644
edit
dl
rm
PyParse.py
19510
0644
edit
dl
rm
PyParse.pyc
10213
0644
edit
dl
rm
PyParse.pyo
9745
0644
edit
dl
rm
PyShell.py
51909
0644
edit
dl
rm
PyShell.pyc
46688
0644
edit
dl
rm
PyShell.pyo
46587
0644
edit
dl
rm
README.txt
2623
0644
edit
dl
rm
RemoteDebugger.py
11660
0644
edit
dl
rm
RemoteDebugger.pyc
16414
0644
edit
dl
rm
RemoteDebugger.pyo
16259
0644
edit
dl
rm
RemoteObjectBrowser.py
942
0644
edit
dl
rm
RemoteObjectBrowser.pyc
2167
0644
edit
dl
rm
RemoteObjectBrowser.pyo
2167
0644
edit
dl
rm
ReplaceDialog.py
5134
0644
edit
dl
rm
ReplaceDialog.pyc
5984
0644
edit
dl
rm
ReplaceDialog.pyo
5984
0644
edit
dl
rm
rpc.py
20215
0644
edit
dl
rm
rpc.pyc
21937
0644
edit
dl
rm
rpc.pyo
21827
0644
edit
dl
rm
run.py
11337
0644
edit
dl
rm
run.pyc
12214
0644
edit
dl
rm
run.pyo
12214
0644
edit
dl
rm
ScriptBinding.py
7783
0644
edit
dl
rm
ScriptBinding.pyc
7607
0644
edit
dl
rm
ScriptBinding.pyo
7607
0644
edit
dl
rm
ScrolledList.py
3995
0644
edit
dl
rm
ScrolledList.pyc
6193
0644
edit
dl
rm
ScrolledList.pyo
6193
0644
edit
dl
rm
SearchDialog.py
2040
0644
edit
dl
rm
SearchDialog.pyc
3026
0644
edit
dl
rm
SearchDialog.pyo
3026
0644
edit
dl
rm
SearchDialogBase.py
4385
0644
edit
dl
rm
SearchDialogBase.pyc
5518
0644
edit
dl
rm
SearchDialogBase.pyo
5518
0644
edit
dl
rm
SearchEngine.py
6731
0644
edit
dl
rm
SearchEngine.pyc
7257
0644
edit
dl
rm
SearchEngine.pyo
7257
0644
edit
dl
rm
StackViewer.py
3857
0644
edit
dl
rm
StackViewer.pyc
5958
0644
edit
dl
rm
StackViewer.pyo
5958
0644
edit
dl
rm
tabbedpages.py
18188
0644
edit
dl
rm
tabbedpages.pyc
18163
0644
edit
dl
rm
tabbedpages.pyo
18163
0644
edit
dl
rm
textView.py
3246
0644
edit
dl
rm
textView.pyc
3983
0644
edit
dl
rm
textView.pyo
3983
0644
edit
dl
rm
TODO.txt
8478
0644
edit
dl
rm
ToolTip.py
2736
0644
edit
dl
rm
ToolTip.pyc
4160
0644
edit
dl
rm
ToolTip.pyo
4160
0644
edit
dl
rm
TreeWidget.py
15237
0644
edit
dl
rm
TreeWidget.pyc
18014
0644
edit
dl
rm
TreeWidget.pyo
18014
0644
edit
dl
rm
UndoDelegator.py
10277
0644
edit
dl
rm
UndoDelegator.pyc
12646
0644
edit
dl
rm
UndoDelegator.pyo
12646
0644
edit
dl
rm
WidgetRedirector.py
4476
0644
edit
dl
rm
WidgetRedirector.pyc
5366
0644
edit
dl
rm
WidgetRedirector.pyo
5366
0644
edit
dl
rm
WindowList.py
2473
0644
edit
dl
rm
WindowList.pyc
3654
0644
edit
dl
rm
WindowList.pyo
3654
0644
edit
dl
rm
ZoomHeight.py
1307
0644
edit
dl
rm
ZoomHeight.pyc
1661
0644
edit
dl
rm
ZoomHeight.pyo
1661
0644
edit
dl
rm
__init__.py
37
0644
edit
dl
rm
__init__.pyc
127
0644
edit
dl
rm
__init__.pyo
127
0644
edit
dl
rm
Edit:
/usr/lib64/python2.6/idlelib/UndoDelegator.py
(10277B)
import string from Tkinter import * from idlelib.Delegator import Delegator #$ event <<redo>> #$ win <Control-y> #$ unix <Alt-z> #$ event <<undo>> #$ win <Control-z> #$ unix <Control-z> #$ event <<dump-undo-state>> #$ win <Control-backslash> #$ unix <Control-backslash> class UndoDelegator(Delegator): max_undo = 1000 def __init__(self): Delegator.__init__(self) self.reset_undo() def setdelegate(self, delegate): if self.delegate is not None: self.unbind("<<undo>>") self.unbind("<<redo>>") self.unbind("<<dump-undo-state>>") Delegator.setdelegate(self, delegate) if delegate is not None: self.bind("<<undo>>", self.undo_event) self.bind("<<redo>>", self.redo_event) self.bind("<<dump-undo-state>>", self.dump_event) def dump_event(self, event): from pprint import pprint pprint(self.undolist[:self.pointer]) print "pointer:", self.pointer, print "saved:", self.saved, print "can_merge:", self.can_merge, print "get_saved():", self.get_saved() pprint(self.undolist[self.pointer:]) return "break" def reset_undo(self): self.was_saved = -1 self.pointer = 0 self.undolist = [] self.undoblock = 0 # or a CommandSequence instance self.set_saved(1) def set_saved(self, flag): if flag: self.saved = self.pointer else: self.saved = -1 self.can_merge = False self.check_saved() def get_saved(self): return self.saved == self.pointer saved_change_hook = None def set_saved_change_hook(self, hook): self.saved_change_hook = hook was_saved = -1 def check_saved(self): is_saved = self.get_saved() if is_saved != self.was_saved: self.was_saved = is_saved if self.saved_change_hook: self.saved_change_hook() def insert(self, index, chars, tags=None): self.addcmd(InsertCommand(index, chars, tags)) def delete(self, index1, index2=None): self.addcmd(DeleteCommand(index1, index2)) # Clients should call undo_block_start() and undo_block_stop() # around a sequence of editing cmds to be treated as a unit by # undo & redo. Nested matching calls are OK, and the inner calls # then act like nops. OK too if no editing cmds, or only one # editing cmd, is issued in between: if no cmds, the whole # sequence has no effect; and if only one cmd, that cmd is entered # directly into the undo list, as if undo_block_xxx hadn't been # called. The intent of all that is to make this scheme easy # to use: all the client has to worry about is making sure each # _start() call is matched by a _stop() call. def undo_block_start(self): if self.undoblock == 0: self.undoblock = CommandSequence() self.undoblock.bump_depth() def undo_block_stop(self): if self.undoblock.bump_depth(-1) == 0: cmd = self.undoblock self.undoblock = 0 if len(cmd) > 0: if len(cmd) == 1: # no need to wrap a single cmd cmd = cmd.getcmd(0) # this blk of cmds, or single cmd, has already # been done, so don't execute it again self.addcmd(cmd, 0) def addcmd(self, cmd, execute=True): if execute: cmd.do(self.delegate) if self.undoblock != 0: self.undoblock.append(cmd) return if self.can_merge and self.pointer > 0: lastcmd = self.undolist[self.pointer-1] if lastcmd.merge(cmd): return self.undolist[self.pointer:] = [cmd] if self.saved > self.pointer: self.saved = -1 self.pointer = self.pointer + 1 if len(self.undolist) > self.max_undo: ##print "truncating undo list" del self.undolist[0] self.pointer = self.pointer - 1 if self.saved >= 0: self.saved = self.saved - 1 self.can_merge = True self.check_saved() def undo_event(self, event): if self.pointer == 0: self.bell() return "break" cmd = self.undolist[self.pointer - 1] cmd.undo(self.delegate) self.pointer = self.pointer - 1 self.can_merge = False self.check_saved() return "break" def redo_event(self, event): if self.pointer >= len(self.undolist): self.bell() return "break" cmd = self.undolist[self.pointer] cmd.redo(self.delegate) self.pointer = self.pointer + 1 self.can_merge = False self.check_saved() return "break" class Command: # Base class for Undoable commands tags = None def __init__(self, index1, index2, chars, tags=None): self.marks_before = {} self.marks_after = {} self.index1 = index1 self.index2 = index2 self.chars = chars if tags: self.tags = tags def __repr__(self): s = self.__class__.__name__ t = (self.index1, self.index2, self.chars, self.tags) if self.tags is None: t = t[:-1] return s + repr(t) def do(self, text): pass def redo(self, text): pass def undo(self, text): pass def merge(self, cmd): return 0 def save_marks(self, text): marks = {} for name in text.mark_names(): if name != "insert" and name != "current": marks[name] = text.index(name) return marks def set_marks(self, text, marks): for name, index in marks.items(): text.mark_set(name, index) class InsertCommand(Command): # Undoable insert command def __init__(self, index1, chars, tags=None): Command.__init__(self, index1, None, chars, tags) def do(self, text): self.marks_before = self.save_marks(text) self.index1 = text.index(self.index1) if text.compare(self.index1, ">", "end-1c"): # Insert before the final newline self.index1 = text.index("end-1c") text.insert(self.index1, self.chars, self.tags) self.index2 = text.index("%s+%dc" % (self.index1, len(self.chars))) self.marks_after = self.save_marks(text) ##sys.__stderr__.write("do: %s\n" % self) def redo(self, text): text.mark_set('insert', self.index1) text.insert(self.index1, self.chars, self.tags) self.set_marks(text, self.marks_after) text.see('insert') ##sys.__stderr__.write("redo: %s\n" % self) def undo(self, text): text.mark_set('insert', self.index1) text.delete(self.index1, self.index2) self.set_marks(text, self.marks_before) text.see('insert') ##sys.__stderr__.write("undo: %s\n" % self) def merge(self, cmd): if self.__class__ is not cmd.__class__: return False if self.index2 != cmd.index1: return False if self.tags != cmd.tags: return False if len(cmd.chars) != 1: return False if self.chars and \ self.classify(self.chars[-1]) != self.classify(cmd.chars): return False self.index2 = cmd.index2 self.chars = self.chars + cmd.chars return True alphanumeric = string.ascii_letters + string.digits + "_" def classify(self, c): if c in self.alphanumeric: return "alphanumeric" if c == "\n": return "newline" return "punctuation" class DeleteCommand(Command): # Undoable delete command def __init__(self, index1, index2=None): Command.__init__(self, index1, index2, None, None) def do(self, text): self.marks_before = self.save_marks(text) self.index1 = text.index(self.index1) if self.index2: self.index2 = text.index(self.index2) else: self.index2 = text.index(self.index1 + " +1c") if text.compare(self.index2, ">", "end-1c"): # Don't delete the final newline self.index2 = text.index("end-1c") self.chars = text.get(self.index1, self.index2) text.delete(self.index1, self.index2) self.marks_after = self.save_marks(text) ##sys.__stderr__.write("do: %s\n" % self) def redo(self, text): text.mark_set('insert', self.index1) text.delete(self.index1, self.index2) self.set_marks(text, self.marks_after) text.see('insert') ##sys.__stderr__.write("redo: %s\n" % self) def undo(self, text): text.mark_set('insert', self.index1) text.insert(self.index1, self.chars) self.set_marks(text, self.marks_before) text.see('insert') ##sys.__stderr__.write("undo: %s\n" % self) class CommandSequence(Command): # Wrapper for a sequence of undoable cmds to be undone/redone # as a unit def __init__(self): self.cmds = [] self.depth = 0 def __repr__(self): s = self.__class__.__name__ strs = [] for cmd in self.cmds: strs.append(" %r" % (cmd,)) return s + "(\n" + ",\n".join(strs) + "\n)" def __len__(self): return len(self.cmds) def append(self, cmd): self.cmds.append(cmd) def getcmd(self, i): return self.cmds[i] def redo(self, text): for cmd in self.cmds: cmd.redo(text) def undo(self, text): cmds = self.cmds[:] cmds.reverse() for cmd in cmds: cmd.undo(text) def bump_depth(self, incr=1): self.depth = self.depth + incr return self.depth def main(): from idlelib.Percolator import Percolator root = Tk() root.wm_protocol("WM_DELETE_WINDOW", root.quit) text = Text() text.pack() text.focus_set() p = Percolator(text) d = UndoDelegator() p.insertfilter(d) root.mainloop() if __name__ == "__main__": main()
Save
cmd:
run