View Javadoc

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   * User: jgorycki
21   * Date: Jan 6, 2009
22   * Time: 3:08:53 PM
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 }