blob: a5f503fc786f102006b36b7c662c533618060978 [file] [log] [blame]
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +00001from WidgetRedirector import WidgetRedirector
2from 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 insert(self, index, chars, tags=None):
16 # Could go away if inheriting from Delegator
17 self.top.insert(index, chars, tags)
18
19 def delete(self, index1, index2=None):
20 # Could go away if inheriting from Delegator
21 self.top.delete(index1, index2)
22
23 def insertfilter(self, filter):
24 # Perhaps rename to pushfilter()?
25 assert isinstance(filter, Delegator)
26 assert filter.delegate is None
27 filter.setdelegate(self.top)
28 self.top = filter
29
30 def removefilter(self, filter):
31 # XXX Perhaps should only support popfilter()?
32 assert isinstance(filter, Delegator)
33 assert filter.delegate is not None
34 f = self.top
35 if f is filter:
36 self.top = filter.delegate
37 filter.setdelegate(None)
38 else:
39 while f.delegate is not filter:
40 assert f is not self.bottom
41 f.resetcache()
42 f = f.delegate
43 f.setdelegate(filter.delegate)
44 filter.setdelegate(None)
45
46
47def main():
48 class Tracer(Delegator):
49 def __init__(self, name):
50 self.name = name
51 Delegator.__init__(self, None)
52 def insert(self, *args):
53 print self.name, ": insert", args
54 apply(self.delegate.insert, args)
55 def delete(self, *args):
56 print self.name, ": delete", args
57 apply(self.delegate.delete, args)
58 from Tkinter import *
59 root = Tk()
60 root.wm_protocol("WM_DELETE_WINDOW", root.quit)
61 text = Text()
62 text.pack()
63 text.focus_set()
64 p = Percolator(text)
65 t1 = Tracer("t1")
66 t2 = Tracer("t2")
67 p.insertfilter(t1)
68 p.insertfilter(t2)
69 root.mainloop()
70 p.removefilter(t2)
71 root.mainloop()
72 p.insertfilter(t2)
73 p.removefilter(t1)
74 root.mainloop()
75
76if __name__ == "__main__":
77 main()