GP-3696 - cleaning up function compare windows.

This commit is contained in:
ghidragon 2024-05-23 11:26:17 -04:00
parent 770f5447e1
commit 5ea8e97805
77 changed files with 4065 additions and 5654 deletions

View file

@ -15,11 +15,13 @@
*/
package ghidra.feature.vt.api.correlator.address;
import static ghidra.util.datastruct.Duo.Side.*;
import ghidra.program.model.address.*;
import ghidra.program.model.correlate.HashedFunctionAddressCorrelation;
import ghidra.program.model.listing.Function;
import ghidra.program.model.mem.MemoryAccessException;
import ghidra.program.util.AddressCorrelation;
import ghidra.program.util.*;
import ghidra.util.Msg;
import ghidra.util.exception.CancelledException;
import ghidra.util.task.TaskMonitor;
@ -35,14 +37,15 @@ public class VTHashedFunctionAddressCorrelation implements AddressCorrelation {
private final Function sourceFunction;
private final Function destinationFunction;
private HashedFunctionAddressCorrelation addressCorrelation;
private ListingAddressCorrelation addressCorrelation;
/**
* Constructs an address correlation between two functions.
* @param sourceFunction the source function
* @param destinationFunction the destination function
*/
public VTHashedFunctionAddressCorrelation(Function sourceFunction, Function destinationFunction) {
public VTHashedFunctionAddressCorrelation(Function sourceFunction,
Function destinationFunction) {
this.sourceFunction = sourceFunction;
this.destinationFunction = destinationFunction;
addressCorrelation = null;
@ -58,7 +61,7 @@ public class VTHashedFunctionAddressCorrelation implements AddressCorrelation {
throws CancelledException {
try {
initializeCorrelation(monitor);
Address destinationAddress = addressCorrelation.getAddressInSecond(sourceAddress);
Address destinationAddress = addressCorrelation.getAddress(RIGHT, sourceAddress);
if (destinationAddress == null) {
return null; // No matching destination.
}
@ -83,8 +86,13 @@ public class VTHashedFunctionAddressCorrelation implements AddressCorrelation {
if (addressCorrelation != null) {
return;
}
addressCorrelation =
if (sourceFunction != null && destinationFunction != null) {
addressCorrelation =
new HashedFunctionAddressCorrelation(sourceFunction, destinationFunction,
monitor);
monitor);
}
else {
addressCorrelation = new DummyListingAddressCorrelation();
}
}
}

View file

@ -15,6 +15,8 @@
*/
package ghidra.feature.vt.gui.duallisting;
import static ghidra.util.datastruct.Duo.Side.*;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
@ -32,12 +34,11 @@ import ghidra.program.model.address.Address;
import ghidra.program.util.ProgramLocation;
import ghidra.util.Msg;
import ghidra.util.SystemUtilities;
import ghidra.util.datastruct.Duo;
public class VTDualListingDragNDropHandler implements Draggable, Droppable {
private final int SOURCE = 0; // left side
private final int DESTINATION = 1; // right side
private ListingPanel[] listingPanels = new ListingPanel[2];
private Duo<ListingPanel> listingPanels;
private VTController controller;
ListingCodeComparisonPanel dualListingPanel;
@ -55,8 +56,9 @@ public class VTDualListingDragNDropHandler implements Draggable, Droppable {
ListingCodeComparisonPanel dualListingPanel) {
this.controller = controller;
this.dualListingPanel = dualListingPanel;
listingPanels[SOURCE] = dualListingPanel.getLeftPanel();
listingPanels[DESTINATION] = dualListingPanel.getRightPanel();
ListingPanel leftPanel = dualListingPanel.getListingPanel(LEFT);
ListingPanel rightPanel = dualListingPanel.getListingPanel(RIGHT);
listingPanels = new Duo<>(leftPanel, rightPanel);
setUpDragDrop();
}
@ -68,7 +70,7 @@ public class VTDualListingDragNDropHandler implements Draggable, Droppable {
dragSource = DragSource.getDefaultDragSource();
dragGestureAdapter = new DragGestureAdapter(this);
dragSourceAdapter = new DragSrcAdapter(this);
dragSource.createDefaultDragGestureRecognizer(listingPanels[SOURCE].getFieldPanel(),
dragSource.createDefaultDragGestureRecognizer(listingPanels.get(LEFT).getFieldPanel(),
dragAction, dragGestureAdapter);
}
@ -79,7 +81,7 @@ public class VTDualListingDragNDropHandler implements Draggable, Droppable {
// set up the destination fieldPanel as a drop target that accepts mark-up items.
dropTargetAdapter =
new DropTgtAdapter(this, DnDConstants.ACTION_COPY_OR_MOVE, acceptableFlavors);
dropTarget = new DropTarget(listingPanels[DESTINATION].getFieldPanel(),
dropTarget = new DropTarget(listingPanels.get(RIGHT).getFieldPanel(),
DnDConstants.ACTION_COPY_OR_MOVE, dropTargetAdapter, true);
dropTarget.setActive(true);
}
@ -100,13 +102,14 @@ public class VTDualListingDragNDropHandler implements Draggable, Droppable {
@Override
public boolean isStartDragOk(DragGestureEvent e) {
if (!listingPanels[SOURCE].isStartDragOk()) {
if (!listingPanels.get(LEFT).isStartDragOk()) {
return false;
}
Point p = e.getDragOrigin();
ProgramLocation programLocation = listingPanels[SOURCE].getProgramLocation(p);
VTMarkupItem markupItem = controller.getCurrentMarkupForLocation(programLocation,
dualListingPanel.getLeftProgram());
ProgramLocation programLocation = listingPanels.get(LEFT).getProgramLocation(p);
VTMarkupItem markupItem =
controller.getCurrentMarkupForLocation(programLocation,
dualListingPanel.getProgram(LEFT));
if (markupItem == null) {
return false;
}
@ -122,13 +125,13 @@ public class VTDualListingDragNDropHandler implements Draggable, Droppable {
@Override
public Transferable getTransferable(Point p) {
if (!listingPanels[SOURCE].contains(p)) {
if (!listingPanels.get(LEFT).contains(p)) {
return null;
}
ProgramLocation programLocation = listingPanels[SOURCE].getProgramLocation(p);
ProgramLocation programLocation = listingPanels.get(LEFT).getProgramLocation(p);
VTMarkupItem markupItem = controller.getCurrentMarkupForLocation(programLocation,
dualListingPanel.getLeftProgram());
dualListingPanel.getProgram(LEFT));
if (markupItem == null) {
return null;
}
@ -145,10 +148,10 @@ public class VTDualListingDragNDropHandler implements Draggable, Droppable {
VTMarkupItem markupItem = (VTMarkupItem) obj;
VTMarkupType markupType = markupItem.getMarkupType();
Point p = event.getLocation();
ProgramLocation loc = listingPanels[DESTINATION].getProgramLocation(p);
ProgramLocation loc = listingPanels.get(RIGHT).getProgramLocation(p);
Address newDestinationAddress =
markupType.getAddress(loc, dualListingPanel.getRightProgram());
markupType.getAddress(loc, dualListingPanel.getProgram(RIGHT));
if (newDestinationAddress == null) {
Msg.showInfo(getClass(), dualListingPanel, "Invalid Drop Location",
markupType.getDisplayName() + " was not dropped at a valid location.");
@ -166,11 +169,6 @@ public class VTDualListingDragNDropHandler implements Draggable, Droppable {
ArrayList<VTMarkupItem> arrayList = new ArrayList<VTMarkupItem>();
arrayList.add(markupItem);
// Use the following if you only want to set the address.
// SetMarkupItemDestinationAddressTask task =
// new SetMarkupItemDestinationAddressTask(controller.getSession(), arrayList,
// newDestinationAddress);
// Use the following if you want to set the address and apply the markup item using the default action.
ApplyMarkupAtDestinationAddressTask task = new ApplyMarkupAtDestinationAddressTask(
controller.getSession(), arrayList, newDestinationAddress, controller.getOptions());

View file

@ -16,7 +16,6 @@
package ghidra.feature.vt.gui.duallisting;
import docking.ComponentProvider;
import docking.widgets.fieldpanel.internal.FieldPanelCoordinator;
import ghidra.app.context.ListingActionContext;
import ghidra.app.nav.Navigatable;
import ghidra.app.util.viewer.util.CodeComparisonPanel;
@ -28,7 +27,7 @@ import ghidra.app.util.viewer.util.CodeComparisonPanelActionContext;
public class VTListingContext extends ListingActionContext
implements CodeComparisonPanelActionContext {
private CodeComparisonPanel<? extends FieldPanelCoordinator> codeComparisonPanel = null;
private CodeComparisonPanel codeComparisonPanel = null;
/**
* Creates an action context for a VT listing.
@ -44,12 +43,12 @@ public class VTListingContext extends ListingActionContext
* @param codeComparisonPanel the code comparison panel.
*/
public void setCodeComparisonPanel(
CodeComparisonPanel<? extends FieldPanelCoordinator> codeComparisonPanel) {
CodeComparisonPanel codeComparisonPanel) {
this.codeComparisonPanel = codeComparisonPanel;
}
@Override
public CodeComparisonPanel<? extends FieldPanelCoordinator> getCodeComparisonPanel() {
public CodeComparisonPanel getCodeComparisonPanel() {
return codeComparisonPanel;
}
}

View file

@ -92,13 +92,7 @@ public class VTListingNavigator implements Navigatable {
@Override
public boolean goTo(Program program, ProgramLocation location) {
boolean went = listingPanel.goTo(location);
// If we tried to go but couldn't, try again after showing entire listing.
if (!went && !dualListingPanel.isEntireListingShowing()) {
dualListingPanel.showEntireListing(true);
return listingPanel.goTo(location);
}
return went;
return listingPanel.goTo(location);
}
@Override
@ -147,7 +141,8 @@ public class VTListingNavigator implements Navigatable {
}
@Override
public void removeHighlightProvider(ListingHighlightProvider highlightProvider, Program program) {
public void removeHighlightProvider(ListingHighlightProvider highlightProvider,
Program program) {
// currently unsupported
}

View file

@ -16,6 +16,7 @@
package ghidra.feature.vt.gui.provider.functionassociation;
import static ghidra.feature.vt.gui.provider.functionassociation.FilterSettings.*;
import static ghidra.util.datastruct.Duo.Side.*;
import java.awt.*;
import java.awt.event.*;
@ -220,7 +221,7 @@ public class VTFunctionAssociationProvider extends ComponentProviderAdapter
ListingCodeComparisonPanel dualListingPanel =
functionComparisonPanel.getDualListingPanel();
if (dualListingPanel != null) {
ListingPanel leftPanel = dualListingPanel.getLeftPanel();
ListingPanel leftPanel = dualListingPanel.getListingPanel(LEFT);
return leftPanel.getHeaderActions(getName());
}
}
@ -261,7 +262,7 @@ public class VTFunctionAssociationProvider extends ComponentProviderAdapter
}
// Is the action being taken on a toolbar button while the dual listing is visible?
else if (isToolbarButtonAction && isShowingDualListing) {
listingPanel = dualListingPanel.getFocusedListingPanel();
listingPanel = dualListingPanel.getActiveListingPanel();
}
// If the dual listing is showing and this is a toolbar action or the action is
// on one of the listings in the ListingCodeComparisonPanel
@ -367,10 +368,9 @@ public class VTFunctionAssociationProvider extends ComponentProviderAdapter
statusPanel.add(statusLabel, BorderLayout.CENTER);
dualTablePanel.add(statusPanel, BorderLayout.SOUTH);
functionComparisonPanel =
new FunctionComparisonPanel(this, tool, (Function) null, (Function) null);
functionComparisonPanel = new FunctionComparisonPanel(this, tool);
addSpecificCodeComparisonActions();
functionComparisonPanel.setCurrentTabbedComponent(ListingCodeComparisonPanel.TITLE);
functionComparisonPanel.setCurrentTabbedComponent(ListingCodeComparisonPanel.NAME);
functionComparisonPanel.setTitlePrefixes("Source:", "Destination:");
comparisonSplitPane =

View file

@ -18,7 +18,6 @@ package ghidra.feature.vt.gui.provider.markuptable;
import java.util.List;
import docking.DefaultActionContext;
import docking.widgets.fieldpanel.internal.FieldPanelCoordinator;
import ghidra.app.util.viewer.util.CodeComparisonPanel;
import ghidra.app.util.viewer.util.CodeComparisonPanelActionContext;
import ghidra.feature.vt.api.main.VTMarkupItem;
@ -30,7 +29,7 @@ public class VTMarkupItemContext extends DefaultActionContext
implements CodeComparisonPanelActionContext {
private final List<VTMarkupItem> selectedItems;
private CodeComparisonPanel<? extends FieldPanelCoordinator> codeComparisonPanel = null;
private CodeComparisonPanel codeComparisonPanel = null;
/**
* Creates an action context for the VT markup item provider.
@ -55,12 +54,12 @@ public class VTMarkupItemContext extends DefaultActionContext
* @param codeComparisonPanel the code comparison panel.
*/
public void setCodeComparisonPanel(
CodeComparisonPanel<? extends FieldPanelCoordinator> codeComparisonPanel) {
CodeComparisonPanel codeComparisonPanel) {
this.codeComparisonPanel = codeComparisonPanel;
}
@Override
public CodeComparisonPanel<? extends FieldPanelCoordinator> getCodeComparisonPanel() {
public CodeComparisonPanel getCodeComparisonPanel() {
return codeComparisonPanel;
}
}

View file

@ -18,6 +18,7 @@ package ghidra.feature.vt.gui.provider.markuptable;
import static ghidra.feature.vt.api.impl.VTEvent.*;
import static ghidra.feature.vt.gui.plugin.VTPlugin.*;
import static ghidra.framework.model.DomainObjectEvent.*;
import static ghidra.util.datastruct.Duo.Side.*;
import java.awt.*;
import java.awt.event.*;
@ -34,7 +35,6 @@ import docking.action.*;
import docking.actions.PopupActionProvider;
import docking.widgets.EventTrigger;
import docking.widgets.fieldpanel.FieldPanel;
import docking.widgets.fieldpanel.internal.FieldPanelCoordinator;
import docking.widgets.table.GTable;
import docking.widgets.table.RowObjectTableModel;
import docking.widgets.table.threaded.ThreadedTableModel;
@ -150,23 +150,24 @@ public class VTMarkupItemsTableProvider extends ComponentProviderAdapter
markupItemsTablePanel.add(tablePanel, BorderLayout.CENTER);
markupItemsTablePanel.add(filterAreaPanel, BorderLayout.SOUTH);
functionComparisonPanel =
new FunctionComparisonPanel(this, tool, (Function) null, (Function) null);
functionComparisonPanel = new FunctionComparisonPanel(this, tool);
addSpecificCodeComparisonActions();
functionComparisonPanel.setCurrentTabbedComponent(ListingCodeComparisonPanel.TITLE);
functionComparisonPanel.setCurrentTabbedComponent(ListingCodeComparisonPanel.NAME);
functionComparisonPanel.setTitlePrefixes("Source:", "Destination:");
ListingCodeComparisonPanel dualListingPanel = functionComparisonPanel.getDualListingPanel();
if (dualListingPanel != null) {
dualListingPanel.setLeftProgramLocationListener(new SourceProgramLocationListener());
dualListingPanel
.setRightProgramLocationListener(new DestinationProgramLocationListener());
dualListingPanel.getListingPanel(LEFT)
.setProgramLocationListener(new SourceProgramLocationListener());
dualListingPanel.getListingPanel(RIGHT).setProgramLocationListener(
new DestinationProgramLocationListener());
sourceHighlightProvider = new VTDualListingHighlightProvider(controller, true);
destinationHighlightProvider = new VTDualListingHighlightProvider(controller, false);
dualListingPanel.addHighlightProviders(sourceHighlightProvider,
destinationHighlightProvider);
sourceHighlightProvider.setListingPanel(dualListingPanel.getLeftPanel());
destinationHighlightProvider.setListingPanel(dualListingPanel.getRightPanel());
sourceHighlightProvider.setListingPanel(dualListingPanel.getListingPanel(LEFT));
destinationHighlightProvider.setListingPanel(dualListingPanel.getListingPanel(RIGHT));
new VTDualListingDragNDropHandler(controller, dualListingPanel);
}
@ -267,24 +268,24 @@ public class VTMarkupItemsTableProvider extends ComponentProviderAdapter
// Don't set source or destination if the location change was initiated by the dual listing.
if (!processingSourceLocationChange &&
!processingDestinationLocationChange) {
dualListingPanel.setLeftLocation(dualListingPanel.getLeftProgram(),
dualListingPanel.setLocation(LEFT, dualListingPanel.getProgram(LEFT),
markupItem.getSourceLocation());
dualListingPanel.setRightLocation(dualListingPanel.getRightProgram(),
dualListingPanel.setLocation(RIGHT, dualListingPanel.getProgram(RIGHT),
markupItem.getDestinationLocation());
}
else {
// Only adjust the side of the dual listing panel that didn't initiate this.
ProgramLocation sourceLocation = markupItem.getSourceLocation();
if (processingDestinationLocationChange && sourceLocation != null) {
dualListingPanel.setLeftLocation(dualListingPanel.getLeftProgram(),
sourceLocation);
dualListingPanel.setLocation(LEFT,
dualListingPanel.getProgram(LEFT), sourceLocation);
}
ProgramLocation destinationLocation =
markupItem.getDestinationLocation();
if (processingSourceLocationChange && destinationLocation != null) {
dualListingPanel.setRightLocation(
dualListingPanel.getRightProgram(), destinationLocation);
dualListingPanel.setLocation(RIGHT,
dualListingPanel.getProgram(RIGHT), destinationLocation);
}
}
dualListingPanel.updateListings(); // refresh the dual listing's background markup colors.
@ -361,10 +362,10 @@ public class VTMarkupItemsTableProvider extends ComponentProviderAdapter
splitPane.add(functionComparisonPanel);
markupPanel.add(splitPane, BorderLayout.CENTER);
if (dualListingPanel != null) {
dualListingPanel
.setLeftProgramLocationListener(new SourceProgramLocationListener());
dualListingPanel.setRightProgramLocationListener(
new DestinationProgramLocationListener());
dualListingPanel.getListingPanel(LEFT)
.setProgramLocationListener(new SourceProgramLocationListener());
dualListingPanel.getListingPanel(LEFT)
.setProgramLocationListener(new DestinationProgramLocationListener());
}
markupPanel.validate();
@ -378,8 +379,8 @@ public class VTMarkupItemsTableProvider extends ComponentProviderAdapter
if (contains) {
// Remove the split pane.
if (dualListingPanel != null) {
dualListingPanel.setLeftProgramLocationListener(null);
dualListingPanel.setRightProgramLocationListener(null);
dualListingPanel.getListingPanel(LEFT).setProgramLocationListener(null);
dualListingPanel.getListingPanel(RIGHT).setProgramLocationListener(null);
}
markupPanel.remove(splitPane);
splitPane.remove(functionComparisonPanel);
@ -462,7 +463,7 @@ public class VTMarkupItemsTableProvider extends ComponentProviderAdapter
public List<DockingActionIf> getPopupActions(Tool t, ActionContext context) {
ListingCodeComparisonPanel dualListingPanel = functionComparisonPanel.getDualListingPanel();
if (context.getComponentProvider() == this && dualListingPanel != null) {
ListingPanel sourcePanel = dualListingPanel.getLeftPanel();
ListingPanel sourcePanel = dualListingPanel.getListingPanel(LEFT);
return sourcePanel.getHeaderActions(getName());
}
return new ArrayList<>();
@ -477,7 +478,7 @@ public class VTMarkupItemsTableProvider extends ComponentProviderAdapter
List<VTMarkupItem> selectedItems = getSelectedMarkupItems();
VTMarkupItemContext vtMarkupItemContext = new VTMarkupItemContext(this, selectedItems);
if (functionComparisonPanel.isVisible()) {
CodeComparisonPanel<? extends FieldPanelCoordinator> displayedPanel =
CodeComparisonPanel displayedPanel =
functionComparisonPanel.getDisplayedPanel();
vtMarkupItemContext.setCodeComparisonPanel(displayedPanel);
}
@ -626,7 +627,7 @@ public class VTMarkupItemsTableProvider extends ComponentProviderAdapter
}
}
else {
functionComparisonPanel.loadFunctions(null, null);
functionComparisonPanel.clear();
}
if (sourceHighlightProvider != null) {