blob: 5682111137b8d09b1f605cba6d50f63d66a786b2 [file] [log] [blame]
David Scherer7aced172000-08-15 01:13:23 +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 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 main():
56 class Tracer(Delegator):
57 def __init__(self, name):
58 self.name = name
59 Delegator.__init__(self, None)
60 def insert(self, *args):
61 print self.name, ": insert", args
62 apply(self.delegate.insert, args)
63 def delete(self, *args):
64 print self.name, ": delete", args
65 apply(self.delegate.delete, args)
David Scherer7aced172000-08-15 01:13:23 +000066 root = Tk()
67 root.wm_protocol("WM_DELETE_WINDOW", root.quit)
68 text = Text()
69 text.pack()
70 text.focus_set()
71 p = Percolator(text)
72 t1 = Tracer("t1")
73 t2 = Tracer("t2")
74 p.insertfilter(t1)
75 p.insertfilter(t2)
76 root.mainloop()
77 p.removefilter(t2)
78 root.mainloop()
79 p.insertfilter(t2)
80 p.removefilter(t1)
81 root.mainloop()
82
83if __name__ == "__main__":
Kurt B. Kaiser48b03142001-07-13 20:00:15 +000084 from Tkinter import *
David Scherer7aced172000-08-15 01:13:23 +000085 main()