Intellij IDEAのプラグインを作成します。 メモとヒント

半年ほど前に、Intellij IDEA用のプラグインを書くという同じ考えを得ました。 アイデアによると、開発者がプロ​​ジェクトに費やした時間(合計、1日、セッションごと)を考慮し、結果を図に表示する必要がありました。 魔法ではありませんが、このような関数は作業時間の計算に大いに役立ちます。



既存のプラグインのカタログをスクロールしても、同様のプラグインが見つかりました。 しかし、彼は図を描画せず、2つのドロップダウンリストで開きました-なんてひどいことか、どれほど不便か-そしてそれはかなり貧弱であることがわかりました。



要するに、私は自分のプラグインが役立つと信じてさらに強くなり、機能するようになりました。 Intellij IDEAプラグインの開発用の資料はほんの数ではなく、ほとんどないことをすぐに言いたいと思います。

しかし、それでも何かを発掘することができました。

便利なリンク



JetBrainsドキュメント

Intellijプラットフォームのプラグイン開発者フォーラム

IDEソースコードの入手先について簡潔かつ明確に

@LucyferのHabréに関する非常に詳細な一連の記事

Java APIの例


小さなヒント


プラグインや構成ファイルなどを開発するための環境をセットアップするなどのことは、RuNetのいくつかの記事がすべてこれに特化しているため、話さないことにしました。 プラグインの作成中に、私はIntellij IDEAの非自明な(とにかく)機能に何度もつまずきました。 以前にそれらのことを知っていたなら、事態はずっと早く終わっていただろう。 したがって、時間を節約できるポイントを共有します。

CustomStatusBarWidgetを追加します


便宜上、開発者をエディターから気を散らすことなく、環境内の現在のセッションに費やされた時間を表示する小さな要素をステータスバーに追加することにしました。 StatusBarインターフェースには、CustomStatusBarWidgetパラメーターを受け取るオーバーロードされたaddWidget()メソッドが含まれています。

public interface StatusBar extends StatusBarInfo, Disposable { ... void addWidget(@NotNull StatusBarWidget var1); void addWidget(@NotNull StatusBarWidget var1, @NotNull String var2); void addWidget(@NotNull StatusBarWidget var1, @NotNull Disposable var2); void addWidget(@NotNull StatusBarWidget var1, @NotNull String var2, @NotNull Disposable var3); ... } 

次のようにして、プロジェクトのStatusBarを取得できます。

 statusBar = WindowManager.getInstance().getStatusBar(currentProject); 

私にとっての主な問題は、CustomStatusBarWidgetの実装と、他のウィジェットとの関係におけるその場所でした(名前がわからなかったため、環境のソースコードでそれらを見つけることができませんでした)。

ここから救いが来ました 。 つまり、次のようにウィジェットを他のウィジェットに相対的に追加できます。

 statusBar.addWidget(myWidget1,"before " + IdeMessagePanel.FATAL_ERROR); statusBar.addWidget(myWidget2, "after Encoding"); statusBar.addWidget(myWidget3,"after InsertOverwrite"); statusBar.addWidget(myWidget4,"after Position"); 

CustomStatusBarWidgetを実装します。

  class Widget implements CustomStatusBarWidget{ private JLabel myLabel = new JLabel("00:00:00"); @Override public JComponent getComponent() { return myLabel; } @NotNull @Override public String ID() { return null; } @Nullable @Override public WidgetPresentation getPresentation(@NotNull PlatformType platformType) { return null; } @Override public void install(@NotNull StatusBar statusBar) { } @Override public void dispose() { } } 

ウィジェットをStatusBarに追加し、JLabelアイコンを補完します...



JavaコードからToolBar'aアクションを取得する


Intellij IDEAプラグインのアクションシステムの詳細については、 こちらをご覧ください
ActionManagerを使用してコンポーネントを取得します。

  private JComponent createActionToolBar(AnAction ...actions){ DefaultActionGroup actionGroup = new DefaultActionGroup(); for(AnAction anAction : actions){ actionGroup.add(anAction); } ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar("Tempore.MainPanel", actionGroup, false); return toolbar.getComponent(); } 

プラグインが機能するプロジェクトのアドレス


プロジェクトへのパスは、Projectクラスのインスタンスを使用して取得できます。 たとえば、プロジェクトの.ideaフォルダーへのパス:

 String path = currentProject.getProjectFile().getParent().getPath(); 

actionPerformed()メソッドからコンポーネントを取得する


AnActionEventパラメーターから、コンポーネントにアクセスできます。

 Project currentProject = DataKeys.PROJECT.getData(actionEvent.getDataContext()); VirtualFile currentFile = DataKeys.VIRTUAL_FILE.getData(actionEvent.getDataContext()); Editor editor = DataKeys.EDITOR.getData(actionEvent.getDataContext()); StatusBar statusBar = WindowManager.getInstance().getStatusBar(DataKeys.PROJECT.getData(actionEvent.getDataContext())); . 

ポップアップメッセージ


次のように、情報またはエラーメッセージを含む簡単なメッセージをStatusBarに追加できます。

  JBPopupFactory.getInstance() .createHtmlTextBalloonBuilder("You have been working for two hours! Recommend to have a break ", MessageType.INFO, null) .setFadeoutTime(7500) .createBalloon() .show(RelativePoint.getCenterOf(statusBar.getComponent()), Balloon.Position.atRight); 

次のようになります。


Intellijプラットフォームの互換性


プロジェクトに費やした時間をカウントすることは、Intellij IDEAだけでなく有用なので、プラグインを他のIntellijプラットフォーム環境と互換性があるようにすることにしました。 これを行うには、plugin.xmlファイルにタグを追加します。

 <idea-plugin version="0.5.5b"> ... <depends>com.intellij.modules.lang</depends> ... </idea-plugin> 

現在、Intellij IDEAに加えて、プラグインはRubyMine、WebStorm、PhpStorm、PyCharm、AppCodeにも適しています。

まとめ


約1か月で、プロジェクトに費やした時間を監視するプラグインを作成し、数時間ノンストップコードを記述する場合は休憩するようにアドバイスし、毎日費やした時間のグラフを描画しました。
また、環境内のアクティビティが5分以上停止すると停止し、ユーザーが再び作業を開始すると開始します。



必要に応じて、プラグイン自体をここからダウンロードできます

この記事が、誰かが開発のいくつかの側面を理解し、APIを読んで眠れない夜からあなたを救うのに役立つことを願っています。

Source: https://habr.com/ru/post/J270309/


All Articles