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 bc49991101..4f1e4af74c 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 @@ -17,8 +17,6 @@ package ghidra.app.plugin.core.function.editor; import java.awt.*; import java.awt.event.*; -import java.util.Arrays; -import java.util.List; import java.util.Objects; import javax.swing.*; @@ -58,7 +56,6 @@ public class StorageAddressEditorDialog extends DialogComponentProvider private VarnodeTableModel varnodeTableModel; private int size; private boolean cancelled = true; - private boolean adjustingDataType = false; private DataType previousDataType; private DataType currentDataType; @@ -132,7 +129,8 @@ public class StorageAddressEditorDialog extends DialogComponentProvider private void setDataType(DataType dt) { currentDataType = dt; size = dt.getLength(); - boolean unconstrained = (dt instanceof AbstractFloatDataType) || Undefined.isUndefined(dt); + boolean unconstrained = + (dt instanceof AbstractFloatDataType) || Undefined.isUndefined(dt); model.setRequiredSize(size, unconstrained); if (sizeLabel != null) { sizeLabel.setText(Integer.toString(size)); @@ -214,6 +212,8 @@ public class StorageAddressEditorDialog extends DialogComponentProvider @Override public void valueChanged(ListSelectionEvent e) { model.setSelectedVarnodeRows(varnodeTable.getSelectedRows()); + updateTableButtonEnablement(); + updateStatusText(); } }; varnodeTable.getSelectionModel().addListSelectionListener(selectionListener); @@ -276,12 +276,10 @@ public class StorageAddressEditorDialog extends DialogComponentProvider @Override public void dataChanged() { - updateDataType(); + varnodeTableModel.storageModelChanged(); updateCurrentSize(); updateStatusText(); updateOkButton(); - updateVarnodeTable(); - updateTableSelection(); updateTableButtonEnablement(); } @@ -291,28 +289,6 @@ public class StorageAddressEditorDialog extends DialogComponentProvider downButton.setEnabled(model.canMoveVarnodeDown()); } - private void updateTableSelection() { - int[] selectedRows = model.getSelectedVarnodeRows(); - if (!Arrays.equals(selectedRows, varnodeTable.getSelectedRows())) { - varnodeTable.clearSelection(); - for (int i : selectedRows) { - varnodeTable.addRowSelectionInterval(i, i); - } - } - } - - private void updateVarnodeTable() { - List varnodeList = model.getVarnodes(); - List tableVarnodeList = varnodeTableModel.getVarnodes(); - if (!varnodeList.equals(tableVarnodeList)) { - ListSelectionModel selectionModel = varnodeTable.getSelectionModel(); - selectionModel.removeListSelectionListener(selectionListener); - varnodeTableModel.setVarnodes(varnodeList); - selectionModel.addListSelectionListener(selectionListener); - } - - } - private void updateOkButton() { setOkEnabled(model.isValid()); } @@ -325,26 +301,6 @@ public class StorageAddressEditorDialog extends DialogComponentProvider currentSizeLabel.setText(Integer.toString(model.getCurrentSize())); } - private void updateDataType() { - - if (adjustingDataType) { - return; - } - adjustingDataType = true; - try { - int currentSize = model.getCurrentSize(); - if (currentSize > 0 && Undefined.isUndefined(variableData.getFormalDataType())) { - DataType adjustedUndefinedtype = Undefined.getUndefinedDataType(currentSize); - currentDataType = adjustedUndefinedtype; - dataTypeEditor.getEditor().setCellEditorValue(adjustedUndefinedtype); - setDataType(adjustedUndefinedtype); - } - } - finally { - adjustingDataType = false; - } - } - @Override public void tableRowsChanged() { TableCellEditor cellEditor = varnodeTable.getCellEditor(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressModel.java index 45ab0dd560..3f3cb14dfb 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressModel.java @@ -53,8 +53,8 @@ class StorageAddressModel { } void addVarnode() { - listener.tableRowsChanged(); varnodes.add(new VarnodeInfo(program, VarnodeType.Register)); + listener.tableRowsChanged(); setSelectedRow(varnodes.size() - 1); notifyDataChanged(); } @@ -142,7 +142,7 @@ class StorageAddressModel { void setSelectedVarnodeRows(int[] selectedRows) { selectedVarnodeRows = selectedRows; - notifyDataChanged(); +// notifyDataChanged(); } private void setSelectedRow(int row) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeInfo.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeInfo.java index e41b0671bc..0778cb5567 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeInfo.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeInfo.java @@ -54,6 +54,10 @@ class VarnodeInfo { public void setVarnodeType(VarnodeType type) { this.type = type; address = null; + register = null; + if (type == VarnodeType.Register) { + size = null; + } } public void setVarnode(Address address, Integer size) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeLocationCellEditor.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeLocationCellEditor.java index 03947c930c..293f5f88f4 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeLocationCellEditor.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeLocationCellEditor.java @@ -15,6 +15,7 @@ */ package ghidra.app.plugin.core.function.editor; +import java.awt.Color; import java.awt.Component; import java.awt.event.*; import java.math.BigInteger; @@ -139,7 +140,7 @@ class VarnodeLocationCellEditor extends AbstractCellEditor implements TableCellE } private Component createAddressEditor(VarnodeInfo varnode) { - addressInput = new AddressInput(); + addressInput = new AddressInput(BorderFactory.createEmptyBorder()); addressInput.setAddressFactory(program.getAddressFactory()); Address address = varnode.getAddress(); if (address != null) { @@ -167,7 +168,9 @@ class VarnodeLocationCellEditor extends AbstractCellEditor implements TableCellE stopCellEditing(); } }); - return offsetInput.getComponent(); + JComponent component = offsetInput.getComponent(); + component.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1)); + return component; } private Component createRegisterCombo(VarnodeInfo varnode) { @@ -219,14 +222,6 @@ class VarnodeLocationCellEditor extends AbstractCellEditor implements TableCellE } }); - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - combo.showPopup(); - combo.requestFocus(); - } - }); return combo; } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeSizeCellEditor.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeSizeCellEditor.java index f2da94c3ac..0d6dabeaba 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeSizeCellEditor.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeSizeCellEditor.java @@ -15,13 +15,13 @@ */ package ghidra.app.plugin.core.function.editor; +import java.awt.Color; import java.awt.Component; import java.awt.event.*; import java.math.BigInteger; import java.util.EventObject; -import javax.swing.AbstractCellEditor; -import javax.swing.JTable; +import javax.swing.*; import javax.swing.table.TableCellEditor; import docking.widgets.textfield.IntegerTextField; @@ -76,7 +76,9 @@ class VarnodeSizeCellEditor extends AbstractCellEditor implements TableCellEdito stopCellEditing(); } }); - return input.getComponent(); + JComponent component = input.getComponent(); + component.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1)); + return component; } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeTableModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeTableModel.java index cc6497b6bc..203d9f8120 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeTableModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeTableModel.java @@ -199,13 +199,10 @@ class VarnodeTableModel extends AbstractGTableModel { } } - public List getVarnodes() { - return varnodes; - } - - public void setVarnodes(List varnodeList) { + void storageModelChanged() { varnodes.clear(); - varnodes.addAll(varnodeList); + varnodes.addAll(storageModel.getVarnodes()); fireTableDataChanged(); } + } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressInput.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressInput.java index e29c78f14a..53b278a575 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressInput.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressInput.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.Comparator; import javax.swing.*; +import javax.swing.border.Border; import javax.swing.event.*; import docking.widgets.combobox.GComboBox; @@ -59,6 +60,16 @@ public class AddressInput extends JPanel { } }; + /** + * Constructor for AddressInput. + * @param border border around each subcomponent (combo/text fields). + */ + public AddressInput(Border border) { + this(); + combo.setBorder(border); + textField.setBorder(border); + } + /** * Constructor for AddressInput. */ diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/function/editor/StorageEditorModelBETest.java b/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/function/editor/StorageEditorModelBETest.java index c07dfa62bb..ccb0f0f052 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/function/editor/StorageEditorModelBETest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/function/editor/StorageEditorModelBETest.java @@ -53,9 +53,9 @@ public class StorageEditorModelBETest extends StorageEditorModelTest { createStorageModel(4, 4, false); VarnodeInfo varnode = model.getVarnodes().get(0); model.setVarnodeType(varnode, VarnodeType.Register); + model.setVarnode(varnode, register); assertEquals(4, varnode.getSize().intValue()); assertEquals(64, register.getBitLength()); - model.setVarnode(varnode, register); assertEquals(register.getAddress().getOffset() + 4, model.getVarnodes().get(0).getAddress().getOffset()); assertEquals(4, varnode.getSize().intValue()); @@ -64,11 +64,10 @@ public class StorageEditorModelBETest extends StorageEditorModelTest { createStorageModel(4, 4, true); varnode = model.getVarnodes().get(0); model.setVarnodeType(varnode, VarnodeType.Register); - assertEquals(4, varnode.getSize().intValue()); - assertEquals(64, register.getBitLength()); model.setVarnode(varnode, register); + assertEquals(8, varnode.getSize().intValue()); + assertEquals(64, register.getBitLength()); assertEquals(register.getAddress().getOffset(), model.getVarnodes().get(0).getAddress().getOffset()); - assertEquals(8, varnode.getSize().intValue()); } } diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/function/editor/StorageEditorModelTest.java b/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/function/editor/StorageEditorModelTest.java index c2582d67f1..ee4d0b1ac5 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/function/editor/StorageEditorModelTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/function/editor/StorageEditorModelTest.java @@ -282,7 +282,7 @@ public class StorageEditorModelTest extends AbstractGenericTest { assertNotNull(varnode.getAddress()); assertEquals(8, varnode.getSize().intValue()); - model.setVarnodeType(varnode, VarnodeType.Register); + model.setVarnodeType(varnode, VarnodeType.Memory); assertNull(varnode.getAddress()); assertEquals(8, varnode.getSize().intValue()); }