ChangesBarみたいにステータスバーをカスタマイズする

Tool Windowをカスタマイズする方法はDevKitのあったけど,ステータスバーはなかった。
ちなみに,Changes Barとはこんなやつ。


興味があるから調べたよ。これも大元はproject-componentで,その初期化時にステータスバーをカスタマイズしておりました。

public class StatusbarProjectComponent implements ProjectComponent {
  private Project _project;
  private StatusBar _statusBar;
  private TestBar _testBar;

  public StatusbarProjectComponent(Project project) {
    _project = project;
  }

  public void initComponent() { }
  public void disposeComponent() { }

  @NotNull
  public String getComponentName() {
    return "StatusbarProjectComponent";
  }

  public void projectOpened() {
    WindowManager windowManager = WindowManager.getInstance();
    _statusBar = windowManager.getStatusBar(_project);
    _testBar = new TestBar(_project);
    // ↓これで,ステータスバーにコンポーネント追加する
    _statusBar.addCustomIndicationComponent(_testBar.getRootComponent());
  }

  public void projectClosed() { }
}

ステータスバーに追加してみたコンポーネントはこんなやつ。


Changes Barは一見ドロップダウンリストに見えたんだけど,実はボタンで押すとポップアップが表示される仕組みだった。なんで,今回作ったサンプルもそれをマネてみたが,ボタン1個だけなんでGUIデザイナ使った意味がなかったかも。


永いことIDEAを使っているが,まじめにGUIデザイナを使ってみたのは今回が初めてかも。GUIデザイナ使うときのポイントは,Formのバインドクラスにroot要素であるJPanelもバインドしておくことだな。
#下図の_rootってのがそれ。


バインドクラス側のコードで特筆する箇所は,ポップアップの作り方か。

  public TestBar(Project projject) {
    _project = projject;
    clickMeButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        showPopup();
      }
    });
  }

  private void showPopup() {
    // ポップアップの作り方は,ほかにも何種類かある。よく知らんけど。
    ListPopup popup = JBPopupFactory.getInstance().createConfirmation(
        "TestPopup", "はい", "いいえ",
        new Runnable() {
          public void run() {
            clickMeButton.setText("ハイに決めた");
          }
        },
        new Runnable() {
          public void run() {
            clickMeButton.setText("いいえにした");
          }
        }, 0
    );
    // ポップアップをステータスバーのボタン付近に表示するためのコード
    // ここは,Changes Barの丸パクリ
    final Dimension preferredSize = popup.getContent().getPreferredSize();
    preferredSize.width = Math.max(preferredSize.width, clickMeButton.getSize().width);
    popup.getContent().setPreferredSize(preferredSize);
    final Point point = clickMeButton.getBounds().getLocation();
    point.y -= preferredSize.height + clickMeButton.getHeight();
    popup.show(new RelativePoint(clickMeButton, point));
  }

Changes Barの場合,ポップアップが表示している間はステータスバーのボタンを押せなくしたり,不意の走査でポップアップが閉じても大丈夫な考慮をしてあったが,今回のサンプルはそんなことしなくても別に不具合は起きなかったぞ。


あとChanges Barでは,IDEAが元々備えているイベントリスナ(VCSに対する変更)を実装してあったが,独自のイベントを発火させる場合はどうすんだろ?IDETalkあたりに答えが隠れてそうなんで,あとで調べてみよう。


と,ここまでやって気がついたが,あたし自身Swingにまったく不慣れなので,なんかしようと思うたびに思考が停止する。よしんばやり方がわかったとしても,なかなか地味なコードでやる気が萎える。
#凝ったGUIは,地味な実装の賜物なのだなぁ,しみじみ思う。:-P