8825ba98c4e7deebb0cf866ff1a2753ca2510828
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / views / LogicUIPart.java
1 package net.mograsim.plugin.views;
2
3 import javax.inject.Inject;
4
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;
17
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;
30
31 public class LogicUIPart extends ViewPart
32 {
33         @Inject
34         private MPart part;
35
36         private LogicExecuter exec;
37         private LogicUICanvas ui;
38
39         @Override
40         public void dispose()
41         {
42                 if (exec != null)
43                         exec.stopLiveExecution();
44                 super.dispose();
45         }
46
47         @Override
48         public void createPartControl(Composite parent)
49         {
50                 // set preferences
51                 Preferences.setPreferences(new EclipsePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(),
52                                 MograsimActivator.instance().getPreferenceStore()));
53
54                 Machine m = MachineContext.getInstance().getMachine();
55
56                 // initialize UI
57                 GridLayout layout = new GridLayout(1, true);
58                 parent.setLayout(layout);
59
60                 addSimulationControlWidgets(parent);
61
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();
68
69                 GridData uiData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
70                 ui.setLayoutData(uiData);
71
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());
79
80                 GridData previewData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
81                 instPreview.getTableViewer().getTable().setLayoutData(previewData);
82
83                 // initialize executer
84                 exec = new LogicExecuter(m.getTimeline());
85
86                 // run it
87                 exec.startLiveExecution();
88         }
89
90         private void addSimulationControlWidgets(Composite parent)
91         {
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);
97
98                 pauseButton.addListener(SWT.Selection, e ->
99                 {
100                         setPauseText(pauseButton, false);
101                         if (pauseButton.getSelection())
102                         {
103                                 exec.unpauseLiveExecution();
104                         } else
105                         {
106                                 exec.pauseLiveExecution();
107                         }
108                 });
109                 pauseButton.addMouseTrackListener(new MouseTrackListener()
110                 {
111                         @Override
112                         public void mouseHover(MouseEvent e)
113                         {
114                                 // nothing
115                         }
116
117                         @Override
118                         public void mouseExit(MouseEvent e)
119                         {
120                                 setPauseText(pauseButton, false);
121                         }
122
123                         @Override
124                         public void mouseEnter(MouseEvent e)
125                         {
126                                 setPauseText(pauseButton, true);
127                         }
128                 });
129
130                 Label speedLabel = new Label(c, SWT.NONE);
131                 speedLabel.setText("Simulation Speed: ");
132
133                 Slider slider = new Slider(c, SWT.NONE);
134                 slider.setMinimum(1);
135                 slider.setMaximum(100 + slider.getThumb());
136                 slider.setIncrement(1);
137
138                 Label speedPercentageLabel = new Label(c, SWT.NONE);
139                 speedPercentageLabel.setText("100%");
140
141                 slider.addListener(SWT.Selection, e ->
142                 {
143                         int selection = slider.getSelection();
144                         speedPercentageLabel.setText(selection + "%");
145
146                         exec.setSpeedPercentage(slider.getSelection());
147                 });
148                 slider.setSelection(100);
149
150                 c.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
151                 c.pack();
152                 c.setVisible(true);
153         }
154
155         private void setPauseText(Button pauseButton, boolean hovered)
156         {
157                 if (hovered)
158                 {
159                         if (pauseButton.getSelection())
160                         {
161                                 pauseButton.setText("Pause?");
162                         } else
163                         {
164                                 pauseButton.setText("Resume?");
165                         }
166                 } else
167                 {
168                         if (pauseButton.getSelection())
169                         {
170                                 pauseButton.setText("Running");
171                         } else
172                         {
173                                 pauseButton.setText("Paused");
174                         }
175                 }
176         }
177
178         @Override
179         public void setFocus()
180         {
181                 ui.setFocus();
182         }
183 }