import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.part.EditorPart;
import net.mograsim.machine.Memory.MemoryCellModifiedListener;
+import net.mograsim.machine.mi.AssignableMicroInstructionMemory.MIMemoryReassignedListener;
import net.mograsim.machine.mi.MicroInstructionMemory;
import net.mograsim.machine.mi.MicroInstructionMemory.ActiveMicroInstructionChangedListener;
import net.mograsim.machine.mi.MicroInstructionMemoryParseException;
import net.mograsim.plugin.nature.MachineContext;
import net.mograsim.plugin.nature.ProjectMachineContext;
import net.mograsim.plugin.tables.DisplaySettings;
-import net.mograsim.plugin.tables.LazyTableViewer;
import net.mograsim.plugin.tables.RadixSelector;
public class InstructionView extends EditorPart implements MemoryCellModifiedListener, ActiveMicroInstructionChangedListener
{
private InstructionTableContentProvider provider;
- private int highlighted = 0;
private boolean dirty = false;
private MicroInstructionMemory memory;
private InstructionTable table;
private MachineContext context;
+ private RowHighlighter highlighter;
@SuppressWarnings("unused")
@Override
new RadixSelector(parent, displaySettings);
addActivationButton(parent);
-
- table = new InstructionTable(parent, displaySettings);
+ table = new InstructionTable(parent, displaySettings, getSite().getWorkbenchWindow().getWorkbench().getThemeManager());
table.setContentProvider(provider);
table.bindMicroInstructionMemory(memory);
GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
viewerData.horizontalSpan = 3;
table.getTableViewer().getTable().setLayoutData(viewerData);
+ highlighter = new RowHighlighter(table.getTableViewer());
}
public void highlight(int index)
{
- Display.getDefault().asyncExec(() ->
- {
- LazyTableViewer viewer = table.getTableViewer();
- viewer.highlightRow(highlighted, false);
- highlighted = index;
- viewer.highlightRow(index, true);
- viewer.getTable().showItem(viewer.getTable().getItem(Math.min((int) memory.getDefinition().getMaximalAddress(), index + 2)));
- viewer.getTable().showItem(viewer.getTable().getItem(index));
- });
+ highlighter.highlight(index);
}
private void addActivationButton(Composite parent)
{
Button activationButton = new Button(parent, SWT.PUSH);
activationButton.setText("Set Active");
- activationButton.addListener(SWT.Selection,
- e -> context.getActiveMachine().ifPresent(m -> m.getMicroInstructionMemory().bind(memory)));
+ activationButton.addListener(SWT.Selection, e -> context.getActiveMachine().ifPresent(m ->
+ {
+ // clear highlighting if the memory is reassigned
+ MIMemoryReassignedListener memReassignedListener = n ->
+ {
+ if (n != memory)
+ highlight(-1);
+ };
+ m.getMicroInstructionMemory().registerMemoryReassignedListener(memReassignedListener);
+ // clear highlighting if the active machine changes
+ context.addActiveMachineListener(n ->
+ {
+ if (n.isEmpty() || n.get() != m)
+ {
+ highlight(-1);
+ m.getMicroInstructionMemory().deregisterMemoryReassignedListener(memReassignedListener);
+ }
+ });
+ m.getMicroInstructionMemory().bind(memory);
+ }));
}
public void bindMicroInstructionMemory(MicroInstructionMemory memory)
{
highlight((int) (address - memory.getDefinition().getMinimalAddress()));
}
+
+ @Override
+ public void dispose()
+ {
+ table.dispose();
+ super.dispose();
+ }
}