IDEA插件学习(一)


距离上次写博客已经好久好久了,一方面工作比较忙,另一方面深感自己的不足,需要沉淀自己。 写下来记录一下学习的历程。

IDEA插件学习准备

首先IDEA插件是jetbrains公司给旗下的软件准备的插件,旗下包括为程序员所熟知的IDEA,WEBStorm,PyCharm等。现在我们来学习一下IDEA插件的创建,本文基于IDEA 2019.2版本,与之前的版本有些许差别的。首先我们先要检查安装plugin DevKit插件,没有安装的小伙伴需要安装一下,这个插件会帮我们很清晰的创建Action和相关的配置,当然如果对插件的位置和配置比较了解的话,这个插件是可以不装的。

首先我们create new Project。有两个地方可以创建,一个是Intellij platform plugin和Gradle下面的Intellij platform plugin。两个地方创建插件的区别就在于是否使用Gradle构建,在这边是随意的,插件一般附带的第三方包不多,用gradle构建也并不复杂,在这里我使用Intellij platform plugin直接构建,暴力便捷。

请注意Project SDK的位置是Intellij的SDK,如果这边配置失败的话也没关系,在后面会说SDK的配置。

idea java插件proxy idea插件原理_xml

然后next ,finish进行创建项目,中间自己填写工程名等项目配置。创建完项目的目录结构如下:

idea java插件proxy idea插件原理_ide_02

目录结构
plugin.xml是项目的相关配置入口,包括一些行为的声明,项目的上传配置等
src目录是java的程序编写目录
可以自己建一个libs目录用于存放第三方包

AnAction的学习

老规矩,学习插件都是从AnAction开始的,这也是比较简单的入门。首先我们创建一下行为: 在src右键new file,找到plugin DevKit

idea java插件proxy idea插件原理_idea java插件proxy_03

就可以看到Action的选项,直接点击创建

idea java插件proxy idea插件原理_第三方包_04

这就是new Action的界面,上面的配置都是可以在plugin.xml上修改的,其中讲解一下上面的含义:

Action ID :Action的标志ID
Class Name :类名
Name:显示的名字
Description:描述(可选)
Groups:行为触发点(重中之重),里面具体每个的含义还是自己看含义吧。

<actions>
    <!-- Add your actions here -->
    <action id="com.longshihan.PopAction" class="PopAction" text="popAction">
      <add-to-group group-id="ToolsMenu" anchor="first"/>
    </action>
  </actions>

  public class PopAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent anActionEvent) {
        // TODO: insert action logic here
    }

    @Override
    public void update(@NotNull AnActionEvent anActionEvent) {
        super.update(e);
    }
}

为了使动作做一些事情,我们需要在PopAction.actionPerformed(AnActionEvent)方法中添加代码。如果要控制操作的可见性和可用性,我们需要覆盖该AnAction.update(AnActionEvent)方法。此方法的默认实现不执行任何操作,这意味着始终禁用操作。重写此方法以提供根据上下文动态更改操作的状态和(或)显示的功能。

例子1:从anActionEvent输入参数获取信息并构造一个简单的消息对话框

Project currentProject = anActionEvent.getProject();
     StringBuffer dlgMsg = new StringBuffer(anActionEvent.getPresentation().getText() + " Selected!");
     Navigatable nav = anActionEvent.getData(CommonDataKeys.NAVIGATABLE);
     if (nav != null) {
         dlgMsg.append(String.format("\nSelected Element: %s", nav.toString()));
     }
     Messages.showMessageDialog(currentProject, dlgMsg.toString(), "提示", Messages.getInformationIcon());

直接运行会生成一个新的IDEA,在这个新的idea中是已经安装我们所写的插件的,所以创建一个新的项目,选中单词,点击tools就能看到我们的Action。点击出现弹窗:

idea java插件proxy idea插件原理_ide_05

例子2:翻译当前选中的文字,并弹窗提示

Gson gson = new Gson();

    @Override
    public void actionPerformed(AnActionEvent e) {
        final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);
        if (null == mEditor) {
            return;
        }
        SelectionModel model = mEditor.getSelectionModel();
        final String selectedText = model.getSelectedText();
        if (TextUtils.isEmpty(selectedText)) {
            return;
        }
        showEnglishPop(mEditor,selectedText);
    }

    public void showEnglishPop(Editor mEditor, String msg1) {
        String baseUrl = "http://fanyi.youdao.com/openapi.do?keyfrom=Skykai521&key=977124034&type=data&doctype=json&version=1.1&q=";
        EngINFO fanyiinfo = HttpUtils.doGet(baseUrl + msg1);
        System.out.println("" + fanyiinfo.toString());
        if (fanyiinfo.isSuccess() && !TextUtils.isEmpty(fanyiinfo.getData())) {
            TranslationInfo translationInfo = gson.fromJson(fanyiinfo.getData(), TranslationInfo.class);
            ApplicationManager.getApplication().invokeLater(new Runnable() {
                public void run() {
                    JBPopupFactory factory = JBPopupFactory.getInstance();
                    factory.createHtmlTextBalloonBuilder(translationInfo.getTranslation().toString(), null, new JBColor(new Color(186, 238, 186), new Color(73, 117, 73)), null)
                            .setFadeoutTime(5000)
                            .createBalloon()
                            .show(factory.guessBestPopupLocation(mEditor), Balloon.Position.below);
                }
            });
        } else {
            System.out.println("请求失败");
        }
    }

Httputils就是一个get请求,再这里不是重点。最后显示出来的界面如:

idea java插件proxy idea插件原理_ide_06

结束语

第一阶段的内容并不多,只是熟悉一下插件的基本使用,下一篇文章开始讲Setting界面的配置和RightMenu的配置,让你的插件看起来更加高大上。