From 08b990412e4fde98d92525b63f07d9a91e32346f Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Thu, 5 Jun 2025 20:44:50 -0400 Subject: [PATCH] GP-5740 - Data Types - Fixed composite editor showing 2 data type chooser dialogs; fixed Escape not working in the chooser dialog --- .../compositeeditor/BitFieldEditorPanel.java | 2 -- .../compositeeditor/CompositeEditorPanel.java | 16 ------------- .../core/datamgr/DataTypeManagerPlugin.java | 1 - .../editor/ParameterDataTypeCellEditor.java | 24 ++----------------- .../editor/StorageAddressEditorDialog.java | 14 ++--------- .../KeyBindingOverrideKeyEventDispatcher.java | 18 +++++++++++++- .../docking/widgets/DropDownTextField.java | 2 ++ 7 files changed, 23 insertions(+), 54 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldEditorPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldEditorPanel.java index 69c014d2ee..160e72f102 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldEditorPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldEditorPanel.java @@ -306,8 +306,6 @@ public class BitFieldEditorPanel extends JPanel { } }); - dtChoiceEditor.getBrowseButton().setFocusable(false); - JComponent editorComponent = dtChoiceEditor.getEditorComponent(); Dimension preferredSize = editorComponent.getPreferredSize(); editorComponent.setPreferredSize(new Dimension(200, preferredSize.height)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java index 2abce33b4a..51d5920b1c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java @@ -43,7 +43,6 @@ import docking.widgets.label.GLabel; import docking.widgets.table.*; import docking.widgets.textfield.GValidatedTextField; import generic.theme.GColor; -import ghidra.app.services.DataTypeManagerService; import ghidra.app.util.datatype.DataTypeSelectionEditor; import ghidra.app.util.datatype.NavigationDirection; import ghidra.framework.plugintool.Plugin; @@ -1204,9 +1203,6 @@ public abstract class CompositeEditorPanel Swing.runLater(() -> stopEdit(tool))); - textField.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { @@ -1217,18 +1213,6 @@ public abstract class CompositeEditorPanel Swing.runLater(() -> { - DataType dataType = service.getDataType((String) null); - if (dataType != null) { - editor.setCellEditorValue(dataType); - editor.stopCellEditing(); - } - else { - editor.cancelCellEditing(); - } - })); - textField.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { @@ -116,14 +104,6 @@ class ParameterDataTypeCellEditor extends AbstractCellEditor return textField; } - /** - * @return chooser button '...' associated with the generated component. Null will - * be returned if getTableCellEditorComponent method has not yet been invoked. - */ - public JButton getChooserButton() { - return editor.getBrowseButton(); - } - @Override public Object getCellEditorValue() { return dt; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java index 53a6fbe898..dcc3ce251f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java @@ -192,20 +192,10 @@ public class StorageAddressEditorDialog extends DialogComponentProvider } }); - final Component dataTypeEditComponent = dataTypeEditor.getTableCellEditorComponent(null, + Component dataTypeEditComponent = dataTypeEditor.getTableCellEditorComponent(null, variableData.getFormalDataType(), false, 0, 0); - final DropDownSelectionTextField textField = dataTypeEditor.getTextField(); - textField.setBorder((new JTextField()).getBorder()); // restore default border - textField.getAccessibleContext().setAccessibleName("Data Type Editor"); - - JButton chooserButton = dataTypeEditor.getChooserButton(); - chooserButton.getAccessibleContext().setAccessibleName("Choose"); - JButton defaultButton = new JButton(); // restore default border/background - defaultButton.getAccessibleContext().setAccessibleName("Default"); - chooserButton.setBorder(defaultButton.getBorder()); - chooserButton.setBackground(defaultButton.getBackground()); - + DropDownSelectionTextField textField = dataTypeEditor.getTextField(); textField.addFocusListener(new FocusListener() { @Override diff --git a/Ghidra/Framework/Docking/src/main/java/docking/KeyBindingOverrideKeyEventDispatcher.java b/Ghidra/Framework/Docking/src/main/java/docking/KeyBindingOverrideKeyEventDispatcher.java index bcd2819614..83c4f2d614 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/KeyBindingOverrideKeyEventDispatcher.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/KeyBindingOverrideKeyEventDispatcher.java @@ -400,7 +400,23 @@ public class KeyBindingOverrideKeyEventDispatcher implements KeyEventDispatcher JComponent jComponent = (JComponent) focusOwner; Action action = getJavaActionForComponent(jComponent, keyStroke); - return action != null && action.isEnabled(); + if (action == null) { + return false; + } + + /* + Some Java actions use the accept() method for more fine-grained enablement checking. An + example of this is the JTree 'cancel' action, bound to Escape, which will cancel any + current edits. The tree UI is smart enough to say the action is only enabled if there + is an active edit. The accept() method may return false when isEnabled() will return + true. So, check the accept() method first, since it may be more specific. + */ + boolean isEnabled = action.accept(focusOwner); + if (!isEnabled) { + return false; + } + + return action.isEnabled(); } private Action getJavaActionForComponent(JComponent jComponent, KeyStroke keyStroke) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java index 3f9e98234b..af22255b89 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java @@ -149,6 +149,8 @@ public class DropDownTextField extends JTextField implements GComponent { setPreviewPaneAttributes(); initDataList(); + + getAccessibleContext().setAccessibleName("Data Type Editor"); } protected ListSelectionModel createListSelectionModel() {