Merge remote-tracking branch 'origin/GP-5679-dragonmacher-dtm-type-filter--SQUASHED' into Ghidra_11.4

This commit is contained in:
Ryan Kurtz
2025-05-16 09:45:41 -04:00
3 changed files with 38 additions and 19 deletions
@@ -178,7 +178,7 @@ public class DtFilterDialog extends DialogComponentProvider {
this.type = type;
this.typeCb = new GCheckBox(type);
this.typeDefCb = new GCheckBox();
this.typeDefCb.setName(type + "Typedefs");
this.typeDefCb.setName(type + "TypeDefs");
}
JComponent getLeft() {
@@ -137,40 +137,38 @@ public class DtFilterState {
DataType baseDt = DataTypeUtils.getBaseDataType(dt);
if (dt instanceof Array) {
return passes(arraysFilter, dt, baseDt);
return passes(arraysFilter, dt);
}
if (dt instanceof Pointer) {
return passes(pointersFilter, dt, baseDt);
return passes(pointersFilter, dt);
}
if (baseDt instanceof Enum) {
return passes(enumsFilter, dt, baseDt);
return passes(enumsFilter, dt);
}
if (baseDt instanceof Function) {
return passes(functionsFilter, dt, baseDt);
return passes(functionsFilter, dt);
}
if (baseDt instanceof Structure) {
return passes(structuresFilter, dt, baseDt);
return passes(structuresFilter, dt);
}
if (baseDt instanceof Union) {
return passes(unionsFilter, dt, baseDt);
return passes(unionsFilter, dt);
}
return true;
}
private boolean passes(DtTypeFilter filter, DataType dt, DataType baseDt) {
if (filter.isTypeActive()) {
return true;
private boolean passes(DtTypeFilter filter, DataType dt) {
if (dt instanceof TypeDef) {
return filter.isTypeDefActive();
}
if (filter.isTypeDefActive() && dt instanceof TypeDef) {
return true;
}
return false;
return filter.isTypeActive();
}
public void save(SaveState parentSaveState) {
@@ -16,6 +16,7 @@
package ghidra.app.plugin.core.datamgr;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.*;
import java.awt.Container;
@@ -959,7 +960,7 @@ public class DataTypeManagerPluginTest extends AbstractGhidraHeadedIntegrationTe
// Now also turn off typedefs
performAction(action, provider, false);
dialog = waitForDialogComponent(DtFilterDialog.class);
setToggleButtonSelected(dialog.getComponent(), "StructuresTypedefs", false);
setToggleButtonSelected(dialog.getComponent(), "StructuresTypeDefs", false);
pressButtonByText(dialog, "OK");
waitForTree();
@@ -967,6 +968,26 @@ public class DataTypeManagerPluginTest extends AbstractGhidraHeadedIntegrationTe
assertType("TypeDefToMyStruct", false);
}
@Test
public void testFilter_Structures_HideTypeDefs() {
assertStructures(true);
assertType("TypeDefToMyStruct", true);
// press the filter button
DockingActionIf action = getAction(plugin, "Show Filter");
performAction(action, provider, false);
DtFilterDialog dialog = waitForDialogComponent(DtFilterDialog.class);
// turn off Structure TypeDefs
setToggleButtonSelected(dialog.getComponent(), "StructuresTypeDefs", false);
pressButtonByText(dialog, "OK");
waitForTree();
assertStructures(true); // still have structures
assertType("TypeDefToMyStruct", false); // no longer have structure typedefs
}
@Test
public void testFilter_ClonedProvider() {
@@ -1058,14 +1079,14 @@ public class DataTypeManagerPluginTest extends AbstractGhidraHeadedIntegrationTe
}
private Map<String, DataTypeNode> getNodes(DataTypeManager dtm) {
DataTypeArchiveGTree gTree = provider.getGTree();
GTreeNode rootNode = gTree.getViewRoot();
GTreeNode dtmNode = rootNode.getChild(dtm.getName());
assertNotNull(dtmNode);
expandNode(dtmNode);
Map<String, DataTypeNode> nodesByName = new HashMap<>();
Iterator<GTreeNode> it = dtmNode.iterator(true);
for (GTreeNode node : CollectionUtils.asIterable(it)) {
@@ -1076,7 +1097,7 @@ public class DataTypeManagerPluginTest extends AbstractGhidraHeadedIntegrationTe
DataType dt = dtNode.getDataType();
nodesByName.put(dt.getName(), dtNode);
}
return nodesByName;
}