private void insertLineBreakerListenerFor(Keymap kMap, String key) { kMap.addActionForKeyStroke( KeyStroke.getKeyStroke(key), new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { insertLineBreak(); } }); }
// ------------------------------------------------------------------ // from Java Swing 1.2 Orielly - Robert Eckstein // ------------------------------------------------------------------ protected JTextComponent updateKeymapForWord(JTextComponent textComp) { // create a new child keymap Keymap map = JTextComponent.addKeymap("NslmMap", textComp.getKeymap()); // define the keystrokeds to be added KeyStroke next = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, InputEvent.CTRL_MASK, false); // add the new mappings used DefaultEditorKit actions map.addActionForKeyStroke(next, getAction(DefaultEditorKit.nextWordAction)); KeyStroke prev = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(prev, getAction(DefaultEditorKit.previousWordAction)); KeyStroke selNext = KeyStroke.getKeyStroke( KeyEvent.VK_RIGHT, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK, false); map.addActionForKeyStroke(selNext, getAction(DefaultEditorKit.selectionNextWordAction)); KeyStroke selPrev = KeyStroke.getKeyStroke( KeyEvent.VK_LEFT, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK, false); map.addActionForKeyStroke(selPrev, getAction(DefaultEditorKit.selectionPreviousWordAction)); KeyStroke find = KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(find, getAction("find")); KeyStroke findAgain = KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(findAgain, getAction("findAgain")); // set the keymap for the text component textComp.setKeymap(map); return (textComp); } // end updateKeymapForWord
@Override protected void addDoneListenerCommiter() { Keymap kMap = _textComponent.getKeymap(); kMap.addActionForKeyStroke( KeyStroke.getKeyStroke("ENTER"), new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { my(Logger.class).log("Enter key pressed."); commitTextChanges(); } }); insertLineBreakerListenerFor(kMap, "control ENTER"); insertLineBreakerListenerFor(kMap, "shift ENTER"); insertLineBreakerListenerFor(kMap, "alt ENTER"); }
// ------------------------------------------------------------------ // from Java Swing 1.2 Orielly - Robert Eckstein // ------------------------------------------------------------------ protected JTextComponent updateKeymapForEmacs(JTextComponent textComp) { // note: it does not look like a key can do more than one action // thus no modes. // todo: not all of these are correct. such as ctrlK // todo: add saving - ctrlXS // create a new child keymap Keymap map = JTextComponent.addKeymap("NslmMap", textComp.getKeymap()); KeyStroke selNext = KeyStroke.getKeyStroke( KeyEvent.VK_RIGHT, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK, false); map.addActionForKeyStroke(selNext, getAction(DefaultEditorKit.selectionNextWordAction)); KeyStroke selPrev = KeyStroke.getKeyStroke( KeyEvent.VK_LEFT, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK, false); map.addActionForKeyStroke(selPrev, getAction(DefaultEditorKit.selectionPreviousWordAction)); KeyStroke next = KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(next, getAction(DefaultEditorKit.forwardAction)); KeyStroke prev = KeyStroke.getKeyStroke(KeyEvent.VK_B, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(prev, getAction(DefaultEditorKit.backwardAction)); KeyStroke selectionDown = KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(selectionDown, getAction(DefaultEditorKit.downAction)); KeyStroke selectionUp = KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(selectionUp, getAction(DefaultEditorKit.upAction)); KeyStroke pageDown = KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(pageDown, getAction(DefaultEditorKit.pageDownAction)); KeyStroke pageUp = KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(pageUp, getAction(DefaultEditorKit.pageUpAction)); KeyStroke endDoc = KeyStroke.getKeyStroke( KeyEvent.VK_GREATER, InputEvent.META_MASK | InputEvent.SHIFT_MASK, false); map.addActionForKeyStroke(endDoc, getAction(DefaultEditorKit.endAction)); KeyStroke beginingDoc = KeyStroke.getKeyStroke( KeyEvent.VK_LESS, InputEvent.META_MASK | InputEvent.SHIFT_MASK, false); map.addActionForKeyStroke(beginingDoc, getAction(DefaultEditorKit.beginAction)); // the VK_SPACE and VK_W not working as in Emacs - space deleting // KeyStroke // selectionStart=KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,InputEvent.CTRL_MASK,false); // map.addActionForKeyStroke(selectionStart,getAction(DefaultEditorKit.selectionForwardAction)); // //todo: setCharPosAction // this is doing nothing because only one char to can be assigned to cut // KeyStroke cut1=KeyStroke.getKeyStroke(KeyEvent.VK_W,InputEvent.CTRL_MASK,false); // map.addActionForKeyStroke(cut1,getAction(DefaultEditorKit.cutAction)); // if we do save as XS, this will have to change KeyStroke cut = KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(cut, getAction(DefaultEditorKit.cutAction)); KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(paste, getAction(DefaultEditorKit.pasteAction)); KeyStroke moveToEndLine = KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(moveToEndLine, getAction(DefaultEditorKit.endLineAction)); // not emacs like KeyStroke selWord = KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(selWord, getAction(DefaultEditorKit.selectWordAction)); KeyStroke selLine = KeyStroke.getKeyStroke(KeyEvent.VK_K, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(selLine, getAction(DefaultEditorKit.selectLineAction)); KeyStroke delNext = KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(delNext, getAction(DefaultEditorKit.deleteNextCharAction)); KeyStroke insertLine = KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(insertLine, getAction(DefaultEditorKit.insertBreakAction)); KeyStroke searchBackward = KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(searchBackward, getAction("findAgain")); KeyStroke searchForward = KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK, false); map.addActionForKeyStroke(searchForward, getAction("findAgain")); // set the keymap for the text component textComp.setKeymap(map); return (textComp); } // end updateKeymapForEmacs
/** * Initialize the frame. * * @param info true if additional information is desired */ private void init(boolean info) { _buttonPressed = null; addComponentListener( new java.awt.event.ComponentAdapter() { public void componentResized(ComponentEvent e) { validate(); _matchList.ensureIndexIsVisible(_matchList.getSelectedIndex()); } }); // buttons int i = 0; for (final CloseAction<T> a : _actions) { _buttons[i] = new JButton(a.getName()); final String tooltip = a.getToolTipText(); if (tooltip != null) { _buttons[i].setToolTipText(tooltip); } _buttons[i].addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { buttonPressed(a); } }); ++i; } getRootPane().setDefaultButton(_buttons[0]); _strategyBox.setEditable(false); _strategyBox.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { // System.out.println("set strategy!"); selectStrategy(); } }); _strategyBox.addFocusListener( new FocusAdapter() { public void focusLost(FocusEvent e) { boolean bf = false; for (JButton b : _buttons) { if (e.getOppositeComponent() == b) { bf = true; break; } } if ((e.getOppositeComponent() != _textField) && (!bf)) { for (JComponent c : _optionalComponents) { if (e.getOppositeComponent() == c) { return; } } _textField.requestFocus(); } } }); // text field _textField.setDragEnabled(false); _textField.setFocusTraversalKeysEnabled(false); addListener(); Keymap ourMap = JTextComponent.addKeymap("PredictiveInputFrame._textField", _textField.getKeymap()); for (final CloseAction<T> a : _actions) { KeyStroke ks = a.getKeyStroke(); if (ks != null) { ourMap.addActionForKeyStroke( ks, new AbstractAction() { public void actionPerformed(ActionEvent e) { buttonPressed(a); } }); } } ourMap.addActionForKeyStroke( KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), new AbstractAction() { public void actionPerformed(ActionEvent e) { // System.out.println("tab!"); removeListener(); _pim.extendSharedMask(); updateTextField(); updateExtensionLabel(); updateList(); addListener(); } }); ourMap.addActionForKeyStroke( KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), new AbstractAction() { public void actionPerformed(ActionEvent e) { // System.out.println("up!"); if (_matchList.getModel().getSize() > 0) { removeListener(); int i = _matchList.getSelectedIndex(); if (i > 0) { _matchList.setSelectedIndex(i - 1); _matchList.ensureIndexIsVisible(i - 1); _pim.setCurrentItem(_pim.getMatchingItems().get(i - 1)); updateInfo(); } addListener(); } } }); ourMap.addActionForKeyStroke( KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), new AbstractAction() { public void actionPerformed(ActionEvent e) { // System.out.println("down!"); if (_matchList.getModel().getSize() > 0) { removeListener(); int i = _matchList.getSelectedIndex(); if (i < _matchList.getModel().getSize() - 1) { _matchList.setSelectedIndex(i + 1); _matchList.ensureIndexIsVisible(i + 1); _pim.setCurrentItem(_pim.getMatchingItems().get(i + 1)); updateInfo(); } addListener(); } } }); ourMap.addActionForKeyStroke( KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0), new AbstractAction() { public void actionPerformed(ActionEvent e) { // System.out.println("page up!"); if (_matchList.getModel().getSize() > 0) { removeListener(); int page = _matchList.getLastVisibleIndex() - _matchList.getFirstVisibleIndex() + 1; int i = _matchList.getSelectedIndex() - page; if (i < 0) i = 0; _matchList.setSelectedIndex(i); _matchList.ensureIndexIsVisible(i); _pim.setCurrentItem(_pim.getMatchingItems().get(i)); updateInfo(); addListener(); } } }); ourMap.addActionForKeyStroke( KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0), new AbstractAction() { public void actionPerformed(ActionEvent e) { // System.out.println("page down!"); if (_matchList.getModel().getSize() > 0) { removeListener(); int page = _matchList.getLastVisibleIndex() - _matchList.getFirstVisibleIndex() + 1; int i = _matchList.getSelectedIndex() + page; if (i >= _matchList.getModel().getSize()) { i = _matchList.getModel().getSize() - 1; } _matchList.setSelectedIndex(i); _matchList.ensureIndexIsVisible(i); _pim.setCurrentItem(_pim.getMatchingItems().get(i)); updateInfo(); addListener(); } } }); _textField.setKeymap(ourMap); _textField.addFocusListener( new FocusAdapter() { public void focusLost(FocusEvent e) { boolean bf = false; for (JButton b : _buttons) { if (e.getOppositeComponent() == b) { bf = true; break; } } if ((e.getOppositeComponent() != _strategyBox) && (!bf)) { for (JComponent c : _optionalComponents) { if (e.getOppositeComponent() == c) { return; } } _textField.requestFocus(); } } }); _matchList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); _matchList.addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { // System.out.println("click!"); removeListener(); int i = _matchList.getSelectedIndex(); if (i >= 0) { _pim.setCurrentItem(_pim.getMatchingItems().get(i)); _matchList.ensureIndexIsVisible(i); updateInfo(); } addListener(); } }); // put everything together Container contentPane = getContentPane(); GridBagLayout layout = new GridBagLayout(); contentPane.setLayout(layout); GridBagConstraints c = new GridBagConstraints(); c.anchor = GridBagConstraints.NORTHWEST; c.weightx = 1.0; c.weighty = 0.0; c.gridwidth = GridBagConstraints.REMAINDER; // end row c.insets.top = 2; c.insets.left = 2; c.insets.bottom = 2; c.insets.right = 2; if (info) { c.fill = GridBagConstraints.NONE; contentPane.add(_infoLabel, c); } c.fill = GridBagConstraints.BOTH; c.weighty = 1.0; contentPane.add( new JScrollPane( _matchList, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), c); c.anchor = GridBagConstraints.SOUTHWEST; c.fill = GridBagConstraints.NONE; c.weightx = 0.0; c.weighty = 0.0; c.gridwidth = 1; contentPane.add(_tabCompletesLabel, c); c.fill = GridBagConstraints.HORIZONTAL; c.weightx = 1.0; c.gridwidth = GridBagConstraints.REMAINDER; contentPane.add(_sharedExtLabel, c); contentPane.add(_textField, c); _optionalComponents = makeOptions(); if (_optionalComponents.length > 0) { _optionsPanel = new JPanel(new BorderLayout()); _setupOptionsPanel(_optionalComponents); contentPane.add(_optionsPanel, c); } c.anchor = GridBagConstraints.SOUTHWEST; c.weightx = 1.0; c.weighty = 0.0; c.gridwidth = GridBagConstraints.REMAINDER; // end row c.insets.top = 2; c.insets.left = 2; c.insets.bottom = 2; c.insets.right = 2; JPanel buttonPanel = new JPanel(new GridBagLayout()); GridBagConstraints bc = new GridBagConstraints(); bc.insets.left = 2; bc.insets.right = 2; buttonPanel.add(new JLabel("Matching strategy:"), bc); buttonPanel.add(_strategyBox, bc); for (JButton b : _buttons) { buttonPanel.add(b, bc); } contentPane.add(buttonPanel, c); pack(); // Dimension parentDim = (_owner != null) ? _owner.getSize() : getToolkit().getScreenSize(); //// int xs = (int) parentDim.getWidth()/3; // int ys = (int) parentDim.getHeight()/4; //// in line below, parentDim was _owner.getSize(); changed because former could generate // NullPointerException // setSize(new Dimension((int) getSize().getWidth(), (int)Math.min(parentDim.getHeight(), // Math.max(ys, 300)))); if (_owner != null) { setLocationRelativeTo(_owner); } removeListener(); updateTextField(); addListener(); updateList(); }