diff --git a/editor.lib/src/org/netbeans/editor/BaseKit.java b/editor.lib/src/org/netbeans/editor/BaseKit.java --- a/editor.lib/src/org/netbeans/editor/BaseKit.java +++ b/editor.lib/src/org/netbeans/editor/BaseKit.java @@ -2153,13 +2153,13 @@ } - @EditorActionRegistration(name = beepAction) + @EditorActionRegistration(name = beepAction, noKeyBinding = true) public static class BeepAction extends LocalBaseAction { static final long serialVersionUID =-4474054576633223968L; public BeepAction() { - putValue(BaseAction.NO_KEYBINDING, Boolean.TRUE); +// putValue(BaseAction.NO_KEYBINDING, Boolean.TRUE); } public void actionPerformed(ActionEvent evt, JTextComponent target) { diff --git a/editor.lib2/apichanges.xml b/editor.lib2/apichanges.xml --- a/editor.lib2/apichanges.xml +++ b/editor.lib2/apichanges.xml @@ -107,6 +107,21 @@ + + Added EditorActionRegistration.noKeyBinding and EditorActionRegistration.noIconInMenu + + + + + +

+ Added EditorActionRegistration.noKeyBinding and EditorActionRegistration.noIconInMenu fields + into EditorActionRegistration annotation. +

+
+ +
+ OnSaveTask interface added diff --git a/editor.lib2/manifest.mf b/editor.lib2/manifest.mf --- a/editor.lib2/manifest.mf +++ b/editor.lib2/manifest.mf @@ -1,6 +1,6 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.editor.lib2/1 -OpenIDE-Module-Implementation-Version: 40 +OpenIDE-Module-Implementation-Version: 41 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/editor/lib2/Bundle.properties OpenIDE-Module-Layer: org/netbeans/modules/editor/lib2/resources/layer.xml OpenIDE-Module-Needs: org.netbeans.modules.editor.actions diff --git a/editor.lib2/nbproject/project.properties b/editor.lib2/nbproject/project.properties --- a/editor.lib2/nbproject/project.properties +++ b/editor.lib2/nbproject/project.properties @@ -43,7 +43,7 @@ is.autoload=true javac.source=1.6 javac.compilerargs=-Xlint:unchecked -spec.version.base=1.73.0 +spec.version.base=1.74.0 javadoc.arch=${basedir}/arch.xml javadoc.apichanges=${basedir}/apichanges.xml diff --git a/editor.lib2/src/org/netbeans/api/editor/EditorActionRegistration.java b/editor.lib2/src/org/netbeans/api/editor/EditorActionRegistration.java --- a/editor.lib2/src/org/netbeans/api/editor/EditorActionRegistration.java +++ b/editor.lib2/src/org/netbeans/api/editor/EditorActionRegistration.java @@ -168,6 +168,22 @@ * The default Integer.MAX_VALUE value means no toolbar representation. */ int toolBarPosition() default Integer.MAX_VALUE; + + /** + * True if the action should not display its icon in menu. + *
+ * False by default (icon visible in menu). + * @since 1.74 + */ + boolean noIconInMenu() default false; + + /** + * True if the action should not be displayed in customizer for key bindings assignment. + *
+ * False by default (key binding can be configured for the action). + * @since 1.74 + */ + boolean noKeyBinding() default false; /** * Boolean key in preferences that corresponds to action's selected state. diff --git a/editor.lib2/src/org/netbeans/modules/editor/lib2/EditorActionRegistrationProcessor.java b/editor.lib2/src/org/netbeans/modules/editor/lib2/EditorActionRegistrationProcessor.java --- a/editor.lib2/src/org/netbeans/modules/editor/lib2/EditorActionRegistrationProcessor.java +++ b/editor.lib2/src/org/netbeans/modules/editor/lib2/EditorActionRegistrationProcessor.java @@ -294,6 +294,14 @@ // Accelerator filled with MULTI_ACCELERATOR_LIST_KEY property by infrastructure // file.methodvalue(Action.ACCELERATOR_KEY, EditorActionUtilities.class.getName(), "getAccelerator"); + boolean noIconInMenu = annotation.noIconInMenu(); + if (noIconInMenu) { + actionFile.boolvalue(AbstractEditorAction.NO_ICON_IN_MENU, noIconInMenu); + } + boolean noKeyBinding = annotation.noKeyBinding(); + if (noKeyBinding) { + actionFile.boolvalue(AbstractEditorAction.NO_KEY_BINDING, noKeyBinding); + } // Resolve weight attribute that allows to override existing action int weight = annotation.weight(); diff --git a/editor.lib2/src/org/netbeans/modules/editor/lib2/actions/PresenterUpdater.java b/editor.lib2/src/org/netbeans/modules/editor/lib2/actions/PresenterUpdater.java --- a/editor.lib2/src/org/netbeans/modules/editor/lib2/actions/PresenterUpdater.java +++ b/editor.lib2/src/org/netbeans/modules/editor/lib2/actions/PresenterUpdater.java @@ -281,9 +281,16 @@ { Icon icon = null; if (isMenuItem()) { + if (cAction != null && Boolean.TRUE.equals(cAction.getValue(AbstractEditorAction.NO_ICON_IN_MENU))) { + return; + } if (cAction != null) { icon = EditorActionUtilities.getSmallIcon(cAction); } + + if (icon == null && Boolean.TRUE.equals(action.getValue(AbstractEditorAction.NO_ICON_IN_MENU))) { + return; + } if (icon == null) { icon = EditorActionUtilities.getSmallIcon(action); } diff --git a/editor.lib2/src/org/netbeans/spi/editor/AbstractEditorAction.java b/editor.lib2/src/org/netbeans/spi/editor/AbstractEditorAction.java --- a/editor.lib2/src/org/netbeans/spi/editor/AbstractEditorAction.java +++ b/editor.lib2/src/org/netbeans/spi/editor/AbstractEditorAction.java @@ -180,6 +180,24 @@ * Key of {@link String} property containing a string path to icon. */ public static final String ICON_RESOURCE_KEY = "iconBase"; // (named in sync with AlwaysEnabledAction) NOI18N + + /** + * Key of {@link Boolean} property which determines whether icon of this action should be + * displayed in menu (false or unset) or not (true). + *
+ * It may be passed to {@link #getValue(java.lang.String) } to obtain the property value. + * @since 1.74 + */ + public static final String NO_ICON_IN_MENU = "noIconInMenu"; // (named in sync with system actions) NOI18N + + /** + * Key of {@link Boolean} property which determines if this action should be + * displayed in key binding customizer (false or unset) or not (true). + *
+ * It may be passed to {@link #getValue(java.lang.String) } to obtain the property value. + * @since 1.74 + */ + public static final String NO_KEY_BINDING = "no-keybinding"; // (named in sync with BaseAction.NO_KEY_BINDING) NOI18N /** * Key of property containing a List < List < {@link KeyStroke} > > diff --git a/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/testactionsregistration/EditorActionRegistrationTest.java b/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/testactionsregistration/EditorActionRegistrationTest.java --- a/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/testactionsregistration/EditorActionRegistrationTest.java +++ b/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/testactionsregistration/EditorActionRegistrationTest.java @@ -50,6 +50,9 @@ import javax.swing.Action; import org.netbeans.junit.NbTestCase; import org.netbeans.api.editor.EditorActionRegistration; +import org.netbeans.modules.editor.lib2.actions.EditorActionUtilities; +import org.netbeans.modules.editor.lib2.actions.SearchableEditorKit; +import org.netbeans.spi.editor.AbstractEditorAction; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.util.test.AnnotationProcessorTestUtils; @@ -65,6 +68,7 @@ private static final String NAME2 = "editor-test-action2"; private static final String NAME3 = "editor-test-action3"; private static final String NAME4 = "editor-test-action4"; + private static final String NAME_NO_ICON_AND_KEY_BINDING = "editor-test-action-no-icon-and-kb"; private static final String bundleHash = "org.netbeans.modules.editor.lib2.testactionsregistration.Bundle#"; @@ -95,6 +99,17 @@ assertEquals("Popup Text3", fo.getAttribute("popupText")); } + public void testRegistrationNoIconAndKeyBinding() throws Exception { + FileObject fo = FileUtil.getConfigFile("/Editors/Actions/" + NAME_NO_ICON_AND_KEY_BINDING + ".instance"); + assertNotNull(fo); + assertTrue((Boolean) fo.getAttribute(AbstractEditorAction.NO_ICON_IN_MENU)); + assertTrue((Boolean) fo.getAttribute(AbstractEditorAction.NO_KEY_BINDING)); + SearchableEditorKit globalActionsKit = EditorActionUtilities.getGlobalActionsKit(); + AbstractEditorAction a = (AbstractEditorAction) globalActionsKit.getAction(NAME_NO_ICON_AND_KEY_BINDING); + assertTrue((Boolean) a.getValue(AbstractEditorAction.NO_ICON_IN_MENU)); + assertTrue((Boolean) a.getValue(AbstractEditorAction.NO_KEY_BINDING)); + } + public void testNonPublicClass() throws Exception { String nonPublicClassSource = "import org.netbeans.api.editor.EditorActionRegistration;\n" + @@ -173,6 +188,16 @@ return new EditorTestAction(); } + @EditorActionRegistration( + name = NAME_NO_ICON_AND_KEY_BINDING, + shortDescription = "", + noIconInMenu = true, + noKeyBinding = true + ) + public static EditorTestAction createActionNoIconAndKeyBinding() { + return new EditorTestAction(); + } + @EditorActionRegistration(name = "NonPublicClass", shortDescription = "") public static final class EditorTestActionNonPublic extends AbstractAction {