mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 10:19:23 +02:00
GP-4466 consolidated focus handling between ComponentProvider and DockableComponent
This commit is contained in:
parent
c131adc670
commit
495dc4df66
8 changed files with 41 additions and 84 deletions
|
@ -115,6 +115,7 @@ public abstract class ComponentProvider implements HelpDescriptor, ActionContext
|
|||
private String inceptionInformation;
|
||||
|
||||
private String registeredFontId;
|
||||
private Component defaultFocusComponent;
|
||||
|
||||
private ThemeListener themeListener = this::themeChanged;
|
||||
|
||||
|
@ -225,21 +226,35 @@ public abstract class ComponentProvider implements HelpDescriptor, ActionContext
|
|||
return instanceID;
|
||||
}
|
||||
|
||||
// Default implementation
|
||||
public void requestFocus() {
|
||||
|
||||
JComponent component = getComponent();
|
||||
if (component == null) {
|
||||
return; // this shouldn't happen; this implies we have been disposed
|
||||
public final void requestFocus() {
|
||||
if (!isVisible()) {
|
||||
return;
|
||||
}
|
||||
|
||||
KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
|
||||
Component focusOwner = kfm.getFocusOwner();
|
||||
if (focusOwner != null && SwingUtilities.isDescendingFrom(focusOwner, component)) {
|
||||
dockingTool.toFront();
|
||||
if (defaultFocusComponent != null) {
|
||||
DockingWindowManager.requestFocus(defaultFocusComponent);
|
||||
return;
|
||||
}
|
||||
|
||||
component.requestFocus();
|
||||
JComponent component = getComponent();
|
||||
Container parent = component == null ? null : component.getParent();
|
||||
|
||||
if (parent == null) {
|
||||
return; // we are either disposed or not added to the tool yet
|
||||
}
|
||||
|
||||
Container focusCycleRoot = parent.getFocusCycleRootAncestor();
|
||||
FocusTraversalPolicy focusTraversalPolicy = focusCycleRoot.getFocusTraversalPolicy();
|
||||
Component componentAfter = focusTraversalPolicy.getComponentAfter(focusCycleRoot, parent);
|
||||
|
||||
// Only request focus if next component in focus traversal belongs to this provider
|
||||
if (componentAfter != null && SwingUtilities.isDescendingFrom(componentAfter, parent)) {
|
||||
DockingWindowManager.requestFocus(componentAfter);
|
||||
}
|
||||
}
|
||||
|
||||
protected void setDefaultFocusComponent(Component component) {
|
||||
this.defaultFocusComponent = component;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -20,7 +20,6 @@ import java.awt.dnd.*;
|
|||
import java.awt.event.*;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.FocusManager;
|
||||
|
||||
import docking.action.DockingActionIf;
|
||||
import ghidra.util.CascadedDropTarget;
|
||||
|
@ -46,7 +45,7 @@ public class DockableComponent extends JPanel implements ContainerListener {
|
|||
private MouseListener popupListener;
|
||||
private ComponentPlaceholder placeholder;
|
||||
private JComponent providerComp;
|
||||
private Component focusedComponent;
|
||||
private Component lastFocusedComponent;
|
||||
private DockingWindowManager winMgr;
|
||||
private ActionToGuiMapper actionMgr;
|
||||
private DropTarget dockableDropTarget;
|
||||
|
@ -142,10 +141,6 @@ public class DockableComponent extends JPanel implements ContainerListener {
|
|||
return helpLocation;
|
||||
}
|
||||
|
||||
public Component getFocusedComponent() {
|
||||
return focusedComponent;
|
||||
}
|
||||
|
||||
void showContextMenu(PopupMenuContext popupContext) {
|
||||
actionMgr.showPopupMenu(placeholder, popupContext);
|
||||
}
|
||||
|
@ -448,15 +443,16 @@ public class DockableComponent extends JPanel implements ContainerListener {
|
|||
@Override
|
||||
// we aren't focusable, so pass focus to a valid child component
|
||||
public void requestFocus() {
|
||||
focusedComponent = findFocusedComponent();
|
||||
if (focusedComponent != null) {
|
||||
DockingWindowManager.requestFocus(focusedComponent);
|
||||
if (lastFocusedComponent != null && lastFocusedComponent.isShowing()) {
|
||||
lastFocusedComponent.requestFocus();
|
||||
return;
|
||||
}
|
||||
placeholder.getProvider().requestFocus();
|
||||
}
|
||||
|
||||
void setFocusedComponent(Component newFocusedComponet) {
|
||||
// remember it so we can restore it later when necessary
|
||||
focusedComponent = newFocusedComponet;
|
||||
lastFocusedComponent = newFocusedComponet;
|
||||
}
|
||||
|
||||
private void componentSelected(Component component) {
|
||||
|
@ -467,22 +463,6 @@ public class DockableComponent extends JPanel implements ContainerListener {
|
|||
}
|
||||
}
|
||||
|
||||
// find the first available component that can take focus
|
||||
private Component findFocusedComponent() {
|
||||
if (focusedComponent != null && focusedComponent.isShowing()) {
|
||||
return focusedComponent;
|
||||
}
|
||||
|
||||
DefaultFocusManager dfm = (DefaultFocusManager) FocusManager.getCurrentManager();
|
||||
Component component = dfm.getComponentAfter(this, this);
|
||||
|
||||
// component must be a child of this DockableComponent
|
||||
if (component != null && SwingUtilities.isDescendingFrom(component, this)) {
|
||||
return component;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentAdded(ContainerEvent e) {
|
||||
initializeComponents(e.getChild());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue