From 6d838dfa4ab7c3a56414817c9bd2d5d0c3eb84f1 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Thu, 24 Sep 2026 16:11:04 -0400 Subject: [PATCH] GP-7315 - Data Types Table - Fixed issue deleting a data type from the table --- .../database/data/DBTraceDataTypeManager.java | 6 ++++-- .../core/datamgr/ActiveDataTypeStores.java | 8 ++++++++ .../datamgr/tree/DataTypesTableProvider.java | 10 ++++++++-- .../database/data/ArchiveDataTypeManagerDB.java | 7 ++++--- .../database/data/DataTypeManagerDB.java | 14 ++++++++------ .../database/data/ProgramDataTypeManager.java | 6 ++++-- .../data/DataTypeManagerChangeListener.java | 17 +++++++++++++++++ .../DataTypeManagerChangeListenerHandler.java | 17 +++++++++++++++-- 8 files changed, 68 insertions(+), 17 deletions(-) diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/data/DBTraceDataTypeManager.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/data/DBTraceDataTypeManager.java index 69b1d8408c..da8c6a8dee 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/data/DBTraceDataTypeManager.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/data/DBTraceDataTypeManager.java @@ -145,8 +145,10 @@ public class DBTraceDataTypeManager extends ProgramBasedDataTypeManagerDB } @Override - protected void dataTypeDeleted(long deletedID, DataTypePath deletedPath) { - super.dataTypeDeleted(deletedID, deletedPath); + protected void dataTypeDeleted(long deletedID, DataType dataType) { + super.dataTypeDeleted(deletedID, dataType); + + DataTypePath deletedPath = dataType.getDataTypePath(); trace.dataTypeDeleted(deletedID, deletedPath); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/ActiveDataTypeStores.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/ActiveDataTypeStores.java index 77d5dc2a7f..67143d1685 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/ActiveDataTypeStores.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/ActiveDataTypeStores.java @@ -500,6 +500,14 @@ class ActiveDataTypeStores { } } + @Override + public void dataTypeRemoved(DataTypeManager dtm, DataType dt) { + modCount++; + for (DataTypeManagerChangeListener listener : dataTypeManagerListeners) { + listener.dataTypeRemoved(dtm, dt); + } + } + @Override public void dataTypeRemoved(DataTypeManager dtm, DataTypePath path) { modCount++; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/DataTypesTableProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/DataTypesTableProvider.java index 419ae3fde0..69b293477e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/DataTypesTableProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/DataTypesTableProvider.java @@ -126,6 +126,7 @@ public class DataTypesTableProvider extends ComponentProvider { if (!isConnected) { plugin.addDisconnectedTableProvider(this); } + } private static DtFilterState getDtFilterState(DataTypeManagerPlugin plugin) { @@ -582,11 +583,15 @@ public class DataTypesTableProvider extends ComponentProvider { } @Override - public void dataTypeRemoved(DataTypeManager dtm, DataTypePath path) { - DataType dt = dtm.getDataType(path); + public void dataTypeRemoved(DataTypeManager dtm, DataType dt) { model.removeObject(dt); } + @Override + public void dataTypeRemoved(DataTypeManager dtm, DataTypePath path) { + // stub; use other version of dataTypeRemoved() + } + @Override public void dataTypeMoved(DataTypeManager dtm, DataTypePath oldPath, DataTypePath newPath) { @@ -670,6 +675,7 @@ public class DataTypesTableProvider extends ComponentProvider { ArchiveManager archiveManager = plugin.getArchiveManager(); List archives = archiveManager.getOpenArchives(); for (PersistentDataTypeArchive archive : archives) { + DataTypeManager dtm = archive.getDataTypeManager(); if (dtm instanceof ProgramBasedDataTypeManager) { continue; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ArchiveDataTypeManagerDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ArchiveDataTypeManagerDB.java index bda06015d9..d0e85b2778 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ArchiveDataTypeManagerDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ArchiveDataTypeManagerDB.java @@ -24,8 +24,8 @@ import db.util.ErrorHandler; import ghidra.framework.data.OpenMode; import ghidra.framework.model.RuntimeIOException; import ghidra.program.database.DBStringMapAdapter; -import ghidra.program.database.dtarchive.DataTypeStoreDBModule; import ghidra.program.database.dtarchive.DataTypeArchiveDB; +import ghidra.program.database.dtarchive.DataTypeStoreDBModule; import ghidra.program.model.data.*; import ghidra.program.model.dtarchive.DataTypeArchive; import ghidra.program.model.lang.LanguageVersionException; @@ -325,8 +325,9 @@ public abstract class ArchiveDataTypeManagerDB extends DataTypeManagerDB } @Override - protected void dataTypeDeleted(long deletedID, DataTypePath deletedDataTypePath) { - super.dataTypeDeleted(deletedID, deletedDataTypePath); + protected void dataTypeDeleted(long deletedID, DataType dataType) { + super.dataTypeDeleted(deletedID, dataType); + DataTypePath deletedDataTypePath = dataType.getDataTypePath(); archive.dataTypeChanged(deletedID, ProgramEvent.DATA_TYPE_REMOVED, false, deletedDataTypePath, null); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java index 4962b3a662..4ce587e130 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java @@ -2425,7 +2425,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager { // possible updates to other datatypes that would need to trigger such a modification time. if (notify) { - dataTypeDeleted(dataTypeID, dataType.getDataTypePath()); + dataTypeDeleted(dataTypeID, dataType); } } @@ -3592,13 +3592,15 @@ abstract public class DataTypeManagerDB implements DataTypeManager { replacementDt.getDataTypePath(), replacementDt); } - protected void dataTypeDeleted(long deletedID, DataTypePath deletedDataTypePath) { - CategoryDB category = (CategoryDB) getCategory(deletedDataTypePath.getCategoryPath()); - category.dataTypeRemoved(deletedDataTypePath.getDataTypeName()); - removeDataTypeFromSortedList(deletedDataTypePath); + protected void dataTypeDeleted(long deletedID, DataType dataType) { + + DataTypePath deletedDtPath = dataType.getDataTypePath(); + CategoryDB category = (CategoryDB) getCategory(deletedDtPath.getCategoryPath()); + category.dataTypeRemoved(deletedDtPath.getDataTypeName()); + removeDataTypeFromSortedList(deletedDtPath); enumValueMap = null; updateLastChangeTime(); - defaultListener.dataTypeRemoved(this, deletedDataTypePath); + defaultListener.dataTypeRemoved(this, dataType); } protected void dataTypeMoved(DataType dt, DataTypePath oldDataTypePath, diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ProgramDataTypeManager.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ProgramDataTypeManager.java index 606bb9b499..897a2d4330 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ProgramDataTypeManager.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ProgramDataTypeManager.java @@ -198,8 +198,10 @@ public class ProgramDataTypeManager extends ProgramBasedDataTypeManagerDB } @Override - protected void dataTypeDeleted(long deletedID, DataTypePath deletedDataTypePath) { - super.dataTypeDeleted(deletedID, deletedDataTypePath); + protected void dataTypeDeleted(long deletedID, DataType dataType) { + super.dataTypeDeleted(deletedID, dataType); + + DataTypePath deletedDataTypePath = dataType.getDataTypePath(); program.dataTypeChanged(deletedID, ProgramEvent.DATA_TYPE_REMOVED, false, deletedDataTypePath, null); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManagerChangeListener.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManagerChangeListener.java index eb96010068..9a67d1bb53 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManagerChangeListener.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManagerChangeListener.java @@ -76,6 +76,23 @@ public interface DataTypeManagerChangeListener { */ public void dataTypeRemoved(DataTypeManager dtm, DataTypePath path); + /** + * Notification when data type is removed. + *

+ * This method has been added to allow clients access the actual data type that was deleted. By + * default this method simply calls the original + * {@link #dataTypeRemoved(DataTypeManager, DataTypePath)} so existing clients don't need to + * implement the new method. + * + * @param dtm data type manager for the given category paths. + * @param dataType the removed datatype. + * @since 12.3 + */ + public default void dataTypeRemoved(DataTypeManager dtm, DataType dataType) { + DataTypePath dtPath = dataType.getDataTypePath(); + dataTypeRemoved(dtm, dtPath); + } + /** * Notification when data type is renamed. * diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManagerChangeListenerHandler.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManagerChangeListenerHandler.java index 267a8b67a7..00d60a1a53 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManagerChangeListenerHandler.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManagerChangeListenerHandler.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -140,6 +140,19 @@ public class DataTypeManagerChangeListenerHandler implements DataTypeManagerChan }); } + @Override + public void dataTypeRemoved(DataTypeManager dtm, DataType dataType) { + + if (listenerList.isEmpty()) { + return; + } + invokeLater(() -> { + for (DataTypeManagerChangeListener listener : listenerList) { + listener.dataTypeRemoved(dtm, dataType); + } + }); + } + @Override public void dataTypeRemoved(DataTypeManager dtm, DataTypePath path) {