| 3 | |
| 4 | |
| 5 | class 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 |
| 20 | self.bottom.setdelegate(None) |
| 21 | self.bottom = None |
| 22 | self.redir.close() |
| 23 | self.redir = None |
| 24 | 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 | |
| 41 | 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 | |
| 56 | 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 |
no outgoing calls
searching dependent graphs…