プラグイン作って覚えたことを淡々と記録するよ(ツールウィンドウのタブ化)
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。劣化コピーなんでずいぶん雑。たとえば「他所のイベントからツールウィンドウの特定のタブ指定でフォーカスを当てる」とかできないんで,あしからず。
#オリジナルはそうゆうこともできる。:-)