mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-221394 Focus is lost when switching project using "Recent projects"
"ABSOLUTELY-GURU" code is eliminated GitOrigin-RevId: bf26bf3a4acc6bb31c335ef8e897e27389f8417e
This commit is contained in:
committed by
intellij-monorepo-bot
parent
d60bc3d3a1
commit
5002b2152c
@@ -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);
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
-162
@@ -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);
|
||||
}
|
||||
|
||||
+1
-12
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+1
-12
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user