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 23fed950326e..3fc61b33e3a2 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -41,6 +41,7 @@ import com.intellij.execution.runners.ProgramRunner; import com.intellij.execution.runners.RestartAction; import com.intellij.execution.ui.*; import com.intellij.execution.ui.actions.CloseAction; +import com.intellij.execution.ui.layout.LayoutAttractionPolicy; import com.intellij.execution.ui.layout.LayoutViewOptions; import com.intellij.execution.ui.layout.PlaceInGrid; import com.intellij.ide.CommonActionsManager; @@ -107,7 +108,7 @@ public class DebuggerSessionTab extends DebuggerLogConsoleManagerBase implements myUi.getDefaults().initTabDefaults(0, "Debugger", null). initFocusContent(DebuggerContentInfo.FRAME_CONTENT, BREAKPOINT_CONDITION). - initFocusContent(DebuggerContentInfo.CONSOLE_CONTENT, LayoutViewOptions.STARTUP); + initFocusContent(DebuggerContentInfo.CONSOLE_CONTENT, LayoutViewOptions.STARTUP, new LayoutAttractionPolicy.FocusOnce(false)); final DefaultActionGroup focus = new DefaultActionGroup(); focus.add(ActionManager.getInstance().getAction("Debugger.FocusOnBreakpoint")); @@ -505,7 +506,7 @@ public class DebuggerSessionTab extends DebuggerLogConsoleManagerBase implements } public void showFramePanel() { - myUi.selectAndFocus(myUi.findContent(DebuggerContentInfo.FRAME_CONTENT), false); + myUi.selectAndFocus(myUi.findContent(DebuggerContentInfo.FRAME_CONTENT), true, false); } private int myThreadDumpsCount = 0; @@ -543,7 +544,7 @@ public class DebuggerSessionTab extends DebuggerLogConsoleManagerBase implements myUi.removeContent(content, true); } }); - myUi.selectAndFocus(content, false); + myUi.selectAndFocus(content, true, false); if (threads.size() > 0) { panel.selectStackFrame(0); } 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 701abee4b933..24ac710276ef 100644 --- a/platform/lang-api/src/com/intellij/execution/ui/RunnerLayoutUi.java +++ b/platform/lang-api/src/com/intellij/execution/ui/RunnerLayoutUi.java @@ -59,7 +59,7 @@ public interface RunnerLayoutUi { @Nullable Content findContent(@NotNull String contentId); - ActionCallback selectAndFocus(@Nullable Content content, final boolean forced); + ActionCallback selectAndFocus(@Nullable Content content, boolean requestFocus, final boolean forced); 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 15a98d2a5313..ed622ce95b45 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 @@ -38,11 +38,20 @@ public abstract class LayoutAttractionPolicy { public static class FocusOnce extends LayoutAttractionPolicy { private boolean myWasAttracted; + private boolean myRequestFocus; + + public FocusOnce() { + this(true); + } + + public FocusOnce(final boolean requestFocus) { + myRequestFocus = requestFocus; + } public void attract(final Content content, final RunnerLayoutUi ui) { if (!myWasAttracted) { myWasAttracted = true; - ui.selectAndFocus(content, true); + ui.selectAndFocus(content, myRequestFocus, true); } else { ui.setBouncing(content, true); } @@ -55,7 +64,7 @@ public abstract class LayoutAttractionPolicy { public static class FocusAlways extends LayoutAttractionPolicy { public void attract(final Content content, final RunnerLayoutUi ui) { - ui.selectAndFocus(content, true); + ui.selectAndFocus(content, true, true); } public void clearAttraction(final Content content, final RunnerLayoutUi ui) { diff --git a/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutStateDefaults.java b/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutStateDefaults.java index a84fe2576df5..b19d6a93b46a 100644 --- a/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutStateDefaults.java +++ b/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutStateDefaults.java @@ -27,4 +27,6 @@ public interface LayoutStateDefaults { LayoutStateDefaults initFocusContent(@NotNull String id, final String condition); + LayoutStateDefaults initFocusContent(@NotNull String id, final String condition, @NotNull final LayoutAttractionPolicy policy); + } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java index a435690c927c..2b4305c5aac2 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java @@ -302,7 +302,7 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { final ToolWindow toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(executor.getToolWindowId()); - toolWindow.activate(null); + toolWindow.show(null); } }); } 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 4aa422e4e010..ad66e54f6c09 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 @@ -779,28 +779,33 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } public void attractByCondition(String condition, boolean afterInitialized) { - processAttraction(myLayoutSettings.getToFocus(condition), myConditionAttractions, new LayoutAttractionPolicy.FocusOnce(), afterInitialized, true); + processAttraction(myLayoutSettings.getToFocus(condition), myConditionAttractions, myLayoutSettings.getAttractionPolicy(condition), afterInitialized, true); } public void clearAttractionByCondition(String condition, boolean afterInitialized) { processAttraction(myLayoutSettings.getToFocus(condition), myConditionAttractions, new LayoutAttractionPolicy.FocusOnce(), afterInitialized, false); } - private void processAttraction(final String contentId, final Map policyMap, final LayoutAttractionPolicy defaultPolicy, boolean afterInitialized, final boolean activate) { - myInitialized.processOnDone(new Runnable() { + private void processAttraction(final String contentId, final Map policyMap, final LayoutAttractionPolicy defaultPolicy, final boolean afterInitialized, final boolean activate) { + IdeFocusManager.getInstance(getProject()).doWhenFocusSettlesDown(new Runnable() { public void run() { - Content content = findContent(contentId); - if (content == null) return; + myInitialized.processOnDone(new Runnable() { + public void run() { + Content content = findContent(contentId); + if (content == null) return; - final LayoutAttractionPolicy policy = getOrCreatePolicyFor(contentId, policyMap, defaultPolicy); - if (activate) { - myAttractionCount++; - policy.attract(content, myRunnerUi); - } else { - policy.clearAttraction(content, myRunnerUi); - } + final LayoutAttractionPolicy policy = getOrCreatePolicyFor(contentId, policyMap, defaultPolicy); + if (activate) { + myAttractionCount++; + policy.attract(content, myRunnerUi); + } + else { + policy.clearAttraction(content, myRunnerUi); + } + } + }, afterInitialized); } - }, afterInitialized); + }); } diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayout.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayout.java index 74deabeea5c8..4b380e44b70d 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayout.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayout.java @@ -16,8 +16,10 @@ package com.intellij.execution.ui.layout.impl; +import com.intellij.execution.ui.layout.LayoutAttractionPolicy; import com.intellij.execution.ui.layout.PlaceInGrid; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.content.Content; import com.intellij.util.xmlb.XmlSerializer; @@ -44,7 +46,7 @@ public class RunnerLayout { private final Map myDefaultTabs = new HashMap(); protected General myGeneral = new General(); - private final Map myDefaultFocus = new HashMap(); + private final Map> myDefaultFocus = new HashMap>(); public RunnerLayout(final String ID) { @@ -237,13 +239,18 @@ public class RunnerLayout { myGeneral.focusOnCondition.put(condition, id); } - public void setDefaultToFocus(String id, final String condition) { - myDefaultFocus.put(condition, id); + public void setDefaultToFocus(String id, final String condition, @NotNull final LayoutAttractionPolicy policy) { + myDefaultFocus.put(condition, Pair.create(id, policy)); } @Nullable public String getToFocus(final String condition) { - return myGeneral.focusOnCondition.containsKey(condition) ? myGeneral.focusOnCondition.get(condition) : myDefaultFocus.get(condition); + return myGeneral.focusOnCondition.containsKey(condition) ? myGeneral.focusOnCondition.get(condition) : (myDefaultFocus.containsKey(condition) ? myDefaultFocus.get(condition).getFirst() : null); + } + + public LayoutAttractionPolicy getAttractionPolicy(final String condition) { + final Pair pair = myDefaultFocus.get(condition); + return pair == null ? new LayoutAttractionPolicy.FocusOnce() : pair.getSecond(); } public static class General { 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 a1102b0f17b9..1d7247387b57 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 @@ -31,6 +31,7 @@ import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; import com.intellij.openapi.wm.IdeFocusManager; +import com.intellij.ui.FocusTrackback; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; import com.intellij.ui.content.ContentManager; @@ -81,7 +82,11 @@ public class RunnerLayoutUiImpl implements Disposable, RunnerLayoutUi, LayoutSta } public LayoutStateDefaults initFocusContent(@NotNull final String id, @NotNull final String condition) { - getLayout().setDefaultToFocus(id, condition); + return initFocusContent(id, condition, new LayoutAttractionPolicy.FocusOnce()); + } + + public LayoutStateDefaults initFocusContent(@NotNull final String id, @NotNull final String condition, @NotNull final LayoutAttractionPolicy policy) { + getLayout().setDefaultToFocus(id, condition, policy); return this; } @@ -158,10 +163,15 @@ public class RunnerLayoutUiImpl implements Disposable, RunnerLayoutUi, LayoutSta return myViewsContentManager; } - public ActionCallback selectAndFocus(@Nullable final Content content, final boolean forced) { + public ActionCallback selectAndFocus(@Nullable final Content content, boolean requestFocus, final boolean forced) { if (content == null) return new ActionCallback.Rejected(); - return getContentManager().setSelectedContentCB(content, true, forced); + return getContentManager().setSelectedContentCB(content, requestFocus || shouldRequestFocus(), forced); + } + + private boolean shouldRequestFocus() { + final Component focused = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); + return focused != null && SwingUtilities.isDescendingFrom(focused, getContentManager().getComponent()); } public boolean removeContent(final Content content, final boolean dispose) { diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index d2541f8421e1..5121ae474673 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -965,9 +965,6 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application public void saveSettings() { if (myDoNotSave || isUnitTestMode() || isHeadlessEnvironment()) return; - - System.out.println("Saving application settings"); - if (mySaveSettingsIsInProgress.compareAndSet(false, true)) { try { doSave(); diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java index 455f24119275..b547da1eec87 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java @@ -885,7 +885,6 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt try { if (save) { FileDocumentManager.getInstance().saveAllDocuments(); - System.out.println("Saving project: " + project.getName()); project.save(); } fireProjectClosing(project);