diff options
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.java | 145 |
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 |