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