Changeset 8686


Ignore:
Timestamp:
03/03/05 14:05:00 (16 years ago)
Author:
piso
Message:

Support emacs-style key bindings.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/j/DescribeKeyDialog.java

    r7377 r8686  
    22 * DescribeKeyDialog.java
    33 *
    4  * Copyright (C) 2000-2004 Peter Graves
    5  * $Id: DescribeKeyDialog.java,v 1.6 2004-08-08 01:46:48 piso Exp $
     4 * Copyright (C) 2000-2005 Peter Graves
     5 * $Id: DescribeKeyDialog.java,v 1.7 2005-03-03 14:05:00 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    3535    private final Editor editor;
    3636    private final Buffer buffer;
     37
     38    private JTextField textField;
    3739    private boolean seenKeyPressed;
     40    private String keyStrokeText;
     41    private boolean eventHandled;
     42    private boolean failed;
    3843    private boolean disposed;
    39     private String keyStrokeText;
     44    private KeyMap requestedKeyMap;
     45    private boolean local;
    4046
    4147    private DescribeKeyDialog(Editor editor)
     
    4450        this.editor = editor;
    4551        buffer = editor.getBuffer();
    46         JTextField textField = new JTextField(20);
     52        textField = new JTextField(20);
    4753        addLabelAndTextField(new JLabel(prompt), textField);
    4854        addVerticalStrut();
     
    6268        seenKeyPressed = true;
    6369        final int modifiers = e.getModifiers();
    64         KeyMapping mapping = new KeyMapping(keycode, modifiers, null);
    65         keyStrokeText = mapping.getKeyText();
    66         describeKey(e.getKeyChar(), keycode, modifiers);
     70        Object command = describeKey(e.getKeyChar(), keycode, modifiers);
     71        if (eventHandled || failed) {
     72            KeyMapping mapping = new KeyMapping(keycode, modifiers, null);
     73            if (keyStrokeText == null)
     74                keyStrokeText = mapping.getKeyText();
     75            else
     76                keyStrokeText = keyStrokeText + " " + mapping.getKeyText();
     77            textField.setText(keyStrokeText);
     78        }
     79        if (command != null)
     80            report(command);
    6781    }
    6882
    6983    public void keyTyped(KeyEvent e)
    7084    {
    71         final char c = e.getKeyChar();
    72         final int modifiers = e.getModifiers();
    73         if (modifiers == 0 || modifiers == InputEvent.SHIFT_MASK) {
    74             // Ignore whitespace key chars (e.g. Space, Shift Tab).
    75             if (c > ' ') {
    76                 FastStringBuffer sb = new FastStringBuffer('\'');
    77                 sb.append(c);
    78                 sb.append('\'');
    79                 keyStrokeText = sb.toString();
     85        if (!eventHandled) {
     86            final char c = e.getKeyChar();
     87            final int modifiers = e.getModifiers();
     88            if (modifiers == 0 || modifiers == InputEvent.SHIFT_MASK) {
     89                // Ignore whitespace key chars (e.g. Space, Shift Tab).
     90                if (c > ' ') {
     91                    FastStringBuffer sb = new FastStringBuffer('\'');
     92                    sb.append(c);
     93                    sb.append('\'');
     94                    if (keyStrokeText == null)
     95                        keyStrokeText = sb.toString();
     96                    else
     97                        keyStrokeText = keyStrokeText + " " + sb.toString();
     98                    textField.setText(keyStrokeText);
     99                }
    80100            }
    81         }
    82         describeKey(c, e.getKeyCode(), modifiers);
     101            Object command = describeKey(c, e.getKeyCode(), modifiers);
     102            if (!eventHandled) {
     103                Log.debug("failed => true");
     104                failed = true;
     105            }
     106            if (command != null)
     107                report(command);
     108        }
    83109    }
    84110
    85111    public void keyReleased(KeyEvent e)
    86112    {
    87         if (seenKeyPressed && !disposed) {
     113        final int keycode = e.getKeyCode();
     114        if (keycode == KeyEvent.VK_SHIFT || keycode == KeyEvent.VK_CONTROL ||
     115            keycode == KeyEvent.VK_ALT || keycode == KeyEvent.VK_META)
     116            return;
     117        if (failed && !disposed) {
    88118            dispose();
    89119            // Use invokeLater() so message dialog will get focus.
     
    91121                public void run()
    92122                {
    93                     MessageDialog.showMessageDialog(editor,
     123                    MessageDialog.showMessageDialog(
     124                        editor,
    94125                        keyStrokeText + " is not mapped", title);
    95126                }
     
    97128            SwingUtilities.invokeLater(r);
    98129        }
    99     }
    100 
    101     private void describeKey(char keyChar, int keyCode, int modifiers)
     130        eventHandled = false; // Start over.
     131    }
     132
     133    private Object describeKey(char keyChar, int keyCode, int modifiers)
    102134    {
    103135        if (disposed)
    104             return;
     136            return null;
    105137        // Mask off the bits we don't care about (Java 1.4).
    106138        modifiers &= 0x0f;
    107139        if (keyCode == 0 && modifiers == InputEvent.SHIFT_MASK) // Shift only.
    108140            modifiers = 0; // Ignore modifier.
    109         boolean local = false;
    110         final Mode mode = buffer.getMode();
    111         KeyMapping mapping =
    112             mode.getKeyMap().lookup(keyChar, keyCode, modifiers);
    113         if (mapping != null)
    114             local = true;
    115         else {
    116             mapping =
    117                 KeyMap.getGlobalKeyMap().lookup(keyChar, keyCode, modifiers);
    118         }
     141        KeyMapping mapping = null;
     142        if (requestedKeyMap != null) {
     143            mapping = requestedKeyMap.lookup(keyChar, keyCode, modifiers);
     144        } else {
     145            final Mode mode = buffer.getMode();
     146            mapping = mode.getKeyMap().lookup(keyChar, keyCode, modifiers);
     147            if (mapping != null)
     148                local = true;
     149            else
     150                mapping = KeyMap.getGlobalKeyMap().lookup(keyChar, keyCode,
     151                                                          modifiers);
     152        }
     153        if (mapping == null)
     154            return null;
     155        eventHandled = true;
     156        Object command = mapping.getCommand();
     157        if (command instanceof KeyMap) {
     158            requestedKeyMap = (KeyMap) command;
     159            return null;
     160        }
     161        return command;
     162    }
     163
     164    private void report(Object command)
     165    {
    119166        final FastStringBuffer sb = new FastStringBuffer();
    120         if (mapping != null) {
    121             sb.append(mapping.getKeyText());
    122             sb.append(" is mapped to ");
    123             sb.append(mapping.getCommand());
    124             if (local) {
    125                 sb.append(" (");
    126                 sb.append(mode.toString());
    127                 sb.append(" mode)");
    128             } else
    129                 sb.append(" (global mapping)");
    130             dispose();
    131             // Use invokeLater() so message dialog will get focus.
    132             Runnable r = new Runnable() {
    133                 public void run()
    134                 {
    135                     MessageDialog.showMessageDialog(editor, sb.toString(),
    136                         "Describe Key");
    137                 }
    138             };
    139             SwingUtilities.invokeLater(r);
    140         }
     167        sb.append(keyStrokeText);
     168        sb.append(" is mapped to ");
     169        sb.append(command);
     170        if (local) {
     171            sb.append(" (");
     172            final Mode mode = buffer.getMode();
     173            sb.append(mode.toString());
     174            sb.append(" mode)");
     175        } else
     176            sb.append(" (global mapping)");
     177        dispose();
     178        // Use invokeLater() so message dialog will get focus.
     179        Runnable r = new Runnable() {
     180            public void run()
     181            {
     182                MessageDialog.showMessageDialog(editor, sb.toString(),
     183                                                "Describe Key");
     184            }
     185        };
     186        SwingUtilities.invokeLater(r);
    141187    }
    142188
Note: See TracChangeset for help on using the changeset viewer.