cleanup
[idea/community.git] / platform / platform-impl / src / com / intellij / ui / content / impl / ContentImpl.java
1
2 /*
3  * Copyright 2000-2009 JetBrains s.r.o.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package com.intellij.ui.content.impl;
18
19 import com.intellij.openapi.Disposable;
20 import com.intellij.openapi.actionSystem.ActionGroup;
21 import com.intellij.openapi.util.Disposer;
22 import com.intellij.openapi.util.IconLoader;
23 import com.intellij.openapi.util.UserDataHolderBase;
24 import com.intellij.openapi.util.Computable;
25 import com.intellij.ui.LayeredIcon;
26 import com.intellij.ui.content.AlertIcon;
27 import com.intellij.ui.content.Content;
28 import com.intellij.ui.content.ContentManager;
29 import org.jetbrains.annotations.NonNls;
30 import org.jetbrains.annotations.Nullable;
31
32 import javax.swing.*;
33 import java.awt.*;
34 import java.beans.PropertyChangeListener;
35 import java.beans.PropertyChangeSupport;
36
37 public class ContentImpl extends UserDataHolderBase implements Content {
38   private String myDisplayName;
39   private String myDescription;
40   private JComponent myComponent;
41   private Icon myIcon;
42   private final PropertyChangeSupport myChangeSupport = new PropertyChangeSupport(this);
43   private ContentManager myManager = null;
44   private boolean myIsLocked = false;
45   private boolean myPinnable = true;
46   private Icon myLayeredIcon = new LayeredIcon(2);
47   private Disposable myDisposer = null;
48   private String myTabName;
49   private String myToolwindowTitle;
50   private boolean myCloseable = true;
51   private ActionGroup myActions;
52   private String myPlace;
53
54   private AlertIcon myAlertIcon;
55
56   private JComponent myActionsContextComponent;
57   private JComponent mySearchComponent;
58
59   private Computable<JComponent> myFocusRequest;
60
61   public ContentImpl(JComponent component, String displayName, boolean isPinnable) {
62     myComponent = component;
63     myDisplayName = displayName;
64     myPinnable = isPinnable;
65   }
66
67   public JComponent getComponent() {
68     return myComponent;
69   }
70
71   public void setComponent(JComponent component) {
72     Component oldComponent = myComponent;
73     myComponent = component;
74     myChangeSupport.firePropertyChange(PROP_COMPONENT, oldComponent, myComponent);
75   }
76
77   public JComponent getPreferredFocusableComponent() {
78     return myFocusRequest == null ? myComponent : myFocusRequest.compute();
79   }
80
81   public void setPreferredFocusableComponent(final JComponent c) {
82     setPreferredFocusedComponent(new Computable<JComponent>() {
83       public JComponent compute() {
84         return c;
85       }
86     });
87   }
88
89   public void setPreferredFocusedComponent(final Computable<JComponent> computable) {
90     myFocusRequest = computable;
91   }
92
93   public void setIcon(Icon icon) {
94     Icon oldValue = getIcon();
95     myIcon = icon;
96     myLayeredIcon = LayeredIcon.create(myIcon, getPinIcon());
97     myChangeSupport.firePropertyChange(PROP_ICON, oldValue, getIcon());
98   }
99
100   public Icon getIcon() {
101     if (myIsLocked) {
102       return myIcon == null ? getPinIcon() : myLayeredIcon;
103     }
104     else {
105       return myIcon;
106     }
107   }
108
109   private static Icon getPinIcon() {
110     return IconLoader.getIcon("/nodes/pinToolWindow.png");
111   }
112
113   public void setDisplayName(String displayName) {
114     String oldValue = myDisplayName;
115     myDisplayName = displayName;
116     myChangeSupport.firePropertyChange(PROP_DISPLAY_NAME, oldValue, myDisplayName);
117   }
118
119   public String getDisplayName() {
120     return myDisplayName;
121   }
122
123   public void setTabName(String tabName) {
124     myTabName = tabName;
125   }
126
127   public String getTabName() {
128     if (myTabName != null) return myTabName;
129     return myDisplayName;
130   }
131
132   public void setToolwindowTitle(String toolwindowTitle) {
133     myToolwindowTitle = toolwindowTitle;
134   }
135
136   public String getToolwindowTitle() {
137     if (myToolwindowTitle != null) return myToolwindowTitle;
138     return myDisplayName;
139   }
140
141   public Disposable getDisposer() {
142     return myDisposer;
143   }
144
145   public void setDisposer(Disposable disposer) {
146     myDisposer = disposer;
147   }
148
149   public String getDescription() {
150     return myDescription;
151   }
152
153   public void setDescription(String description) {
154     String oldValue = myDescription;
155     myDescription = description;
156     myChangeSupport.firePropertyChange(PROP_DESCRIPTION, oldValue, myDescription);
157   }
158
159   public void addPropertyChangeListener(PropertyChangeListener l) {
160     myChangeSupport.addPropertyChangeListener(l);
161   }
162
163   public void removePropertyChangeListener(PropertyChangeListener l) {
164     myChangeSupport.removePropertyChangeListener(l);
165   }
166
167   public void setManager(ContentManager manager) {
168     myManager = manager;
169   }
170
171   public ContentManager getManager() {
172     return myManager;
173   }
174
175   public boolean isSelected() {
176     return myManager != null && myManager.isSelected(this);
177   }
178
179   public final void release() {
180     Disposer.dispose(this);
181   }
182
183   //TODO[anton,vova] investigate
184   public boolean isValid() {
185     return myManager != null;
186   }
187
188   public boolean isPinned() {
189     return myIsLocked;
190   }
191
192   public void setPinned(boolean locked) {
193     if (isPinnable()) {
194       Icon oldIcon = getIcon();
195       myIsLocked = locked;
196       Icon newIcon = getIcon();
197       myChangeSupport.firePropertyChange(PROP_ICON, oldIcon, newIcon);
198     }
199   }
200
201   public boolean isPinnable() {
202     return myPinnable;
203   }
204
205   public boolean isCloseable() {
206     return myCloseable;
207   }
208
209   public void setCloseable(final boolean closeable) {
210     myCloseable = closeable;
211   }
212
213   public void setActions(final ActionGroup actions, String place, @Nullable JComponent contextComponent) {
214     final ActionGroup oldActions = myActions;
215     myActions = actions;
216     myPlace = place;
217     myActionsContextComponent = contextComponent;
218     myChangeSupport.firePropertyChange(PROP_ACTIONS, oldActions, myActions);
219   }
220
221   public JComponent getActionsContextComponent() {
222     return myActionsContextComponent;
223   }
224
225   public ActionGroup getActions() {
226     return myActions;
227   }
228
229   public String getPlace() {
230     return myPlace;
231   }
232
233   @NonNls
234   public String toString() {
235     return "Content name=" + myDisplayName;
236   }
237
238   public void dispose() {
239     if (myComponent instanceof Disposable) {
240       Disposer.dispose((Disposable)myComponent);
241     }
242
243     myComponent = null;
244     myFocusRequest = null;
245     myManager = null;
246
247     clearUserData();
248     if (myDisposer != null) {
249       Disposer.dispose(myDisposer);
250       myDisposer = null;
251     }
252   }
253
254   @Nullable
255   public AlertIcon getAlertIcon() {
256     return myAlertIcon;
257   }
258
259   public void setAlertIcon(@Nullable final AlertIcon icon) {
260     myAlertIcon = icon;
261   }
262
263   public void fireAlert() {
264     myChangeSupport.firePropertyChange(PROP_ALERT, null, true);
265   }
266
267   public void setSearchComponent(@Nullable final JComponent comp) {
268     mySearchComponent = comp;
269   }
270
271   public JComponent getSearchComponent() {
272     return mySearchComponent;
273   }
274 }