作 者 简 介
谷轩宇——从事安卓开发,目前效力于通天塔技术开放组是否曾经被ide重复繁琐的操作所困扰,又或者没有心仪的UI控件而难受。那么请阅读这篇文章,掌握idea插件的开发流程,开发属于自己的插件,造福开源社区。
开发前请做好相关准备工作:
都准备好了,那就进入正题。
类型就选择IntelliJ Platform Plugin,然后一直选下一步。
先在src文件夹建个packge,取名随意,在packge里新建action
需要填4个内容和选择一个Groups,分别是:
ok之后,plugin.xml会自动加入刚刚创建的action
<actions>
<!-- Add your actions here -->
<action id="xxx" class="xxx" text="xxx">
<add-to-group group-id="xxx" anchor="last"/>
</action>
</actions>
anchor代表插件相对于组的位置的位置,有以下几种:
例如,本例Group ID选择了,anchor选了last
最后插件就会在git块的这里出现
运行后插件可以出现了,但这时候点击是没有反应的,进入下一步
先写个简单的hello world
@Override
public void actionPerformed(AnActionEvent e) {
Projectproject=event.getProject();
Messages.showMessageDialog(project,"helloworld","mytitle",Messages.getInformationIcon());
}
点击三角运行
正常会打开新的idea窗口,随便打开个项目找到刚才的插件位置,点击,不出意外会弹出一个helloworld的提示窗口了。
插件开发的过程大概如此,但是我们开发,肯定不是一个弹窗就解决需求的。由于开发需求的多样性,没法在一篇文章介绍所有api,所以在下面的部分,我将介绍IDEA开发的一些统一标准要求。
IDEA官方开发者封装了大量易用的api,由于官方文档介绍很笼统,看过了仅有的文档,只能根据要开发的插件功能,去定位官方的源码相似功能部分,然后模仿着写。下面给出的一些经验,开发过程可能有的用不到,但是一定会对你大致理解整套系统有所帮助
这点很多平台都有这种规定,后台线程是不能操作UI的,Android中使用的是消息Handler机制,在IDEA中也有类似的消息机制。在event线程中不要进行耗时操作(例如网络,IO),耗时操作要放在后台线程。在后台线程获取到数据后,可以使用下面方式来更新UI。(还有其他方法,这里仅介绍一种)
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
// update UI
}
});
不仅限于此,这里介绍一种方法,可以使用ProgressManager来开启
ProgressManager.getInstance().XXXX(new Runnable());
补全后可以看到很多方法,选择合适的调用即可。
创建自定义类MyTask继承于Task.Backgroundable,并重写run方法,run方法在后台线程执行,调用时可以如下:
new BackgroundTaskQueue(project, "my-task-name").run(newMyTask());
官方文档地址:
http://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/files.html
看代码时可能会经常看见VirtualFile,初次见肯定会疑惑,简单介绍一下(摘自官档)
虚拟文件系统(VFS)是IntelliJ Platform的一个组件,它封装了用于处理文件的大部分活动。它有以下主要用途:
看一下VirtualFileSystem实例的方法,大概有以下几项:刷新、获取VirtualFile、添加监听等作用。
比较常用的是VirtualFile,看一下实例方法
可以看到我们常用的文件操作基本都在这里。而与之相对应的有个类叫 Document ,这两个是不同的概念,Document 只能用于文本的文档,而且对应的是实例文件。VirtualFile是虚拟的文件,既可用于文本也可用于二进制文件。
程序结构接口,通常称为PSI,是IntelliJ平台中的一个层,负责解析文件并创建支持平台许多功能的语法和语义代码模型。(摘自官档)
也就是说对特定语言语法树,符号解析等可以使用PSI,如果有此需要,可以参考
https://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/psi.html
IntelliJ平台包含大量自定义Swing组件。在插件中使用这些组件将确保您的插件与IDE的其余部分的UI一致并且与其一致,并且与使用默认Swing组件相比,通常可以减少代码大小。
列举一些:
可以参考
http://www.jetbrains.org/intellij/sdk/docs/user_interface_components/user_interface_components.html
其中VFS和PSI是众多模块中比较核心的部分,开发过程中也建议参考其他开源插件的源码,多看多想,相信读者在开发过程中会有不小的收获。