summaryrefslogtreecommitdiff
path: root/platform/platform-api/src/com/intellij/openapi/wm/FocusCommand.java
diff options
context:
space:
mode:
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.java61
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();
}