From 1b05fc9c8570389d96c9fb79f6e775ea57ddb585 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Mon, 2 Nov 2009 13:40:33 +0300 Subject: [PATCH] tool window combo - show content action --- .../com/intellij/openapi/wm/ToolWindow.java | 3 + .../ide/actions/ShowContentAction.java | 64 +++++++++++++++++++ .../impl/ToolWindowHeadlessManagerImpl.java | 4 ++ .../openapi/wm/impl/ToolWindowImpl.java | 5 +- .../wm/impl/content/ComboContentLayout.java | 7 ++ .../wm/impl/content/ContentComboLabel.java | 37 +---------- .../wm/impl/content/ContentLayout.java | 3 +- .../wm/impl/content/TabContentLayout.java | 12 ++++ .../wm/impl/content/ToolWindowContentUi.java | 42 ++++++++++++ .../src/messages/ActionsBundle.properties | 2 + .../src/idea/DefaultKeymap.xml | 6 ++ .../src/idea/PlatformActions.xml | 1 + 12 files changed, 148 insertions(+), 38 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/ide/actions/ShowContentAction.java diff --git a/platform/platform-api/src/com/intellij/openapi/wm/ToolWindow.java b/platform/platform-api/src/com/intellij/openapi/wm/ToolWindow.java index 4b61db4defaf..0900fbf65dd5 100644 --- a/platform/platform-api/src/com/intellij/openapi/wm/ToolWindow.java +++ b/platform/platform-api/src/com/intellij/openapi/wm/ToolWindow.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.*; +import java.awt.event.InputEvent; public interface ToolWindow { @@ -159,6 +160,8 @@ public interface ToolWindow { boolean isDisposed(); + void showContentPopup(InputEvent inputEvent); + class Border extends EmptyBorder { public Border() { this(true, true, true, true); diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ShowContentAction.java b/platform/platform-impl/src/com/intellij/ide/actions/ShowContentAction.java new file mode 100644 index 000000000000..b0e2f27dcc57 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ide/actions/ShowContentAction.java @@ -0,0 +1,64 @@ +/* + * Copyright 2000-2009 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. + */ +package com.intellij.ide.actions; + +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DataConstants; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.ShadowAction; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ToolWindowManager; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +public class ShowContentAction extends AnAction { + private ToolWindow myWindow; + + public ShowContentAction() { + } + + public ShowContentAction(ToolWindow window, JComponent c) { + myWindow = window; + AnAction original = ActionManager.getInstance().getAction("ShowContent"); + new ShadowAction(this, original, c); + copyFrom(original); + } + + @Override + public void update(AnActionEvent e) { + e.getPresentation().setEnabled(getWindow(e) != null); + } + + @Override + public void actionPerformed(AnActionEvent e) { + getWindow(e).showContentPopup(e.getInputEvent()); + } + + @Nullable + private ToolWindow getWindow(AnActionEvent event) { + if (myWindow != null) return myWindow; + + Project project = (Project)event.getDataContext().getData(DataConstants.PROJECT); + if (project == null) return null; + + ToolWindowManager manager = ToolWindowManager.getInstance(project); + + return manager.getToolWindow(manager.getActiveToolWindowId()); + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeadlessManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeadlessManagerImpl.java index a60ec7fc4976..40044627814f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeadlessManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeadlessManagerImpl.java @@ -45,6 +45,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.HyperlinkListener; import java.awt.*; +import java.awt.event.InputEvent; import java.util.Collections; import java.util.List; import java.util.ArrayList; @@ -161,6 +162,9 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { public void activate(@Nullable Runnable runnable, boolean autoFocusContents, boolean forced) { } + + public void showContentPopup(InputEvent inputEvent) { + } }; @NonNls private static final ContentManager MOCK_CONTENT_MANAGER = new ContentManager() { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java index 1fa5dfd73b3d..6413a29e11f2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java @@ -34,6 +34,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; +import java.awt.event.InputEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; @@ -364,5 +365,7 @@ public final class ToolWindowImpl implements ToolWindowEx { } } - + public void showContentPopup(InputEvent inputEvent) { + myContentUI.showContentPopup(inputEvent); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ComboContentLayout.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ComboContentLayout.java index 96f89868623a..e36231e0c7f9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ComboContentLayout.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ComboContentLayout.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.wm.impl.content; +import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.wm.impl.TitlePanel; import com.intellij.ui.content.ContentManagerEvent; @@ -154,4 +155,10 @@ class ComboContentLayout extends ContentLayout { @Override public void contentRemoved(ContentManagerEvent event) { } + + @Override + public void showContentPopup(ListPopup listPopup) { + listPopup.setMinimumSize(new Dimension(myComboLabel.getPreferredSize().width, 0)); + listPopup.showUnderneathOf(myComboLabel); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentComboLabel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentComboLabel.java index 1d4f8cab7dbd..901c6b3b717f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentComboLabel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentComboLabel.java @@ -58,45 +58,10 @@ public class ContentComboLabel extends BaseLabel { super.processMouseEvent(e); if (UIUtil.isActionClick(e)) { - showPopup(); + myUi.showContentPopup(e); } } - private void showPopup() { - if (!isToDrawCombo()) return; - - final ContentManager manager = myUi.myManager; - BaseListPopupStep step = new BaseListPopupStep(null, manager.getContents()) { - @Override - public PopupStep onChosen(Content selectedValue, boolean finalChoice) { - manager.setSelectedContent(selectedValue); - return FINAL_CHOICE; - } - - @NotNull - @Override - public String getTextFor(Content value) { - return value.getDisplayName(); - } - - @Override - public Icon getIconFor(Content aValue) { - return aValue.getIcon(); - } - - @Override - public boolean isMnemonicsNavigationEnabled() { - return true; - } - }; - - step.setDefaultOptionIndex(Arrays.asList(manager.getContents()).indexOf(manager.getSelectedContent())); - - ListPopup popup = JBPopupFactory.getInstance().createListPopup(step); - popup.setMinimumSize(new Dimension(getPreferredSize().width, 0)); - popup.showUnderneathOf(this); - } - void update() { if (isToDrawCombo()) { setBorder(new EmptyBorder(0, 8, 0, 8)); diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentLayout.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentLayout.java index 839a5d1207c3..119a3d34abf8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentLayout.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentLayout.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.wm.impl.content; +import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.ui.content.ContentManagerEvent; import javax.swing.border.EmptyBorder; @@ -90,5 +91,5 @@ abstract class ContentLayout { g2d.fill(shape); } - + public abstract void showContentPopup(ListPopup listPopup); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/TabContentLayout.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/TabContentLayout.java index a2416aa43131..4ea6f2906d8e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/TabContentLayout.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/TabContentLayout.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.wm.impl.content; +import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.wm.impl.TitlePanel; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManager; @@ -388,4 +389,15 @@ class TabContentLayout extends ContentLayout { myContent2Tabs.remove(event.getContent()); } } + + @Override + public void showContentPopup(ListPopup listPopup) { + Content selected = myUi.myManager.getSelectedContent(); + if (selected != null) { + ContentTabLabel tab = myContent2Tabs.get(selected); + listPopup.showUnderneathOf(tab); + } else { + listPopup.showUnderneathOf(myIdLabel); + } + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java index 771bdea343b2..748d1cf29ace 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java @@ -16,7 +16,11 @@ package com.intellij.openapi.wm.impl.content; import com.intellij.ide.IdeEventQueue; +import com.intellij.ide.actions.ShowContentAction; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.PopupStep; +import com.intellij.openapi.ui.popup.util.BaseListPopupStep; import com.intellij.openapi.wm.IdeFrame; import com.intellij.openapi.wm.ToolWindowContentUiType; import com.intellij.openapi.wm.impl.ToolWindowImpl; @@ -32,11 +36,13 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.*; +import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.Arrays; public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyChangeListener, DataProvider { public static final String POPUP_PLACE = "ToolwindowPopup"; @@ -51,6 +57,8 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh TabbedContentAction.MyNextTabAction myNextTabAction; TabbedContentAction.MyPreviousTabAction myPreviousTabAction; + ShowContentAction myShowContent; + ContentLayout myTabsLayout = new TabContentLayout(this); ContentLayout myComboLayout = new ComboContentLayout(this); @@ -62,6 +70,8 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh myContent.setFocusable(false); setOpaque(false); + myShowContent = new ShowContentAction(myWindow, myContent); + setBorder(new EmptyBorder(0, 0, 0, 2)); } @@ -269,6 +279,8 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh if (c instanceof BaseLabel) { final Content content = ((BaseLabel)c).getContent(); if (content != null) { + contentGroup.add(ui.myShowContent); + contentGroup.addSeparator(); contentGroup.add(new TabbedContentAction.CloseAction(content)); contentGroup.add(ui.myCloseAllAction); contentGroup.add(new TabbedContentAction.CloseAllButThisAction(content)); @@ -345,4 +357,34 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh boolean isCurrent(ContentLayout layout) { return getCurrentLayout() == layout; } + + public void showContentPopup(InputEvent inputEvent) { + BaseListPopupStep step = new BaseListPopupStep(null, myManager.getContents()) { + @Override + public PopupStep onChosen(Content selectedValue, boolean finalChoice) { + myManager.setSelectedContent(selectedValue, true, true); + return FINAL_CHOICE; + } + + @NotNull + @Override + public String getTextFor(Content value) { + return value.getDisplayName(); + } + + @Override + public Icon getIconFor(Content aValue) { + return aValue.getIcon(); + } + + @Override + public boolean isMnemonicsNavigationEnabled() { + return true; + } + }; + + step.setDefaultOptionIndex(Arrays.asList(myManager.getContents()).indexOf(myManager.getSelectedContent())); + getCurrentLayout().showContentPopup(JBPopupFactory.getInstance().createListPopup(step)); + + } } diff --git a/platform/platform-resources-en/src/messages/ActionsBundle.properties b/platform/platform-resources-en/src/messages/ActionsBundle.properties index 295c49f4b222..6a7fb6c9eb57 100644 --- a/platform/platform-resources-en/src/messages/ActionsBundle.properties +++ b/platform/platform-resources-en/src/messages/ActionsBundle.properties @@ -695,6 +695,8 @@ action.ToggleSideMode.text=Split Mode action.ToggleSideMode.description=Tool windows split mode on/off action.ToggleContentUiTypeMode.text=Tabbed Content action.ToggleContentUiTypeMode.description=Toggle between tabbed/combo presentation of contents +action.ShowContent.text=Show Content +action.ShowContent.description=Show tool window content popup action.NextTab.text=Select Ne_xt Tab action.NextTab.description=Activate next tab action.PreviousTab.text=Se_lect Previous Tab diff --git a/platform/platform-resources/src/idea/DefaultKeymap.xml b/platform/platform-resources/src/idea/DefaultKeymap.xml index 2b600493a36e..56b27de65b5d 100644 --- a/platform/platform-resources/src/idea/DefaultKeymap.xml +++ b/platform/platform-resources/src/idea/DefaultKeymap.xml @@ -518,6 +518,9 @@ + + + @@ -975,6 +978,9 @@ + + + diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml index a8871dd74b18..987f253d476c 100644 --- a/platform/platform-resources/src/idea/PlatformActions.xml +++ b/platform/platform-resources/src/idea/PlatformActions.xml @@ -227,6 +227,7 @@ +