• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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