diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java index 92e6623f2a..ab9f52d06a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java @@ -309,7 +309,7 @@ class StructureEditorModel extends CompEditorModel { private int[] convertRowsToOrdinals(int[] rows) { int[] ordinals = new int[rows.length]; - DataTypeComponent[] definedComponents = ((Structure) viewComposite).getDefinedComponents(); + DataTypeComponent[] definedComponents = viewComposite.getDefinedComponents(); for (int i = rows.length - 1; i >= 0; i--) { ordinals[i] = definedComponents[rows[i]].getOrdinal(); } @@ -328,7 +328,7 @@ class StructureEditorModel extends CompEditorModel { if (isShowingUndefinedBytes()) { return rowIndex; } - DataTypeComponent[] definedComponents = ((Structure) viewComposite).getDefinedComponents(); + DataTypeComponent[] definedComponents = viewComposite.getDefinedComponents(); return definedComponents[rowIndex].getOrdinal(); } @@ -737,16 +737,16 @@ class StructureEditorModel extends CompEditorModel { catch (InvalidDataTypeException e) { return false; } - + if (isPackingEnabled() || isAtEnd(rowIndex)) { return true; } - + int undefSize = getNumUndefinedBytesAfter(dtc); if (undefSize < 0) { return true; } - + int numAvailable = dtc.getLength() + undefSize; return dataType.getLength() <= numAvailable; } @@ -806,7 +806,7 @@ class StructureEditorModel extends CompEditorModel { if (isPackingEnabled() || isAtEnd(currentIndex)) { return Integer.MAX_VALUE; } - + // Can only replace with what fits unless at last component or empty last line. DataTypeComponent comp = getComponent(currentIndex); int numComponents = getNumComponents(); @@ -820,9 +820,9 @@ class StructureEditorModel extends CompEditorModel { // Otherwise, get size of component and number of Undefined bytes after it. FieldRange currentRange = getSelectedRangeContaining(currentIndex); boolean isOneComponent = - (currentRange == null) || (currentRange.getStart().getIndex().intValue() + - 1 == currentRange.getEnd().getIndex().intValue()); - + (currentRange == null) || (currentRange.getStart().getIndex().intValue() + + 1 == currentRange.getEnd().getIndex().intValue()); + if (isOneComponent) { return comp.getLength() + getNumUndefinedBytesAfter(comp); } @@ -860,7 +860,7 @@ class StructureEditorModel extends CompEditorModel { return viewDTM.withTransaction("Insert Component", () -> { DataTypeComponent dtc; if (isPackingEnabled() || !(dataType instanceof BitFieldDataType)) { - dtc = ((Structure) viewComposite).insert(rowIndex, dataType, length, name, + dtc = viewComposite.insert(rowIndex, dataType, length, name, comment); } else { @@ -957,7 +957,8 @@ class StructureEditorModel extends CompEditorModel { struct.growStructure(length - avail); } } - return ((Structure) viewComposite).replace(componentOrdinal, dataType, length, name, comment); + return ((Structure) viewComposite).replace(componentOrdinal, dataType, length, + name, comment); }); } return dtc; @@ -1266,8 +1267,9 @@ class StructureEditorModel extends CompEditorModel { dialog.setStatusText("The name cannot match the external structure name."); return false; } - DataTypeManager originalDTM = getOriginalDataTypeManager(); - DataType conflictingDt = originalDTM.getDataType(getOriginalCategoryPath(), name); + + DataTypeManager originalDtm = getOriginalDataTypeManager(); + DataType conflictingDt = originalDtm.getDataType(getOriginalCategoryPath(), name); if (conflictingDt != null) { dialog.setStatusText("A data type named \"" + name + "\" already exists."); return false; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/UnionEditorModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/UnionEditorModel.java index 2e5f886c08..70df062d1c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/UnionEditorModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/UnionEditorModel.java @@ -16,11 +16,14 @@ package ghidra.app.plugin.core.compositeeditor; import java.math.BigInteger; +import java.util.*; import javax.help.UnsupportedOperationException; +import javax.swing.table.TableColumn; import docking.widgets.fieldpanel.support.FieldRange; import docking.widgets.fieldpanel.support.FieldSelection; +import docking.widgets.table.GTableHeaderRenderer; /** * Data union editor model for maintaining information about the edits being @@ -53,6 +56,9 @@ class UnionEditorModel extends CompEditorModel { private static final int DATATYPE = 2; private static final int FIELDNAME = 3; private static final int COMMENT = 4; + private static final int ORDINAL = 5; + + private List hiddenColumns; UnionEditorModel(UnionEditorProvider provider, boolean showInHex) { super(provider); @@ -62,6 +68,12 @@ class UnionEditorModel extends CompEditorModel { adjustOffsets(); this.showHexNumbers = showInHex; + List additionalColumns = new ArrayList<>(); + TableColumn ordinalColumn = new TableColumn(ORDINAL, 75); + ordinalColumn.setHeaderRenderer(new GTableHeaderRenderer()); + ordinalColumn.setHeaderValue("Ordinal"); + additionalColumns.add(ordinalColumn); + hiddenColumns = Collections.unmodifiableList(additionalColumns); } @Override @@ -69,6 +81,11 @@ class UnionEditorModel extends CompEditorModel { return "Union"; } + @Override + protected List getHiddenColumns() { + return hiddenColumns; + } + @Override public int getOffsetColumn() { return -1; @@ -99,6 +116,29 @@ class UnionEditorModel extends CompEditorModel { return COMMENT; } + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + + if ((viewComposite == null) || (rowIndex < 0) || (columnIndex < 0)) { + return ""; + } + + DataTypeComponent dtc = getComponent(rowIndex); + if (dtc == null) { + if (columnIndex == getDataTypeColumn()) { + return null; + } + return ""; + } + + if (columnIndex == ORDINAL) { + int ordinal = dtc.getOrdinal(); + return showHexNumbers ? getHexString(ordinal, true) : Integer.toString(ordinal); + } + + return super.getValueAt(rowIndex, columnIndex); + } + /** * returns whether or not a particular component row and field in this * structure is editable. @@ -381,7 +421,7 @@ class UnionEditorModel extends CompEditorModel { checkIsAllowableDataType(dataType); try { DataTypeComponent dtc = viewDTM.withTransaction("Add Component", - () -> ((Union) viewComposite).insert(rowIndex, dataType, length, name, comment)); + () -> viewComposite.insert(rowIndex, dataType, length, name, comment)); if (rowIndex <= currentEditRow) { currentEditRow++; } @@ -418,8 +458,8 @@ class UnionEditorModel extends CompEditorModel { try { boolean isSelected = selection.containsEntirely(BigInteger.valueOf(rowIndex)); DataTypeComponent dtc = viewDTM.withTransaction("Replace Component", () -> { - ((Union) viewComposite).delete(rowIndex); - return ((Union) viewComposite).insert(rowIndex, dataType, length, name, comment); + viewComposite.delete(rowIndex); + return viewComposite.insert(rowIndex, dataType, length, name, comment); }); if (isSelected) { selection.addRange(rowIndex, rowIndex + 1); @@ -487,7 +527,7 @@ class UnionEditorModel extends CompEditorModel { @Override public void replaceOriginalComponents() { - ((Union) getOriginalComposite()).replaceWith(viewComposite); + getOriginalComposite().replaceWith(viewComposite); } @Override