プラグイン作って覚えたことを淡々と記録するよ(ツールウィンドウのタブ化)

Atlassian IDE Pluginで Changes Window みたくツールウィンドウにタブ付いていたので,早速パクってみた。
手頃なところで,この前作った翻訳パネルにタブを3枚つけてみたよ。


「もしかしてOpenAPIにそんなコンポーネントあったの?」ってちょっと期待したんだけど,そんなことはなく地道に組んでるだけだった。でも,ContentManagerがもともとそうゆう機能を持ってるようで,こっちが思い描いているようなAPIではなかっただけって話だ。
なんで,こんな感じで TabbedToolWindow なんてのを作ってみたよ。

public class TabbedToolWindow extends ContentManagerAdapter {
  private Map<String, Content> panels = new LinkedHashMap<String, Content>();

  private ToolWindow ideaToolWindow;

  public TabbedToolWindow(String name, ToolWindowManager windowManager, boolean canClose,ToolWindowAnchor anchor) {
    this.ideaToolWindow = windowManager.registerToolWindow(name, canClose, anchor);
  }

  public void registerPanel(String panelName, Content content) {
    Content oldContent = panels.put(panelName, content);
    if (oldContent != null) {
      ideaToolWindow.getContentManager().removeContent(oldContent, true);
    }
    ideaToolWindow.getContentManager().addContent(panels.get(panelName));
  }

  public void startTabChangeListener() {
    ideaToolWindow.getContentManager().addContentManagerListener(this);
  }
  public void stopTabChangeListener() {
    ideaToolWindow.getContentManager().removeContentManagerListener(this);
  }

  public void focusPanelIfExists(String name) {
    Content content = ideaToolWindow.getContentManager().findContent(name);
    if (content != null) {
      ideaToolWindow.getContentManager().setSelectedContent(content);
    }
  }
}


使い方は,こう。

public void projectOpened() {
  ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(_project);
  tabbedToolWindow = new TabbedToolWindow(TOOL_WINDOW_ID, toolWindowManager, true, ToolWindowAnchor.BOTTOM);

  PeerFactory peerFactory = PeerFactory.getInstance();
  TranslatorConfig config = ApplicationManager.getApplication().getComponent(TranslatorConfig.class);
  TranslatorPanel translatePanel;
  Content content;

  translatePanel = new TranslatorPanel();
  translatePanel.init(config);
  content = peerFactory.getContentFactory().createContent(translatePanel.rootPanel, "P:1", false);
  tabbedToolWindow.registerPanel("panel1", content);

  translatePanel = new TranslatorPanel();
  translatePanel.init(config);
  content = peerFactory.getContentFactory().createContent(translatePanel.rootPanel, "P:2", false);
  tabbedToolWindow.registerPanel("panel2", content);
    :


TabbedToolWindow の元ネタは,Atlassianの PluginToolWindow。劣化コピーなんでずいぶん雑。たとえば「他所のイベントからツールウィンドウの特定のタブ指定でフォーカスを当てる」とかできないんで,あしからず。
#オリジナルはそうゆうこともできる。:-)