49c6fa435ee1396034ea17a190345bca1c7f3cb7
[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.layout.GridData;
8 import org.eclipse.swt.layout.GridLayout;
9 import org.eclipse.swt.widgets.Composite;
10 import org.eclipse.ui.PlatformUI;
11 import org.eclipse.ui.part.ViewPart;
12
13 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
14 import net.mograsim.logic.model.LogicExecuter;
15 import net.mograsim.logic.model.LogicUICanvas;
16 import net.mograsim.machine.Machine;
17 import net.mograsim.machine.mi.AssignableMicroInstructionMemory;
18 import net.mograsim.plugin.EclipsePreferences;
19 import net.mograsim.plugin.MachineContext;
20 import net.mograsim.plugin.MograsimActivator;
21 import net.mograsim.plugin.tables.DisplaySettings;
22 import net.mograsim.plugin.tables.mi.ActiveInstructionPreviewContentProvider;
23 import net.mograsim.plugin.tables.mi.InstructionTable;
24 import net.mograsim.preferences.Preferences;
25
26 public class LogicUIPart extends ViewPart
27 {
28         @Inject
29         private MPart part;
30
31         private LogicExecuter exec;
32         private LogicUICanvas ui;
33
34         @Override
35         public void dispose()
36         {
37                 if (exec != null)
38                         exec.stopLiveExecution();
39         }
40
41         @Override
42         public void createPartControl(Composite parent)
43         {
44                 // set preferences
45                 Preferences.setPreferences(new EclipsePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(),
46                                 MograsimActivator.instance().getPreferenceStore()));
47
48                 Machine m = MachineContext.getInstance().getMachine();
49
50                 // initialize UI
51                 GridLayout layout = new GridLayout(1, true);
52                 parent.setLayout(layout);
53
54                 ui = new LogicUICanvas(parent, SWT.NONE, m.getModel());
55                 ui.addTransformListener((x, y, z) -> part.setDirty(z < 1));
56                 ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
57                 userInput.buttonDrag = 3;
58                 userInput.buttonZoom = 2;
59                 userInput.enableUserInput();
60
61                 GridData uiData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
62                 ui.setLayoutData(uiData);
63
64                 // initialize Instruction preview
65                 InstructionTable instPreview = new InstructionTable(parent, new DisplaySettings());
66                 instPreview.setContentProvider(new ActiveInstructionPreviewContentProvider(instPreview.getTableViewer()));
67                 AssignableMicroInstructionMemory mIMemory = m.getMicroInstructionMemory();
68                 instPreview.bindMicroInstructionMemory(mIMemory);
69                 mIMemory.registerCellModifiedListener(a -> instPreview.refresh());
70                 mIMemory.registerMemoryReassignedListener(n -> instPreview.refresh());
71
72                 GridData previewData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
73                 instPreview.getTableViewer().getTable().setLayoutData(previewData);
74
75                 // initialize executer
76                 exec = new LogicExecuter(m.getTimeline());
77
78                 // run it
79                 exec.startLiveExecution();
80         }
81
82         @Override
83         public void setFocus()
84         {
85                 ui.setFocus();
86         }
87 }