mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-25 06:45:58 +08:00
Merge remote-tracking branch
'origin/GP-2483_ghidra1_FunctionStorageEditor--SQUASHED' (Closes #4492)
This commit is contained in:
+5
-49
@@ -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();
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
+4
@@ -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) {
|
||||
|
||||
+5
-10
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+5
-3
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+3
-6
@@ -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.
|
||||
*/
|
||||
|
||||
+3
-4
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user