ねこび〜んのGIFアニメ貼ってみた

ウィンドウコンポーネントに,ImageIcon付きのJLabel貼っただけなんで,あっという間にできた。
#でも,この程度じゃあんまり楽しくないナ。


こんな感じにウォーターマークが出来れば良いんだけど,IDEAでできてもうれしくもなんともない。:-(


ついでに,NetBeansのモジュール関連のリンクも載せとく。

NetBeansのモジュール開発は機能追加するには申し分ないんだけど,既存の機能をハックするには,まだ情報不足って感じ。


プラグイン作って覚えたことを淡々と記録するよ(エディタヘッダ編)

Edit→Findで出てくるインクリメンタルサーチ用のパネルは,自分らもいじれるという話。
あのパネルの正体は,EditorSearchComponent(com.intellij.findパッケージ)というJPanelの子どもなんだけど,それを表示している場所がEditorのヘッダ部。


ヘッダ?なるほどEditorにはそんな場所があったのか。都合の良いことにEditorはOpenAPIで公開されている*1ので,さっそくOpenAPIのJavadoc見てみたよ。

setHeaderComponent
void setHeaderComponent(@Nullable
            javax.swing.JComponent header)
Set up a header component for this text editor. Please note this is used for textual find feature so your component will most probably will be reset once the user presses Ctrl+F.

使っても良いけどインクリメンタルサーチで上書きされちゃうよって事すか。まあ,それでも良い。
#欲を言えば,フッタも欲しかったな。:-P


というわけで,試してみたらすぐ出来た。:-)


ちなみにコードはこんなの。

public class ShowEditorHeaderAction extends EditorAction {
    public ShowEditorHeaderAction() {
        super(new Handler());
    }

    private static class Handler extends EditorActionHandler {
        public void execute(Editor editor, DataContext datacontext) {
            Header header = new Header(editor);
        }

        public boolean isEnabled(Editor editor, DataContext datacontext) {
            Project project = (Project) DataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(editor.getComponent()));
            return project != null;
        }
    }
}

ヘッダコンポーネント(Header)は超やっつけ仕事で,こんなの。

*1:com.intellij.openapi.editorパッケージ

プラグイン作って覚えたことを淡々と記録するよ(イベントフック編)

とりあえずコンパイル結果とインスペクションの結果の拾い方がわかった。
まずは,コンパイル結果について

  • CompilationStatusListener[com.intellij.openapi.compilerパッケージ]を使う
  • CompilerManager.addCompilationStatusListener()[上記と同じパッケージ]で登録
  • CompilerManagerはインスタンスを取得するにはProjectが必要なので,ProjectComponentでリスナー登録しとくと良い。

次がインスペクションの結果,ってエディタの右上に出てるボックスインジケータの変更を検知するやり方

  • WolfTheProblemSolver.ProblemListener [com.intellij.problemsパッケージ]を使う
  • 登録先は,WolfTheProblemSolver。
  • CompilerManager同様,WolfTheProblemSolverもインスタンス取得にProjectが要る。
  • イベントのサイクルがいまいちわからん。経験則だとこんな感じ。
    • インジケータがグリーンの間は何も起きない(みたい)
    • キーをタイプしはじめると,problemsAppeared()が発火する。
    • キータイプ中は常に,problemsChanged()が発火してる。
    • キータイプが終わると,problemsDisappeared()が発火する。
  • 問題の有無はWolfTheProblemSolverで評価する(hasSyntaxErrors()/isProblemFile()を利用)。

WolfTheProblemSolverは見つけたのはいいけど,ちょっと使い道を思案中。


その他のイベントについては,Event Soundsプラグインを参考にするとヨロシ。


ps.
JUnitのテスト結果のイベントも拾ってみたいんだけど,JUnitプラグインはIDEA組み込みでソースがないから,解析にちょい苦労してる。なんとなくそれっぽいのは見つけたけど,イベントフックできるかどうかはわからん。