Updated for 2.1a3
[python/dscho.git] / Lib / idlelib / WidgetRedirector.py
blobb49ccf1c590a506e1efca25e4c1e82249b3ee4e4
1 from Tkinter import *
4 class WidgetRedirector:
6 """Support for redirecting arbitrary widget subcommands."""
8 def __init__(self, widget):
9 self.dict = {}
10 self.widget = widget
11 self.tk = tk = widget.tk
12 w = widget._w
13 self.orig = w + "_orig"
14 tk.call("rename", w, self.orig)
15 tk.createcommand(w, self.dispatch)
17 def __repr__(self):
18 return "WidgetRedirector(%s<%s>)" % (self.widget.__class__.__name__,
19 self.widget._w)
21 def close(self):
22 for name in self.dict.keys():
23 self.unregister(name)
24 widget = self.widget; del self.widget
25 orig = self.orig; del self.orig
26 tk = widget.tk
27 w = widget._w
28 tk.deletecommand(w)
29 tk.call("rename", orig, w)
31 def register(self, name, function):
32 if self.dict.has_key(name):
33 previous = dict[name]
34 else:
35 previous = OriginalCommand(self, name)
36 self.dict[name] = function
37 setattr(self.widget, name, function)
38 return previous
40 def unregister(self, name):
41 if self.dict.has_key(name):
42 function = self.dict[name]
43 del self.dict[name]
44 if hasattr(self.widget, name):
45 delattr(self.widget, name)
46 return function
47 else:
48 return None
50 def dispatch(self, cmd, *args):
51 m = self.dict.get(cmd)
52 try:
53 if m:
54 return apply(m, args)
55 else:
56 return self.tk.call((self.orig, cmd) + args)
57 except TclError:
58 return ""
61 class OriginalCommand:
63 def __init__(self, redir, name):
64 self.redir = redir
65 self.name = name
66 self.tk = redir.tk
67 self.orig = redir.orig
68 self.tk_call = self.tk.call
69 self.orig_and_name = (self.orig, self.name)
71 def __repr__(self):
72 return "OriginalCommand(%s, %s)" % (`self.redir`, `self.name`)
74 def __call__(self, *args):
75 return self.tk_call(self.orig_and_name + args)
78 def main():
79 root = Tk()
80 text = Text()
81 text.pack()
82 text.focus_set()
83 redir = WidgetRedirector(text)
84 global orig_insert
85 def my_insert(*args):
86 print "insert", args
87 apply(orig_insert, args)
88 orig_insert = redir.register("insert", my_insert)
89 root.mainloop()
91 if __name__ == "__main__":
92 main()