/* * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Created by IntelliJ IDEA. * User: Anna.Kozlova * Date: 13-Jul-2006 * Time: 12:07:39 */ package com.intellij.openapi.wm.impl; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.wm.*; import com.intellij.openapi.wm.ex.ToolWindowEx; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; import com.intellij.openapi.wm.ex.ToolWindowManagerListener; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; import com.intellij.ui.content.ContentManager; import com.intellij.ui.content.ContentManagerListener; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.HyperlinkListener; import java.awt.*; import java.awt.event.InputEvent; import java.beans.PropertyChangeListener; import java.util.*; import java.util.List; @SuppressWarnings({"ConstantConditions"}) public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { private final Map myToolWindows = new HashMap(); private final Project myProject; public ToolWindowHeadlessManagerImpl(Project project) { myProject = project; } @Override public boolean canShowNotification(@NotNull String toolWindowId) { return false; } @Override public void notifyByBalloon(@NotNull final String toolWindowId, @NotNull final MessageType type, @NotNull final String htmlBody) { } private ToolWindow doRegisterToolWindow(final String id, @Nullable Disposable parentDisposable) { MockToolWindow tw = new MockToolWindow(myProject); myToolWindows.put(id, tw); if (parentDisposable != null) { Disposer.register(parentDisposable, new Disposable() { @Override public void dispose() { unregisterToolWindow(id); } }); } return tw; } @Override public ToolWindow registerToolWindow(@NotNull String id, @NotNull JComponent component, @NotNull ToolWindowAnchor anchor, Disposable parentDisposable, boolean canWorkInDumbMode) { return doRegisterToolWindow(id, parentDisposable); } @Override public ToolWindow registerToolWindow(@NotNull String id, @NotNull JComponent component, @NotNull ToolWindowAnchor anchor) { return doRegisterToolWindow(id, null); } @Override public ToolWindow registerToolWindow(@NotNull String id, @NotNull JComponent component, @NotNull ToolWindowAnchor anchor, Disposable parentDisposable, boolean canWorkInDumbMode, boolean canCloseContents) { return doRegisterToolWindow(id, parentDisposable); } @Override public ToolWindow registerToolWindow(@NotNull String id, @NotNull JComponent component, @NotNull ToolWindowAnchor anchor, Disposable parentDisposable) { return doRegisterToolWindow(id, parentDisposable); } @Override public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor) { return doRegisterToolWindow(id, null); } @Override public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor, final boolean secondary) { return doRegisterToolWindow(id, null); } @Override public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor, final Disposable parentDisposable, final boolean dumbAware) { return doRegisterToolWindow(id, parentDisposable); } @Override public void unregisterToolWindow(@NotNull String id) { myToolWindows.remove(id); } @Override public void activateEditorComponent() { } @Override public boolean isEditorComponentActive() { return false; } @Override public String[] getToolWindowIds() { return ArrayUtil.EMPTY_STRING_ARRAY; } @Override public String getActiveToolWindowId() { return null; } @Override public ToolWindow getToolWindow(String id) { return myToolWindows.get(id); } @Override public void invokeLater(Runnable runnable) { } @Override public IdeFocusManager getFocusManager() { return IdeFocusManagerHeadless.INSTANCE; } @Override public void notifyByBalloon(@NotNull final String toolWindowId, @NotNull final MessageType type, @NotNull final String text, @Nullable final Icon icon, @Nullable final HyperlinkListener listener) { } @Override public Balloon getToolWindowBalloon(String id) { return null; } @Override public void initToolWindow(ToolWindowEP bean) { } @Override public void addToolWindowManagerListener(@NotNull ToolWindowManagerListener l) { } @Override public void removeToolWindowManagerListener(@NotNull ToolWindowManagerListener l) { } @Override public String getLastActiveToolWindowId() { return null; } @Override public String getLastActiveToolWindowId(Condition condition) { return null; } @Override public DesktopLayout getLayout() { return new DesktopLayout(); } @Override public void setLayoutToRestoreLater(DesktopLayout layout) { } @Override public DesktopLayout getLayoutToRestoreLater() { return new DesktopLayout(); } @Override public void setLayout(@NotNull DesktopLayout layout) { } @Override public void clearSideStack() { } @Override public void hideToolWindow(@NotNull final String id, final boolean hideSide) { } @Override public List getIdsOn(@NotNull final ToolWindowAnchor anchor) { return new ArrayList(); } public static class MockToolWindow implements ToolWindowEx { ContentManager myContentManager = new MockContentManager(); public MockToolWindow(@NotNull Project project) { Disposer.register(project, myContentManager); } @Override public boolean isActive() { return false; } @Override public void activate(@Nullable Runnable runnable) { } @Override public boolean isDisposed() { return false; } @Override public boolean isVisible() { return false; } @NotNull @Override public ActionCallback getReady(@NotNull Object requestor) { return new ActionCallback.Done(); } @Override public void show(@Nullable Runnable runnable) { } @Override public void hide(@Nullable Runnable runnable) { } @Override public ToolWindowAnchor getAnchor() { return ToolWindowAnchor.BOTTOM; } @Override public void setAnchor(ToolWindowAnchor anchor, @Nullable Runnable runnable) { } @Override public boolean isSplitMode() { return false; } @Override public void setSplitMode(final boolean isSideTool, @Nullable final Runnable runnable) { } @Override public boolean isAutoHide() { return false; } @Override public void setAutoHide(boolean state) { } @Override public void setToHideOnEmptyContent(final boolean hideOnEmpty) { } @Override public boolean isToHideOnEmptyContent() { return false; } @Override public ToolWindowType getType() { return ToolWindowType.SLIDING; } @Override public void setType(ToolWindowType type, @Nullable Runnable runnable) { } @Override public Icon getIcon() { return null; } @Override public void setIcon(Icon icon) { } @Override public String getTitle() { return ""; } @Override public void setTitle(String title) { } @NotNull @Override public String getStripeTitle() { return ""; } @Override public void setStripeTitle(@NotNull String title) { } @Override public boolean isAvailable() { return false; } @Override public void setContentUiType(ToolWindowContentUiType type, @Nullable Runnable runnable) { } @Override public void setDefaultContentUiType(@NotNull ToolWindowContentUiType type) { } @Override public ToolWindowContentUiType getContentUiType() { return ToolWindowContentUiType.TABBED; } @Override public void setAvailable(boolean available, @Nullable Runnable runnable) { } @Override public void installWatcher(ContentManager contentManager) { } @Override public JComponent getComponent() { return null; } @Override public ContentManager getContentManager() { return myContentManager; } @Override public void setDefaultState(@Nullable final ToolWindowAnchor anchor, @Nullable final ToolWindowType type, @Nullable final Rectangle floatingBounds) { } @Override public void activate(@Nullable final Runnable runnable, final boolean autoFocusContents) { } @Override public void activate(@Nullable Runnable runnable, boolean autoFocusContents, boolean forced) { } @Override public void showContentPopup(InputEvent inputEvent) { } @Override public ActionCallback getActivation() { return new ActionCallback.Done(); } @Override public void removePropertyChangeListener(PropertyChangeListener l) { } @Override public ToolWindowType getInternalType() { return ToolWindowType.DOCKED; } @Override public void stretchWidth(int value) { } @Override public void stretchHeight(int value) { } @Override public InternalDecorator getDecorator() { return null; } @Override public void setAdditionalGearActions(ActionGroup additionalGearActions) { } @Override public void setTitleActions(AnAction... actions) { } @Override public void setUseLastFocusedOnActivation(boolean focus) { } @Override public boolean isUseLastFocusedOnActivation() { return false; } } private static class MockContentManager implements ContentManager { private final List myContents = new ArrayList(); private Content mySelected; @NotNull @Override public ActionCallback getReady(@NotNull Object requestor) { return new ActionCallback.Done(); } @Override public void addContent(@NotNull final Content content) { myContents.add(content); if (mySelected == null) mySelected = content; } @Override public void addContent(@NotNull Content content, int order) { myContents.add(order, content); if (mySelected == null) mySelected = content; } @Override public void addContent(@NotNull final Content content, final Object constraints) { addContent(content); } @Override public void addSelectedContent(@NotNull final Content content) { addContent(content); setSelectedContent(content); } @Override public void addContentManagerListener(@NotNull final ContentManagerListener l) { } @Override public void addDataProvider(@NotNull final DataProvider provider) { } @Override public boolean canCloseAllContents() { return false; } @Override public boolean canCloseContents() { return false; } @Override public Content findContent(final String displayName) { for (Content each : myContents) { if (each.getDisplayName().equals(displayName)) return each; } return null; } @Override public List getAdditionalPopupActions(@NotNull final Content content) { return Collections.emptyList(); } @NotNull @Override public String getCloseActionName() { return "close"; } @NotNull @Override public String getCloseAllButThisActionName() { return "closeallbutthis"; } @NotNull @Override public String getPreviousContentActionName() { return "previous"; } @NotNull @Override public String getNextContentActionName() { return "next"; } @NotNull @Override public JComponent getComponent() { return new JLabel(); } @Override public Content getContent(final JComponent component) { Content[] contents = getContents(); for (Content content : contents) { if (Comparing.equal(component, content.getComponent())) { return content; } } return null; } @Override @Nullable public Content getContent(final int index) { return myContents.get(index); } @Override public int getContentCount() { return myContents.size(); } @Override @NotNull public Content[] getContents() { return myContents.toArray(new Content[myContents.size()]); } @Override public int getIndexOfContent(final Content content) { return myContents.indexOf(content); } @Override @Nullable public Content getSelectedContent() { return mySelected; } @Override @NotNull public Content[] getSelectedContents() { return mySelected != null ? new Content[]{mySelected} : new Content[0]; } @Override public boolean isSelected(@NotNull final Content content) { return content == mySelected; } @Override public void removeAllContents(final boolean dispose) { for (int i = myContents.size() - 1; i >= 0; i--) { Content content = myContents.get(i); removeContent(content, dispose); } mySelected = null; } @Override public boolean removeContent(@NotNull final Content content, final boolean dispose) { if (dispose) Disposer.dispose(content); boolean result = myContents.remove(content); if (mySelected == content) { mySelected = ContainerUtil.getFirstItem(myContents); } return result; } @NotNull @Override public ActionCallback removeContent(@NotNull Content content, boolean dispose, boolean trackFocus, boolean implicitFocus) { removeContent(content, dispose); return new ActionCallback.Done(); } @Override public void removeContentManagerListener(@NotNull final ContentManagerListener l) { } @Override public void removeFromSelection(@NotNull final Content content) { } @Override public ActionCallback selectNextContent() { return new ActionCallback.Done(); } @Override public ActionCallback selectPreviousContent() { return new ActionCallback.Done(); } @Override public void setSelectedContent(@NotNull final Content content) { mySelected = content; } @NotNull @Override public ActionCallback setSelectedContentCB(@NotNull Content content) { setSelectedContent(content); return new ActionCallback.Done(); } @Override public void setSelectedContent(@NotNull final Content content, final boolean requestFocus) { setSelectedContent(content); } @NotNull @Override public ActionCallback setSelectedContentCB(@NotNull final Content content, final boolean requestFocus) { return setSelectedContentCB(content); } @Override public void setSelectedContent(@NotNull Content content, boolean requestFocus, boolean forcedFocus) { setSelectedContent(content); } @NotNull @Override public ActionCallback setSelectedContentCB(@NotNull final Content content, final boolean requestFocus, final boolean forcedFocus) { return setSelectedContentCB(content); } @NotNull @Override public ActionCallback setSelectedContent(@NotNull Content content, boolean requestFocus, boolean forcedFocus, boolean implicit) { return setSelectedContentCB(content); } @NotNull @Override public ActionCallback requestFocus(@Nullable final Content content, final boolean forced) { return new ActionCallback.Done(); } @Override public void dispose() { removeAllContents(true); } @Override public boolean isDisposed() { return false; } @Override public boolean isSingleSelection() { return true; } @Override @NotNull public ContentFactory getFactory() { return ServiceManager.getService(ContentFactory.class); } }}