DOIFOR技术IDEA插件开发之在某一行的装订线上添加IconGutter
DOIFOR技术IDEA插件开发之在某一行的装订线上添加IconGutter
IDEA

IDEA插件开发之在某一行的装订线上添加IconGutter

技术

先后查了很多资料,问了好几个AI,想要实现装订线上的gutter,都是回答说使用LineMarkerProvider,然后根据教程实现后发现根本就不起作用,具体原因还没找到,后续后时间再慢慢找。
今天突然发现了一个新的实现方法,因为我发现RangeHighlighter有个方法名很像我要的功能:

  /**
   * Sets the renderer used for drawing gutter icons in the area covered by the
   * highlighter. Gutter icons are drawn to the left of the folding area and can be used,
   * for example, to mark implemented or overridden methods.
   *
   * @param renderer the renderer instance, or {@code null} if the highlighter does not add any gutter icons.
   */
  void setGutterIconRenderer(@Nullable GutterIconRenderer renderer);

我就是需要一个带图标的gutter,这个名字怎么看怎么像。上一篇关于在代码下方添加波浪线文章中我们知道RangeHighlighter是通过MarkupModel获取的,整个链路类似如下:

RangeHighlighter rangeHighlighter = editor.getMarkupModel().addLineHighlighter(0, HighlighterLayer.SELECTION, null);

接下来就是实现一个GutterIconRenderer了,大致代码如下:

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.editor.markup.GutterIconRenderer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;

public class MyGutterIconRenderer extends GutterIconRenderer {
    private int line;
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof MyGutterIconRenderer) {
            return line == ((MyGutterIconRenderer)obj).line;
        }
        return false;
    }

    @Override
    public int hashCode() {
        return line;
    }

    @Override
    public @NotNull Icon getIcon() {
        return state()? icon1: icon2;
    }

    private boolean state(){
        // do something here
        return false;
    }


    @Override
    public @Nullable AnAction getClickAction() {
        // 响应icon的点击事件,该方法默认实现为null
        return super.getClickAction();
    }
}

最后在需要的地方调用文章开头的方法即可!!!
该方法简单有效,且非常灵活。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注