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 @@
+
+