mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-30 12:31:13 +08:00
GP-6396: Fix loss of renderers, editors, widths in Debugger table columns.
This commit is contained in:
+40
-36
@@ -23,16 +23,13 @@ import java.util.stream.Stream;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
|
||||
import docking.widgets.table.DefaultEnumeratedColumnTableModel;
|
||||
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
|
||||
import docking.widgets.table.GTable;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.pcode.emu.symz3.SymZ3RecordsExecution.RecInstruction;
|
||||
import ghidra.symz3.gui.Z3SummaryInstructionLogPanel.InstructionHtmlFormatter;
|
||||
import ghidra.util.table.GhidraTableFilterPanel;
|
||||
import ghidra.util.table.column.GColumnRenderer;
|
||||
|
||||
public class Z3SummaryInformationPanel extends JPanel {
|
||||
|
||||
@@ -51,32 +48,60 @@ public class Z3SummaryInformationPanel extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
record InformationRow(InfoKind kind, String variable, String value) {
|
||||
record InformationRow(InfoKind kind, String variable, String value) {}
|
||||
|
||||
}
|
||||
private static final MonospaceCellRenderer MONO_RENDERER = new MonospaceCellRenderer();
|
||||
|
||||
protected enum InformationTableColumns
|
||||
implements EnumeratedTableColumn<InformationTableColumns, InformationRow> {
|
||||
KIND("Kind", InfoKind.class, InformationRow::kind, true),
|
||||
VARIABLE("Variable", String.class, InformationRow::variable, true),
|
||||
VALUE("Value", String.class, InformationRow::value, true);
|
||||
KIND("Kind", InfoKind.class, InformationRow::kind) {
|
||||
@Override
|
||||
public int getMaxWidth() {
|
||||
return 40;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinWidth() {
|
||||
return 40;
|
||||
}
|
||||
},
|
||||
VARIABLE("Variable", String.class, InformationRow::variable) {
|
||||
@Override
|
||||
public GColumnRenderer<?> getRenderer() {
|
||||
return MONO_RENDERER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPreferredWidth() {
|
||||
return 20;
|
||||
}
|
||||
},
|
||||
VALUE("Value", String.class, InformationRow::value) {
|
||||
@Override
|
||||
public GColumnRenderer<?> getRenderer() {
|
||||
return MONO_RENDERER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPreferredWidth() {
|
||||
return 60;
|
||||
}
|
||||
};
|
||||
|
||||
private final String header;
|
||||
private final Class<?> cls;
|
||||
private final Function<InformationRow, ?> getter;
|
||||
private final boolean visible;
|
||||
|
||||
<T> InformationTableColumns(String header, Class<T> cls,
|
||||
Function<InformationRow, T> getter, boolean visible) {
|
||||
Function<InformationRow, T> getter) {
|
||||
this.header = header;
|
||||
this.cls = cls;
|
||||
this.getter = getter;
|
||||
this.visible = visible;
|
||||
}
|
||||
|
||||
static String getInstructionHtml(RecInstruction op) {
|
||||
InstructionHtmlFormatter formatter = new InstructionHtmlFormatter();
|
||||
return formatter.formatInstruction(op.instruction());
|
||||
@Override
|
||||
public String getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -88,16 +113,6 @@ public class Z3SummaryInformationPanel extends JPanel {
|
||||
public Object getValueOf(InformationRow row) {
|
||||
return getter.apply(row);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return visible;
|
||||
}
|
||||
}
|
||||
|
||||
protected static class InformationTableModel extends
|
||||
@@ -125,17 +140,6 @@ public class Z3SummaryInformationPanel extends JPanel {
|
||||
|
||||
filterPanel = new GhidraTableFilterPanel<>(table, model);
|
||||
add(filterPanel, BorderLayout.SOUTH);
|
||||
|
||||
TableColumnModel columnModel = table.getColumnModel();
|
||||
TableColumn kindCol = columnModel.getColumn(InformationTableColumns.KIND.ordinal());
|
||||
kindCol.setMaxWidth(40);
|
||||
kindCol.setMinWidth(40);
|
||||
TableColumn varCol = columnModel.getColumn(InformationTableColumns.VARIABLE.ordinal());
|
||||
varCol.setCellRenderer(new MonospaceCellRenderer());
|
||||
varCol.setPreferredWidth(20);
|
||||
TableColumn valCol = columnModel.getColumn(InformationTableColumns.VALUE.ordinal());
|
||||
valCol.setCellRenderer(new MonospaceCellRenderer());
|
||||
valCol.setPreferredWidth(60);
|
||||
}
|
||||
|
||||
public void setInformation(Stream<Entry<String, String>> valuations,
|
||||
|
||||
+54
-33
@@ -22,8 +22,6 @@ import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
|
||||
import docking.widgets.table.DefaultEnumeratedColumnProgramTableModel;
|
||||
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
|
||||
@@ -39,6 +37,7 @@ import ghidra.program.model.symbol.Equate;
|
||||
import ghidra.util.HTMLUtilities;
|
||||
import ghidra.util.WebColors;
|
||||
import ghidra.util.table.GhidraTableFilterPanel;
|
||||
import ghidra.util.table.column.GColumnRenderer;
|
||||
|
||||
public class Z3SummaryInstructionLogPanel extends JPanel {
|
||||
private static final Color COLOR_FOREGROUND_ADDRESS = new GColor("color.fg.listing.address");
|
||||
@@ -51,6 +50,9 @@ public class Z3SummaryInstructionLogPanel extends JPanel {
|
||||
private static final Color COLOR_FOREGROUND_VARIABLE =
|
||||
new GColor("color.fg.listing.function.variable");
|
||||
|
||||
private static final MonospaceCellRenderer MONO_RENDERER = new MonospaceCellRenderer();
|
||||
private static final HtmlCellRenderer HTML_RENDERER = new HtmlCellRenderer();
|
||||
|
||||
protected static String htmlColor(Color color, String display) {
|
||||
return String.format("<font color=\"%s\">%s</font>", WebColors.toString(color, false),
|
||||
HTMLUtilities.escapeHTML(display));
|
||||
@@ -58,22 +60,60 @@ public class Z3SummaryInstructionLogPanel extends JPanel {
|
||||
|
||||
protected enum InstructionLogTableColumns
|
||||
implements EnumeratedTableColumn<InstructionLogTableColumns, RecInstruction> {
|
||||
INDEX("Index", Integer.class, RecInstruction::index, true),
|
||||
THREAD("Thread", String.class, RecInstruction::getThreadName, true),
|
||||
ADDRESS("Address", Address.class, RecInstruction::getAddress, true),
|
||||
CODE("Instruction", String.class, InstructionLogTableColumns::getInstructionHtml, true),;
|
||||
INDEX("Index", Integer.class, RecInstruction::index) {
|
||||
@Override
|
||||
public int getMaxWidth() {
|
||||
return 30;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinWidth() {
|
||||
return 30;
|
||||
}
|
||||
},
|
||||
THREAD("Thread", String.class, RecInstruction::getThreadName) {
|
||||
@Override
|
||||
public int getMaxWidth() {
|
||||
return 30;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinWidth() {
|
||||
return 30;
|
||||
}
|
||||
},
|
||||
ADDRESS("Address", Address.class, RecInstruction::getAddress) {
|
||||
@Override
|
||||
public GColumnRenderer<?> getRenderer() {
|
||||
return MONO_RENDERER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPreferredWidth() {
|
||||
return 20;
|
||||
}
|
||||
},
|
||||
CODE("Instruction", String.class, InstructionLogTableColumns::getInstructionHtml) {
|
||||
@Override
|
||||
public GColumnRenderer<?> getRenderer() {
|
||||
return HTML_RENDERER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPreferredWidth() {
|
||||
return 40;
|
||||
}
|
||||
};
|
||||
|
||||
private final String header;
|
||||
private final Class<?> cls;
|
||||
private final Function<RecInstruction, ?> getter;
|
||||
private final boolean visible;
|
||||
|
||||
<T> InstructionLogTableColumns(String header, Class<T> cls,
|
||||
Function<RecInstruction, T> getter, boolean visible) {
|
||||
Function<RecInstruction, T> getter) {
|
||||
this.header = header;
|
||||
this.cls = cls;
|
||||
this.getter = getter;
|
||||
this.visible = visible;
|
||||
}
|
||||
|
||||
static String getInstructionHtml(RecInstruction op) {
|
||||
@@ -81,6 +121,11 @@ public class Z3SummaryInstructionLogPanel extends JPanel {
|
||||
return formatter.formatInstruction(op.instruction());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<?> getValueClass() {
|
||||
return cls;
|
||||
@@ -90,16 +135,6 @@ public class Z3SummaryInstructionLogPanel extends JPanel {
|
||||
public Object getValueOf(RecInstruction row) {
|
||||
return getter.apply(row);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return visible;
|
||||
}
|
||||
}
|
||||
|
||||
protected static class InstructionLogTableModel extends
|
||||
@@ -280,20 +315,6 @@ public class Z3SummaryInstructionLogPanel extends JPanel {
|
||||
filterPanel = new GhidraTableFilterPanel<>(table, model);
|
||||
add(filterPanel, BorderLayout.SOUTH);
|
||||
|
||||
TableColumnModel columnModel = table.getColumnModel();
|
||||
TableColumn indexCol = columnModel.getColumn(InstructionLogTableColumns.INDEX.ordinal());
|
||||
indexCol.setMaxWidth(30);
|
||||
indexCol.setMinWidth(30);
|
||||
TableColumn threadCol = columnModel.getColumn(InstructionLogTableColumns.THREAD.ordinal());
|
||||
threadCol.setMaxWidth(30);
|
||||
threadCol.setMinWidth(30);
|
||||
TableColumn addrCol = columnModel.getColumn(InstructionLogTableColumns.ADDRESS.ordinal());
|
||||
addrCol.setCellRenderer(new MonospaceCellRenderer());
|
||||
addrCol.setPreferredWidth(20);
|
||||
TableColumn codeCol = columnModel.getColumn(InstructionLogTableColumns.CODE.ordinal());
|
||||
codeCol.setCellRenderer(new HtmlCellRenderer());
|
||||
codeCol.setPreferredWidth(40);
|
||||
|
||||
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
||||
table.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
|
||||
+53
-26
@@ -22,8 +22,6 @@ import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
|
||||
import docking.widgets.table.DefaultEnumeratedColumnProgramTableModel;
|
||||
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
|
||||
@@ -44,6 +42,7 @@ import ghidra.program.model.pcode.PcodeOp;
|
||||
import ghidra.util.HTMLUtilities;
|
||||
import ghidra.util.WebColors;
|
||||
import ghidra.util.table.GhidraTableFilterPanel;
|
||||
import ghidra.util.table.column.GColumnRenderer;
|
||||
|
||||
public class Z3SummaryPcodeLogPanel extends JPanel {
|
||||
private static final Color COLOR_FOREGROUND_ADDRESS = new GColor("color.fg.listing.address");
|
||||
@@ -63,6 +62,9 @@ public class Z3SummaryPcodeLogPanel extends JPanel {
|
||||
private static final Color COLOR_FOREGROUND_USEROP =
|
||||
new GColor("color.fg.listing.pcode.userop");
|
||||
|
||||
private static final MonospaceCellRenderer MONO_RENDERER = new MonospaceCellRenderer();
|
||||
private static final HtmlCellRenderer HTML_RENDERER = new HtmlCellRenderer();
|
||||
|
||||
protected static String htmlColor(Color color, String display) {
|
||||
return String.format("<font color=\"%s\">%s</font>", WebColors.toString(color, false),
|
||||
HTMLUtilities.escapeHTML(display));
|
||||
@@ -70,11 +72,50 @@ public class Z3SummaryPcodeLogPanel extends JPanel {
|
||||
|
||||
protected enum PcodeLogTableColumns
|
||||
implements EnumeratedTableColumn<PcodeLogTableColumns, RecOp> {
|
||||
INDEX("Index", Integer.class, RecOp::index, true),
|
||||
THREAD("Thread", String.class, RecOp::getThreadName, true),
|
||||
ADDRESS("Address", Address.class, RecOp::getAddress, false),
|
||||
CODE("P-code", String.class, PcodeLogTableColumns::getPcodeHtml, true),
|
||||
;
|
||||
INDEX("Index", Integer.class, RecOp::index, true) {
|
||||
@Override
|
||||
public int getMaxWidth() {
|
||||
return 30;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinWidth() {
|
||||
return 30;
|
||||
}
|
||||
},
|
||||
THREAD("Thread", String.class, RecOp::getThreadName, true) {
|
||||
@Override
|
||||
public int getMaxWidth() {
|
||||
return 30;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinWidth() {
|
||||
return 30;
|
||||
}
|
||||
},
|
||||
ADDRESS("Address", Address.class, RecOp::getAddress, false) {
|
||||
@Override
|
||||
public GColumnRenderer<?> getRenderer() {
|
||||
return MONO_RENDERER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPreferredWidth() {
|
||||
return 20;
|
||||
}
|
||||
},
|
||||
CODE("P-code", String.class, PcodeLogTableColumns::getPcodeHtml, true) {
|
||||
@Override
|
||||
public GColumnRenderer<?> getRenderer() {
|
||||
return HTML_RENDERER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPreferredWidth() {
|
||||
return 40;
|
||||
}
|
||||
};
|
||||
|
||||
private final String header;
|
||||
private final Class<?> cls;
|
||||
@@ -94,6 +135,11 @@ public class Z3SummaryPcodeLogPanel extends JPanel {
|
||||
return formatter.formatOp(op.op());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<?> getValueClass() {
|
||||
return cls;
|
||||
@@ -104,11 +150,6 @@ public class Z3SummaryPcodeLogPanel extends JPanel {
|
||||
return getter.apply(row);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return visible;
|
||||
@@ -276,20 +317,6 @@ public class Z3SummaryPcodeLogPanel extends JPanel {
|
||||
filterPanel = new GhidraTableFilterPanel<>(table, model);
|
||||
add(filterPanel, BorderLayout.SOUTH);
|
||||
|
||||
TableColumnModel columnModel = table.getColumnModel();
|
||||
TableColumn indexCol = columnModel.getColumn(PcodeLogTableColumns.INDEX.ordinal());
|
||||
indexCol.setMaxWidth(30);
|
||||
indexCol.setMinWidth(30);
|
||||
TableColumn threadCol = columnModel.getColumn(PcodeLogTableColumns.THREAD.ordinal());
|
||||
threadCol.setMaxWidth(30);
|
||||
threadCol.setMinWidth(30);
|
||||
TableColumn addrCol = columnModel.getColumn(PcodeLogTableColumns.ADDRESS.ordinal());
|
||||
addrCol.setCellRenderer(new MonospaceCellRenderer());
|
||||
addrCol.setPreferredWidth(20);
|
||||
TableColumn codeCol = columnModel.getColumn(PcodeLogTableColumns.CODE.ordinal());
|
||||
codeCol.setCellRenderer(new HtmlCellRenderer());
|
||||
codeCol.setPreferredWidth(40);
|
||||
|
||||
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
||||
table.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user