mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 19:42:36 +02:00
GP-3377 - Symbol Table - Updated the 'Name Only' filter to also search the 'Original Imported Name'; added a 'Simplified Name' column
This commit is contained in:
parent
c1f8312c56
commit
cfa1fc93e9
2 changed files with 57 additions and 5 deletions
|
@ -21,6 +21,7 @@ import docking.widgets.table.*;
|
|||
import ghidra.app.cmd.function.DeleteFunctionCmd;
|
||||
import ghidra.app.cmd.label.DeleteLabelCmd;
|
||||
import ghidra.app.cmd.label.RenameLabelCmd;
|
||||
import ghidra.app.util.template.TemplateSimplifier;
|
||||
import ghidra.docking.settings.Settings;
|
||||
import ghidra.framework.cmd.CompoundCmd;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
|
@ -80,6 +81,7 @@ public abstract class AbstractSymbolTableModel extends AddressBasedTableModel<Sy
|
|||
descriptor.addHiddenColumn(new PinnedTableColumn());
|
||||
descriptor.addHiddenColumn(new UserTableColumn());
|
||||
descriptor.addHiddenColumn(new OriginalNameColumn());
|
||||
descriptor.addHiddenColumn(new SimplifiedNameColumn());
|
||||
|
||||
return descriptor;
|
||||
}
|
||||
|
@ -648,7 +650,7 @@ public abstract class AbstractSymbolTableModel extends AddressBasedTableModel<Sy
|
|||
|
||||
}
|
||||
|
||||
private class OriginalNameColumn
|
||||
class OriginalNameColumn
|
||||
extends AbstractProgramBasedDynamicTableColumn<SymbolRowObject, String> {
|
||||
|
||||
@Override
|
||||
|
@ -684,7 +686,35 @@ public abstract class AbstractSymbolTableModel extends AddressBasedTableModel<Sy
|
|||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private class SimplifiedNameColumn
|
||||
extends AbstractProgramBasedDynamicTableColumn<SymbolRowObject, String> {
|
||||
|
||||
private TemplateSimplifier simplifier = new TemplateSimplifier();
|
||||
|
||||
@Override
|
||||
public String getColumnName() {
|
||||
return "Simplified Name";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getColumnDescription() {
|
||||
return "The symbol name with less complicated template arguments";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValue(SymbolRowObject rowObject, Settings settings, Program p,
|
||||
ServiceProvider svcProvider) throws IllegalArgumentException {
|
||||
|
||||
Symbol symbol = rowObject.getSymbol();
|
||||
if (symbol == null || symbol.isDeleted()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String name = symbol.getName();
|
||||
return simplifier.simplify(name);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -22,12 +22,14 @@ import java.util.List;
|
|||
import javax.swing.*;
|
||||
import javax.swing.event.TableModelListener;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
|
||||
import org.jdom.Element;
|
||||
|
||||
import docking.widgets.checkbox.GCheckBox;
|
||||
import docking.widgets.table.DefaultRowFilterTransformer;
|
||||
import docking.widgets.table.RowFilterTransformer;
|
||||
import ghidra.app.plugin.core.symtable.AbstractSymbolTableModel.OriginalNameColumn;
|
||||
import ghidra.framework.options.SaveState;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.program.model.symbol.Symbol;
|
||||
|
@ -119,11 +121,11 @@ class SymbolPanel extends JPanel {
|
|||
}
|
||||
|
||||
protected RowFilterTransformer<SymbolRowObject> updateRowDataTransformer(boolean nameOnly) {
|
||||
TableColumnModel columnModel = symTable.getColumnModel();
|
||||
if (nameOnly) {
|
||||
return new NameOnlyRowTransformer();
|
||||
return new NameOnlyRowTransformer(tableModel, columnModel);
|
||||
}
|
||||
|
||||
return new DefaultRowFilterTransformer<>(tableModel, symTable.getColumnModel());
|
||||
return new DefaultRowFilterTransformer<>(tableModel, columnModel);
|
||||
}
|
||||
|
||||
void dispose() {
|
||||
|
@ -201,8 +203,16 @@ class SymbolPanel extends JPanel {
|
|||
// Inner Classes
|
||||
//==================================================================================================
|
||||
|
||||
private static class NameOnlyRowTransformer implements RowFilterTransformer<SymbolRowObject> {
|
||||
private static class NameOnlyRowTransformer
|
||||
extends DefaultRowFilterTransformer<SymbolRowObject> {
|
||||
|
||||
private List<String> list = new ArrayList<>();
|
||||
private SymbolTableModel symbolTableModel;
|
||||
|
||||
NameOnlyRowTransformer(SymbolTableModel symbolTableModel, TableColumnModel columnModel) {
|
||||
super(symbolTableModel, columnModel);
|
||||
this.symbolTableModel = symbolTableModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> transform(SymbolRowObject rowObject) {
|
||||
|
@ -211,10 +221,22 @@ class SymbolPanel extends JPanel {
|
|||
// The toString() returns the name for the symbol, which may be cached. Calling
|
||||
// toString() will also avoid locking for cached values.
|
||||
list.add(rowObject.toString());
|
||||
|
||||
// Add the 'Original Imported Name' value as well, which may feel intuitive to the
|
||||
// user when filtering on the name.
|
||||
addOriginalName(rowObject);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private void addOriginalName(SymbolRowObject rowObject) {
|
||||
int index = symbolTableModel.getColumnIndex(OriginalNameColumn.class);
|
||||
String originalName = getStringValue(rowObject, index);
|
||||
if (originalName != null) {
|
||||
list.add(originalName);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
// not meant to put in hashing structures; the data for equals may change over time
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue