summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java')
-rw-r--r--platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java145
1 files changed, 63 insertions, 82 deletions
diff --git a/platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java b/platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java
index b6e739692ede..d0b110f083bf 100644
--- a/platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java
+++ b/platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java
@@ -15,6 +15,7 @@
*/
package com.intellij.ui.content.impl;
+import com.intellij.ide.DataManager;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.DataProvider;
@@ -32,13 +33,15 @@ import com.intellij.ui.components.panels.Wrapper;
import com.intellij.ui.content.*;
import com.intellij.ui.switcher.SwitchProvider;
import com.intellij.ui.switcher.SwitchTarget;
+import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.SmartList;
+
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
-import javax.swing.event.EventListenerList;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
@@ -55,21 +58,21 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
private static final Logger LOG = Logger.getInstance("#com.intellij.ui.content.impl.ContentManagerImpl");
private ContentUI myUI;
- private final ArrayList<Content> myContents;
- private EventListenerList myListeners;
- private List<Content> mySelection = new ArrayList<Content>();
+ private final List<Content> myContents = new ArrayList<Content>();
+ private final List<ContentManagerListener> myListeners = ContainerUtil.createLockFreeCopyOnWriteList();
+ private final List<Content> mySelection = new ArrayList<Content>();
private final boolean myCanCloseContents;
- private MyContentComponent myContentComponent;
- private MyFocusProxy myFocusProxy;
- private JPanel myComponent;
-
+ private Wrapper.FocusHolder myFocusProxy;
+ private MyNonOpaquePanel myComponent;
private final Set<Content> myContentWithChangedComponent = new HashSet<Content>();
private boolean myDisposed;
private final Project myProject;
+ private final List<DataProvider> dataProviders = new SmartList<DataProvider>();
+
/**
* WARNING: as this class adds listener to the ProjectManager which is removed on projectClosed event, all instances of this class
* must be created on already OPENED projects, otherwise there will be memory leak!
@@ -77,8 +80,6 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
public ContentManagerImpl(@NotNull ContentUI contentUI, boolean canCloseContents, @NotNull Project project) {
myProject = project;
myCanCloseContents = canCloseContents;
- myContents = new ArrayList<Content>();
- myListeners = new EventListenerList();
myUI = contentUI;
myUI.setManager(this);
@@ -95,15 +96,18 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
@Override
public JComponent getComponent() {
if (myComponent == null) {
- myComponent = new NonOpaquePanel(new BorderLayout());
+ myComponent = new MyNonOpaquePanel();
+
+ myFocusProxy = new Wrapper.FocusHolder();
+ myFocusProxy.setOpaque(false);
+ myFocusProxy.setPreferredSize(new Dimension(0, 0));
- myFocusProxy = new MyFocusProxy();
- myContentComponent = new MyContentComponent();
- myContentComponent.setContent(myUI.getComponent());
- myContentComponent.setFocusCycleRoot(true);
+ MyContentComponent contentComponent = new MyContentComponent();
+ contentComponent.setContent(myUI.getComponent());
+ contentComponent.setFocusCycleRoot(true);
myComponent.add(myFocusProxy, BorderLayout.NORTH);
- myComponent.add(myContentComponent, BorderLayout.CENTER);
+ myComponent.add(contentComponent, BorderLayout.CENTER);
}
return myComponent;
}
@@ -117,58 +121,51 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
return busyObject != null ? busyObject.getReady(requestor) : new ActionCallback.Done();
}
- private class MyContentComponent extends NonOpaquePanel implements DataProvider, SwitchProvider {
-
- private final List<DataProvider> myProviders = new ArrayList<DataProvider>();
-
- public void addProvider(final DataProvider provider) {
- myProviders.add(provider);
+ private class MyNonOpaquePanel extends NonOpaquePanel implements DataProvider {
+ public MyNonOpaquePanel() {
+ super(new BorderLayout());
}
@Override
@Nullable
- public Object getData(@NonNls final String dataId) {
- if (PlatformDataKeys.CONTENT_MANAGER.is(dataId)) return ContentManagerImpl.this;
- if (PlatformDataKeys.NONEMPTY_CONTENT_MANAGER.is(dataId) && getContentCount() > 1) {
+ public Object getData(@NonNls String dataId) {
+ if (PlatformDataKeys.CONTENT_MANAGER.is(dataId) || PlatformDataKeys.NONEMPTY_CONTENT_MANAGER.is(dataId) && getContentCount() > 1) {
return ContentManagerImpl.this;
}
- for (DataProvider each : myProviders) {
- final Object data = each.getData(dataId);
- if (data != null) return data;
+ for (DataProvider dataProvider : dataProviders) {
+ Object data = dataProvider.getData(dataId);
+ if (data != null) {
+ return data;
+ }
}
if (myUI instanceof DataProvider) {
return ((DataProvider)myUI).getData(dataId);
}
- return null;
+ DataProvider provider = DataManager.getDataProvider(this);
+ return provider == null ? null : provider.getData(dataId);
}
+ }
+ private class MyContentComponent extends NonOpaquePanel implements SwitchProvider {
@Override
public List<SwitchTarget> getTargets(boolean onlyVisible, boolean originalProvider) {
if (myUI instanceof SwitchProvider) {
return ((SwitchProvider)myUI).getTargets(onlyVisible, false);
}
- return new ArrayList<SwitchTarget>();
+ return new SmartList<SwitchTarget>();
}
@Override
public SwitchTarget getCurrentTarget() {
- if (myUI instanceof SwitchProvider) {
- return ((SwitchProvider)myUI).getCurrentTarget();
- }
-
- return null;
+ return myUI instanceof SwitchProvider ? ((SwitchProvider)myUI).getCurrentTarget() : null;
}
@Override
public JComponent getComponent() {
- if (myUI instanceof SwitchProvider) {
- return myUI.getComponent();
- }
-
- return this;
+ return myUI instanceof SwitchProvider ? myUI.getComponent() : this;
}
@Override
@@ -177,35 +174,23 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
}
}
- private class MyFocusProxy extends Wrapper.FocusHolder implements DataProvider {
- private MyFocusProxy() {
- setOpaque(false);
- setPreferredSize(new Dimension(0, 0));
- }
-
- @Override
- @Nullable
- public Object getData(@NonNls final String dataId) {
- return myContentComponent.getData(dataId);
- }
- }
-
@Override
public void addContent(@NotNull Content content, final int order) {
- addContent(content, null, order);
+ doAddContent(content, order);
}
@Override
public void addContent(@NotNull Content content) {
- addContent(content, null, -1);
+ doAddContent(content, -1);
}
@Override
public void addContent(@NotNull final Content content, final Object constraints) {
- addContent(content, constraints, -1);
+ doAddContent(content, -1);
}
- private void addContent(@NotNull final Content content, final Object constraints, final int index) {
+ private void doAddContent(@NotNull final Content content, final int index) {
+ ApplicationManager.getApplication().assertIsDispatchThread();
if (myContents.contains(content)) return;
((ContentImpl)content).setManager(this);
@@ -227,24 +212,26 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
@Override
public boolean removeContent(@NotNull Content content, final boolean dispose) {
- return removeContent(content, true, dispose);
+ return removeContent(content, true, dispose).isDone();
}
@NotNull
@Override
public ActionCallback removeContent(@NotNull Content content, boolean dispose, final boolean trackFocus, final boolean forcedFocus) {
final ActionCallback result = new ActionCallback();
- _removeContent(content, true, dispose).doWhenDone(new Runnable() {
+ removeContent(content, true, dispose).doWhenDone(new Runnable() {
@Override
public void run() {
if (trackFocus) {
Content current = getSelectedContent();
if (current != null) {
setSelectedContent(current, true, true, !forcedFocus);
- } else {
+ }
+ else {
result.setDone();
}
- } else {
+ }
+ else {
result.setDone();
}
}
@@ -253,11 +240,9 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
return result;
}
- private boolean removeContent(final Content content, boolean trackSelection, boolean dispose) {
- return _removeContent(content, trackSelection, dispose).isDone();
- }
-
- private ActionCallback _removeContent(Content content, boolean trackSelection, boolean dispose) {
+ @NotNull
+ private ActionCallback removeContent(@NotNull Content content, boolean trackSelection, boolean dispose) {
+ ApplicationManager.getApplication().assertIsDispatchThread();
int indexToBeRemoved = getIndexOfContent(content);
if (indexToBeRemoved == -1) return new ActionCallback.Rejected();
@@ -604,43 +589,39 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
@Override
public void addContentManagerListener(@NotNull ContentManagerListener l) {
- myListeners.add(ContentManagerListener.class, l);
+ myListeners.add(0,l);
}
@Override
public void removeContentManagerListener(@NotNull ContentManagerListener l) {
- myListeners.remove(ContentManagerListener.class, l);
+ myListeners.remove(l);
}
private void fireContentAdded(Content content, int newIndex, ContentManagerEvent.ContentOperation operation) {
ContentManagerEvent event = new ContentManagerEvent(this, content, newIndex, operation);
- ContentManagerListener[] listeners = myListeners.getListeners(ContentManagerListener.class);
- for (ContentManagerListener listener : listeners) {
+ for (ContentManagerListener listener : myListeners) {
listener.contentAdded(event);
}
}
private void fireContentRemoved(Content content, int oldIndex, ContentManagerEvent.ContentOperation operation) {
ContentManagerEvent event = new ContentManagerEvent(this, content, oldIndex, operation);
- ContentManagerListener[] listeners = myListeners.getListeners(ContentManagerListener.class);
- for (ContentManagerListener listener : listeners) {
+ for (ContentManagerListener listener : myListeners) {
listener.contentRemoved(event);
}
}
private void fireSelectionChanged(Content content, ContentManagerEvent.ContentOperation operation) {
ContentManagerEvent event = new ContentManagerEvent(this, content, myContents.indexOf(content), operation);
- ContentManagerListener[] listeners = myListeners.getListeners(ContentManagerListener.class);
- for (ContentManagerListener listener : listeners) {
+ for (ContentManagerListener listener : myListeners) {
listener.selectionChanged(event);
}
}
private boolean fireContentRemoveQuery(Content content, int oldIndex, ContentManagerEvent.ContentOperation operation) {
ContentManagerEvent event = new ContentManagerEvent(this, content, oldIndex, operation);
- ContentManagerListener[] listeners = myListeners.getListeners(ContentManagerListener.class);
- for (ContentManagerListener listener : listeners) {
+ for (ContentManagerListener listener : myListeners) {
listener.contentRemoveQuery(event);
if (event.isConsumed()) {
return false;
@@ -692,13 +673,13 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
@Override
public void addDataProvider(@NotNull final DataProvider provider) {
- myContentComponent.addProvider(provider);
+ dataProviders.add(provider);
}
@Override
- public void propertyChange(final PropertyChangeEvent evt) {
- if (Content.PROP_COMPONENT.equals(evt.getPropertyName())) {
- myContentWithChangedComponent.add((Content)evt.getSource());
+ public void propertyChange(@NotNull PropertyChangeEvent event) {
+ if (Content.PROP_COMPONENT.equals(event.getPropertyName())) {
+ myContentWithChangedComponent.add((Content)event.getSource());
}
}
@@ -718,10 +699,10 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
myDisposed = true;
myContents.clear();
- mySelection = null;
+ mySelection.clear();
myContentWithChangedComponent.clear();
myUI = null;
- myListeners = null;
+ myListeners.clear();
}
@Override