blob: 1fe34d29f54eb2887868d01310ad4a1033aead74 [file] [log] [blame]
Terry Jan Reedy6fa5bdc2016-05-28 13:22:31 -04001from idlelib.delegator import Delegator
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -04002from idlelib.redirector import WidgetRedirector
David Scherer7aced172000-08-15 01:13:23 +00003
Terry Jan Reedy092473e2016-05-17 22:48:22 -04004
David Scherer7aced172000-08-15 01:13:23 +00005class Percolator:
6
7 def __init__(self, text):
8 # XXX would be nice to inherit from Delegator
9 self.text = text
10 self.redir = WidgetRedirector(text)
11 self.top = self.bottom = Delegator(text)
12 self.bottom.insert = self.redir.register("insert", self.insert)
13 self.bottom.delete = self.redir.register("delete", self.delete)
14 self.filters = []
15
16 def close(self):
17 while self.top is not self.bottom:
18 self.removefilter(self.top)
19 self.top = None
Terry Jan Reedy092473e2016-05-17 22:48:22 -040020 self.bottom.setdelegate(None)
21 self.bottom = None
22 self.redir.close()
23 self.redir = None
David Scherer7aced172000-08-15 01:13:23 +000024 self.text = None
25
26 def insert(self, index, chars, tags=None):
27 # Could go away if inheriting from Delegator
28 self.top.insert(index, chars, tags)
29
30 def delete(self, index1, index2=None):
31 # Could go away if inheriting from Delegator
32 self.top.delete(index1, index2)
33
34 def insertfilter(self, filter):
35 # Perhaps rename to pushfilter()?
36 assert isinstance(filter, Delegator)
37 assert filter.delegate is None
38 filter.setdelegate(self.top)
39 self.top = filter
40
Tal Einat15d38612021-04-29 01:27:55 +030041 def insertfilterafter(self, filter, after):
42 assert isinstance(filter, Delegator)
43 assert isinstance(after, Delegator)
44 assert filter.delegate is None
45
46 f = self.top
47 f.resetcache()
48 while f is not after:
49 assert f is not self.bottom
50 f = f.delegate
51 f.resetcache()
52
53 filter.setdelegate(f.delegate)
54 f.setdelegate(filter)
55
David Scherer7aced172000-08-15 01:13:23 +000056 def removefilter(self, filter):
57 # XXX Perhaps should only support popfilter()?
58 assert isinstance(filter, Delegator)
59 assert filter.delegate is not None
60 f = self.top
61 if f is filter:
62 self.top = filter.delegate
63 filter.setdelegate(None)
64 else:
65 while f.delegate is not filter:
66 assert f is not self.bottom
67 f.resetcache()
68 f = f.delegate
69 f.setdelegate(filter.delegate)
70 filter.setdelegate(None)
71
Terry Jan Reedy092473e2016-05-17 22:48:22 -040072
73def _percolator(parent): # htest #
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -040074 import tkinter as tk
Terry Jan Reedy092473e2016-05-17 22:48:22 -040075
David Scherer7aced172000-08-15 01:13:23 +000076 class Tracer(Delegator):
77 def __init__(self, name):
78 self.name = name
79 Delegator.__init__(self, None)
Terry Jan Reedy092473e2016-05-17 22:48:22 -040080
David Scherer7aced172000-08-15 01:13:23 +000081 def insert(self, *args):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000082 print(self.name, ": insert", args)
Raymond Hettinger931237e2003-07-09 18:48:24 +000083 self.delegate.insert(*args)
Terry Jan Reedy092473e2016-05-17 22:48:22 -040084
David Scherer7aced172000-08-15 01:13:23 +000085 def delete(self, *args):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000086 print(self.name, ": delete", args)
Raymond Hettinger931237e2003-07-09 18:48:24 +000087 self.delegate.delete(*args)
Terry Jan Reedy092473e2016-05-17 22:48:22 -040088
89 box = tk.Toplevel(parent)
90 box.title("Test Percolator")
Terry Jan Reedya7480322016-07-10 17:28:10 -040091 x, y = map(int, parent.geometry().split('+')[1:])
92 box.geometry("+%d+%d" % (x, y + 175))
Terry Jan Reedy092473e2016-05-17 22:48:22 -040093 text = tk.Text(box)
David Scherer7aced172000-08-15 01:13:23 +000094 p = Percolator(text)
Terry Jan Reedy092473e2016-05-17 22:48:22 -040095 pin = p.insertfilter
96 pout = p.removefilter
David Scherer7aced172000-08-15 01:13:23 +000097 t1 = Tracer("t1")
98 t2 = Tracer("t2")
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -040099
100 def toggle1():
Terry Jan Reedy092473e2016-05-17 22:48:22 -0400101 (pin if var1.get() else pout)(t1)
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -0400102 def toggle2():
Terry Jan Reedy092473e2016-05-17 22:48:22 -0400103 (pin if var2.get() else pout)(t2)
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -0400104
105 text.pack()
Terry Jan Reedyb60adc52016-06-21 18:41:38 -0400106 var1 = tk.IntVar(parent)
Terry Jan Reedy092473e2016-05-17 22:48:22 -0400107 cb1 = tk.Checkbutton(box, text="Tracer1", command=toggle1, variable=var1)
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -0400108 cb1.pack()
Terry Jan Reedyb60adc52016-06-21 18:41:38 -0400109 var2 = tk.IntVar(parent)
Terry Jan Reedy092473e2016-05-17 22:48:22 -0400110 cb2 = tk.Checkbutton(box, text="Tracer2", command=toggle2, variable=var2)
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -0400111 cb2.pack()
112
David Scherer7aced172000-08-15 01:13:23 +0000113if __name__ == "__main__":
Terry Jan Reedyea3dc802018-06-18 04:47:59 -0400114 from unittest import main
115 main('idlelib.idle_test.test_percolator', verbosity=2, exit=False)
Terry Jan Reedy092473e2016-05-17 22:48:22 -0400116
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -0400117 from idlelib.idle_test.htest import run
118 run(_percolator)