blob: 9e9331940f7246386018c9f133e2d7298a6f93dd [file] [log] [blame]
Kurt B. Kaiser2d7f6a02007-08-22 23:01:33 +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
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -040054def _percolator(parent):
55 import tkinter as tk
56 import re
David Scherer7aced172000-08-15 01:13:23 +000057 class Tracer(Delegator):
58 def __init__(self, name):
59 self.name = name
60 Delegator.__init__(self, None)
61 def insert(self, *args):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000062 print(self.name, ": insert", args)
Raymond Hettinger931237e2003-07-09 18:48:24 +000063 self.delegate.insert(*args)
David Scherer7aced172000-08-15 01:13:23 +000064 def delete(self, *args):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000065 print(self.name, ": delete", args)
Raymond Hettinger931237e2003-07-09 18:48:24 +000066 self.delegate.delete(*args)
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -040067 root = tk.Tk()
68 root.title("Test Percolator")
69 width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
70 root.geometry("+%d+%d"%(x, y + 150))
71 text = tk.Text(root)
David Scherer7aced172000-08-15 01:13:23 +000072 p = Percolator(text)
73 t1 = Tracer("t1")
74 t2 = Tracer("t2")
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -040075
76 def toggle1():
77 if var1.get() == 0:
78 var1.set(1)
79 p.insertfilter(t1)
80 elif var1.get() == 1:
81 var1.set(0)
82 p.removefilter(t1)
83
84 def toggle2():
85 if var2.get() == 0:
86 var2.set(1)
87 p.insertfilter(t2)
88 elif var2.get() == 1:
89 var2.set(0)
90 p.removefilter(t2)
91
92 text.pack()
93 var1 = tk.IntVar()
94 cb1 = tk.Checkbutton(root, text="Tracer1", command=toggle1, variable=var1)
95 cb1.pack()
96 var2 = tk.IntVar()
97 cb2 = tk.Checkbutton(root, text="Tracer2", command=toggle2, variable=var2)
98 cb2.pack()
99
David Scherer7aced172000-08-15 01:13:23 +0000100 root.mainloop()
101
102if __name__ == "__main__":
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -0400103 from idlelib.idle_test.htest import run
104 run(_percolator)