diff --git a/platform/lang-api/src/com/intellij/execution/ui/RunnerLayoutUi.java b/platform/lang-api/src/com/intellij/execution/ui/RunnerLayoutUi.java index 24ac710276ef..abfc45c5541c 100644 --- a/platform/lang-api/src/com/intellij/execution/ui/RunnerLayoutUi.java +++ b/platform/lang-api/src/com/intellij/execution/ui/RunnerLayoutUi.java @@ -60,6 +60,7 @@ public interface RunnerLayoutUi { Content findContent(@NotNull String contentId); ActionCallback selectAndFocus(@Nullable Content content, boolean requestFocus, final boolean forced); + ActionCallback selectAndFocus(@Nullable Content content, boolean requestFocus, final boolean forced, final boolean implicit); RunnerLayoutUi addListener(@NotNull ContentManagerListener listener, @NotNull Disposable parent); diff --git a/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutAttractionPolicy.java b/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutAttractionPolicy.java index ed622ce95b45..cb28328bbfc4 100644 --- a/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutAttractionPolicy.java +++ b/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutAttractionPolicy.java @@ -51,7 +51,7 @@ public abstract class LayoutAttractionPolicy { public void attract(final Content content, final RunnerLayoutUi ui) { if (!myWasAttracted) { myWasAttracted = true; - ui.selectAndFocus(content, myRequestFocus, true); + ui.selectAndFocus(content, myRequestFocus, true, true); } else { ui.setBouncing(content, true); } diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java index 8991ebba2615..0a522dd1d6b6 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java @@ -236,6 +236,10 @@ public class GridCellImpl implements GridCell, Disposable { updatePresentation(myTabs.findInfo(content), content); } + public boolean isMinimized(Content content) { + return myMinimizedContents.contains(content); + } + private static class ProviderWrapper extends NonOpaquePanel implements DataProvider { Content myContent; diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridImpl.java index 5fcbaf9cd669..170f6c8465b0 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridImpl.java @@ -218,6 +218,10 @@ public class GridImpl extends Wrapper implements Grid, Disposable, CellTransform } } + public boolean isMinimized(Content content) { + return getCellFor(content).isMinimized(content); + } + static class Placeholder extends Wrapper implements NullableComponent { private JComponent myContent; diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java index 7b5ff3e65b38..ffa58766cfcc 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java @@ -604,6 +604,17 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } } + public boolean canChangeSelectionTo(Content content, boolean implicit) { + if (implicit) { + GridImpl grid = getGridFor(content, false); + if (grid != null) { + return !grid.isMinimized(content); + } + } + + return true; + } + public void dispose() { } diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java index 3af8318c75d1..0c35126212dd 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java @@ -159,9 +159,13 @@ public class RunnerLayoutUiImpl implements Disposable, RunnerLayoutUi, LayoutSta } public ActionCallback selectAndFocus(@Nullable final Content content, boolean requestFocus, final boolean forced) { + return selectAndFocus(content, requestFocus, forced, false); + } + + public ActionCallback selectAndFocus(@Nullable final Content content, boolean requestFocus, final boolean forced, boolean implicit) { if (content == null) return new ActionCallback.Rejected(); - return getContentManager().setSelectedContentCB(content, requestFocus || shouldRequestFocus(), forced); + return getContentManager().setSelectedContent(content, requestFocus || shouldRequestFocus(), forced, implicit); } private boolean shouldRequestFocus() { diff --git a/platform/platform-api/src/com/intellij/ui/content/ContentManager.java b/platform/platform-api/src/com/intellij/ui/content/ContentManager.java index 99e79681f6a8..17dae5393682 100644 --- a/platform/platform-api/src/com/intellij/ui/content/ContentManager.java +++ b/platform/platform-api/src/com/intellij/ui/content/ContentManager.java @@ -44,6 +44,8 @@ public interface ContentManager extends Disposable { void setSelectedContent(@NotNull Content content, boolean requestFocus, boolean forcedFocus); ActionCallback setSelectedContentCB(@NotNull Content content, boolean requestFocus, boolean forcedFocus); + ActionCallback setSelectedContent(@NotNull Content content, boolean requestFocus, boolean forcedFocus, boolean implicit); + void addSelectedContent(@NotNull Content content); @Nullable diff --git a/platform/platform-api/src/com/intellij/ui/content/ContentUI.java b/platform/platform-api/src/com/intellij/ui/content/ContentUI.java index 925afbb2139e..e340aa7b6dce 100644 --- a/platform/platform-api/src/com/intellij/ui/content/ContentUI.java +++ b/platform/platform-api/src/com/intellij/ui/content/ContentUI.java @@ -28,4 +28,6 @@ public interface ContentUI extends Disposable { boolean canBeEmptySelection(); void beforeDispose(); + + boolean canChangeSelectionTo(Content content, boolean implicit); } 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 17200e81d3b9..e4bd6eda7ed4 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 @@ -217,6 +217,10 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { return new ActionCallback.Done(); } + public ActionCallback setSelectedContent(@NotNull Content content, boolean requestFocus, boolean forcedFocus, boolean implicit) { + return new ActionCallback.Done(); + } + public ActionCallback requestFocus(@Nullable final Content content, final boolean forced) { return new ActionCallback.Done(); } 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 52bb3be4d5c0..13b207067be2 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 @@ -236,6 +236,10 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh public void beforeDispose() { } + public boolean canChangeSelectionTo(Content content, boolean implicit) { + return true; + } + static void initMouseListeners(final JComponent c, final ToolWindowContentUi ui) { if (c.getClientProperty(ui) != null) return; 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 6e88467dad1f..68b0ae2776db 100644 --- a/platform/platform-impl/src/com/intellij/ui/content/TabbedPaneContentUI.java +++ b/platform/platform-impl/src/com/intellij/ui/content/TabbedPaneContentUI.java @@ -320,6 +320,10 @@ public class TabbedPaneContentUI implements ContentUI, PropertyChangeListener { public void beforeDispose() { } + public boolean canChangeSelectionTo(Content content, boolean implicit) { + return true; + } + public void dispose() { } } diff --git a/platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java b/platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java index bc1dd41c6607..7953ac5dfc7c 100644 --- a/platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java @@ -309,7 +309,7 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene } public void addSelectedContent(@NotNull final Content content) { - if (!checkSelectionChangeShouldBeProcessed(content)) return; + if (!checkSelectionChangeShouldBeProcessed(content, false)) return; if (getIndexOfContent(content) == -1) { throw new IllegalArgumentException("content not found: " + content); @@ -320,9 +320,14 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene } } - private boolean checkSelectionChangeShouldBeProcessed(Content content) { + private boolean checkSelectionChangeShouldBeProcessed(Content content, boolean implicit) { + if (!myUI.canChangeSelectionTo(content, implicit)) { + return false; + } + final boolean result = !isSelected(content) || myContentWithChangedComponent.contains(content); myContentWithChangedComponent.remove(content); + return result; } @@ -359,11 +364,17 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene } public ActionCallback setSelectedContentCB(@NotNull final Content content, final boolean requestFocus, final boolean forcedFocus) { + return setSelectedContent(content, requestFocus, forcedFocus, false); + } + + public ActionCallback setSelectedContent(@NotNull final Content content, final boolean requestFocus, final boolean forcedFocus, boolean implicit) { if (isSelected(content) && requestFocus) { return requestFocus(content, forcedFocus); } - if (!checkSelectionChangeShouldBeProcessed(content)) return new ActionCallback.Rejected(); + if (!checkSelectionChangeShouldBeProcessed(content, implicit)) { + return new ActionCallback.Rejected(); + } if (!myContents.contains(content)) { throw new IllegalArgumentException("Cannot find content:" + content.getDisplayName()); }