blob: e0e8cade0ddbd6b30671036cd0d5f37286d9df0c [file] [log] [blame]
Florent Xiclunad630c042010-04-02 07:24:52 +00001from idlelib.WidgetRedirector import WidgetRedirector
2from idlelib.Delegator import Delegator
David Scherer7aced172000-08-15 01:13:23 +00003
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
Terry Jan Reedy985ef282014-05-27 02:47:38 -040055def _percolator(parent):
56 import Tkinter as tk
57 import re
David Scherer7aced172000-08-15 01:13:23 +000058 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
Raymond Hettinger931237e2003-07-09 18:48:24 +000064 self.delegate.insert(*args)
David Scherer7aced172000-08-15 01:13:23 +000065 def delete(self, *args):
66 print self.name, ": delete", args
Raymond Hettinger931237e2003-07-09 18:48:24 +000067 self.delegate.delete(*args)
Terry Jan Reedy985ef282014-05-27 02:47:38 -040068 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)
David Scherer7aced172000-08-15 01:13:23 +000073 p = Percolator(text)
74 t1 = Tracer("t1")
75 t2 = Tracer("t2")
Terry Jan Reedy985ef282014-05-27 02:47:38 -040076
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()
David Scherer7aced172000-08-15 01:13:23 +0000100
101if __name__ == "__main__":
Terry Jan Reedy985ef282014-05-27 02:47:38 -0400102 from idlelib.idle_test.htest import run
103 run(_percolator)