diff options
Diffstat (limited to 'platform/platform-api/src/com/intellij/openapi/wm/FocusCommand.java')
-rw-r--r-- | platform/platform-api/src/com/intellij/openapi/wm/FocusCommand.java | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/platform/platform-api/src/com/intellij/openapi/wm/FocusCommand.java b/platform/platform-api/src/com/intellij/openapi/wm/FocusCommand.java index 6584184a1bb2..fc9eec268ece 100644 --- a/platform/platform-api/src/com/intellij/openapi/wm/FocusCommand.java +++ b/platform/platform-api/src/com/intellij/openapi/wm/FocusCommand.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.wm; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.popup.util.PopupUtil; import com.intellij.openapi.util.ActionCallback; @@ -22,12 +23,13 @@ import com.intellij.openapi.util.ActiveRunnable; import com.intellij.openapi.util.Expirable; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; -import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; import java.util.Arrays; /** @@ -41,6 +43,8 @@ public abstract class FocusCommand extends ActiveRunnable implements Expirable { private boolean myInvalidatesPendingFurtherRequestors = true; private Expirable myExpirable; + public static final Logger LOG = Logger.getInstance("#com.intellij.openapi.wm.FocusCommand"); + public boolean isForced() { return myForced; } @@ -154,46 +158,51 @@ public abstract class FocusCommand extends ActiveRunnable implements Expirable { public static class ByComponent extends FocusCommand { private Component myToFocus; + private Throwable myAllocation; - public ByComponent(@Nullable Component toFocus) { - this(toFocus, toFocus); + public ByComponent(@Nullable Component toFocus, @NotNull Throwable allocation) { + this(toFocus, toFocus, allocation); } - public ByComponent(@Nullable Component toFocus, @Nullable Component dominationComponent) { + public ByComponent(@Nullable Component toFocus, @Nullable Component dominationComponent, @NotNull Throwable allocation) { super(toFocus, dominationComponent); + myAllocation = allocation; myToFocus = toFocus; } @NotNull public final ActionCallback run() { - if (myToFocus != null) { - if (Registry.is("actionSystem.doNotStealFocus")) { - Window topWindow = SwingUtilities.windowForComponent(myToFocus); - UIUtil.setAutoRequestFocus(topWindow, topWindow.isActive()); - while (topWindow.getOwner() != null) { - topWindow = SwingUtilities.windowForComponent(topWindow); - UIUtil.setAutoRequestFocus(topWindow, topWindow.isActive()); - } - if (topWindow.isActive()) { - if (!myToFocus.requestFocusInWindow()) { - myToFocus.requestFocus(); - } - } else { - myToFocus.requestFocusInWindow(); + boolean shouldLogFocuses = Registry.is("ide.log.focuses"); + + if (shouldLogFocuses) { + myToFocus.addFocusListener(new FocusAdapter() { + @Override + public void focusGained(FocusEvent e) { + if (isExpired()) return; + super.focusGained(e); + LOG.info("Focus gained on " + myToFocus.getClass().getName()); + myToFocus.removeFocusListener(this); } + }); + } - } else { - // This change seems reasonable to me. But as far as some implementations - // can ignore the "forced" parameter we can get bad focus behaviour. - // So let's start from mac. - if (!(myToFocus.requestFocusInWindow())) { - if (!SystemInfo.isMac || isForced() ) { - myToFocus.requestFocus(); - } + if (!(myToFocus.requestFocusInWindow())) { + if (shouldLogFocuses) { + LOG.info("We could not request focus in window on " + myToFocus.getClass().getName()); + LOG.info(myAllocation); + } + if (!SystemInfo.isMac || isForced() ) { + myToFocus.requestFocus(); + if (shouldLogFocuses) { + LOG.info("Force request focus on " + myToFocus.getClass().getName()); } } + } else if (shouldLogFocuses) { + LOG.info("We have successfully requested focus in window on " + myToFocus.getClass().getName()); + LOG.info(myAllocation); } + clear(); return new ActionCallback.Done(); } |