Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/macosx/classes/com/apple/laf/AquaKeyBindings.java
38831 views
/*1* Copyright (c) 2011, 2013, 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 {39static 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"alt BACK_SPACE", "delete-previous-word",7071"LEFT", DefaultEditorKit.backwardAction,72"KP_LEFT", DefaultEditorKit.backwardAction,73"RIGHT", DefaultEditorKit.forwardAction,74"KP_RIGHT", DefaultEditorKit.forwardAction,75"shift LEFT", DefaultEditorKit.selectionBackwardAction,76"shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,77"shift RIGHT", DefaultEditorKit.selectionForwardAction,78"shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,79"meta LEFT", DefaultEditorKit.beginLineAction,80"meta KP_LEFT", DefaultEditorKit.beginLineAction,81"meta RIGHT", DefaultEditorKit.endLineAction,82"meta KP_RIGHT", DefaultEditorKit.endLineAction,83"shift meta LEFT", DefaultEditorKit.selectionBeginLineAction,84"shift meta KP_LEFT", DefaultEditorKit.selectionBeginLineAction,85"shift meta RIGHT", DefaultEditorKit.selectionEndLineAction,86"shift meta KP_RIGHT", DefaultEditorKit.selectionEndLineAction,87"alt LEFT", DefaultEditorKit.previousWordAction,88"alt KP_LEFT", DefaultEditorKit.previousWordAction,89"alt RIGHT", DefaultEditorKit.nextWordAction,90"alt KP_RIGHT", DefaultEditorKit.nextWordAction,91"shift alt LEFT", DefaultEditorKit.selectionPreviousWordAction,92"shift alt KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,93"shift alt RIGHT", DefaultEditorKit.selectionNextWordAction,94"shift alt KP_RIGHT", DefaultEditorKit.selectionNextWordAction,9596"control A", DefaultEditorKit.beginLineAction,97"control B", DefaultEditorKit.backwardAction,98"control D", DefaultEditorKit.deleteNextCharAction,99"control E", DefaultEditorKit.endLineAction,100"control F", DefaultEditorKit.forwardAction,101"control H", DefaultEditorKit.deletePrevCharAction,102"control W", "delete-previous-word",103"control shift O", "toggle-componentOrientation",104105"END", DefaultEditorKit.endAction,106"HOME", DefaultEditorKit.beginAction,107"shift END", DefaultEditorKit.selectionEndAction,108"shift HOME", DefaultEditorKit.selectionBeginAction,109110"PAGE_DOWN", pageDownMultiline,111"PAGE_UP", pageUpMultiline,112"shift PAGE_DOWN", "selection-page-down",113"shift PAGE_UP", "selection-page-up",114"meta shift PAGE_DOWN", "selection-page-right",115"meta shift PAGE_UP", "selection-page-left",116117"meta DOWN", DefaultEditorKit.endAction,118"meta KP_DOWN", DefaultEditorKit.endAction,119"meta UP", DefaultEditorKit.beginAction,120"meta KP_UP", DefaultEditorKit.beginAction,121"shift meta DOWN", DefaultEditorKit.selectionEndAction,122"shift meta KP_DOWN", DefaultEditorKit.selectionEndAction,123"shift meta UP", DefaultEditorKit.selectionBeginAction,124"shift meta KP_UP", DefaultEditorKit.selectionBeginAction,125};126127LateBoundInputMap getTextFieldInputMap() {128return new LateBoundInputMap(new SimpleBinding(commonTextEditorBindings), new SimpleBinding(new String[] {129"DOWN", DefaultEditorKit.endLineAction,130"KP_DOWN", DefaultEditorKit.endLineAction,131"UP", DefaultEditorKit.beginLineAction,132"KP_UP", DefaultEditorKit.beginLineAction,133"shift DOWN", DefaultEditorKit.selectionEndLineAction,134"shift KP_DOWN", DefaultEditorKit.selectionEndLineAction,135"shift UP", DefaultEditorKit.selectionBeginLineAction,136"shift KP_UP", DefaultEditorKit.selectionBeginLineAction,137138"control P", DefaultEditorKit.beginAction,139"control N", DefaultEditorKit.endAction,140"control V", DefaultEditorKit.endAction,141}));142}143144LateBoundInputMap getPasswordFieldInputMap() {145return new LateBoundInputMap(new SimpleBinding(getTextFieldInputMap().getBindings()),146// nullify all the bindings that may discover space characters in the text147new SimpleBinding(new String[] {148"alt LEFT", null,149"alt KP_LEFT", null,150"alt RIGHT", null,151"alt KP_RIGHT", null,152"shift alt LEFT", null,153"shift alt KP_LEFT", null,154"shift alt RIGHT", null,155"shift alt KP_RIGHT", null,156}));157}158159LateBoundInputMap getMultiLineTextInputMap() {160return new LateBoundInputMap(new SimpleBinding(commonTextEditorBindings), new SimpleBinding(new String[] {161"ENTER", DefaultEditorKit.insertBreakAction,162"DOWN", downMultilineAction,163"KP_DOWN", downMultilineAction,164"UP", upMultilineAction,165"KP_UP", upMultilineAction,166"shift DOWN", DefaultEditorKit.selectionDownAction,167"shift KP_DOWN", DefaultEditorKit.selectionDownAction,168"shift UP", DefaultEditorKit.selectionUpAction,169"shift KP_UP", DefaultEditorKit.selectionUpAction,170"alt shift DOWN", DefaultEditorKit.selectionEndParagraphAction,171"alt shift KP_DOWN", DefaultEditorKit.selectionEndParagraphAction,172"alt shift UP", DefaultEditorKit.selectionBeginParagraphAction,173"alt shift KP_UP", DefaultEditorKit.selectionBeginParagraphAction,174175"control P", DefaultEditorKit.upAction,176"control N", DefaultEditorKit.downAction,177"control V", pageDownMultiline,178179"TAB", DefaultEditorKit.insertTabAction,180"meta SPACE", "activate-link-action",181"meta T", "next-link-action",182"meta shift T", "previous-link-action",183184"END", DefaultEditorKit.endAction,185"HOME", DefaultEditorKit.beginAction,186"shift END", DefaultEditorKit.selectionEndAction,187"shift HOME", DefaultEditorKit.selectionBeginAction,188189"PAGE_DOWN", pageDownMultiline,190"PAGE_UP", pageUpMultiline,191"shift PAGE_DOWN", "selection-page-down",192"shift PAGE_UP", "selection-page-up",193"meta shift PAGE_DOWN", "selection-page-right",194"meta shift PAGE_UP", "selection-page-left",195}));196}197198LateBoundInputMap getFormattedTextFieldInputMap() {199return new LateBoundInputMap(getTextFieldInputMap(), new SimpleBinding(new String[] {200"UP", "increment",201"KP_UP", "increment",202"DOWN", "decrement",203"KP_DOWN", "decrement",204205"ESCAPE", "reset-field-edit",206}));207}208209LateBoundInputMap getComboBoxInputMap() {210return new LateBoundInputMap(new SimpleBinding(new String[] {211"ESCAPE", "aquaHidePopup",212"PAGE_UP", "aquaSelectPageUp",213"PAGE_DOWN", "aquaSelectPageDown",214"HOME", "aquaSelectHome",215"END", "aquaSelectEnd",216"ENTER", "enterPressed",217"UP", "aquaSelectPrevious",218"KP_UP", "aquaSelectPrevious",219"DOWN", "aquaSelectNext",220"KP_DOWN", "aquaSelectNext",221"SPACE", "aquaSpacePressed" // "spacePopup"222}));223}224225LateBoundInputMap getListInputMap() {226return new LateBoundInputMap(new SimpleBinding(new String[] {227"meta C", "copy",228"meta V", "paste",229"meta X", "cut",230"COPY", "copy",231"PASTE", "paste",232"CUT", "cut",233"UP", "selectPreviousRow",234"KP_UP", "selectPreviousRow",235"shift UP", "selectPreviousRowExtendSelection",236"shift KP_UP", "selectPreviousRowExtendSelection",237"DOWN", "selectNextRow",238"KP_DOWN", "selectNextRow",239"shift DOWN", "selectNextRowExtendSelection",240"shift KP_DOWN", "selectNextRowExtendSelection",241"LEFT", "selectPreviousColumn",242"KP_LEFT", "selectPreviousColumn",243"shift LEFT", "selectPreviousColumnExtendSelection",244"shift KP_LEFT", "selectPreviousColumnExtendSelection",245"RIGHT", "selectNextColumn",246"KP_RIGHT", "selectNextColumn",247"shift RIGHT", "selectNextColumnExtendSelection",248"shift KP_RIGHT", "selectNextColumnExtendSelection",249"meta A", "selectAll",250251// aquaHome and aquaEnd are new actions that just move the view so the first or last item is visible.252"HOME", "aquaHome",253"shift HOME", "selectFirstRowExtendSelection",254"END", "aquaEnd",255"shift END", "selectLastRowExtendSelection",256257// Unmodified PAGE_UP and PAGE_DOWN are handled by their scroll pane, if any.258"shift PAGE_UP", "scrollUpExtendSelection",259"shift PAGE_DOWN", "scrollDownExtendSelection"260}));261}262263LateBoundInputMap getScrollBarInputMap() {264return new LateBoundInputMap(new SimpleBinding(new String[] {265"RIGHT", "positiveUnitIncrement",266"KP_RIGHT", "positiveUnitIncrement",267"DOWN", "positiveUnitIncrement",268"KP_DOWN", "positiveUnitIncrement",269"PAGE_DOWN", "positiveBlockIncrement",270"LEFT", "negativeUnitIncrement",271"KP_LEFT", "negativeUnitIncrement",272"UP", "negativeUnitIncrement",273"KP_UP", "negativeUnitIncrement",274"PAGE_UP", "negativeBlockIncrement",275"HOME", "minScroll",276"END", "maxScroll"277}));278}279280LateBoundInputMap getScrollBarRightToLeftInputMap() {281return new LateBoundInputMap(new SimpleBinding(new String[] {282"RIGHT", "negativeUnitIncrement",283"KP_RIGHT", "negativeUnitIncrement",284"LEFT", "positiveUnitIncrement",285"KP_LEFT", "positiveUnitIncrement"286}));287}288289LateBoundInputMap getScrollPaneInputMap() {290return new LateBoundInputMap(new SimpleBinding(new String[] {291"RIGHT", "unitScrollRight",292"KP_RIGHT", "unitScrollRight",293"DOWN", "unitScrollDown",294"KP_DOWN", "unitScrollDown",295"LEFT", "unitScrollLeft",296"KP_LEFT", "unitScrollLeft",297"UP", "unitScrollUp",298"KP_UP", "unitScrollUp",299"PAGE_UP", "scrollUp",300"PAGE_DOWN", "scrollDown",301"HOME", "scrollHome",302"END", "scrollEnd"303}));304}305306LateBoundInputMap getSliderInputMap() {307return new LateBoundInputMap(new SimpleBinding(new String[] {308"RIGHT", "positiveUnitIncrement",309"KP_RIGHT", "positiveUnitIncrement",310"DOWN", "negativeUnitIncrement",311"KP_DOWN", "negativeUnitIncrement",312"PAGE_DOWN", "negativeBlockIncrement",313"LEFT", "negativeUnitIncrement",314"KP_LEFT", "negativeUnitIncrement",315"UP", "positiveUnitIncrement",316"KP_UP", "positiveUnitIncrement",317"PAGE_UP", "positiveBlockIncrement",318"HOME", "minScroll",319"END", "maxScroll"320}));321}322323LateBoundInputMap getSliderRightToLeftInputMap() {324return new LateBoundInputMap(new SimpleBinding(new String[] {325"RIGHT", "negativeUnitIncrement",326"KP_RIGHT", "negativeUnitIncrement",327"LEFT", "positiveUnitIncrement",328"KP_LEFT", "positiveUnitIncrement"329}));330}331332LateBoundInputMap getSpinnerInputMap() {333return new LateBoundInputMap(new SimpleBinding(new String[] {334"UP", "increment",335"KP_UP", "increment",336"DOWN", "decrement",337"KP_DOWN", "decrement"338}));339}340341LateBoundInputMap getTableInputMap() {342return new LateBoundInputMap(new SimpleBinding(new String[] {343"meta C", "copy",344"meta V", "paste",345"meta X", "cut",346"COPY", "copy",347"PASTE", "paste",348"CUT", "cut",349"RIGHT", "selectNextColumn",350"KP_RIGHT", "selectNextColumn",351"LEFT", "selectPreviousColumn",352"KP_LEFT", "selectPreviousColumn",353"DOWN", "selectNextRow",354"KP_DOWN", "selectNextRow",355"UP", "selectPreviousRow",356"KP_UP", "selectPreviousRow",357"shift RIGHT", "selectNextColumnExtendSelection",358"shift KP_RIGHT", "selectNextColumnExtendSelection",359"shift LEFT", "selectPreviousColumnExtendSelection",360"shift KP_LEFT", "selectPreviousColumnExtendSelection",361"shift DOWN", "selectNextRowExtendSelection",362"shift KP_DOWN", "selectNextRowExtendSelection",363"shift UP", "selectPreviousRowExtendSelection",364"shift KP_UP", "selectPreviousRowExtendSelection",365"PAGE_UP", "scrollUpChangeSelection",366"PAGE_DOWN", "scrollDownChangeSelection",367"HOME", "selectFirstColumn",368"END", "selectLastColumn",369"shift PAGE_UP", "scrollUpExtendSelection",370"shift PAGE_DOWN", "scrollDownExtendSelection",371"shift HOME", "selectFirstColumnExtendSelection",372"shift END", "selectLastColumnExtendSelection",373"TAB", "selectNextColumnCell",374"shift TAB", "selectPreviousColumnCell",375"meta A", "selectAll",376"ESCAPE", "cancel",377"ENTER", "selectNextRowCell",378"shift ENTER", "selectPreviousRowCell",379"alt TAB", "focusHeader",380"alt shift TAB", "focusHeader"381}));382}383384LateBoundInputMap getTableRightToLeftInputMap() {385return new LateBoundInputMap(new SimpleBinding(new String[] {386"RIGHT", "selectPreviousColumn",387"KP_RIGHT", "selectPreviousColumn",388"LEFT", "selectNextColumn",389"KP_LEFT", "selectNextColumn",390"shift RIGHT", "selectPreviousColumnExtendSelection",391"shift KP_RIGHT", "selectPreviousColumnExtendSelection",392"shift LEFT", "selectNextColumnExtendSelection",393"shift KP_LEFT", "selectNextColumnExtendSelection",394"ctrl PAGE_UP", "scrollRightChangeSelection",395"ctrl PAGE_DOWN", "scrollLeftChangeSelection",396"ctrl shift PAGE_UP", "scrollRightExtendSelection",397"ctrl shift PAGE_DOWN", "scrollLeftExtendSelection"398}));399}400401LateBoundInputMap getTreeInputMap() {402return new LateBoundInputMap(new SimpleBinding(new String[] {403"meta C", "copy",404"meta V", "paste",405"meta X", "cut",406"COPY", "copy",407"PASTE", "paste",408"CUT", "cut",409"UP", "selectPrevious",410"KP_UP", "selectPrevious",411"shift UP", "selectPreviousExtendSelection",412"shift KP_UP", "selectPreviousExtendSelection",413"DOWN", "selectNext",414"KP_DOWN", "selectNext",415"shift DOWN", "selectNextExtendSelection",416"shift KP_DOWN", "selectNextExtendSelection",417"RIGHT", "aquaExpandNode",418"KP_RIGHT", "aquaExpandNode",419"LEFT", "aquaCollapseNode",420"KP_LEFT", "aquaCollapseNode",421"shift RIGHT", "aquaExpandNode",422"shift KP_RIGHT", "aquaExpandNode",423"shift LEFT", "aquaCollapseNode",424"shift KP_LEFT", "aquaCollapseNode",425"ctrl LEFT", "aquaCollapseNode",426"ctrl KP_LEFT", "aquaCollapseNode",427"ctrl RIGHT", "aquaExpandNode",428"ctrl KP_RIGHT", "aquaExpandNode",429"alt RIGHT", "aquaFullyExpandNode",430"alt KP_RIGHT", "aquaFullyExpandNode",431"alt LEFT", "aquaFullyCollapseNode",432"alt KP_LEFT", "aquaFullyCollapseNode",433"meta A", "selectAll",434"RETURN", "startEditing"435}));436}437438LateBoundInputMap getTreeRightToLeftInputMap() {439return new LateBoundInputMap(new SimpleBinding(new String[] {440"RIGHT", "aquaCollapseNode",441"KP_RIGHT", "aquaCollapseNode",442"LEFT", "aquaExpandNode",443"KP_LEFT", "aquaExpandNode",444"shift RIGHT", "aquaCollapseNode",445"shift KP_RIGHT", "aquaCollapseNode",446"shift LEFT", "aquaExpandNode",447"shift KP_LEFT", "aquaExpandNode",448"ctrl LEFT", "aquaExpandNode",449"ctrl KP_LEFT", "aquaExpandNode",450"ctrl RIGHT", "aquaCollapseNode",451"ctrl KP_RIGHT", "aquaCollapseNode"452}));453}454455// common interface between a string array, and a dynamic provider of string arrays ;-)456interface BindingsProvider {457public String[] getBindings();458}459460// wraps basic string arrays461static class SimpleBinding implements BindingsProvider {462final String[] bindings;463public SimpleBinding(final String[] bindings) { this.bindings = bindings; }464public String[] getBindings() { return bindings; }465}466467// patches all providers together at the moment the UIManager needs the real InputMap468static class LateBoundInputMap implements LazyValue, BindingsProvider {469private final BindingsProvider[] providerList;470private String[] mergedBindings;471472public LateBoundInputMap(final BindingsProvider ... providerList) {473this.providerList = providerList;474}475476public Object createValue(final UIDefaults table) {477return LookAndFeel.makeInputMap(getBindings());478}479480public String[] getBindings() {481if (mergedBindings != null) return mergedBindings;482483final String[][] bindingsList = new String[providerList.length][];484int size = 0;485for (int i = 0; i < providerList.length; i++) {486bindingsList[i] = providerList[i].getBindings();487size += bindingsList[i].length;488}489490if (bindingsList.length == 1) {491return mergedBindings = bindingsList[0];492}493494final ArrayList<String> unifiedList = new ArrayList<String>(size);495Collections.addAll(unifiedList, bindingsList[0]); // System.arrayCopy() the first set496497for (int i = 1; i < providerList.length; i++) {498mergeBindings(unifiedList, bindingsList[i]);499}500501return mergedBindings = unifiedList.toArray(new String[unifiedList.size()]);502}503504static void mergeBindings(final ArrayList<String> unifiedList, final String[] overrides) {505for (int i = 0; i < overrides.length; i+=2) {506final String key = overrides[i];507final String value = overrides[i+1];508509final int keyIndex = unifiedList.indexOf(key);510if (keyIndex == -1) {511unifiedList.add(key);512unifiedList.add(value);513} else {514unifiedList.set(keyIndex, key);515unifiedList.set(keyIndex + 1, value);516}517}518}519}520521void installAquaUpDownActions(final JTextComponent component) {522final ActionMap actionMap = component.getActionMap();523actionMap.put(upMultilineAction, moveUpMultilineAction);524actionMap.put(downMultilineAction, moveDownMultilineAction);525actionMap.put(pageUpMultiline, pageUpMultilineAction);526actionMap.put(pageDownMultiline, pageDownMultilineAction);527}528529// extracted and adapted from DefaultEditorKit in 1.6530static abstract class DeleteWordAction extends TextAction {531public DeleteWordAction(final String name) { super(name); }532533public void actionPerformed(final ActionEvent e) {534if (e == null) return;535536final JTextComponent target = getTextComponent(e);537if (target == null) return;538539if (!target.isEditable() || !target.isEnabled()) {540UIManager.getLookAndFeel().provideErrorFeedback(target);541return;542}543544try {545final int start = target.getSelectionStart();546final Element line = Utilities.getParagraphElement(target, start);547final int end = getEnd(target, line, start);548549final int offs = Math.min(start, end);550final int len = Math.abs(end - start);551if (offs >= 0) {552target.getDocument().remove(offs, len);553return;554}555} catch (final BadLocationException ignore) {}556UIManager.getLookAndFeel().provideErrorFeedback(target);557}558559abstract int getEnd(final JTextComponent target, final Element line, final int start) throws BadLocationException;560}561562final TextAction moveUpMultilineAction = new AquaMultilineAction(upMultilineAction, DefaultEditorKit.upAction, DefaultEditorKit.beginAction);563final TextAction moveDownMultilineAction = new AquaMultilineAction(downMultilineAction, DefaultEditorKit.downAction, DefaultEditorKit.endAction);564final TextAction pageUpMultilineAction = new AquaMultilineAction(pageUpMultiline, DefaultEditorKit.pageUpAction, DefaultEditorKit.beginAction);565final TextAction pageDownMultilineAction = new AquaMultilineAction(pageDownMultiline, DefaultEditorKit.pageDownAction, DefaultEditorKit.endAction);566567static class AquaMultilineAction extends TextAction {568final String targetActionName;569final String proxyActionName;570571public AquaMultilineAction(final String actionName, final String targetActionName, final String proxyActionName) {572super(actionName);573this.targetActionName = targetActionName;574this.proxyActionName = proxyActionName;575}576577public void actionPerformed(final ActionEvent e) {578final JTextComponent c = getTextComponent(e);579final ActionMap actionMap = c.getActionMap();580final Action targetAction = actionMap.get(targetActionName);581582final int startPosition = c.getCaretPosition();583targetAction.actionPerformed(e);584if (startPosition != c.getCaretPosition()) return;585586final Action proxyAction = actionMap.get(proxyActionName);587proxyAction.actionPerformed(e);588}589}590}591592593