blob: 7b9a7494c6405409959f353f8e8814cdb8ecf7cc [file] [log] [blame]
/*
* 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<String, ToolWindow> myToolWindows = new HashMap<String, ToolWindow>();
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;
}
@NotNull
@Override
public ToolWindow registerToolWindow(@NotNull String id,
@NotNull JComponent component,
@NotNull ToolWindowAnchor anchor,
Disposable parentDisposable,
boolean canWorkInDumbMode) {
return doRegisterToolWindow(id, parentDisposable);
}
@NotNull
@Override
public ToolWindow registerToolWindow(@NotNull String id, @NotNull JComponent component, @NotNull ToolWindowAnchor anchor) {
return doRegisterToolWindow(id, null);
}
@NotNull
@Override
public ToolWindow registerToolWindow(@NotNull String id,
@NotNull JComponent component,
@NotNull ToolWindowAnchor anchor,
Disposable parentDisposable,
boolean canWorkInDumbMode,
boolean canCloseContents) {
return doRegisterToolWindow(id, parentDisposable);
}
@NotNull
@Override
public ToolWindow registerToolWindow(@NotNull String id,
@NotNull JComponent component,
@NotNull ToolWindowAnchor anchor,
@NotNull Disposable parentDisposable) {
return doRegisterToolWindow(id, parentDisposable);
}
@NotNull
@Override
public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor) {
return doRegisterToolWindow(id, null);
}
@NotNull
@Override
public ToolWindow registerToolWindow(@NotNull final String id,
final boolean canCloseContent,
@NotNull final ToolWindowAnchor anchor,
final boolean secondary) {
return doRegisterToolWindow(id, null);
}
@NotNull
@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;
}
@NotNull
@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(@NotNull Runnable runnable) {
}
@NotNull
@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(@NotNull 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<JComponent> 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<String> getIdsOn(@NotNull final ToolWindowAnchor anchor) {
return new ArrayList<String>();
}
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<Content> myContents = new ArrayList<Content>();
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<AnAction> 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);
}
}}