IDEA-221394 Focus is lost when switching project using "Recent projects"

"ABSOLUTELY-GURU" code is eliminated

GitOrigin-RevId: bf26bf3a4acc6bb31c335ef8e897e27389f8417e
This commit is contained in:
Denis Fokin
2019-09-21 10:08:08 +00:00
committed by intellij-monorepo-bot
parent d60bc3d3a1
commit 5002b2152c
14 changed files with 17 additions and 260 deletions
@@ -60,7 +60,7 @@ public abstract class DebuggerTreePanel extends UpdatableDebuggerView implements
setFocusTraversalPolicy(new IdeFocusTraversalPolicy() {
@Override
public Component getDefaultComponentImpl(Container focusCycleRoot) {
public Component getDefaultComponent(Container focusCycleRoot) {
return myTree;
}
});
@@ -998,7 +998,7 @@ public abstract class DiffRequestProcessor implements Disposable {
private class MyFocusTraversalPolicy extends IdeFocusTraversalPolicy {
@Override
public final Component getDefaultComponentImpl(final Container focusCycleRoot) {
public final Component getDefaultComponent(final Container focusCycleRoot) {
JComponent component = DiffRequestProcessor.this.getPreferredFocusedComponent();
if (component == null) return null;
return IdeFocusTraversalPolicy.getPreferredFocusedComponent(component, this);
@@ -541,7 +541,7 @@ public abstract class MergeRequestProcessor implements Disposable {
private class MyFocusTraversalPolicy extends IdeFocusTraversalPolicy {
@Override
public final Component getDefaultComponentImpl(final Container focusCycleRoot) {
public final Component getDefaultComponent(final Container focusCycleRoot) {
JComponent component = MergeRequestProcessor.this.getPreferredFocusedComponent();
if (component == null) return null;
return IdeFocusTraversalPolicy.getPreferredFocusedComponent(component, this);
@@ -557,7 +557,7 @@ public class EditorsSplitters extends IdePanePanel implements UISettingsListener
private final class MyFocusTraversalPolicy extends IdeFocusTraversalPolicy {
@Override
public final Component getDefaultComponentImpl(final Container focusCycleRoot) {
public final Component getDefaultComponent(final Container focusCycleRoot) {
if (myCurrentWindow != null) {
final EditorWithProviderComposite selectedEditor = myCurrentWindow.getSelectedEditor();
if (selectedEditor != null) {
@@ -20,7 +20,6 @@ import com.intellij.openapi.util.WindowStateService;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.wm.*;
import com.intellij.openapi.wm.ex.IdeFrameEx;
import com.intellij.openapi.wm.ex.LayoutFocusTraversalPolicyExt;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.openapi.wm.impl.IdeFrameDecorator;
import com.intellij.openapi.wm.impl.IdeGlassPaneImpl;
@@ -375,7 +374,7 @@ public class FrameWrapper implements Disposable, DataProvider {
}
MouseGestureManager.getInstance().add(this);
setFocusTraversalPolicy(new LayoutFocusTraversalPolicyExt());
setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
}
@Override
@@ -488,7 +487,7 @@ public class FrameWrapper implements Disposable, DataProvider {
getRootPane().putClientProperty("Window.style", "small");
setBackground(UIUtil.getPanelBackground());
MouseGestureManager.getInstance().add(this);
setFocusTraversalPolicy(new LayoutFocusTraversalPolicyExt());
setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
}
@Override
@@ -27,7 +27,6 @@ import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.openapi.wm.IdeFrame;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.wm.ex.LayoutFocusTraversalPolicyExt;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.openapi.wm.impl.IdeFrameDecorator;
import com.intellij.openapi.wm.impl.IdeFrameImpl;
@@ -531,9 +530,9 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer {
myDialogWrapper = new WeakReference<>(dialogWrapper);
myProject = project != null ? new WeakReference<>(project) : null;
setFocusTraversalPolicy(new LayoutFocusTraversalPolicyExt() {
setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
@Override
protected boolean accept(Component aComponent) {
public boolean accept(Component aComponent) {
if (UIUtil.isFocusProxy(aComponent)) return false;
return super.accept(aComponent);
}
@@ -11,11 +11,11 @@ import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.*;
public class IdeFocusTraversalPolicy extends LayoutFocusTraversalPolicyExt {
public class IdeFocusTraversalPolicy extends LayoutFocusTraversalPolicy {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy");
@Override
protected Component getDefaultComponentImpl(Container focusCycleRoot) {
public Component getDefaultComponent(Container focusCycleRoot) {
if (!(focusCycleRoot instanceof JComponent)) {
return super.getDefaultComponent(focusCycleRoot);
}
@@ -43,13 +43,7 @@ public class IdeFocusTraversalPolicy extends LayoutFocusTraversalPolicyExt {
return component;
}
Component defaultComponent;
if (focusTraversalPolicy instanceof LayoutFocusTraversalPolicyExt) {
final LayoutFocusTraversalPolicyExt extPolicy = (LayoutFocusTraversalPolicyExt)focusTraversalPolicy;
defaultComponent = extPolicy.queryImpl(() -> extPolicy.getDefaultComponent(component));
} else {
defaultComponent = focusTraversalPolicy.getDefaultComponent(component);
}
Component defaultComponent = focusTraversalPolicy.getDefaultComponent(component);
if (defaultComponent instanceof JComponent) {
return (JComponent)defaultComponent;
@@ -1,162 +0,0 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.openapi.wm.ex;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
/**
* @author Vladimir Kondratyev
*/
public class LayoutFocusTraversalPolicyExt extends LayoutFocusTraversalPolicy{
/**
* Overriden default component
*/
private static JComponent myOverridenDefaultComponent;
private boolean myNoDefaultComponent;
private Object myNoDefaultComponentRequestor;
private boolean myQueryImpl = false;
public void setNoDefaultComponent(boolean noDefaultComponent, Object requestor) {
if (noDefaultComponent) {
myNoDefaultComponent = noDefaultComponent;
myNoDefaultComponentRequestor = requestor;
} else {
if (myNoDefaultComponentRequestor == requestor) {
myNoDefaultComponent = false;
myNoDefaultComponentRequestor = null;
}
}
}
public boolean isNoDefaultComponent() {
if (myQueryImpl) return false;
return myNoDefaultComponent || Registry.is("actionSystem.noDefaultComponent", true);
}
@Nullable
public static LayoutFocusTraversalPolicyExt findWindowPolicy(Component c) {
Window wnd = UIUtil.getWindow(c);
final FocusTraversalPolicy policy = wnd.getFocusTraversalPolicy();
if (policy instanceof LayoutFocusTraversalPolicyExt) {
return (LayoutFocusTraversalPolicyExt)policy;
} else {
return null;
}
}
/**
* !!!!! CAUTION !!!!!
* !!!!! CAUTION !!!!!
* !!!!! CAUTION !!!!!
*
* THIS IS AN "ABSOLUTELY-GURU METHOD".
* NOBODY SHOULD ADD OTHER USAGES OF IT :)
* ONLY ANTON AND VOVA ARE PERMITTED TO USE THIS METHOD!!!
*
* !!!!! CAUTION !!!!!
* !!!!! CAUTION !!!!!
* !!!!! CAUTION !!!!!
*
* This is absolutely guru method. Please do not use it without deep understanding
* of Swing concepts, especially Swing focus management. <b>do not forget to clear
* this "overiden" component!</b>
*/
public static void setOverridenDefaultComponent(final JComponent overridenDefaultComponent) {
myOverridenDefaultComponent = overridenDefaultComponent;
}
@Override
public final Component getDefaultComponent(final Container focusCycleRoot) {
if (isNoDefaultComponent()) return null;
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getDefaultComponentImpl(focusCycleRoot);
}
protected Component getDefaultComponentImpl(final Container focusCycleRoot) {
return super.getDefaultComponent(focusCycleRoot);
}
@Override
public Component getFirstComponent(final Container focusCycleRoot) {
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getFirstComponentImpl(focusCycleRoot);
}
protected Component getFirstComponentImpl(final Container focusCycleRoot) {
return super.getFirstComponent(focusCycleRoot);
}
@Override
public Component getLastComponent(final Container focusCycleRoot) {
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getLastComponentImpl(focusCycleRoot);
}
protected Component getLastComponentImpl(final Container focusCycleRoot) {
return super.getLastComponent(focusCycleRoot);
}
@Override
public Component getComponentAfter(final Container focusCycleRoot, final Component aComponent) {
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getComponentAfterImpl(focusCycleRoot, aComponent);
}
protected Component getComponentAfterImpl(final Container focusCycleRoot, final Component aComponent) {
return super.getComponentAfter(focusCycleRoot, aComponent);
}
@Override
public Component getComponentBefore(final Container focusCycleRoot, final Component aComponent) {
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getComponentBeforeImpl(focusCycleRoot, aComponent);
}
@Override
public Component getInitialComponent(JInternalFrame frame) {
if (isNoDefaultComponent()) return null;
return super.getInitialComponent(frame);
}
@Override
public Component getInitialComponent(Window window) {
if (isNoDefaultComponent()) return null;
return super.getInitialComponent(window);
}
protected Component getComponentBeforeImpl(final Container focusCycleRoot, final Component aComponent) {
return super.getComponentBefore(focusCycleRoot, aComponent);
}
public Component queryImpl(Computable<? extends Component> runnable) {
try {
myQueryImpl = true;
return runnable.compute();
}
finally {
myQueryImpl = false;
}
}
}
@@ -22,7 +22,6 @@ import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.wm.*;
import com.intellij.openapi.wm.ex.IdeFrameEx;
import com.intellij.openapi.wm.ex.LayoutFocusTraversalPolicyExt;
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.openapi.wm.impl.status.*;
@@ -186,7 +185,7 @@ public final class ProjectFrameHelper implements IdeFrameEx, AccessibleContextAc
MnemonicHelper.init(myFrame);
myFrame.setFocusTraversalPolicy(new MyLayoutFocusTraversalPolicyExt());
myFrame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
// to show window thumbnail under Macs
// http://lists.apple.com/archives/java-dev/2009/Dec/msg00240.html
@@ -579,42 +578,4 @@ public final class ProjectFrameHelper implements IdeFrameEx, AccessibleContextAc
}
return false;
}
private final class MyLayoutFocusTraversalPolicyExt extends LayoutFocusTraversalPolicyExt {
@Override
protected Component getDefaultComponentImpl(Container focusCycleRoot) {
Component component = findNextFocusComponent();
return component == null ? super.getDefaultComponentImpl(focusCycleRoot) : component;
}
@Override
protected Component getFirstComponentImpl(Container focusCycleRoot) {
Component component = findNextFocusComponent();
return component == null ? super.getFirstComponentImpl(focusCycleRoot) : component;
}
@Override
protected Component getLastComponentImpl(Container focusCycleRoot) {
Component component = findNextFocusComponent();
return component == null ? super.getLastComponentImpl(focusCycleRoot) : component;
}
@Override
protected Component getComponentAfterImpl(Container focusCycleRoot, Component aComponent) {
Component component = findNextFocusComponent();
return component == null ? super.getComponentAfterImpl(focusCycleRoot, aComponent) : component;
}
@Override
public Component getInitialComponent(Window window) {
Component component = findNextFocusComponent();
return component == null ? super.getInitialComponent(window) : component;
}
@Override
protected Component getComponentBeforeImpl(Container focusCycleRoot, Component aComponent) {
Component component = findNextFocusComponent();
return component == null ? super.getComponentBeforeImpl(focusCycleRoot, aComponent) : component;
}
}
}
@@ -17,7 +17,6 @@ import com.intellij.openapi.util.registry.RegistryValueListener;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ToolWindowType;
import com.intellij.openapi.wm.ex.LayoutFocusTraversalPolicyExt;
import com.intellij.openapi.wm.impl.commands.FinalizableCommand;
import com.intellij.reference.SoftReference;
import com.intellij.ui.OnePixelSplitter;
@@ -145,7 +144,7 @@ public final class ToolWindowsPane extends JBLayeredPane implements UISettingsLi
add(myRightStripe, JLayeredPane.POPUP_LAYER);
add(myLayeredPane, JLayeredPane.DEFAULT_LAYER);
setFocusTraversalPolicy(new LayoutFocusTraversalPolicyExt());
setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
}
private void updateInnerMinSize(@NotNull RegistryValue value) {
@@ -12,7 +12,6 @@ import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.wm.ex.LayoutFocusTraversalPolicyExt;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.components.panels.OpaquePanel;
import org.jetbrains.annotations.NotNull;
@@ -360,14 +359,9 @@ public class LightweightHint extends UserDataHolderBase implements Hint {
if (layeredPane != null) {
Rectangle bounds = myComponent.getBounds();
try {
if (myFocusBackComponent != null) {
LayoutFocusTraversalPolicyExt.setOverridenDefaultComponent(myFocusBackComponent);
}
layeredPane.remove(myComponent);
}
finally {
LayoutFocusTraversalPolicyExt.setOverridenDefaultComponent(null);
}
finally {}
layeredPane.paintImmediately(bounds.x, bounds.y, bounds.width, bounds.height);
}
@@ -409,12 +409,7 @@ public class TabbedPaneWrapper {
private final class _MyFocusTraversalPolicy extends IdeFocusTraversalPolicy{
@Override
public boolean isNoDefaultComponent() {
return false;
}
@Override
public final Component getDefaultComponentImpl(final Container focusCycleRoot) {
public final Component getDefaultComponent(final Container focusCycleRoot) {
final JComponent component=getSelectedComponent();
return component == null ? null : IdeFocusTraversalPolicy.getPreferredFocusedComponent(component, this);
}
@@ -17,7 +17,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.wm.FocusWatcher;
import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy;
import com.intellij.openapi.wm.ex.LayoutFocusTraversalPolicyExt;
import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.core.GridLayoutManager;
import org.jetbrains.annotations.NotNull;
@@ -230,17 +229,7 @@ public class InplaceEditingLayer extends JComponent {
}
private void removeInplaceComponent() {
// [vova] before removing component from Swing tree we have to
// request component into glass layer. Otherwise focus from component being removed
// can go to some RadComponent.
LayoutFocusTraversalPolicyExt.setOverridenDefaultComponent(myDesigner.getPreferredFocusedComponent());
try {
remove(myInplaceComponent);
}
finally {
LayoutFocusTraversalPolicyExt.setOverridenDefaultComponent(null);
}
remove(myInplaceComponent);
}
/**
@@ -7,7 +7,6 @@ import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.wm.FocusWatcher;
import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy;
import com.intellij.openapi.wm.ex.LayoutFocusTraversalPolicyExt;
import com.intellij.uiDesigner.FormEditingUtil;
import com.intellij.uiDesigner.UIDesignerBundle;
import com.intellij.uiDesigner.componentTree.ComponentSelectionListener;
@@ -301,17 +300,7 @@ public final class InplaceEditingLayer extends JComponent{
}
private void removeInplaceEditorComponent() {
// [vova] before removing component from Swing tree we have to
// request component into glass layer. Otherwise focus from component being removed
// can go to some RadComponent.
LayoutFocusTraversalPolicyExt.setOverridenDefaultComponent(myEditor.getGlassLayer());
try {
remove(myInplaceEditorComponent);
}
finally {
LayoutFocusTraversalPolicyExt.setOverridenDefaultComponent(null);
}
remove(myInplaceEditorComponent);
}
/**