熟悉了官方教程后,有没有手痒想自己实现一个实用的功能的插件呢?我们来看看别人是怎么实现插件的,然后我们基于别人的插件改一款自己的插件。
我选择的插件是Active Tab Highlighter 主页是plugins.jetbrains.com/plugin/9562…
这个插件的功能非常简单,它可以将当前选中的文件的tab标签用特殊的颜色标识出来,还可以选择不同的颜色。
但是我觉得这个插件还不能满足我的需求,我想要下图这样的效果:可以修改最近打开的4个文件的颜色,并且越近打开的文件颜色越深。
我们下载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用于初始化。
我们来看这个类的实现
这个类其中关键点在于监听了两个消息队列,其中FileEditorManagerListener是IDEA内建队列,负责在新文件打开时,关闭时,切换时通知监听者。
HighlighterSettingsChangeListener是ActiveTabHighlighterPlugin自己写的队列,主要功能是监听调色板变化以后的处理。 这两个队列的监听实现都是TabHighlighterFileEditorListener类,实现给tab加颜色的功能的两个关键方法是highlight与unhighlight,一个高亮,一个取消高亮。
入参file表示当前需要高亮的file。
这个类还实现了FileEditorManagerListener的selectionChanged方法以及自定义的settingsChanged方法。
实现思路也很简单:每切换到焦点file时就高亮焦点file,取消高亮失去焦点的file。
所以实现我们想要的功能只要用一个队列保留之前获取到焦点的file的序列,分别为序列里的file添加tab颜色就可以了。
我是这样实现的
我还修改了hightlight方法,根据入参i处理颜色亮度(我偷懒把通过配置修改颜色的功能去掉了,写死了是红色)
还要记得修改初始化的地方哦,把当前获得焦点的file加入list
到这里,我们的主要功能已经实现了。下面我们在说下其他三个extensions
editorTabColorProvider
官网上没有说明,但在代码里有注释。它能获取tab的颜色。
我观察到这个extensions的作用是:如果你的项目被git管理后,git插件也会修改tab的颜色(默认会把文字变成蓝色)如果不加editorTabColorProvider的话,每次git变颜色的时候,会把已经高亮的tab变成非高亮状态。
projectConfigurable与projectService
标准搭配用来保存配置的,在本例中用于实现调色板,和保存调色板信息。
最终实现可以看这里:gitee.com/kagami1/myp… 只要打包出来即可。
其他问题
在插件开发过程中我们经常需要自己画UI,使用IDEA自带的UI设计工具基本能满足我们的需求。通过new创建GUI Form即可
有时候右键以后发现没有这个选项,需要在插件列表里,把UI Designer插件勾选上,重启即可。
相关资料
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…