认识Action
在IDE编辑器中可以通过右键打开选项,如下图所示,这里的动作便是Action,同时在顶部的ToolBar也会有相应的Action,如下图所示。可能大家对我这个IDE的UI有点陌生,其实这是2022.3版本的IDEA开启了New UI,NEW UI还是内测中,需要手动开启,设置位置在:Settings->appearance&behavior -> New UI。
新建Action
本文示例代码可以点击文末阅读原文获取,拿MessageDialogAction进行讲解,这个Action做的事情就是通过Dialog展示当前选择的文本。所有Action都要继承自AnAction并实现actionPerformed方法,Action执行时便会回调这个方法。
同时需要在plugin.xml文件注册这个Action之后,这个Action才能生效。所有Action都在actions标签中进行注册,首先通过action标签注册,通过group标签可以将Action进行组合,add-to-group表示添加到某个组里面,可以添加到编辑器右键选项(EditorPopupMenu)和菜单栏(ToolsMenu)。
<actions>
<action id="messageDialogAction"
text="MessageDialog测试"
class="com.example.ideaplugindemo.action.MessageDialogAction"/>
<group id="notificationTest" popup="true"
text="通知测试">
<add-to-group group-id="EditorPopupMenu" anchor="after" relative-to-action="$Paste"/>
<add-to-group group-id="ToolsMenu" anchor="first"/>
<reference ref="messageDialogAction"/>
</group>
</actions>
能干什么
actionPerformed方法传入AnActionEvent参数,通过这个参数我们可以获取到很多信息,比如通过DataContext获取到编辑器对象,通过编辑器对象就可以做很多事情,如下是通过CaretModel获取到当前选择的文本。
Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext());
String selectedText = Optional.ofNullable(editor)
.map(Editor::getCaretModel)
.map(CaretModel::getPrimaryCaret)
.map(Caret::getSelectedText)
.orElse("")
int result = Messages.showYesNoCancelDialog(e.getProject(), "Yes or no dialog 测试 测试,你选择的是" + selectedText, "Plugin Demo",
"Yes", "No", "Cancel", Messages.getQuestionIcon());