ねこび〜んのGIFアニメ貼ってみた
プラグイン作って覚えたことを淡々と記録するよ(エディタヘッダ編)
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)は超やっつけ仕事で,こんなの。
プラグイン作って覚えたことを淡々と記録するよ(イベントフック編)
とりあえずコンパイル結果とインスペクションの結果の拾い方がわかった。
まずは,コンパイル結果について
- 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組み込みでソースがないから,解析にちょい苦労してる。なんとなくそれっぽいのは見つけたけど,イベントフックできるかどうかはわからん。