fix run/debug console to not eat focus on startup

This commit is contained in:
Alexey Pegov
2009-11-10 15:04:14 +03:00
parent 44af897af7
commit 0b8b161c5e
10 changed files with 61 additions and 31 deletions
@@ -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);
}
@@ -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);
@@ -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) {
@@ -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);
}
@@ -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);
}
});
}
@@ -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<String, LayoutAttractionPolicy> policyMap, final LayoutAttractionPolicy defaultPolicy, boolean afterInitialized, final boolean activate) {
myInitialized.processOnDone(new Runnable() {
private void processAttraction(final String contentId, final Map<String, LayoutAttractionPolicy> 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);
});
}
@@ -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<Integer, TabImpl.Default> myDefaultTabs = new HashMap<Integer, TabImpl.Default>();
protected General myGeneral = new General();
private final Map<String, String> myDefaultFocus = new HashMap<String, String>();
private final Map<String, Pair<String, LayoutAttractionPolicy>> myDefaultFocus = new HashMap<String, Pair<String, LayoutAttractionPolicy>>();
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<String, LayoutAttractionPolicy> pair = myDefaultFocus.get(condition);
return pair == null ? new LayoutAttractionPolicy.FocusOnce() : pair.getSecond();
}
public static class General {
@@ -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) {
@@ -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();
@@ -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);