Completely changed the structure and switched to Eclipse Plugin.
[Mograsim.git] / net.mograsim.plugin.core / src / net / mograsim / plugin / MograsimPreview.java
1 package net.mograsim.plugin;\r
2 \r
3 import org.eclipse.swt.SWT;\r
4 import org.eclipse.swt.widgets.Composite;\r
5 import org.eclipse.ui.themes.ITheme;\r
6 import org.eclipse.ui.themes.IThemePreview;\r
7 \r
8 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;\r
9 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;\r
10 import net.mograsim.logic.core.timeline.Timeline;\r
11 import net.mograsim.logic.ui.LogicExecuter;\r
12 import net.mograsim.logic.ui.LogicUICanvas;\r
13 import net.mograsim.logic.ui.model.ViewModelModifiable;\r
14 import net.mograsim.logic.ui.model.components.GUIManualSwitch;\r
15 import net.mograsim.logic.ui.model.components.GUINotGate;\r
16 import net.mograsim.logic.ui.model.components.GUIOrGate;\r
17 import net.mograsim.logic.ui.model.wires.GUIWire;\r
18 import net.mograsim.logic.ui.model.wires.WireCrossPoint;\r
19 import net.mograsim.logic.ui.modeladapter.LogicModelParameters;\r
20 import net.mograsim.logic.ui.modeladapter.ViewLogicModelAdapter;\r
21 \r
22 public class MograsimPreview implements IThemePreview\r
23 {\r
24 \r
25         private LogicUICanvas ui;\r
26         private LogicExecuter exec;\r
27 \r
28         @Override\r
29         @SuppressWarnings("unused")\r
30         public void createControl(Composite parent, ITheme currentTheme)\r
31         {\r
32                 ViewModelModifiable model = new ViewModelModifiable();\r
33                 LogicModelParameters params = new LogicModelParameters();\r
34                 params.gateProcessTime = 50;\r
35                 params.wireTravelTime = 10;\r
36 \r
37                 GUIManualSwitch rIn = new GUIManualSwitch(model);\r
38                 rIn.moveTo(10, 10);\r
39                 GUIManualSwitch sIn = new GUIManualSwitch(model);\r
40                 sIn.moveTo(10, 70);\r
41 \r
42                 GUIOrGate or1 = new GUIOrGate(model, 1);\r
43                 or1.moveTo(70, 12.5);\r
44                 new GUIWire(model, rIn.getOutputPin(), or1.getPin("A"));\r
45 \r
46                 GUIOrGate or2 = new GUIOrGate(model, 1);\r
47                 or2.moveTo(70, 62.5);\r
48                 new GUIWire(model, sIn.getOutputPin(), or2.getPin("B"));\r
49 \r
50                 GUINotGate not1 = new GUINotGate(model, 1);\r
51                 not1.moveTo(110, 17.5);\r
52                 new GUIWire(model, or1.getPin("Y"), not1.getPin("A"));\r
53 \r
54                 GUINotGate not2 = new GUINotGate(model, 1);\r
55                 not2.moveTo(110, 67.5);\r
56                 new GUIWire(model, or2.getPin("Y"), not2.getPin("A"));\r
57 \r
58                 WireCrossPoint p1 = new WireCrossPoint(model, 1);\r
59                 p1.moveCenterTo(140, 22.5);\r
60                 new GUIWire(model, not1.getPin("Y"), p1);\r
61                 new GUIWire(model, p1, or2.getPin("A"), new Point(140, 35), new Point(50, 60), new Point(50, 67.5));\r
62 \r
63                 WireCrossPoint p2 = new WireCrossPoint(model, 1);\r
64                 p2.moveCenterTo(140, 72.5);\r
65                 new GUIWire(model, not2.getPin("Y"), p2);\r
66                 new GUIWire(model, p2, or1.getPin("B"), new Point(140, 60), new Point(50, 35), new Point(50, 27.5));\r
67 \r
68                 WireCrossPoint o1 = new WireCrossPoint(model, 1);\r
69                 o1.moveCenterTo(150, 22.5);\r
70                 new GUIWire(model, p1, o1);\r
71 \r
72                 WireCrossPoint o2 = new WireCrossPoint(model, 1);\r
73                 o2.moveCenterTo(150, 72.5);\r
74                 new GUIWire(model, p2, o2);\r
75 \r
76                 Timeline t = ViewLogicModelAdapter.convert(model, params);\r
77                 exec = new LogicExecuter(t);\r
78 \r
79                 rIn.clicked(0, 0);\r
80 \r
81                 ui = new LogicUICanvas(parent, SWT.NONE, model);\r
82                 ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);\r
83                 userInput.buttonDrag = 3;\r
84                 userInput.buttonZoom = 2;\r
85                 userInput.enableUserInput();\r
86                 update(currentTheme);\r
87                 currentTheme.getColorRegistry().addListener(e -> update(currentTheme));\r
88 \r
89                 ui.zoomSteps(12, 10, 10);\r
90                 exec.startLiveExecution();\r
91         }\r
92 \r
93         private void update(ITheme currentTheme)\r
94         {\r
95                 ui.setBackground(currentTheme.getColorRegistry().get("net.mograsim.plugin.sim_backgound"));\r
96                 ui.setForeground(currentTheme.getColorRegistry().get("net.mograsim.plugin.sim_text_color"));\r
97         }\r
98 \r
99         @Override\r
100         public void dispose()\r
101         {\r
102                 exec.stopLiveExecution();\r
103         }\r
104 }\r