fix NPE
[fedora-idea.git] / platform-impl / src / com / intellij / openapi / wm / impl / ToolWindowImpl.java
blobb8c4c7b08224406734cbc8b592f6d5b096fec606
1 package com.intellij.openapi.wm.impl;
3 import com.intellij.ide.impl.ContentManagerWatcher;
4 import com.intellij.openapi.actionSystem.ActionGroup;
5 import com.intellij.openapi.application.ApplicationManager;
6 import com.intellij.openapi.components.ServiceManager;
7 import com.intellij.openapi.util.ActionCallback;
8 import com.intellij.openapi.wm.ToolWindowAnchor;
9 import com.intellij.openapi.wm.ToolWindowFactory;
10 import com.intellij.openapi.wm.ToolWindowType;
11 import com.intellij.openapi.wm.ex.ToolWindowEx;
12 import com.intellij.openapi.wm.impl.content.ToolWindowContentUi;
13 import com.intellij.ui.content.Content;
14 import com.intellij.ui.content.ContentFactory;
15 import com.intellij.ui.content.ContentManager;
16 import com.intellij.ui.content.impl.ContentImpl;
17 import org.jetbrains.annotations.Nullable;
19 import javax.swing.*;
20 import java.awt.*;
21 import java.beans.PropertyChangeListener;
22 import java.beans.PropertyChangeSupport;
24 /**
25 * @author Anton Katilin
26 * @author Vladimir Kondratyev
28 public final class ToolWindowImpl implements ToolWindowEx {
29 private final PropertyChangeSupport myChangeSupport;
30 private final ToolWindowManagerImpl myToolWindowManager;
31 private final String myId;
32 private final JComponent myComponent;
33 private boolean myAvailable;
34 private final ContentManager myContentManager;
35 private Icon myIcon = null;
37 private static final Content EMPTY_CONTENT = new ContentImpl(new JLabel(), "", false);
38 private final ToolWindowContentUi myContentUI;
40 private InternalDecorator myDecorator;
42 private boolean myHideOnEmptyContent = false;
43 private boolean myPlaceholderMode;
44 private ToolWindowFactory myContentFactory;
46 private ActionCallback myActivation = new ActionCallback.Done();
48 ToolWindowImpl(final ToolWindowManagerImpl toolWindowManager, final String id, boolean canCloseContent, @Nullable final JComponent component) {
49 myToolWindowManager = toolWindowManager;
50 myChangeSupport = new PropertyChangeSupport(this);
51 myId = id;
52 myAvailable = true;
54 final ContentFactory contentFactory = ServiceManager.getService(ContentFactory.class);
55 myContentUI = new ToolWindowContentUi(this);
56 myContentManager =
57 contentFactory.createContentManager(myContentUI, canCloseContent, toolWindowManager.getProject());
59 if (component != null) {
60 final Content content = contentFactory.createContent(component, "", false);
61 myContentManager.addContent(content);
62 myContentManager.setSelectedContent(content, false);
65 myComponent = myContentManager.getComponent();
68 public final void addPropertyChangeListener(final PropertyChangeListener l) {
69 myChangeSupport.addPropertyChangeListener(l);
72 public final void removePropertyChangeListener(final PropertyChangeListener l) {
73 myChangeSupport.removePropertyChangeListener(l);
76 public final void activate(final Runnable runnable) {
77 activate(runnable, true);
80 public void activate(@Nullable final Runnable runnable, final boolean autoFocusContents) {
81 activate(runnable, autoFocusContents, true);
84 public void activate(@Nullable final Runnable runnable, boolean autoFocusContents, boolean forced) {
85 ApplicationManager.getApplication().assertIsDispatchThread();
86 myToolWindowManager.activateToolWindow(myId, forced, autoFocusContents);
88 if (runnable != null) {
89 getActivation().doWhenDone(new Runnable() {
90 public void run() {
91 myToolWindowManager.invokeLater(runnable);
93 });
97 public final boolean isActive() {
98 ApplicationManager.getApplication().assertIsDispatchThread();
99 return myToolWindowManager.isToolWindowActive(myId);
102 public final void show(final Runnable runnable) {
103 ApplicationManager.getApplication().assertIsDispatchThread();
104 myToolWindowManager.showToolWindow(myId);
105 if (runnable != null) {
106 getActivation().doWhenDone(new Runnable() {
107 public void run() {
108 myToolWindowManager.invokeLater(runnable);
114 public final void hide(final Runnable runnable) {
115 ApplicationManager.getApplication().assertIsDispatchThread();
116 myToolWindowManager.hideToolWindow(myId, false);
117 if (runnable != null) {
118 myToolWindowManager.invokeLater(runnable);
122 public final boolean isVisible() {
123 ApplicationManager.getApplication().assertIsDispatchThread();
124 return myToolWindowManager.isToolWindowVisible(myId);
127 public final ToolWindowAnchor getAnchor() {
128 ApplicationManager.getApplication().assertIsDispatchThread();
129 return myToolWindowManager.getToolWindowAnchor(myId);
132 public final void setAnchor(final ToolWindowAnchor anchor, final Runnable runnable) {
133 ApplicationManager.getApplication().assertIsDispatchThread();
134 myToolWindowManager.setToolWindowAnchor(myId, anchor);
135 if (runnable != null) {
136 myToolWindowManager.invokeLater(runnable);
140 public boolean isSplitMode() {
141 ApplicationManager.getApplication().assertIsDispatchThread();
142 return myToolWindowManager.isSplitMode(myId);
145 public void setSplitMode(final boolean isSideTool, @Nullable final Runnable runnable) {
146 ApplicationManager.getApplication().assertIsDispatchThread();
147 myToolWindowManager.setSideTool(myId, isSideTool);
148 if (runnable != null) {
149 myToolWindowManager.invokeLater(runnable);
153 public final void setAutoHide(final boolean state) {
154 ApplicationManager.getApplication().assertIsDispatchThread();
155 myToolWindowManager.setToolWindowAutoHide(myId, state);
158 public final boolean isAutoHide() {
159 ApplicationManager.getApplication().assertIsDispatchThread();
160 return myToolWindowManager.isToolWindowAutoHide(myId);
163 public final boolean isFloating() {
164 ApplicationManager.getApplication().assertIsDispatchThread();
165 return myToolWindowManager.isToolWindowFloating(myId);
168 public final ToolWindowType getType() {
169 ApplicationManager.getApplication().assertIsDispatchThread();
170 return myToolWindowManager.getToolWindowType(myId);
173 public final void setType(final ToolWindowType type, final Runnable runnable) {
174 ApplicationManager.getApplication().assertIsDispatchThread();
175 myToolWindowManager.setToolWindowType(myId, type);
176 if (runnable != null) {
177 myToolWindowManager.invokeLater(runnable);
181 public final ToolWindowType getInternalType() {
182 ApplicationManager.getApplication().assertIsDispatchThread();
183 return myToolWindowManager.getToolWindowInternalType(myId);
186 public final void setAvailable(final boolean available, final Runnable runnable) {
187 ApplicationManager.getApplication().assertIsDispatchThread();
188 final Boolean oldAvailable = myAvailable ? Boolean.TRUE : Boolean.FALSE;
189 myAvailable = available;
190 myChangeSupport.firePropertyChange(PROP_AVAILABLE, oldAvailable, myAvailable ? Boolean.TRUE : Boolean.FALSE);
191 if (runnable != null) {
192 myToolWindowManager.invokeLater(runnable);
196 public void installWatcher(ContentManager contentManager) {
197 new ContentManagerWatcher(this, contentManager);
201 * @return <code>true</code> if the component passed into constructor is not instance of
202 * <code>ContentManager</code> class. Otherwise it delegates the functionality to the
203 * passed content manager.
205 public final boolean isAvailable() {
206 ApplicationManager.getApplication().assertIsDispatchThread();
207 return myAvailable && myComponent != null;
210 public final JComponent getComponent() {
211 return myComponent;
214 public ContentManager getContentManager() {
215 return myContentManager;
218 public ToolWindowContentUi getContentUI() {
219 return myContentUI;
222 public final Icon getIcon() {
223 ApplicationManager.getApplication().assertIsDispatchThread();
224 return myIcon;
225 //return getSelectedContent().getIcon();
228 public final String getId() {
229 return myId;
232 public final String getTitle() {
233 ApplicationManager.getApplication().assertIsDispatchThread();
234 return getSelectedContent().getDisplayName();
237 public final void setIcon(final Icon icon) {
238 ApplicationManager.getApplication().assertIsDispatchThread();
239 final Icon oldIcon = getIcon();
240 getSelectedContent().setIcon(icon);
241 myIcon = icon;
242 myChangeSupport.firePropertyChange(PROP_ICON, oldIcon, icon);
245 public final void setTitle(final String title) {
246 ApplicationManager.getApplication().assertIsDispatchThread();
247 final String oldTitle = getTitle();
248 getSelectedContent().setDisplayName(title);
249 myChangeSupport.firePropertyChange(PROP_TITLE, oldTitle, title);
252 private Content getSelectedContent() {
253 final Content selected = getContentManager().getSelectedContent();
254 return selected != null ? selected : EMPTY_CONTENT;
257 public void setDecorator(final InternalDecorator decorator) {
258 myDecorator = decorator;
261 public void fireActivated() {
262 if (myDecorator != null) {
263 myDecorator.fireActivated();
267 public void fireHidden() {
268 if (myDecorator != null) {
269 myDecorator.fireHidden();
273 public void fireHiddenSide() {
274 if (myDecorator != null) {
275 myDecorator.fireHiddenSide();
280 public ToolWindowManagerImpl getToolWindowManager() {
281 return myToolWindowManager;
284 @Nullable
285 public ActionGroup getPopupGroup() {
286 return myDecorator != null ? myDecorator.createPopupGroup() : null;
289 public void setDefaultState(@Nullable final ToolWindowAnchor anchor, @Nullable final ToolWindowType type, @Nullable final Rectangle floatingBounds) {
290 myToolWindowManager.setDefaultState(this, anchor, type, floatingBounds);
293 public void setToHideOnEmptyContent(final boolean hideOnEmpty) {
294 myHideOnEmptyContent = hideOnEmpty;
297 public boolean isToHideOnEmptyContent() {
298 return myHideOnEmptyContent;
301 public boolean isDisposed() {
302 return myContentManager.isDisposed();
305 public boolean isPlaceholderMode() {
306 return myPlaceholderMode;
309 public void setPlaceholderMode(final boolean placeholderMode) {
310 myPlaceholderMode = placeholderMode;
313 public ActionCallback getActivation() {
314 return myActivation;
317 public ActionCallback setActivation(ActionCallback activation) {
318 if (myActivation != null && !myActivation.isProcessed() && !myActivation.equals(activation)) {
319 myActivation.setRejected();
322 myActivation = activation;
323 return myActivation;
326 public void setContentFactory(ToolWindowFactory contentFactory) {
327 myContentFactory = contentFactory;
330 public void ensureContentInitialized() {
331 if (myContentFactory != null) {
332 getContentManager().removeAllContents(false);
333 myContentFactory.createToolWindowContent(myToolWindowManager.getProject(), this);
334 myContentFactory = null;