GP-6396: Fix loss of renderers, editors, widths in Debugger table columns.

This commit is contained in:
Dan
2026-03-11 12:46:52 +00:00
parent 5ca5bf40f0
commit c063668d11
34 changed files with 1815 additions and 1085 deletions
@@ -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,
@@ -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
@@ -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