GP-7315 - Data Types Table - Fixed issue deleting a data type from the

table
This commit is contained in:
dragonmacher
2026-09-24 16:11:04 -04:00
parent ffbc5acf0f
commit 6d838dfa4a
8 changed files with 68 additions and 17 deletions

View File

@@ -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);
}

View File

@@ -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++;

View File

@@ -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<PersistentDataTypeArchive> archives = archiveManager.getOpenArchives();
for (PersistentDataTypeArchive archive : archives) {
DataTypeManager dtm = archive.getDataTypeManager();
if (dtm instanceof ProgramBasedDataTypeManager) {
continue;

View File

@@ -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);
}

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -76,6 +76,23 @@ public interface DataTypeManagerChangeListener {
*/
public void dataTypeRemoved(DataTypeManager dtm, DataTypePath path);
/**
* Notification when data type is removed.
* <P>
* 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.
*

View File

@@ -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) {