Path: blob/master/src/java.desktop/macosx/classes/com/apple/laf/AquaKeyBindings.java
41154 views
/*1* Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package com.apple.laf;2627import java.awt.event.ActionEvent;28import java.util.*;2930import javax.swing.*;31import javax.swing.UIDefaults.LazyValue;32import javax.swing.text.*;33import javax.swing.text.DefaultEditorKit.DefaultKeyTypedAction;3435import com.apple.laf.AquaUtils.RecyclableSingleton;36import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor;3738public class AquaKeyBindings {39private static final RecyclableSingleton<AquaKeyBindings> instance = new RecyclableSingletonFromDefaultConstructor<AquaKeyBindings>(AquaKeyBindings.class);40static AquaKeyBindings instance() {41return instance.get();42}4344final DefaultKeyTypedAction defaultKeyTypedAction = new DefaultKeyTypedAction();45void setDefaultAction(final String keymapName) {46final javax.swing.text.Keymap map = JTextComponent.getKeymap(keymapName);47map.setDefaultAction(defaultKeyTypedAction);48}4950static final String upMultilineAction = "aqua-move-up";51static final String downMultilineAction = "aqua-move-down";52static final String pageUpMultiline = "aqua-page-up";53static final String pageDownMultiline = "aqua-page-down";5455final String[] commonTextEditorBindings = {56"ENTER", JTextField.notifyAction,57"COPY", DefaultEditorKit.copyAction,58"CUT", DefaultEditorKit.cutAction,59"PASTE", DefaultEditorKit.pasteAction,60"meta A", DefaultEditorKit.selectAllAction,61"meta C", DefaultEditorKit.copyAction,62"meta V", DefaultEditorKit.pasteAction,63"meta X", DefaultEditorKit.cutAction,64"meta BACK_SLASH", "unselect",6566"DELETE", DefaultEditorKit.deleteNextCharAction,67"alt DELETE", "delete-next-word",68"BACK_SPACE", DefaultEditorKit.deletePrevCharAction,69"shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,70"alt BACK_SPACE", "delete-previous-word",7172"LEFT", DefaultEditorKit.backwardAction,73"KP_LEFT", DefaultEditorKit.backwardAction,74"RIGHT", DefaultEditorKit.forwardAction,75"KP_RIGHT", DefaultEditorKit.forwardAction,76"shift LEFT", DefaultEditorKit.selectionBackwardAction,77"shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,78"shift RIGHT", DefaultEditorKit.selectionForwardAction,79"shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,80"meta LEFT", DefaultEditorKit.beginLineAction,81"meta KP_LEFT", DefaultEditorKit.beginLineAction,82"meta RIGHT", DefaultEditorKit.endLineAction,83"meta KP_RIGHT", DefaultEditorKit.endLineAction,84"shift meta LEFT", DefaultEditorKit.selectionBeginLineAction,85"shift meta KP_LEFT", DefaultEditorKit.selectionBeginLineAction,86"shift meta RIGHT", DefaultEditorKit.selectionEndLineAction,87"shift meta KP_RIGHT", DefaultEditorKit.selectionEndLineAction,88"alt LEFT", DefaultEditorKit.previousWordAction,89"alt KP_LEFT", DefaultEditorKit.previousWordAction,90"alt RIGHT", DefaultEditorKit.nextWordAction,91"alt KP_RIGHT", DefaultEditorKit.nextWordAction,92"shift alt LEFT", DefaultEditorKit.selectionPreviousWordAction,93"shift alt KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,94"shift alt RIGHT", DefaultEditorKit.selectionNextWordAction,95"shift alt KP_RIGHT", DefaultEditorKit.selectionNextWordAction,9697"control A", DefaultEditorKit.beginLineAction,98"control B", DefaultEditorKit.backwardAction,99"control D", DefaultEditorKit.deleteNextCharAction,100"control E", DefaultEditorKit.endLineAction,101"control F", DefaultEditorKit.forwardAction,102"control H", DefaultEditorKit.deletePrevCharAction,103"control W", "delete-previous-word",104"control shift O", "toggle-componentOrientation",105106"END", DefaultEditorKit.endAction,107"HOME", DefaultEditorKit.beginAction,108"shift END", DefaultEditorKit.selectionEndAction,109"shift HOME", DefaultEditorKit.selectionBeginAction,110111"PAGE_DOWN", pageDownMultiline,112"PAGE_UP", pageUpMultiline,113"shift PAGE_DOWN", "selection-page-down",114"shift PAGE_UP", "selection-page-up",115"meta shift PAGE_DOWN", "selection-page-right",116"meta shift PAGE_UP", "selection-page-left",117118"meta DOWN", DefaultEditorKit.endAction,119"meta KP_DOWN", DefaultEditorKit.endAction,120"meta UP", DefaultEditorKit.beginAction,121"meta KP_UP", DefaultEditorKit.beginAction,122"shift meta DOWN", DefaultEditorKit.selectionEndAction,123"shift meta KP_DOWN", DefaultEditorKit.selectionEndAction,124"shift meta UP", DefaultEditorKit.selectionBeginAction,125"shift meta KP_UP", DefaultEditorKit.selectionBeginAction,126};127128LateBoundInputMap getTextFieldInputMap() {129return new LateBoundInputMap(new SimpleBinding(commonTextEditorBindings), new SimpleBinding(new String[] {130"DOWN", DefaultEditorKit.endLineAction,131"KP_DOWN", DefaultEditorKit.endLineAction,132"UP", DefaultEditorKit.beginLineAction,133"KP_UP", DefaultEditorKit.beginLineAction,134"shift DOWN", DefaultEditorKit.selectionEndLineAction,135"shift KP_DOWN", DefaultEditorKit.selectionEndLineAction,136"shift UP", DefaultEditorKit.selectionBeginLineAction,137"shift KP_UP", DefaultEditorKit.selectionBeginLineAction,138139"control P", DefaultEditorKit.beginAction,140"control N", DefaultEditorKit.endAction,141"control V", DefaultEditorKit.endAction,142}));143}144145LateBoundInputMap getPasswordFieldInputMap() {146return new LateBoundInputMap(new SimpleBinding(getTextFieldInputMap().getBindings()),147// nullify all the bindings that may discover space characters in the text148new SimpleBinding(new String[] {149"alt LEFT", null,150"alt KP_LEFT", null,151"alt RIGHT", null,152"alt KP_RIGHT", null,153"shift alt LEFT", null,154"shift alt KP_LEFT", null,155"shift alt RIGHT", null,156"shift alt KP_RIGHT", null,157}));158}159160LateBoundInputMap getMultiLineTextInputMap() {161return new LateBoundInputMap(new SimpleBinding(commonTextEditorBindings), new SimpleBinding(new String[] {162"ENTER", DefaultEditorKit.insertBreakAction,163"DOWN", downMultilineAction,164"KP_DOWN", downMultilineAction,165"UP", upMultilineAction,166"KP_UP", upMultilineAction,167"shift DOWN", DefaultEditorKit.selectionDownAction,168"shift KP_DOWN", DefaultEditorKit.selectionDownAction,169"shift UP", DefaultEditorKit.selectionUpAction,170"shift KP_UP", DefaultEditorKit.selectionUpAction,171"alt shift DOWN", DefaultEditorKit.selectionEndParagraphAction,172"alt shift KP_DOWN", DefaultEditorKit.selectionEndParagraphAction,173"alt shift UP", DefaultEditorKit.selectionBeginParagraphAction,174"alt shift KP_UP", DefaultEditorKit.selectionBeginParagraphAction,175176"control P", DefaultEditorKit.upAction,177"control N", DefaultEditorKit.downAction,178"control V", pageDownMultiline,179180"TAB", DefaultEditorKit.insertTabAction,181"meta SPACE", "activate-link-action",182"meta T", "next-link-action",183"meta shift T", "previous-link-action",184185"END", DefaultEditorKit.endAction,186"HOME", DefaultEditorKit.beginAction,187"shift END", DefaultEditorKit.selectionEndAction,188"shift HOME", DefaultEditorKit.selectionBeginAction,189190"PAGE_DOWN", pageDownMultiline,191"PAGE_UP", pageUpMultiline,192"shift PAGE_DOWN", "selection-page-down",193"shift PAGE_UP", "selection-page-up",194"meta shift PAGE_DOWN", "selection-page-right",195"meta shift PAGE_UP", "selection-page-left",196}));197}198199LateBoundInputMap getFormattedTextFieldInputMap() {200return new LateBoundInputMap(getTextFieldInputMap(), new SimpleBinding(new String[] {201"UP", "increment",202"KP_UP", "increment",203"DOWN", "decrement",204"KP_DOWN", "decrement",205206"ESCAPE", "reset-field-edit",207}));208}209210LateBoundInputMap getComboBoxInputMap() {211return new LateBoundInputMap(new SimpleBinding(new String[] {212"ESCAPE", "aquaHidePopup",213"PAGE_UP", "aquaSelectPageUp",214"PAGE_DOWN", "aquaSelectPageDown",215"HOME", "aquaSelectHome",216"END", "aquaSelectEnd",217"ENTER", "enterPressed",218"UP", "aquaSelectPrevious",219"KP_UP", "aquaSelectPrevious",220"DOWN", "aquaSelectNext",221"KP_DOWN", "aquaSelectNext",222"SPACE", "aquaSpacePressed" // "spacePopup"223}));224}225226LateBoundInputMap getListInputMap() {227return new LateBoundInputMap(new SimpleBinding(new String[] {228"meta C", "copy",229"meta V", "paste",230"meta X", "cut",231"COPY", "copy",232"PASTE", "paste",233"CUT", "cut",234"UP", "selectPreviousRow",235"KP_UP", "selectPreviousRow",236"shift UP", "selectPreviousRowExtendSelection",237"shift KP_UP", "selectPreviousRowExtendSelection",238"DOWN", "selectNextRow",239"KP_DOWN", "selectNextRow",240"shift DOWN", "selectNextRowExtendSelection",241"shift KP_DOWN", "selectNextRowExtendSelection",242"LEFT", "selectPreviousColumn",243"KP_LEFT", "selectPreviousColumn",244"shift LEFT", "selectPreviousColumnExtendSelection",245"shift KP_LEFT", "selectPreviousColumnExtendSelection",246"RIGHT", "selectNextColumn",247"KP_RIGHT", "selectNextColumn",248"shift RIGHT", "selectNextColumnExtendSelection",249"shift KP_RIGHT", "selectNextColumnExtendSelection",250"meta A", "selectAll",251252// aquaHome and aquaEnd are new actions that just move the view so the first or last item is visible.253"HOME", "aquaHome",254"shift HOME", "selectFirstRowExtendSelection",255"END", "aquaEnd",256"shift END", "selectLastRowExtendSelection",257258// Unmodified PAGE_UP and PAGE_DOWN are handled by their scroll pane, if any.259"shift PAGE_UP", "scrollUpExtendSelection",260"shift PAGE_DOWN", "scrollDownExtendSelection"261}));262}263264LateBoundInputMap getScrollBarInputMap() {265return new LateBoundInputMap(new SimpleBinding(new String[] {266"RIGHT", "positiveUnitIncrement",267"KP_RIGHT", "positiveUnitIncrement",268"DOWN", "positiveUnitIncrement",269"KP_DOWN", "positiveUnitIncrement",270"PAGE_DOWN", "positiveBlockIncrement",271"LEFT", "negativeUnitIncrement",272"KP_LEFT", "negativeUnitIncrement",273"UP", "negativeUnitIncrement",274"KP_UP", "negativeUnitIncrement",275"PAGE_UP", "negativeBlockIncrement",276"HOME", "minScroll",277"END", "maxScroll"278}));279}280281LateBoundInputMap getScrollBarRightToLeftInputMap() {282return new LateBoundInputMap(new SimpleBinding(new String[] {283"RIGHT", "negativeUnitIncrement",284"KP_RIGHT", "negativeUnitIncrement",285"LEFT", "positiveUnitIncrement",286"KP_LEFT", "positiveUnitIncrement"287}));288}289290LateBoundInputMap getScrollPaneInputMap() {291return new LateBoundInputMap(new SimpleBinding(new String[] {292"RIGHT", "unitScrollRight",293"KP_RIGHT", "unitScrollRight",294"DOWN", "unitScrollDown",295"KP_DOWN", "unitScrollDown",296"LEFT", "unitScrollLeft",297"KP_LEFT", "unitScrollLeft",298"UP", "unitScrollUp",299"KP_UP", "unitScrollUp",300"PAGE_UP", "scrollUp",301"PAGE_DOWN", "scrollDown",302"HOME", "scrollHome",303"END", "scrollEnd"304}));305}306307LateBoundInputMap getSliderInputMap() {308return new LateBoundInputMap(new SimpleBinding(new String[] {309"RIGHT", "positiveUnitIncrement",310"KP_RIGHT", "positiveUnitIncrement",311"DOWN", "negativeUnitIncrement",312"KP_DOWN", "negativeUnitIncrement",313"PAGE_DOWN", "negativeBlockIncrement",314"LEFT", "negativeUnitIncrement",315"KP_LEFT", "negativeUnitIncrement",316"UP", "positiveUnitIncrement",317"KP_UP", "positiveUnitIncrement",318"PAGE_UP", "positiveBlockIncrement",319"HOME", "minScroll",320"END", "maxScroll"321}));322}323324LateBoundInputMap getSliderRightToLeftInputMap() {325return new LateBoundInputMap(new SimpleBinding(new String[] {326"RIGHT", "negativeUnitIncrement",327"KP_RIGHT", "negativeUnitIncrement",328"LEFT", "positiveUnitIncrement",329"KP_LEFT", "positiveUnitIncrement"330}));331}332333LateBoundInputMap getSpinnerInputMap() {334return new LateBoundInputMap(new SimpleBinding(new String[] {335"UP", "increment",336"KP_UP", "increment",337"DOWN", "decrement",338"KP_DOWN", "decrement"339}));340}341342LateBoundInputMap getTableInputMap() {343return new LateBoundInputMap(new SimpleBinding(new String[] {344"meta C", "copy",345"meta V", "paste",346"meta X", "cut",347"COPY", "copy",348"PASTE", "paste",349"CUT", "cut",350"RIGHT", "selectNextColumn",351"KP_RIGHT", "selectNextColumn",352"LEFT", "selectPreviousColumn",353"KP_LEFT", "selectPreviousColumn",354"DOWN", "selectNextRow",355"KP_DOWN", "selectNextRow",356"UP", "selectPreviousRow",357"KP_UP", "selectPreviousRow",358"shift RIGHT", "selectNextColumnExtendSelection",359"shift KP_RIGHT", "selectNextColumnExtendSelection",360"shift LEFT", "selectPreviousColumnExtendSelection",361"shift KP_LEFT", "selectPreviousColumnExtendSelection",362"shift DOWN", "selectNextRowExtendSelection",363"shift KP_DOWN", "selectNextRowExtendSelection",364"shift UP", "selectPreviousRowExtendSelection",365"shift KP_UP", "selectPreviousRowExtendSelection",366"PAGE_UP", "scrollUpChangeSelection",367"PAGE_DOWN", "scrollDownChangeSelection",368"HOME", "selectFirstColumn",369"END", "selectLastColumn",370"shift PAGE_UP", "scrollUpExtendSelection",371"shift PAGE_DOWN", "scrollDownExtendSelection",372"shift HOME", "selectFirstColumnExtendSelection",373"shift END", "selectLastColumnExtendSelection",374"TAB", "selectNextColumnCell",375"shift TAB", "selectPreviousColumnCell",376"meta A", "selectAll",377"ESCAPE", "cancel",378"ENTER", "selectNextRowCell",379"shift ENTER", "selectPreviousRowCell",380"alt TAB", "focusHeader",381"alt shift TAB", "focusHeader"382}));383}384385LateBoundInputMap getTableRightToLeftInputMap() {386return new LateBoundInputMap(new SimpleBinding(new String[] {387"RIGHT", "selectPreviousColumn",388"KP_RIGHT", "selectPreviousColumn",389"LEFT", "selectNextColumn",390"KP_LEFT", "selectNextColumn",391"shift RIGHT", "selectPreviousColumnExtendSelection",392"shift KP_RIGHT", "selectPreviousColumnExtendSelection",393"shift LEFT", "selectNextColumnExtendSelection",394"shift KP_LEFT", "selectNextColumnExtendSelection",395"ctrl PAGE_UP", "scrollRightChangeSelection",396"ctrl PAGE_DOWN", "scrollLeftChangeSelection",397"ctrl shift PAGE_UP", "scrollRightExtendSelection",398"ctrl shift PAGE_DOWN", "scrollLeftExtendSelection"399}));400}401402LateBoundInputMap getTreeInputMap() {403return new LateBoundInputMap(new SimpleBinding(new String[] {404"meta C", "copy",405"meta V", "paste",406"meta X", "cut",407"COPY", "copy",408"PASTE", "paste",409"CUT", "cut",410"UP", "selectPrevious",411"KP_UP", "selectPrevious",412"shift UP", "selectPreviousExtendSelection",413"shift KP_UP", "selectPreviousExtendSelection",414"DOWN", "selectNext",415"KP_DOWN", "selectNext",416"shift DOWN", "selectNextExtendSelection",417"shift KP_DOWN", "selectNextExtendSelection",418"RIGHT", "aquaExpandNode",419"KP_RIGHT", "aquaExpandNode",420"LEFT", "aquaCollapseNode",421"KP_LEFT", "aquaCollapseNode",422"shift RIGHT", "aquaExpandNode",423"shift KP_RIGHT", "aquaExpandNode",424"shift LEFT", "aquaCollapseNode",425"shift KP_LEFT", "aquaCollapseNode",426"ctrl LEFT", "aquaCollapseNode",427"ctrl KP_LEFT", "aquaCollapseNode",428"ctrl RIGHT", "aquaExpandNode",429"ctrl KP_RIGHT", "aquaExpandNode",430"alt RIGHT", "aquaFullyExpandNode",431"alt KP_RIGHT", "aquaFullyExpandNode",432"alt LEFT", "aquaFullyCollapseNode",433"alt KP_LEFT", "aquaFullyCollapseNode",434"meta A", "selectAll",435"RETURN", "startEditing"436}));437}438439LateBoundInputMap getTreeRightToLeftInputMap() {440return new LateBoundInputMap(new SimpleBinding(new String[] {441"RIGHT", "aquaCollapseNode",442"KP_RIGHT", "aquaCollapseNode",443"LEFT", "aquaExpandNode",444"KP_LEFT", "aquaExpandNode",445"shift RIGHT", "aquaCollapseNode",446"shift KP_RIGHT", "aquaCollapseNode",447"shift LEFT", "aquaExpandNode",448"shift KP_LEFT", "aquaExpandNode",449"ctrl LEFT", "aquaExpandNode",450"ctrl KP_LEFT", "aquaExpandNode",451"ctrl RIGHT", "aquaCollapseNode",452"ctrl KP_RIGHT", "aquaCollapseNode"453}));454}455456// common interface between a string array, and a dynamic provider of string arrays ;-)457interface BindingsProvider {458public String[] getBindings();459}460461// wraps basic string arrays462static class SimpleBinding implements BindingsProvider {463final String[] bindings;464public SimpleBinding(final String[] bindings) { this.bindings = bindings; }465public String[] getBindings() { return bindings; }466}467468// patches all providers together at the moment the UIManager needs the real InputMap469static class LateBoundInputMap implements LazyValue, BindingsProvider {470private final BindingsProvider[] providerList;471private String[] mergedBindings;472473public LateBoundInputMap(final BindingsProvider ... providerList) {474this.providerList = providerList;475}476477public Object createValue(final UIDefaults table) {478return LookAndFeel.makeInputMap(getBindings());479}480481public String[] getBindings() {482if (mergedBindings != null) return mergedBindings;483484final String[][] bindingsList = new String[providerList.length][];485int size = 0;486for (int i = 0; i < providerList.length; i++) {487bindingsList[i] = providerList[i].getBindings();488size += bindingsList[i].length;489}490491if (bindingsList.length == 1) {492return mergedBindings = bindingsList[0];493}494495final ArrayList<String> unifiedList = new ArrayList<String>(size);496Collections.addAll(unifiedList, bindingsList[0]); // System.arrayCopy() the first set497498for (int i = 1; i < providerList.length; i++) {499mergeBindings(unifiedList, bindingsList[i]);500}501502return mergedBindings = unifiedList.toArray(new String[unifiedList.size()]);503}504505static void mergeBindings(final ArrayList<String> unifiedList, final String[] overrides) {506for (int i = 0; i < overrides.length; i+=2) {507final String key = overrides[i];508final String value = overrides[i+1];509510final int keyIndex = unifiedList.indexOf(key);511if (keyIndex == -1) {512unifiedList.add(key);513unifiedList.add(value);514} else {515unifiedList.set(keyIndex, key);516unifiedList.set(keyIndex + 1, value);517}518}519}520}521522void installAquaUpDownActions(final JTextComponent component) {523final ActionMap actionMap = component.getActionMap();524actionMap.put(upMultilineAction, moveUpMultilineAction);525actionMap.put(downMultilineAction, moveDownMultilineAction);526actionMap.put(pageUpMultiline, pageUpMultilineAction);527actionMap.put(pageDownMultiline, pageDownMultilineAction);528}529530// extracted and adapted from DefaultEditorKit in 1.6531@SuppressWarnings("serial") // Superclass is not serializable across versions532abstract static class DeleteWordAction extends TextAction {533public DeleteWordAction(final String name) { super(name); }534535public void actionPerformed(final ActionEvent e) {536if (e == null) return;537538final JTextComponent target = getTextComponent(e);539if (target == null) return;540541if (!target.isEditable() || !target.isEnabled()) {542UIManager.getLookAndFeel().provideErrorFeedback(target);543return;544}545546try {547final int start = target.getSelectionStart();548final Element line = Utilities.getParagraphElement(target, start);549final int end = getEnd(target, line, start);550551final int offs = Math.min(start, end);552final int len = Math.abs(end - start);553if (offs >= 0) {554target.getDocument().remove(offs, len);555return;556}557} catch (final BadLocationException ignore) {}558UIManager.getLookAndFeel().provideErrorFeedback(target);559}560561abstract int getEnd(final JTextComponent target, final Element line, final int start) throws BadLocationException;562}563564final TextAction moveUpMultilineAction = new AquaMultilineAction(upMultilineAction, DefaultEditorKit.upAction, DefaultEditorKit.beginAction);565final TextAction moveDownMultilineAction = new AquaMultilineAction(downMultilineAction, DefaultEditorKit.downAction, DefaultEditorKit.endAction);566final TextAction pageUpMultilineAction = new AquaMultilineAction(pageUpMultiline, DefaultEditorKit.pageUpAction, DefaultEditorKit.beginAction);567final TextAction pageDownMultilineAction = new AquaMultilineAction(pageDownMultiline, DefaultEditorKit.pageDownAction, DefaultEditorKit.endAction);568569@SuppressWarnings("serial") // Superclass is not serializable across versions570static class AquaMultilineAction extends TextAction {571final String targetActionName;572final String proxyActionName;573574public AquaMultilineAction(final String actionName, final String targetActionName, final String proxyActionName) {575super(actionName);576this.targetActionName = targetActionName;577this.proxyActionName = proxyActionName;578}579580public void actionPerformed(final ActionEvent e) {581final JTextComponent c = getTextComponent(e);582final ActionMap actionMap = c.getActionMap();583final Action targetAction = actionMap.get(targetActionName);584585final int startPosition = c.getCaretPosition();586targetAction.actionPerformed(e);587if (startPosition != c.getCaretPosition()) return;588589final Action proxyAction = actionMap.get(proxyActionName);590proxyAction.actionPerformed(e);591}592}593}594595596