diff --git a/register_actions/resources/META-INF/plugin.xml b/register_actions/resources/META-INF/plugin.xml index 080b2f298..9cb5b953c 100644 --- a/register_actions/resources/META-INF/plugin.xml +++ b/register_actions/resources/META-INF/plugin.xml @@ -1,12 +1,12 @@ - org.jetbrains.plugins.sample.RegisterActions + org.jetbrains.tutorials.actions.RegisterActions Sample plugin for working with IntelliJ Action System - 1.0 + 1.1 JetBrains - Illustration of Action System + Illustration of the Action System - Initial commit + Refactor to give users feedback when menu items are selected. @@ -39,7 +39,7 @@ The optional "use-shortcut-of" attribute specifies the ID of the action whose keyboard shortcut this action will use. The optional "description" attribute specifies the text which is displayed in the status bar when the action is focused. The optional "icon" attribute specifies the icon which is displayed on the toolbar button or next to the menu item. --> - - - - + + + + + + - - - + + + + - - + + + \ No newline at end of file diff --git a/register_actions/src/org/jetbrains/tutorials/actions/BaseActionGroup.java b/register_actions/src/org/jetbrains/tutorials/actions/BaseActionGroup.java deleted file mode 100644 index 6907d5648..000000000 --- a/register_actions/src/org/jetbrains/tutorials/actions/BaseActionGroup.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.jetbrains.tutorials.actions; - -import com.intellij.openapi.actionSystem.*; -import org.jetbrains.annotations.NotNull; - -/** - * @author Anna Bulenkova - */ -public class BaseActionGroup extends ActionGroup { - @NotNull - @Override - public AnAction[] getChildren(AnActionEvent anActionEvent) { - return new AnAction[]{new MyAction()}; - } - - class MyAction extends AnAction { - public MyAction() { - super("Dynamically Added Action"); - } - - @Override - public void actionPerformed(@NotNull AnActionEvent anActionEvent) { - //does nothing - } - } -} diff --git a/register_actions/src/org/jetbrains/tutorials/actions/CustomDefaultActionGroup.java b/register_actions/src/org/jetbrains/tutorials/actions/CustomDefaultActionGroup.java index 3211af2b0..b36e4d75b 100644 --- a/register_actions/src/org/jetbrains/tutorials/actions/CustomDefaultActionGroup.java +++ b/register_actions/src/org/jetbrains/tutorials/actions/CustomDefaultActionGroup.java @@ -1,18 +1,37 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + */ + package org.jetbrains.tutorials.actions; import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.editor.Editor; /** + * Creates an action group to contain menu actions. See plugin.xml declarations. + * @see DefaultActionGroup * @author Anna Bulenkova */ public class CustomDefaultActionGroup extends DefaultActionGroup { + + /** + * Given CustomDefaultActionGroup is derived from AnAction, in this context + * update() determines whether the action group itself should be enabled or disabled. + * Requires an editor to be active in order to enable the group functionality. + * @see com.intellij.openapi.actionSystem.AnAction#update(AnActionEvent) + * @param event Event received when the associated group-id menu is chosen. + */ @Override public void update(AnActionEvent event) { + // Enable/disable depending on whether user is editing Editor editor = event.getData(CommonDataKeys.EDITOR); - event.getPresentation().setVisible(true); event.getPresentation().setEnabled(editor != null); + // Always make visible. + event.getPresentation().setVisible(true); + // Take this opportunity to set an icon for the menu entry. event.getPresentation().setIcon(AllIcons.General.Error); } } diff --git a/register_actions/src/org/jetbrains/tutorials/actions/CustomGroupedAction.java b/register_actions/src/org/jetbrains/tutorials/actions/CustomGroupedAction.java deleted file mode 100644 index 15b309a6a..000000000 --- a/register_actions/src/org/jetbrains/tutorials/actions/CustomGroupedAction.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.jetbrains.tutorials.actions; - -import com.intellij.openapi.actionSystem.*; - -public class CustomGroupedAction extends AnAction { - @Override - public void actionPerformed(AnActionEvent anActionEvent) { - //Does nothing - } -} diff --git a/register_actions/src/org/jetbrains/tutorials/actions/DynamicActionGroup.java b/register_actions/src/org/jetbrains/tutorials/actions/DynamicActionGroup.java new file mode 100644 index 000000000..f2e521dc4 --- /dev/null +++ b/register_actions/src/org/jetbrains/tutorials/actions/DynamicActionGroup.java @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + */ + +package org.jetbrains.tutorials.actions; + +import com.intellij.openapi.actionSystem.ActionGroup; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import org.jetbrains.annotations.*; + +/** + * Demonstrates adding an action group to a menu statically in plugin.xml, and then creating a menu item + * within the group at runtime. See plugin.xml for the declaration of DynamicActionGroup, + * and note the group declaration does not contain an action. + * DynamicActionGroup is based on ActionGroup because menu children are determined + * on rules other than just positional constraints. + * + * @author Anna Bulenkova + * @see ActionGroup + */ +public class DynamicActionGroup extends ActionGroup { + + /** + * Returns an array of menu actions for the group. + * + * @param anActionEvent Event received when the associated group-id menu is chosen. + * @return AnAction[] An instance of AnAction, in this case containing a single instance of the + * SimplePopDialogAction class. + */ + @NotNull + @Override + public AnAction[] getChildren(AnActionEvent anActionEvent) { + return new AnAction[]{ new SimplePopDialogAction("Action Added at Runtime", + "Dynamic Action Demo", + null) + }; + } + +} diff --git a/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java b/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java deleted file mode 100644 index a0d193f5c..000000000 --- a/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.tutorials.actions; - -import com.intellij.openapi.actionSystem.*; - -public class GroupedAction extends AnAction { - @Override - public void update(AnActionEvent event) { - } - - @Override - public void actionPerformed(AnActionEvent event) { - //Does nothing - } -} diff --git a/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java b/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java deleted file mode 100644 index fa76bcb02..000000000 --- a/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.jetbrains.tutorials.actions; - -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.Messages; -import com.intellij.pom.Navigatable; - -public class SimpleAction extends AnAction { - @Override - public void actionPerformed(AnActionEvent anActionEvent) { - Project project = anActionEvent.getProject(); - Navigatable navigatable = anActionEvent.getData(CommonDataKeys.NAVIGATABLE); - if (project != null && navigatable != null) { - Messages.showMessageDialog(project, navigatable.toString(), "Selected Element", Messages.getInformationIcon()); - } - } - - @Override - public void update(AnActionEvent anActionEvent) { - Project project = anActionEvent.getProject(); - Navigatable navigatable = anActionEvent.getData(CommonDataKeys.NAVIGATABLE); - anActionEvent.getPresentation().setEnabledAndVisible(project != null && navigatable != null); - } -} diff --git a/register_actions/src/org/jetbrains/tutorials/actions/SimplePopDialogAction.java b/register_actions/src/org/jetbrains/tutorials/actions/SimplePopDialogAction.java new file mode 100755 index 000000000..13de550dd --- /dev/null +++ b/register_actions/src/org/jetbrains/tutorials/actions/SimplePopDialogAction.java @@ -0,0 +1,82 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + */ + +package org.jetbrains.tutorials.actions; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; +import com.intellij.pom.Navigatable; +import org.jetbrains.annotations.*; + +import javax.swing.*; + +/** + * Action class to demonstrate how to interact with the IntelliJ Platform. + * The only action this class performs is to provide the user with a popup dialog as feedback. + * Typically this class is instantiated by the IntelliJ Platform framework based on declarations + * in the plugin.xml file. But when added at runtime this class is instantiated by an action group. + * @see com.intellij.openapi.actionSystem.AnAction + * @see com.intellij.openapi.actionSystem.AnActionEvent + */ +public class SimplePopDialogAction extends AnAction { + + /** + * This default constructor is used by the IntelliJ Platform framework to + * instantiate this class based on plugin.xml declarations. Only needed in SimplePopDialogAction + * class because another constructor is overridden. + * @see AnAction#AnAction() + */ + public SimplePopDialogAction() { + super(); + } + + /** + * This constructor is used to support dynamically added menu actions. + * It sets the text, description to be displayed for the menu item. + * Otherwise, the default AnAction constructor is used by the IntelliJ Platform. + * @see AnAction#AnAction(String, String, Icon) + * @param menuText The text to be displayed as a menu item. + * @param menuDescription The description of the menu item. + * @param menuIcon The icon to be used with the menu item. + */ + public SimplePopDialogAction(@Nullable String menuText, @Nullable String menuDescription, @Nullable Icon menuIcon) { + super(menuText, menuDescription, menuIcon); + } + + /** + * Gives the user feedback when the dynamic action menu is chosen. + * Pops a simple message dialog. See the psi_demo plugin for an + * example of how to use AnActionEvent to access data. + * @param anActionEvent Event received when the associated menu item is chosen. + */ + @Override + public void actionPerformed(@NotNull AnActionEvent anActionEvent) { + // Using the event, create and show a dialog + Project currentProject = anActionEvent.getProject(); + StringBuffer dlgMsg = new StringBuffer(anActionEvent.getPresentation().getText() + " Selected!"); + String dlgTitle = anActionEvent.getPresentation().getDescription(); + // If an element is selected in the editor, add info about it. + Navigatable nav = anActionEvent.getData(CommonDataKeys.NAVIGATABLE); + if (nav != null) { + dlgMsg.append(String.format("\nSelected Element: %s", nav.toString())); + } + Messages.showMessageDialog(currentProject, dlgMsg.toString(), dlgTitle, Messages.getInformationIcon()); + } + + /** + * Determines whether this menu item is available for the current context. + * Requires a project to be open. + * @param anActionEvent Event received when the associated group-id menu is chosen. + */ + @Override + public void update(AnActionEvent anActionEvent) { + // Set the availability based on whether a project is open + Project project = anActionEvent.getProject(); + anActionEvent.getPresentation().setEnabledAndVisible(project != null); + } + +}