diff --git a/tutorials/action_system/action_system.md b/tutorials/action_system/action_system.md index d569fe71f..ca04208db 100644 --- a/tutorials/action_system/action_system.md +++ b/tutorials/action_system/action_system.md @@ -24,19 +24,23 @@ To create a new we need to extend [AnAction] (https://github.com/JetBrains/intellij-community/blob/master/platform/editor-ui-api/src/com/intellij/openapi/actionSystem/AnAction.java) class: - public class SimpleAction extends AnAction { - } +```java +public class SimpleAction extends AnAction { +} +``` The only method of an inheritor of [AnAction] (https://github.com/JetBrains/intellij-community/blob/master/platform/editor-ui-api/src/com/intellij/openapi/actionSystem/AnAction.java) which needs to be overridden is ```public void actionPerformed(AnActionEvent anActionEvent);``` , and it should contain a part of code to be executed after the action has been invoked. In this case the action does nothing. - public class SimpleAction extends AnAction { - @Override - public void actionPerformed(AnActionEvent anActionEvent) { - } +```java +public class SimpleAction extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { } +} +``` ------------- @@ -57,52 +61,56 @@ After filling the "New Action" form and applying the changes ** section [plugin.xml]() file will look like this: - - - - - - +```xml + + + + + + +``` Full list of action's attributes can also be set manually in [plugin.xml]() configuration file like the following code sample shows: - - - - - - - - - - - - +```xml + + + + + + + + + + + + +``` After performing the steps described above we need to compile and run the plugin to the the newly created action available as a Tools Menu item. !["Register action" quick fix](img/tools_menu_item_action.png) @@ -113,13 +121,15 @@ After performing the steps described above we need to compile and run the plugin In order to make the action do something we need to implement it's ```public void actionPerformed(AnActionEvent anActionEvent);``` method. In the following example action invokes a dialog that shows information about a selected Project View Item and has no icon and any pre-selected default option: - @Override - public void actionPerformed(AnActionEvent anActionEvent) { - Object navigatable = anActionEvent.getData(CommonDataKeys.NAVIGATABLE); - if (navigatable != null) { - Messages.showDialog(navigatable.toString(), "Selected Element:", new String[]{"OK"}, -1, null); - } +```java +@Override +public void actionPerformed(AnActionEvent anActionEvent) { + Object navigatable = anActionEvent.getData(CommonDataKeys.NAVIGATABLE); + if (navigatable != null) { + Messages.showDialog(navigatable.toString(), "Selected Element:", new String[]{"OK"}, -1, null); } +} +``` ----------- @@ -131,36 +141,40 @@ Default implementation of this method does nothing. Override this method to provide the ability to dynamically change action's state and(or) presentation depending on the context. - public class SimpleAction extends AnAction { - @Override - public void actionPerformed(AnActionEvent anActionEvent) { - //... - } - - @Override - public void update(AnActionEvent anActionEvent) { - } +```java +public class SimpleAction extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + //... } + @Override + public void update(AnActionEvent anActionEvent) { + } +} +``` + The following code sample illustrates how to make the action visible and available only when the following conditions are met: there's a project available and there's an item you can navigate to selected in the project view pane: - public class SimpleAction extends AnAction { - @Override - public void actionPerformed(AnActionEvent anActionEvent) { - //... - } - - @Override - public void update(AnActionEvent anActionEvent) { - final Project project = anActionEvent.getData(CommonDataKeys.PROJECT); - if (project == null) - return; - Object navigatable = anActionEvent.getData(CommonDataKeys.NAVIGATABLE); - anActionEvent.getPresentation().setEnabledAndVisible(navigatable != null); - } +```java +public class SimpleAction extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + //... } + @Override + public void update(AnActionEvent anActionEvent) { + final Project project = anActionEvent.getData(CommonDataKeys.PROJECT); + if (project == null) + return; + Object navigatable = anActionEvent.getData(CommonDataKeys.NAVIGATABLE); + anActionEvent.getPresentation().setEnabledAndVisible(navigatable != null); + } +} +``` + Parameter anActionEvent carries information on the invocation place and data available. **Note** This method can be called frequently, for instance, if an action is added to a toolbar, it will be updated twice a second. @@ -188,47 +202,55 @@ Grouping can be done by extending adding ** attribute to ** [plugin.xml]() file. - - - - +```xml + + + + +``` ##Binding action groups to UI component. The following sample shows how to place a custom action group on top of the editor popup menu: - - - - - +```xml + + + + + +``` ##Adding actions to the group. To create an action we need to extend [AnAction.java]() class: - public class GroupedAction extends AnAction { - @Override - public void update(AnActionEvent event) { - event.getPresentation().setEnabledAndVisible(true); - } - - @Override - public void actionPerformed(AnActionEvent event) { - //Does nothing - } +```java +public class GroupedAction extends AnAction { + @Override + public void update(AnActionEvent event) { + event.getPresentation().setEnabledAndVisible(true); } + @Override + public void actionPerformed(AnActionEvent event) { + //Does nothing + } +} +``` + And then the actions needs to be registered in the newly created group: - - - - + + + - - - + + + +``` After performing the steps described above the action group nad it's content will be available in the editor popup menu: @@ -248,11 +270,13 @@ This class is used if a set of actions belonging to the group is fixed, which is Firstly, [DefaultActionGroup.java] should be derived: - public class CustomDefaultActionGroup extends DefaultActionGroup { - @Override - public void update(AnActionEvent event) { - } +```java +public class CustomDefaultActionGroup extends DefaultActionGroup { + @Override + public void update(AnActionEvent event) { } +} +``` ###Registering action group. As in case with the simple action group, the inheritor of @@ -261,49 +285,59 @@ should be declared in [plugin.xml]() file: - - - - - +```xml + + + + + +``` ###Creating an action. [AnAction.java]() needs to be extended: - public class CustomGroupedAction extends AnAction { - @Override - public void actionPerformed(AnActionEvent anActionEvent) { - //Does nothing - } + +```java +public class CustomGroupedAction extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + //Does nothing } +} +``` ###Adding actions to the group. Action's class should be registered in [plugin.xml]() : - - - - - +```xml + + + + + + +``` ###Providing specific behaviour for the group. In this case we override ```public void update(AnActionEvent event);``` method to make the group visible as a *Tools* menu item, however, it will be enabled only if there's an instance of the editor available. Also a custom icon is set up: - public class CustomDefaultActionGroup extends DefaultActionGroup { - @Override - public void update(AnActionEvent event) { - Editor editor = event.getData(CommonDataKeys.EDITOR); - event.getPresentation().setVisible(true); - event.getPresentation().setEnabled(editor != null); - event.getPresentation().setIcon(AllIcons.General.Error); - } +```java +public class CustomDefaultActionGroup extends DefaultActionGroup { + @Override + public void update(AnActionEvent event) { + Editor editor = event.getData(CommonDataKeys.EDITOR); + event.getPresentation().setVisible(true); + event.getPresentation().setEnabled(editor != null); + event.getPresentation().setIcon(AllIcons.General.Error); } +} +``` After compiling and running the code sample above, *Tools* menu item should contain an extra group of action with a user-defined icon: