1 package net.mograsim.plugin.views;
3 import javax.inject.Inject;
5 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
6 import org.eclipse.swt.SWT;
7 import org.eclipse.swt.events.MouseEvent;
8 import org.eclipse.swt.events.MouseTrackListener;
9 import org.eclipse.swt.layout.GridData;
10 import org.eclipse.swt.layout.GridLayout;
11 import org.eclipse.swt.widgets.Button;
12 import org.eclipse.swt.widgets.Composite;
13 import org.eclipse.swt.widgets.Label;
14 import org.eclipse.swt.widgets.Slider;
15 import org.eclipse.ui.PlatformUI;
16 import org.eclipse.ui.part.ViewPart;
18 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
19 import net.mograsim.logic.model.LogicExecuter;
20 import net.mograsim.logic.model.LogicUICanvas;
21 import net.mograsim.machine.Machine;
22 import net.mograsim.machine.mi.AssignableMicroInstructionMemory;
23 import net.mograsim.plugin.EclipsePreferences;
24 import net.mograsim.plugin.MachineContext;
25 import net.mograsim.plugin.MograsimActivator;
26 import net.mograsim.plugin.tables.DisplaySettings;
27 import net.mograsim.plugin.tables.mi.ActiveInstructionPreviewContentProvider;
28 import net.mograsim.plugin.tables.mi.InstructionTable;
29 import net.mograsim.preferences.Preferences;
31 public class LogicUIPart extends ViewPart
36 private LogicExecuter exec;
37 private LogicUICanvas ui;
43 exec.stopLiveExecution();
48 public void createPartControl(Composite parent)
51 Preferences.setPreferences(new EclipsePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(),
52 MograsimActivator.instance().getPreferenceStore()));
54 Machine m = MachineContext.getInstance().getMachine();
57 GridLayout layout = new GridLayout(1, true);
58 parent.setLayout(layout);
60 addSimulationControlWidgets(parent);
62 ui = new LogicUICanvas(parent, SWT.NONE, m.getModel());
63 ui.addTransformListener((x, y, z) -> part.setDirty(z < 1));
64 ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
65 userInput.buttonDrag = 3;
66 userInput.buttonZoom = 2;
67 userInput.enableUserInput();
69 GridData uiData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
70 ui.setLayoutData(uiData);
72 // initialize Instruction preview
73 InstructionTable instPreview = new InstructionTable(parent, new DisplaySettings());
74 instPreview.setContentProvider(new ActiveInstructionPreviewContentProvider(instPreview.getTableViewer()));
75 AssignableMicroInstructionMemory mIMemory = m.getMicroInstructionMemory();
76 instPreview.bindMicroInstructionMemory(mIMemory);
77 mIMemory.registerCellModifiedListener(a -> instPreview.refresh());
78 mIMemory.registerMemoryReassignedListener(n -> instPreview.refresh());
80 GridData previewData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
81 instPreview.getTableViewer().getTable().setLayoutData(previewData);
83 // initialize executer
84 exec = new LogicExecuter(m.getTimeline());
87 exec.startLiveExecution();
90 private void addSimulationControlWidgets(Composite parent)
92 Composite c = new Composite(parent, SWT.NONE);
93 c.setLayout(new GridLayout(4, false));
94 Button pauseButton = new Button(c, SWT.TOGGLE);
95 pauseButton.setSelection(true);
96 setPauseText(pauseButton, false);
98 pauseButton.addListener(SWT.Selection, e ->
100 setPauseText(pauseButton, false);
101 if (pauseButton.getSelection())
103 exec.unpauseLiveExecution();
106 exec.pauseLiveExecution();
109 pauseButton.addMouseTrackListener(new MouseTrackListener()
112 public void mouseHover(MouseEvent e)
118 public void mouseExit(MouseEvent e)
120 setPauseText(pauseButton, false);
124 public void mouseEnter(MouseEvent e)
126 setPauseText(pauseButton, true);
130 Label speedLabel = new Label(c, SWT.NONE);
131 speedLabel.setText("Simulation Speed: ");
133 Slider slider = new Slider(c, SWT.NONE);
134 slider.setMinimum(1);
135 slider.setMaximum(100 + slider.getThumb());
136 slider.setIncrement(1);
138 Label speedPercentageLabel = new Label(c, SWT.NONE);
139 speedPercentageLabel.setText("100%");
141 slider.addListener(SWT.Selection, e ->
143 int selection = slider.getSelection();
144 speedPercentageLabel.setText(selection + "%");
146 exec.setSpeedPercentage(slider.getSelection());
148 slider.setSelection(100);
150 c.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
155 private void setPauseText(Button pauseButton, boolean hovered)
159 if (pauseButton.getSelection())
161 pauseButton.setText("Pause?");
164 pauseButton.setText("Resume?");
168 if (pauseButton.getSelection())
170 pauseButton.setText("Running");
173 pauseButton.setText("Paused");
179 public void setFocus()