package net.mograsim.plugin.views;
+import static net.mograsim.logic.model.preferences.RenderPreferences.DRAG_BUTTON;
+import static net.mograsim.logic.model.preferences.RenderPreferences.ZOOM_BUTTON;
+import static net.mograsim.plugin.preferences.PluginPreferences.SIMULATION_SPEED_PRECISION;
+
import java.util.HashSet;
+import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
import org.eclipse.debug.ui.contexts.IDebugContextManager;
import org.eclipse.debug.ui.contexts.IDebugContextService;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import net.mograsim.logic.core.LogicObserver;
import net.mograsim.logic.core.components.CoreClock;
import net.mograsim.logic.model.LogicUICanvas;
+import net.mograsim.logic.model.preferences.RenderPreferences;
import net.mograsim.machine.Machine;
import net.mograsim.machine.Memory.MemoryCellModifiedListener;
import net.mograsim.machine.mi.AssignableMicroInstructionMemory;
+import net.mograsim.plugin.MograsimActivator;
+import net.mograsim.plugin.launch.MachineDebugContextListener;
import net.mograsim.plugin.launch.MachineDebugTarget;
import net.mograsim.plugin.tables.DisplaySettings;
import net.mograsim.plugin.tables.mi.ActiveInstructionPreviewContentProvider;
import net.mograsim.plugin.tables.mi.InstructionTable;
import net.mograsim.plugin.util.OverlappingFillLayout;
-import net.mograsim.preferences.Preferences;
public class SimulationView extends ViewPart
{
private static final double SIM_SPEED_SCALE_STEP_FACTOR_LOG = Math.log(SIM_SPEED_SCALE_STEP_FACTOR);
private final Set<Control> controlsToDisableWhenNoMachinePresent;
+ private Button sbseButton;
private Scale simSpeedScale;
private DoubleInput simSpeedInput;
private Composite contextDependentControlsParent;
private final MemoryCellModifiedListener memCellListener;
private final LogicObserver clockObserver;
- private final IDebugContextListener debugContextListener;
+ private final MachineDebugContextListener debugContextListener;
private final Consumer<Double> executionSpeedListener;
public SimulationView()
{
controlsToDisableWhenNoMachinePresent = new HashSet<>();
memCellListener = a -> instPreview.refresh();
- // TODO could this be a breakpoint?
+ // TODO use Step Over instead
clockObserver = o ->
{
if (((CoreClock) o).isOn())
SafeRunner.run(() -> debugTarget.suspend());
};
- debugContextListener = e -> debugContextChanged(e.getContext());
+ debugContextListener = new MachineDebugContextListener()
+ {
+ @Override
+ public void machineDebugContextChanged(Optional<MachineDebugTarget> oldTarget, Optional<MachineDebugTarget> newTarget)
+ {
+ SimulationView.this.debugContextChanged(newTarget);
+ }
+ };
executionSpeedListener = this::speedFactorChanged;
}
IDebugContextManager debugCManager = DebugUITools.getDebugContextManager();
IDebugContextService contextService = debugCManager.getContextService(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
contextService.addDebugContextListener(debugContextListener);
- debugContextChanged(contextService.getActiveContext());
+ debugContextListener.debugContextChanged(contextService.getActiveContext());
}
private void addSimulationControlWidgets(Composite parent)
c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
c.setLayout(new GridLayout(7, false));
- Button sbseButton = new Button(c, SWT.CHECK);
+ sbseButton = new Button(c, SWT.CHECK);
controlsToDisableWhenNoMachinePresent.add(sbseButton);
sbseButton.setText("Step by step execution");
simSpeedInput = new DoubleInput(c, SWT.NONE);
controlsToDisableWhenNoMachinePresent.add(simSpeedInput);
- simSpeedInput.setPrecision(Preferences.current().getInt("net.mograsim.plugin.core.simspeedprecision"));
+ // TODO add a listener
+ simSpeedInput.setPrecision(MograsimActivator.instance().getPluginPrefs().getInt(SIMULATION_SPEED_PRECISION));
simSpeedInput.addChangeListener(speed ->
{
if (speed != 0)
private void addInstructionPreviewControlWidgets(Composite parent)
{
- instPreview = new InstructionTable(parent, new DisplaySettings(), getSite().getWorkbenchWindow().getWorkbench().getThemeManager());
+ instPreview = new InstructionTable(parent, new DisplaySettings(), getSite().getWorkbenchWindow().getWorkbench().getThemeManager(),
+ false);
instPreview.getTableViewer().getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
contentProvider = new ActiveInstructionPreviewContentProvider(instPreview.getTableViewer());
instPreview.setContentProvider(contentProvider);
}
- private void debugContextChanged(ISelection selection)
+ private void debugContextChanged(Optional<MachineDebugTarget> newTarget)
{
- if (selection != null && selection instanceof TreeSelection)
- {
- TreeSelection treeSelection = (TreeSelection) selection;
- Object[] selectedElements = treeSelection.toArray();
- for (Object selectedElement : selectedElements)
- {
- IDebugTarget debugTarget;
- if (selectedElement instanceof IDebugElement)
- debugTarget = ((IDebugElement) selectedElement).getDebugTarget();
- else if (selectedElement instanceof ILaunch)
- debugTarget = ((ILaunch) selectedElement).getDebugTarget();
- else
- continue;
- if (!(debugTarget instanceof MachineDebugTarget))
- continue;
- if (debugTarget.isTerminated())
- continue;
- // we found a selected MachineDebugTarget
- if (this.debugTarget != debugTarget)
- bindToDebugTarget((MachineDebugTarget) debugTarget);
- return;
- }
- }
- // we didn't find a selected MachineDebugTarget
- // call binToDebugTarget even if this.debugTarget==null
- bindToDebugTarget(null);
+ // call binToDebugTarget even if we didn't find a selected MachineDebugTarget
+ bindToDebugTarget(newTarget.orElse(null));
}
private void bindToDebugTarget(MachineDebugTarget debugTarget)
{
+ deregisterMachineDependentListeners();
this.debugTarget = debugTarget;
if (canvasParent == null)
double offX;
double offY;
double zoom;
- deregisterMachineDependentListeners();
if (canvas != null)
{
offX = canvas.getOffX();
Machine machine = debugTarget.getMachine();
- canvas = new LogicUICanvas(canvasParent, SWT.NONE, machine.getModel());
+ RenderPreferences renderPrefs = MograsimActivator.instance().getRenderPrefs();
+ canvas = new LogicUICanvas(canvasParent, SWT.NONE, machine.getModel(), renderPrefs);
canvas.addListener(SWT.MouseDown, e -> canvas.setFocus());
ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(canvas);
- userInput.buttonDrag = Preferences.current().getInt("net.mograsim.logic.model.button.drag");
- userInput.buttonZoom = Preferences.current().getInt("net.mograsim.logic.model.button.zoom");
+ // TODO add a listener
+ userInput.buttonDrag = renderPrefs.getInt(DRAG_BUTTON);
+ // TODO add a listener
+ userInput.buttonZoom = renderPrefs.getInt(ZOOM_BUTTON);
userInput.enableUserInput();
if (zoom > 0)
{
debugTarget.removeExecutionSpeedListener(executionSpeedListener);
debugTarget.getMachine().getMicroInstructionMemory().deregisterCellModifiedListener(memCellListener);
debugTarget.getMachine().getClock().deregisterObserver(clockObserver);
+ if (sbseButton != null && !sbseButton.isDisposed())
+ sbseButton.setSelection(false);
}
}
public void dispose()
{
deregisterMachineDependentListeners();
+ contentProvider.setMachine(null);
DebugUITools.getDebugContextManager().removeDebugContextListener(debugContextListener);
super.dispose();
}