mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fix run/debug console to not eat focus on startup
This commit is contained in:
@@ -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 {
|
||||
|
||||
+13
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user