summaryrefslogtreecommitdiffstats
path: root/Tools/idle/Percolator.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/idle/Percolator.py')
-rw-r--r--Tools/idle/Percolator.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/Tools/idle/Percolator.py b/Tools/idle/Percolator.py
new file mode 100644
index 0000000..a5f503f
--- /dev/null
+++ b/Tools/idle/Percolator.py
@@ -0,0 +1,77 @@
+from WidgetRedirector import WidgetRedirector
+from Delegator import Delegator
+
+class Percolator:
+
+ def __init__(self, text):
+ # XXX would be nice to inherit from Delegator
+ self.text = text
+ self.redir = WidgetRedirector(text)
+ self.top = self.bottom = Delegator(text)
+ self.bottom.insert = self.redir.register("insert", self.insert)
+ self.bottom.delete = self.redir.register("delete", self.delete)
+ self.filters = []
+
+ def insert(self, index, chars, tags=None):
+ # Could go away if inheriting from Delegator
+ self.top.insert(index, chars, tags)
+
+ def delete(self, index1, index2=None):
+ # Could go away if inheriting from Delegator
+ self.top.delete(index1, index2)
+
+ def insertfilter(self, filter):
+ # Perhaps rename to pushfilter()?
+ assert isinstance(filter, Delegator)
+ assert filter.delegate is None
+ filter.setdelegate(self.top)
+ self.top = filter
+
+ def removefilter(self, filter):
+ # XXX Perhaps should only support popfilter()?
+ assert isinstance(filter, Delegator)
+ assert filter.delegate is not None
+ f = self.top
+ if f is filter:
+ self.top = filter.delegate
+ filter.setdelegate(None)
+ else:
+ while f.delegate is not filter:
+ assert f is not self.bottom
+ f.resetcache()
+ f = f.delegate
+ f.setdelegate(filter.delegate)
+ filter.setdelegate(None)
+
+
+def main():
+ class Tracer(Delegator):
+ def __init__(self, name):
+ self.name = name
+ Delegator.__init__(self, None)
+ def insert(self, *args):
+ print self.name, ": insert", args
+ apply(self.delegate.insert, args)
+ def delete(self, *args):
+ print self.name, ": delete", args
+ apply(self.delegate.delete, args)
+ from Tkinter import *
+ root = Tk()
+ root.wm_protocol("WM_DELETE_WINDOW", root.quit)
+ text = Text()
+ text.pack()
+ text.focus_set()
+ p = Percolator(text)
+ t1 = Tracer("t1")
+ t2 = Tracer("t2")
+ p.insertfilter(t1)
+ p.insertfilter(t2)
+ root.mainloop()
+ p.removefilter(t2)
+ root.mainloop()
+ p.insertfilter(t2)
+ p.removefilter(t1)
+ root.mainloop()
+
+if __name__ == "__main__":
+ main()