Merge remote-tracking branch 'origin/GP-4129_Dan_fixModelTreeListener'

This commit is contained in:
Ryan Kurtz 2023-12-11 12:59:37 -05:00
commit 7ec608a695
2 changed files with 35 additions and 2 deletions

View File

@ -25,8 +25,7 @@ import docking.widgets.tree.GTreeNode;
import ghidra.app.plugin.core.debug.gui.DebuggerResources;
import ghidra.dbg.target.*;
import ghidra.dbg.util.PathUtils.TargetObjectKeyComparator;
import ghidra.framework.model.DomainObject;
import ghidra.framework.model.DomainObjectClosedListener;
import ghidra.framework.model.*;
import ghidra.trace.model.*;
import ghidra.trace.model.Trace.TraceObjectChangeType;
import ghidra.trace.model.target.*;
@ -39,6 +38,7 @@ public class ObjectTreeModel implements DisplaysModified {
class ListenerForChanges extends TraceDomainObjectListener
implements DomainObjectClosedListener {
public ListenerForChanges() {
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, this::domainObjectRestored);
listenFor(TraceObjectChangeType.CREATED, this::objectCreated);
listenFor(TraceObjectChangeType.VALUE_CREATED, this::valueCreated);
listenFor(TraceObjectChangeType.VALUE_DELETED, this::valueDeleted);
@ -50,6 +50,10 @@ public class ObjectTreeModel implements DisplaysModified {
setTrace(null);
}
public void domainObjectRestored(DomainObjectChangeRecord rec) {
reload();
}
protected boolean isEventValue(TraceObjectValue value) {
if (!value.getParent()
.getTargetSchema()

View File

@ -43,6 +43,7 @@ import ghidra.dbg.target.schema.SchemaContext;
import ghidra.dbg.target.schema.TargetObjectSchema.SchemaName;
import ghidra.dbg.target.schema.XmlSchemaContext;
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
import ghidra.lifecycle.Unfinished;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.target.*;
import ghidra.trace.model.target.TraceObject.ConflictResolution;
@ -1027,4 +1028,32 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerTest
assertEquals(threadsPath.index(0),
modelProvider.elementsTablePanel.getSelectedItem().getValue().getCanonicalPath());
}
@Test
public void testSetValueAffectsTree() throws Throwable {
createTraceAndPopulateObjects();
TraceObjectKeyPath threadsPath = TraceObjectKeyPath.parse("Processes[0].Threads");
TraceObject threads = tb.trace.getObjectManager().getObjectByCanonicalPath(threadsPath);
TraceObject thread0 =
tb.trace.getObjectManager().getObjectByCanonicalPath(threadsPath.index(0));
traceManager.activateTrace(tb.trace);
traceManager.activateSnap(1);
waitForSwing();
modelProvider.setPath(threadsPath);
waitForTasks();
AbstractNode node =
waitForValue(() -> modelProvider.objectsTreePanel.treeModel.getNode(threadsPath));
assertEquals(10, node.getChildren().size());
try (Transaction tx = tb.startTransaction()) {
threads.setAttribute(Lifespan.nowOn(0), "Current", thread0);
}
waitForTasks();
assertEquals(11, node.getChildren().size());
}
}