Merge remote-tracking branch

'origin/GP-2483_ghidra1_FunctionStorageEditor--SQUASHED' (Closes #4492)
This commit is contained in:
Ryan Kurtz
2022-08-23 00:28:37 -04:00
9 changed files with 39 additions and 75 deletions
@@ -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<VarnodeInfo> varnodeList = model.getVarnodes();
List<VarnodeInfo> 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();
@@ -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) {
@@ -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) {
@@ -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;
}
}
@@ -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;
}
}
@@ -199,13 +199,10 @@ class VarnodeTableModel extends AbstractGTableModel<VarnodeInfo> {
}
}
public List<VarnodeInfo> getVarnodes() {
return varnodes;
}
public void setVarnodes(List<VarnodeInfo> varnodeList) {
void storageModelChanged() {
varnodes.clear();
varnodes.addAll(varnodeList);
varnodes.addAll(storageModel.getVarnodes());
fireTableDataChanged();
}
}
@@ -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.
*/
@@ -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());
}
}
@@ -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());
}