X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Ftables%2Fmi%2FInstructionTable.java;h=25c0f7176d68d003846ce5736e7604bb9e51abf3;hb=648fc6e69e09fe4467cb6bac47934be1a7dcf0d6;hp=93179c08d43dcf91a170ce987a98e51cb74dd8be;hpb=76c2b3eab6cec47490bb75713356152deb5d07ed;p=Mograsim.git diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTable.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTable.java index 93179c08..25c0f717 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTable.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTable.java @@ -1,43 +1,85 @@ package net.mograsim.plugin.tables.mi; +import static net.mograsim.plugin.preferences.PluginPreferences.MPM_EDITOR_BITS_AS_COLUMN_NAME; + import java.util.Arrays; import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.ColumnViewerEditor; +import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent; +import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy; import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter; import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.TableViewerEditor; +import org.eclipse.jface.viewers.TableViewerFocusCellManager; import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.themes.IThemeManager; import net.mograsim.machine.mi.MicroInstructionDefinition; import net.mograsim.machine.mi.MicroInstructionMemory; import net.mograsim.machine.mi.parameters.MnemonicFamily; import net.mograsim.machine.mi.parameters.ParameterClassification; +import net.mograsim.plugin.MograsimActivator; import net.mograsim.plugin.tables.AddressLabelProvider; import net.mograsim.plugin.tables.DisplaySettings; import net.mograsim.plugin.tables.LazyTableViewer; public class InstructionTable { - protected DisplaySettings displaySettings; - protected LazyTableViewer viewer; + protected final DisplaySettings displaySettings; + protected final LazyTableViewer viewer; private TableViewerColumn[] columns = new TableViewerColumn[0]; private MicroInstructionDefinition miDef; private MicroInstructionMemory memory; private InstructionTableContentProvider provider; + private final RowHighlighter highlighter; + private final FontAndColorHelper cProv; + + private final boolean isEditable; - public InstructionTable(Composite parent, DisplaySettings displaySettings) + public InstructionTable(Composite parent, DisplaySettings displaySettings, IThemeManager themeManager) { - viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); + this(parent, displaySettings, themeManager, true); + } + + public InstructionTable(Composite parent, DisplaySettings displaySettings, IThemeManager themeManager, boolean allowEditing) + { + viewer = new LazyTableViewer(parent, SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); this.displaySettings = displaySettings; + this.cProv = new FontAndColorHelper(viewer, themeManager); + this.highlighter = new RowHighlighter(viewer, cProv); + this.isEditable = allowEditing; Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); viewer.setUseHashlookup(true); + table.addDisposeListener(e -> dispose()); + + TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(viewer, new FocusCellOwnerDrawHighlighter(viewer)); + + ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(viewer) + { + @Override + protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) + { + return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL + || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION + || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) + || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; + } + }; + int features = ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR + | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION; + TableViewerEditor.create(viewer, focusCellManager, actSupport, features); GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); viewerData.horizontalSpan = 3; @@ -54,12 +96,35 @@ public class InstructionTable private void createColumns() { + viewer.getTable().setVisible(false); + int size = miDef.size(); columns = new TableViewerColumn[size + 1]; - TableViewerColumn col = createTableViewerColumn("Address", generateLongestHexStrings(12)); + TableViewerColumn col = createTableViewerColumn("Address", null); columns[0] = col; - col.setLabelProvider(new AddressLabelProvider()); + col.setLabelProvider(new AddressLabelProvider() + { + @Override + public Color getBackground(Object element) + { + return cProv.getBackground(element, -1); + } + + @Override + public Color getForeground(Object element) + { + return cProv.getForeground(element, -1); + } + + @Override + public Font getFont(Object element) + { + return cProv.getFont(element, -1); + } + }); + + String[] columnTitles = new String[size]; int bit = miDef.sizeInBits(); ParameterClassification[] classes = miDef.getParameterClassifications(); @@ -68,8 +133,26 @@ public class InstructionTable { int startBit = bit - 1; int endBit = bit = bit - classes[i].getExpectedBits(); - String name = startBit == endBit ? Integer.toString(startBit) : startBit + "..." + endBit; + String columnTitle; + String bitString = startBit == endBit ? Integer.toString(startBit) : startBit + "..." + endBit; + // TODO add a listener + if (MograsimActivator.instance().getPluginPrefs().getBoolean(MPM_EDITOR_BITS_AS_COLUMN_NAME)) + columnTitle = bitString; + else + columnTitle = miDef.getParameterTitle(i).orElse(bitString); + columnTitles[i] = columnTitle; + String columnTooltip = miDef.getParameterDescription(i).orElse(null); + + col = createTableViewerColumn(columnTitle, columnTooltip); + columns[i + 1] = col; + createEditingAndLabel(col, miDef, i); + } + + calculateOptimalColumnSize(0, "Address", generateLongestHexStrings(12)); + + for (int i = 0; i < size; i++) + { String[] longestPossibleContents; switch (classes[i].getExpectedType()) { @@ -84,18 +167,20 @@ public class InstructionTable longestPossibleContents = new String[0]; break; } - - col = createTableViewerColumn(name, longestPossibleContents); - columns[i + 1] = col; - createEditingAndLabel(col, miDef, i); + calculateOptimalColumnSize(i + 1, columnTitles[i], longestPossibleContents); } + + viewer.getTable().setVisible(true); } public void bindMicroInstructionMemory(MicroInstructionMemory memory) { this.memory = memory; - this.miDef = memory.getDefinition().getMicroInstructionDefinition(); - setViewerInput(memory); + if (memory != null) + { + this.miDef = memory.getDefinition().getMicroInstructionDefinition(); + setViewerInput(memory); + } } private static final String[] HEX_DIGITS = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" }; @@ -113,30 +198,40 @@ public class InstructionTable switch (parameterClassification.getExpectedType()) { case BOOLEAN_IMMEDIATE: - support = new BooleanEditingSupport(viewer, miDef, index); - provider = new ParameterLabelProvider(index); + support = isEditable ? new BooleanEditingSupport(viewer, miDef, index) : null; + provider = new ParameterLabelProvider(cProv, index); break; case INTEGER_IMMEDIATE: - support = new IntegerEditingSupport(viewer, miDef, index, displaySettings, this.provider); - provider = new IntegerColumnLabelProvider(displaySettings, index); + support = isEditable ? new IntegerEditingSupport(viewer, miDef, index, displaySettings, this.provider) : null; + provider = new IntegerColumnLabelProvider(displaySettings, cProv, index); break; case MNEMONIC: - support = new MnemonicEditingSupport(viewer, miDef, index, this.provider); - provider = new ParameterLabelProvider(index); + support = isEditable ? new MnemonicEditingSupport(viewer, miDef, index, this.provider) : null; + provider = new ParameterLabelProvider(cProv, index); break; default: throw new IllegalStateException( "Unable to create EditingSupport for unknown ParameterType " + parameterClassification.getExpectedType()); } - col.setEditingSupport(support); + if (isEditable) + col.setEditingSupport(support); col.setLabelProvider(provider); - col.getColumn().setToolTipText(miDef.getParameterDescription(index).orElse("")); } - private TableViewerColumn createTableViewerColumn(String title, String... longestPossibleContents) + private TableViewerColumn createTableViewerColumn(String title, String toolTip) { TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); TableColumn column = viewerColumn.getColumn(); + column.setText(title); + column.setToolTipText(toolTip); + column.setResizable(true); + column.setMoveable(false); + return viewerColumn; + } + + private void calculateOptimalColumnSize(int i, String title, String... longestPossibleContents) + { + TableColumn column = viewer.getTable().getColumn(i); int maxWidth = 0; for (String s : longestPossibleContents) { @@ -149,9 +244,6 @@ public class InstructionTable column.pack(); if (column.getWidth() < maxWidth) column.setWidth(maxWidth); - column.setResizable(true); - column.setMoveable(false); - return viewerColumn; } public LazyTableViewer getTableViewer() @@ -181,4 +273,15 @@ public class InstructionTable { Display.getDefault().asyncExec(() -> viewer.refresh()); } + + private void dispose() + { + cProv.dispose(); + viewer.getTable().dispose(); + } + + public void highlight(int row) + { + highlighter.highlight(row); + } }