Merge remote-tracking branch 'origin/GP-2813-dragonmacher-search-memory-highlights--SQUASHED'

This commit is contained in:
Ryan Kurtz
2022-11-12 01:41:35 -05:00
3 changed files with 80 additions and 4 deletions
@@ -17,8 +17,7 @@ package ghidra.app.plugin.core.searchmem;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.util.Collections;
import java.util.List;
import java.util.*;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
@@ -635,6 +634,8 @@ public class MemSearchPlugin extends Plugin implements OptionsChangeListener,
abstract List<MemSearchResult> getMatches();
abstract void cleanup();
private List<MemSearchResult> getAddressesFoundInRange(Address start, Address end) {
List<MemSearchResult> data = getMatches();
int startIndex = findFirstIndex(data, start, end);
@@ -766,12 +767,14 @@ public class MemSearchPlugin extends Plugin implements OptionsChangeListener,
if (provider != null) { // search all - remove highlights when
if (!tool.isVisible(provider)) { // results are no longer showing
highlightNavigatable.removeHighlightProvider(this, highlightProgram);
cleanup();
return true;
}
}
else if (!searchDialog.isVisible()) {
// single search - remove highlights when search dialog no longer showing
highlightNavigatable.removeHighlightProvider(this, highlightProgram);
cleanup();
return true;
}
return false;
@@ -791,16 +794,64 @@ public class MemSearchPlugin extends Plugin implements OptionsChangeListener,
private class SearchTableHighlightHandler extends SearchResultsHighlighter {
private final MemSearchTableModel model;
private List<MemSearchResult> sortedResults;
SearchTableHighlightHandler(Navigatable navigatable, MemSearchTableModel model,
TableComponentProvider<MemSearchResult> provider, Program program) {
super(navigatable, provider, program);
this.model = model;
model.addThreadedTableModelListener(new ThreadedTableModelListener() {
@Override
public void loadingStarted() {
clearCache();
}
@Override
public void loadingFinished(boolean wasCancelled) {
// stub
}
@Override
public void loadPending() {
clearCache();
}
});
}
@Override
List<MemSearchResult> getMatches() {
return model.getModelData();
if (sortedResults != null) {
return sortedResults;
}
if (model.isBusy()) {
return Collections.emptyList();
}
List<MemSearchResult> modelData = model.getModelData();
if (model.isSortedOnAddress()) {
return modelData;
}
sortedResults = new ArrayList<>(modelData);
Collections.sort(sortedResults);
return sortedResults;
}
@Override
void cleanup() {
clearCache();
}
private void clearCache() {
if (sortedResults != null) {
sortedResults.clear();
sortedResults = null;
}
}
}
@@ -817,6 +868,11 @@ public class MemSearchPlugin extends Plugin implements OptionsChangeListener,
List<MemSearchResult> getMatches() {
return searchTask.getMatchingAddresses();
}
@Override
void cleanup() {
// nothing to do
}
}
private class SearchOnceTaskListener implements TaskListener {
@@ -15,6 +15,7 @@
*/
package ghidra.app.plugin.core.searchmem;
import docking.widgets.table.*;
import ghidra.framework.plugintool.ServiceProvider;
import ghidra.program.model.address.*;
import ghidra.program.model.listing.Program;
@@ -23,6 +24,7 @@ import ghidra.util.datastruct.Accumulator;
import ghidra.util.exception.CancelledException;
import ghidra.util.search.memory.*;
import ghidra.util.table.AddressBasedTableModel;
import ghidra.util.table.field.AddressTableColumn;
import ghidra.util.task.TaskMonitor;
public class MemSearchTableModel extends AddressBasedTableModel<MemSearchResult> {
@@ -44,6 +46,22 @@ public class MemSearchTableModel extends AddressBasedTableModel<MemSearchResult>
this.selectionSize = selectionSize;
}
public boolean isSortedOnAddress() {
TableSortState sortState = getTableSortState();
if (sortState.isUnsorted()) {
return false;
}
ColumnSortState primaryState = sortState.getAllSortStates().get(0);
DynamicTableColumn<MemSearchResult, ?, ?> column =
getColumn(primaryState.getColumnModelIndex());
String name = column.getColumnName();
if (AddressTableColumn.NAME.equals(name)) {
return true;
}
return false;
}
@Override
protected void doLoad(Accumulator<MemSearchResult> accumulator, TaskMonitor monitor)
throws CancelledException {
@@ -28,6 +28,8 @@ import ghidra.program.util.ProgramLocation;
public class AddressTableColumn
extends ProgramLocationTableColumnExtensionPoint<Address, AddressBasedLocation> {
public static final String NAME = "Location";
@Override
public String getColumnDisplayName(Settings settings) {
return getColumnName();
@@ -35,7 +37,7 @@ public class AddressTableColumn
@Override
public String getColumnName() {
return "Location";
return NAME;
}
@Override