1 package com.atlassian.theplugin.idea;
2
3 import com.intellij.openapi.actionSystem.AnActionEvent;
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.wm.ToolWindow;
6 import com.intellij.openapi.wm.ToolWindowAnchor;
7 import com.intellij.openapi.wm.ToolWindowManager;
8 import com.intellij.ui.content.Content;
9 import com.intellij.ui.content.ContentManagerAdapter;
10 import com.intellij.ui.content.ContentManagerEvent;
11 import com.intellij.ui.content.ContentManagerListener;
12
13 import javax.swing.*;
14 import java.awt.*;
15 import java.awt.image.BufferedImage;
16 import java.util.HashMap;
17 import java.util.Map;
18
19
20
21
22
23
24 public abstract class MultiTabToolWindow {
25
26 private Map<String, ContentPanel> panelMap = new HashMap<String, ContentPanel>();
27
28 protected abstract class ContentPanel extends JPanel {
29 public abstract void unregister();
30
31 public abstract String getTitle();
32 }
33
34 protected interface ContentParameters {
35 }
36
37 protected abstract String getContentKey(ContentParameters params);
38
39 protected abstract ContentPanel createContentPanel(ContentParameters params);
40
41 private boolean singleTabMode;
42
43 protected MultiTabToolWindow(boolean singleTabMode) {
44 this.singleTabMode = singleTabMode;
45 }
46
47 protected ToolWindow showToolWindow(final Project project, ContentParameters params,
48 final String title, final Icon icon, final Icon tabIcon) {
49 String contentKey = getContentKey(params);
50 final ToolWindowManager twm = ToolWindowManager.getInstance(project);
51 ToolWindow itw = twm.getToolWindow(title);
52
53 if (itw == null) {
54 itw = createNewToolWindow(project, title, icon);
55 }
56
57 ContentPanel contentPanel = null;
58 for (String s : panelMap.keySet()) {
59 if (s.equals(contentKey)) {
60 contentPanel = panelMap.get(contentKey);
61 break;
62 }
63 }
64
65 if (singleTabMode) {
66 if (contentPanel != null) {
67 Content c = itw.getContentManager().findContent(panelMap.get(contentKey).getTitle());
68 itw.getContentManager().setSelectedContent(c);
69 itw.show(null);
70 } else {
71 if (panelMap.size() > 0) {
72 itw.getContentManager().removeAllContents(true);
73 }
74 contentPanel = createContentPanel(params);
75 panelMap.put(contentKey, contentPanel);
76 fillToolWindowContents(contentKey, contentPanel, tabIcon, itw);
77 }
78 } else {
79 if (contentPanel == null) {
80 contentPanel = createContentPanel(params);
81 panelMap.put(contentKey, contentPanel);
82 fillToolWindowContents(contentKey, contentPanel, tabIcon, itw);
83 } else {
84 Content c = itw.getContentManager().findContent(panelMap.get(contentKey).getTitle());
85 itw.getContentManager().setSelectedContent(c);
86 itw.show(null);
87 }
88 }
89
90 return itw;
91 }
92
93 protected ToolWindow showToolWindow(final Project project, ContentParameters params,
94 final String title, final Icon icon, final Icon tabIcon, final ContentManagerListener listener) {
95 ToolWindow toolWindow = showToolWindow(project, params, title, icon, tabIcon);
96 toolWindow.getContentManager().addContentManagerListener(listener);
97 return toolWindow;
98 }
99
100 protected ToolWindow createNewToolWindow(final Project project, final String title, final Icon icon) {
101 final ToolWindowManager twm = ToolWindowManager.getInstance(project);
102 final ToolWindow issueToolWindow = twm.registerToolWindow(title, true, ToolWindowAnchor.BOTTOM);
103
104 setToolWindowIcon(issueToolWindow, icon);
105
106 issueToolWindow.getContentManager().addContentManagerListener(new ContentManagerAdapter() {
107 public void contentRemoved(ContentManagerEvent event) {
108 super.contentRemoved(event);
109 String key = event.getContent().getTabName();
110
111 panelMap.get(key).unregister();
112 panelMap.remove(key);
113 SwingUtilities.invokeLater(new Runnable() {
114 public void run() {
115 if (panelMap.size() == 0) {
116 twm.unregisterToolWindow(title);
117 }
118 }
119 });
120 }
121 });
122 return issueToolWindow;
123 }
124
125 private void fillToolWindowContents(String key, ContentPanel panel, Icon icon, ToolWindow toolWindow) {
126 Content content = toolWindow.getContentManager().getFactory().createContent(panel, panel.getTitle(), true);
127
128 content.setIcon(icon);
129 content.putUserData(com.intellij.openapi.wm.ToolWindow.SHOW_CONTENT_ICON, Boolean.TRUE);
130
131 content.setTabName(key);
132 toolWindow.getContentManager().addContent(content);
133
134 toolWindow.getContentManager().setSelectedContent(content);
135 toolWindow.show(null);
136 }
137
138 private static void setToolWindowIcon(ToolWindow toolWindow, Icon icon) {
139 BufferedImage bi = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
140 Graphics2D g = bi.createGraphics();
141 icon.paintIcon(null, g, 0, 0);
142 g.dispose();
143 Icon i = new ImageIcon(bi);
144 toolWindow.setIcon(i);
145 }
146
147 protected <T extends ContentPanel> T getContentPanel(String key) {
148 return (T) panelMap.get(key);
149 }
150
151 protected void closeToolWindow(String title, AnActionEvent e) {
152 Project project = IdeaHelper.getCurrentProject(e);
153
154 final ToolWindowManager twm = ToolWindowManager.getInstance(project);
155 ToolWindow tw = twm.getToolWindow(title);
156 if (tw != null) {
157 String key = e.getPlace();
158
159 for (Content c : tw.getContentManager().getContents()) {
160 if (c.getTabName().equals(key)) {
161
162 if (tw.getContentManager().getContentCount() == 1) {
163 tw.hide(new Runnable() {
164 public void run() {
165 }
166 });
167 }
168 tw.getContentManager().removeContent(c, true);
169 break;
170 }
171 }
172 }
173 }
174 }