diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index 927a4ef55c86..7e1cb650c9e8 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -42,6 +42,7 @@ import com.intellij.ui.content.AlertIcon; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManagerAdapter; import com.intellij.ui.content.ContentManagerEvent; +import com.intellij.ui.content.tabs.PinToolwindowTabAction; import com.intellij.unscramble.ThreadDumpPanel; import com.intellij.unscramble.ThreadState; import com.intellij.xdebugger.XDebuggerBundle; @@ -333,6 +334,7 @@ public class DebuggerSessionTab extends DebuggerLogConsoleManagerBase implements group.addSeparator(); + addActionToGroup(group, PinToolwindowTabAction.ACTION_NAME); group.add(new CloseAction(executor, myRunContentDescriptor, getProject())); group.add(new ContextHelpAction(executor.getHelpId())); diff --git a/platform/icons/src/general/pin_tab.png b/platform/icons/src/general/pin_tab.png new file mode 100644 index 000000000000..ccf38390572f Binary files /dev/null and b/platform/icons/src/general/pin_tab.png differ diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java index fb9c915830bc..5c1f71f9a2c2 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java @@ -28,6 +28,7 @@ import com.intellij.openapi.util.IconLoader; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManagerAdapter; import com.intellij.ui.content.ContentManagerEvent; +import com.intellij.ui.content.tabs.PinToolwindowTabAction; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -215,6 +216,7 @@ public class RunContentBuilder implements LogConsoleManager, Disposable { actionGroup.addSeparator(); actionGroup.add(myUi.getOptions().getLayoutActions()); actionGroup.addSeparator(); + actionGroup.add(PinToolwindowTabAction.getPinAction()); actionGroup.add(new CloseAction(myExecutor, contentDescriptor, myProject)); actionGroup.add(new ContextHelpAction(myExecutor.getHelpId())); return actionGroup; diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBase.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBase.java index df66908aa2f2..fd944c0f4d41 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBase.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBase.java @@ -10,6 +10,7 @@ import com.intellij.pom.Navigatable; import com.intellij.psi.NavigatablePsiElement; import com.intellij.psi.PsiElement; import com.intellij.ui.content.Content; +import com.intellij.ui.content.tabs.PinToolwindowTabAction; import com.intellij.ui.AutoScrollToSourceHandler; import com.intellij.ui.TreeSpeedSearch; import com.intellij.ui.TreeToolTipHandler; @@ -75,6 +76,7 @@ public abstract class HierarchyBrowserBase extends SimpleToolWindowPanel impleme protected void appendActions(@NotNull DefaultActionGroup actionGroup, @Nullable String helpID) { actionGroup.add(myAutoScrollToSourceHandler.createToggleAction()); + actionGroup.add(PinToolwindowTabAction.getPinAction()); actionGroup.add(new CloseAction()); if (helpID != null) { actionGroup.add(new ContextHelpAction(helpID)); diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java index edad790f3511..d979510378ab 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java @@ -40,7 +40,7 @@ import java.util.Map; * @author Eugene Belyaev * @author Vladimir Kondratyev */ -public final class InternalDecorator extends JPanel implements TestableUi { +public final class InternalDecorator extends JPanel implements TestableUi, TypeSafeDataProvider { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.wm.impl.InternalDecorator"); private static final int DIVIDER_WIDTH = 5; @@ -268,6 +268,12 @@ public final class InternalDecorator extends JPanel implements TestableUi { } } + public void calcData(DataKey key, DataSink sink) { + if (PlatformDataKeys.TOOL_WINDOW.equals(key)) { + sink.put(PlatformDataKeys.TOOL_WINDOW, myToolWindow); + } + } + final void addInternalDecoratorListener(final InternalDecoratorListener l) { myListenerList.add(InternalDecoratorListener.class, l); } 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 419d2c98fc53..b5b331f5bb59 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 @@ -8,6 +8,7 @@ import com.intellij.openapi.wm.impl.ToolWindowImpl; import com.intellij.ui.PopupHandler; import com.intellij.ui.content.*; import com.intellij.ui.content.tabs.TabbedContentAction; +import com.intellij.ui.content.tabs.PinToolwindowTabAction; import com.intellij.ui.tabs.impl.singleRow.MoreIcon; import com.intellij.util.ui.BaseButtonBehavior; import com.intellij.util.ui.UIUtil; @@ -28,6 +29,7 @@ import java.util.HashMap; import java.util.Map; public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyChangeListener, DataProvider { + public static final String POPUP_PLACE = "ToolwindowPopup"; private ContentManager myManager; @@ -499,7 +501,7 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh contentGroup.add(new TabbedContentAction.CloseAllButThisAction(content)); contentGroup.addSeparator(); if (content.isPinnable()) { - contentGroup.add(new TabbedContentAction.MyPinTabAction(content)); + contentGroup.add(PinToolwindowTabAction.getPinAction()); contentGroup.addSeparator(); } @@ -518,7 +520,7 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh group.addAll(windowPopup); } - final ActionPopupMenu popupMenu = ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, group); + final ActionPopupMenu popupMenu = ActionManager.getInstance().createActionPopupMenu(POPUP_PLACE, group); popupMenu.getComponent().show(comp, x, y); } }); diff --git a/platform/platform-impl/src/com/intellij/ui/content/TabbedPaneContentUI.java b/platform/platform-impl/src/com/intellij/ui/content/TabbedPaneContentUI.java index d1afb0e007fd..fb13cb526919 100644 --- a/platform/platform-impl/src/com/intellij/ui/content/TabbedPaneContentUI.java +++ b/platform/platform-impl/src/com/intellij/ui/content/TabbedPaneContentUI.java @@ -8,6 +8,7 @@ import com.intellij.ui.TabbedPaneWrapper; import com.intellij.ui.TabbedPaneImpl; import com.intellij.ui.TabbedPane; import com.intellij.ui.content.tabs.TabbedContentAction; +import com.intellij.ui.content.tabs.PinToolwindowTabAction; import com.intellij.util.IJSwingUtilities; import javax.swing.*; @@ -26,6 +27,8 @@ import java.util.List; * @author Vladimir Kondratyev */ public class TabbedPaneContentUI implements ContentUI, PropertyChangeListener { + public static final String POPUP_PLACE = "TabbedPanePopup"; + private ContentManager myManager; private TabbedPaneWrapper myTabbedPaneWrapper; @@ -118,6 +121,7 @@ public class TabbedPaneContentUI implements ContentUI, PropertyChangeListener { } private class MyTabbedPane extends TabbedPaneImpl { + public MyTabbedPane(int tabPlacement) { super(tabPlacement); addMouseListener(new MyPopupHandler()); @@ -230,7 +234,7 @@ public class TabbedPaneContentUI implements ContentUI, PropertyChangeListener { group.add(new TabbedContentAction.CloseAllButThisAction(content)); } group.addSeparator(); - group.add(new TabbedContentAction.MyPinTabAction(content)); + group.add(PinToolwindowTabAction.getPinAction()); group.addSeparator(); group.add(new TabbedContentAction.MyNextTabAction(myManager)); group.add(new TabbedContentAction.MyPreviousTabAction(myManager)); @@ -241,7 +245,7 @@ public class TabbedPaneContentUI implements ContentUI, PropertyChangeListener { group.add(anAction); } } - ActionPopupMenu menu = ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, group); + ActionPopupMenu menu = ActionManager.getInstance().createActionPopupMenu(POPUP_PLACE, group); menu.getComponent().show(myTabbedPaneWrapper.getComponent(), x, y); } } diff --git a/platform/platform-impl/src/com/intellij/ui/content/tabs/PinToolwindowTabAction.java b/platform/platform-impl/src/com/intellij/ui/content/tabs/PinToolwindowTabAction.java new file mode 100644 index 000000000000..b624be955212 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ui/content/tabs/PinToolwindowTabAction.java @@ -0,0 +1,67 @@ +package com.intellij.ui.content.tabs; + +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.impl.content.ToolWindowContentUi; +import com.intellij.ui.content.Content; +import com.intellij.ui.content.ContentManager; +import com.intellij.ui.content.TabbedPaneContentUI; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +/** + * @author spleaner + */ +public class PinToolwindowTabAction extends ToggleAction { + public static final String ACTION_NAME = "PinToolwindowTab"; + + private static final Icon ICON = IconLoader.getIcon("/general/pin_tab.png"); + + public static AnAction getPinAction() { + return ActionManager.getInstance().getAction(ACTION_NAME); + } + + public PinToolwindowTabAction() { + super("Pin Tab", "Pin tool window tab", ICON); + } + + @Nullable + private static Content getContextContent(AnActionEvent event) { + final ToolWindow window = PlatformDataKeys.TOOL_WINDOW.getData(event.getDataContext()); + if (window != null) { + final ContentManager contentManager = window.getContentManager(); + if (contentManager != null) { + return contentManager.getSelectedContent(); + } + } + + return null; + } + + public boolean isSelected(AnActionEvent event) { + final Content content = getContextContent(event); + return content != null && content.isPinned(); + } + + public void setSelected(AnActionEvent event, boolean flag) { + final Content content = getContextContent(event); + if (content != null) content.setPinned(flag); + } + + public void update(AnActionEvent event) { + super.update(event); + Presentation presentation = event.getPresentation(); + final Content content = getContextContent(event); + boolean enabled = content != null && content.isPinnable(); + + if (enabled) { + presentation.setIcon( + TabbedPaneContentUI.POPUP_PLACE.equals(event.getPlace()) || ToolWindowContentUi.POPUP_PLACE.equals(event.getPlace()) ? null : ICON); + } + + presentation.setEnabled(enabled); + presentation.setVisible(enabled); + } +} diff --git a/platform/platform-impl/src/com/intellij/ui/content/tabs/TabbedContentAction.java b/platform/platform-impl/src/com/intellij/ui/content/tabs/TabbedContentAction.java index e9d6ad0d8bf7..cffdf5fc4ea0 100644 --- a/platform/platform-impl/src/com/intellij/ui/content/tabs/TabbedContentAction.java +++ b/platform/platform-impl/src/com/intellij/ui/content/tabs/TabbedContentAction.java @@ -101,33 +101,6 @@ public abstract class TabbedContentAction extends AnAction implements DumbAware } } - public static class MyPinTabAction extends ToggleAction { - private final Content myContent; - - public MyPinTabAction(Content content) { - myContent = content; - Presentation presentation = getTemplatePresentation(); - presentation.setText(UIBundle.message("tabbed.pane.pin.tab.action.name")); - presentation.setDescription(UIBundle.message("tabbed.pane.pin.tab.action.description")); - } - - public boolean isSelected(AnActionEvent event) { - return myContent != null && myContent.isPinned(); - } - - public void setSelected(AnActionEvent event, boolean flag) { - myContent.setPinned(flag); - } - - public void update(AnActionEvent event) { - super.update(event); - Presentation presentation = event.getPresentation(); - boolean enabled = myContent != null && myContent.isPinnable(); - presentation.setEnabled(enabled); - presentation.setVisible(enabled); - } - } - public static class CloseAllAction extends TabbedContentAction { public CloseAllAction(ContentManager manager) { super(manager, ActionManager.getInstance().getAction(IdeActions.ACTION_CLOSE_ALL_EDITORS), UIBundle.message("tabbed.pane.close.all.action.name")); diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml index a85ecc06f90f..5b1a9e29524e 100644 --- a/platform/platform-resources/src/idea/PlatformActions.xml +++ b/platform/platform-resources/src/idea/PlatformActions.xml @@ -92,6 +92,8 @@ + + diff --git a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java index 2476c6d8efce..7580bbe2b6f8 100644 --- a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java +++ b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java @@ -423,6 +423,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra return new AnAction[]{ canPerformReRun() ? new ReRunAction() : null, new CloseAction(), + ActionManager.getInstance().getAction("PinToolwindowTab"), createRecentFindUsagesAction(), expandAllAction, collapseAllAction, diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java index c74334b91ac7..fa5523c39b4e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java @@ -23,6 +23,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ex.WindowManagerEx; import com.intellij.ui.content.Content; +import com.intellij.ui.content.tabs.PinToolwindowTabAction; import com.intellij.xdebugger.XDebugProcess; import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.XDebuggerBundle; @@ -207,6 +208,7 @@ public class XDebugSessionTab extends DebuggerLogConsoleManagerBase { group.addSeparator(); + group.add(PinToolwindowTabAction.getPinAction()); group.add(new CloseAction(executor, myRunContentDescriptor, getProject())); group.add(new ContextHelpAction(executor.getHelpId()));