source: coopr.gui.coopr/trunk/coopr/gui/coopr/Keymap.py @ 2135

Last change on this file since 2135 was 2135, checked in by wehart, 10 years ago

Adding Jython GUI components.

  • Property svn:executable set to *
File size: 2.1 KB
Line 
1from java.awt.event import KeyEvent, InputEvent
2from pawt.swing import KeyStroke, text
3import string
4from Action import Action
5
6_keynames = {}
7def getKeyStroke(key):
8        if len(_keynames) == 0:
9                for name in dir(KeyEvent):
10                        if name[:3] == 'VK_':
11                                _keynames[string.lower(name[3:])] = getattr(KeyEvent, name)
12
13        if key is None:
14                return KeyStroke.getKeyStroke(KeyEvent.CHAR_UNDEFINED)
15
16        if len(key) == 1:
17                return KeyStroke.getKeyStroke(key)
18
19        fields = string.split(key, '-')
20        key = fields[-1]
21        mods = fields[:-1]
22
23        modifiers = 0
24        for mod in mods:
25                if mod == 'C':
26                        modifiers = modifiers | InputEvent.CTRL_MASK
27                elif mod == 'S':
28                        modifiers = modifiers | InputEvent.SHIFT_MASK
29                #Meta and Alt don't currently work right
30                elif mod == 'M':
31                        modifiers = modifiers | InputEvent.META_MASK
32                elif mod == 'A':
33                        modifiers = modifiers | InputEvent.ALT_MASK
34                else:
35                        raise ValueError, 'Invalid modifier in '+key
36
37        return KeyStroke.getKeyStroke(_keynames[key], modifiers)
38
39
40def makeAction(o):
41        if isinstance(o, Action): return o
42        if callable(o): return Action(o)
43
44class Keymap:
45        __keynames = {}
46        __defaultKeymap = text.JTextComponent.getKeymap(text.JTextComponent.DEFAULT_KEYMAP)
47
48        def __init__(self, bindings={}, parent=__defaultKeymap):
49                self.keymap = text.JTextComponent.addKeymap(None, parent)
50                for key, action in bindings.items():
51                        self.bind(key, action)
52
53        def bind(self, key, action):
54                self.keymap.addActionForKeyStroke(getKeyStroke(key), makeAction(action))
55
56        def __tojava__(self, c):
57                if isinstance(self.keymap, c):
58                        return self.keymap
59
60if __name__ == '__main__':
61        km = Keymap()
62        class T:
63                def __init__(self, message):
64                        self.message = message
65                        self.__name__ = message
66                def __call__(self):
67                        print self.message
68
69        km.bind('x', T('x'))
70        km.bind('C-x', T('C-x'))
71        km.bind('A-x', T('A-x'))
72        km.bind('up', T('up'))
73        km.bind('enter', T('enter'))
74        km.bind('tab', T('tab'))
75        km.bind('S-tab', T('S-tab'))
76
77
78        text = "hello\nworld"
79
80        from pawt import swing, test
81
82        doc = swing.text.DefaultStyledDocument()
83        doc.insertString(0, text, None)
84        edit = swing.JTextPane(doc)
85        edit.keymap = km
86
87        test(edit, size=(150,80))
Note: See TracBrowser for help on using the repository browser.