IDEA插件开发教程-实现自己的小插件

5,824 阅读3分钟

熟悉了官方教程后,有没有手痒想自己实现一个实用的功能的插件呢?我们来看看别人是怎么实现插件的,然后我们基于别人的插件改一款自己的插件。

我选择的插件是Active Tab Highlighter 主页是plugins.jetbrains.com/plugin/9562…

这个插件的功能非常简单,它可以将当前选中的文件的tab标签用特殊的颜色标识出来,还可以选择不同的颜色。

plugin.gif

但是我觉得这个插件还不能满足我的需求,我想要下图这样的效果:可以修改最近打开的4个文件的颜色,并且越近打开的文件颜色越深。

myplugin.gif

我们下载ActiveTabHighlighterPlugin源码,来看看它原有的功能是怎么实现的。下载代码

git clone https://github.com/tobszarny/ActiveTabHighlighterPlugin.git

打开项目后我们首先看plugin.

<extensions defaultExtensionNs="com.intellij">
    <!-- Startup -->
    <postStartupActivity implementation="com.tobszarny.intellij.plugin.activetabhighlighter.ActiveTabHighlighterStartupActivity"/>

    <editorTabColorProvider
            implementation="com.tobszarny.intellij.plugin.activetabhighlighter.editor.CustomEditorTabColorProvider"/>
    <projectConfigurable groupId="tools" displayName="Active Tab Highlighter Plugin"
                             id="preference.HighlighterSettingsConfigurable"
                             instance="com.tobszarny.intellij.plugin.activetabhighlighter.config.HighlighterSettingsConfigurable"/>
    <projectService serviceImplementation="com.tobszarny.intellij.plugin.activetabhighlighter.config.HighlighterSettingsConfig"/>
</extensions>

ActiveTabHighlighterPlugin是通过扩展了四个extensions实现的,我们逐一分析一下

postStartupActivity

从官网上查到postStartupActivity是当项目打开后立刻执行。可以猜测ActiveTabHighlighterStartupActivity用于初始化。

clipboard.png 我们来看这个类的实现

clipboard.png

这个类其中关键点在于监听了两个消息队列,其中FileEditorManagerListener是IDEA内建队列,负责在新文件打开时,关闭时,切换时通知监听者。

HighlighterSettingsChangeListener是ActiveTabHighlighterPlugin自己写的队列,主要功能是监听调色板变化以后的处理。 这两个队列的监听实现都是TabHighlighterFileEditorListener类,实现给tab加颜色的功能的两个关键方法是highlight与unhighlight,一个高亮,一个取消高亮。

clipboard.png 入参file表示当前需要高亮的file。

这个类还实现了FileEditorManagerListener的selectionChanged方法以及自定义的settingsChanged方法。

clipboard.png

实现思路也很简单:每切换到焦点file时就高亮焦点file,取消高亮失去焦点的file。

所以实现我们想要的功能只要用一个队列保留之前获取到焦点的file的序列,分别为序列里的file添加tab颜色就可以了。

我是这样实现的

clipboard.png

我还修改了hightlight方法,根据入参i处理颜色亮度(我偷懒把通过配置修改颜色的功能去掉了,写死了是红色)

clipboard.png

还要记得修改初始化的地方哦,把当前获得焦点的file加入list

clipboard.png 到这里,我们的主要功能已经实现了。下面我们在说下其他三个extensions

editorTabColorProvider

官网上没有说明,但在代码里有注释。它能获取tab的颜色。

clipboard.png 我观察到这个extensions的作用是:如果你的项目被git管理后,git插件也会修改tab的颜色(默认会把文字变成蓝色)如果不加editorTabColorProvider的话,每次git变颜色的时候,会把已经高亮的tab变成非高亮状态。

projectConfigurable与projectService

标准搭配用来保存配置的,在本例中用于实现调色板,和保存调色板信息。

最终实现可以看这里:gitee.com/kagami1/myp… 只要打包出来即可。

其他问题

在插件开发过程中我们经常需要自己画UI,使用IDEA自带的UI设计工具基本能满足我们的需求。通过new创建GUI Form即可

clipboard.png

有时候右键以后发现没有这个选项,需要在插件列表里,把UI Designer插件勾选上,重启即可。

clipboard.png

相关资料

IDEA插件官网:plugins.jetbrains.com/docs/intell…

Extension Point List:plugins.jetbrains.com/docs/intell…

IDEA样版项目地址:github.com/JetBrains/i…

Live Templates 函数说明:www.jetbrains.com/help/idea/t…