1from idlelib.WidgetRedirector import WidgetRedirector 2from idlelib.Delegator import Delegator 3 4class Percolator: 5 6 def __init__(self, text): 7 # XXX would be nice to inherit from Delegator 8 self.text = text 9 self.redir = WidgetRedirector(text) 10 self.top = self.bottom = Delegator(text) 11 self.bottom.insert = self.redir.register("insert", self.insert) 12 self.bottom.delete = self.redir.register("delete", self.delete) 13 self.filters = [] 14 15 def close(self): 16 while self.top is not self.bottom: 17 self.removefilter(self.top) 18 self.top = None 19 self.bottom.setdelegate(None); self.bottom = None 20 self.redir.close(); self.redir = None 21 self.text = None 22 23 def insert(self, index, chars, tags=None): 24 # Could go away if inheriting from Delegator 25 self.top.insert(index, chars, tags) 26 27 def delete(self, index1, index2=None): 28 # Could go away if inheriting from Delegator 29 self.top.delete(index1, index2) 30 31 def insertfilter(self, filter): 32 # Perhaps rename to pushfilter()? 33 assert isinstance(filter, Delegator) 34 assert filter.delegate is None 35 filter.setdelegate(self.top) 36 self.top = filter 37 38 def removefilter(self, filter): 39 # XXX Perhaps should only support popfilter()? 40 assert isinstance(filter, Delegator) 41 assert filter.delegate is not None 42 f = self.top 43 if f is filter: 44 self.top = filter.delegate 45 filter.setdelegate(None) 46 else: 47 while f.delegate is not filter: 48 assert f is not self.bottom 49 f.resetcache() 50 f = f.delegate 51 f.setdelegate(filter.delegate) 52 filter.setdelegate(None) 53 54 55def _percolator(parent): 56 import Tkinter as tk 57 import re 58 class Tracer(Delegator): 59 def __init__(self, name): 60 self.name = name 61 Delegator.__init__(self, None) 62 def insert(self, *args): 63 print self.name, ": insert", args 64 self.delegate.insert(*args) 65 def delete(self, *args): 66 print self.name, ": delete", args 67 self.delegate.delete(*args) 68 root = tk.Tk() 69 root.title("Test Percolator") 70 width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) 71 root.geometry("+%d+%d"%(x, y + 150)) 72 text = tk.Text(root) 73 p = Percolator(text) 74 t1 = Tracer("t1") 75 t2 = Tracer("t2") 76 77 def toggle1(): 78 if var1.get() == 0: 79 var1.set(1) 80 p.insertfilter(t1) 81 elif var1.get() == 1: 82 var1.set(0) 83 p.removefilter(t1) 84 85 def toggle2(): 86 if var2.get() == 0: 87 var2.set(1) 88 p.insertfilter(t2) 89 elif var2.get() == 1: 90 var2.set(0) 91 p.removefilter(t2) 92 93 text.pack() 94 var1 = tk.IntVar() 95 cb1 = tk.Checkbutton(root, text="Tracer1", command=toggle1, variable=var1) 96 cb1.pack() 97 var2 = tk.IntVar() 98 cb2 = tk.Checkbutton(root, text="Tracer2", command=toggle2, variable=var2) 99 cb2.pack() 100 101if __name__ == "__main__": 102 from idlelib.idle_test.htest import run 103 run(_percolator) 104