Implemented GUISplitter and GUIMerger
[Mograsim.git] / LogicUI / src / LogicUI.java
1 import java.util.HashMap;\r
2 import java.util.HashSet;\r
3 import java.util.Map;\r
4 import java.util.Set;\r
5 \r
6 import org.eclipse.swt.SWT;\r
7 import org.eclipse.swt.layout.FillLayout;\r
8 import org.eclipse.swt.widgets.Display;\r
9 import org.eclipse.swt.widgets.Shell;\r
10 \r
11 import era.mi.components.gui.BasicGUIComponent;\r
12 import era.mi.components.gui.GUIMerger;\r
13 import era.mi.components.gui.GUIMux;\r
14 import era.mi.components.gui.GUISplitter;\r
15 import era.mi.logic.Simulation;\r
16 import era.mi.logic.components.gates.AndGate;\r
17 import era.mi.logic.components.gates.NotGate;\r
18 import era.mi.logic.wires.WireArray;\r
19 import net.haspamelodica.swt.helper.gcs.GeneralGC;\r
20 import net.haspamelodica.swt.helper.gcs.TranslatedGC;\r
21 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;\r
22 import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas;\r
23 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay;\r
24 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;\r
25 \r
26 public class LogicUI\r
27 {\r
28         private final Display                                           display;\r
29         private final Shell                                                     shell;\r
30         private final Set<BasicGUIComponent>            components;\r
31         private final Map<BasicGUIComponent, Point>     componentPositions;\r
32 \r
33         public LogicUI()\r
34         {\r
35                 display = new Display();\r
36                 shell = new Shell(display);\r
37                 shell.setLayout(new FillLayout());\r
38                 ZoomableCanvas canvas = new ZoomableCanvas(shell, SWT.NONE);\r
39 \r
40                 components = new HashSet<>();\r
41                 componentPositions = new HashMap<>();\r
42                 initComponents();\r
43 \r
44                 canvas.addZoomedRenderer(gc -> components.forEach(component -> drawComponent(gc, component)));\r
45                 new ZoomableCanvasUserInput(canvas).enableUserInput();\r
46                 new ZoomableCanvasOverlay(canvas, null).enableScale();\r
47         }\r
48         private void initComponents()\r
49         {\r
50                 Simulation.TIMELINE.reset();\r
51                 WireArray a = new WireArray(1, 1), b = new WireArray(1, 1), c = new WireArray(1, 10), d = new WireArray(2, 1), e = new WireArray(1, 1),\r
52                                 f = new WireArray(1, 1), g = new WireArray(1, 1), h = new WireArray(2, 1), i = new WireArray(2, 1), j = new WireArray(1, 1), k = new WireArray(1, 1);\r
53                 new AndGate(1, f, a, b);\r
54                 new NotGate(1, f, g);\r
55                 addComponent(new GUIMerger(h, c, g), 70, 10);\r
56                 addComponent(new GUIMux(1, i, e, h, d), 10, 10);\r
57                 addComponent(new GUISplitter(i, k, j), 40, 10);\r
58         }\r
59         private void addComponent(BasicGUIComponent component, double x, double y)\r
60         {\r
61                 components.add(component);\r
62                 componentPositions.put(component, new Point(x, y));\r
63         }\r
64         private void drawComponent(GeneralGC gc, BasicGUIComponent component)\r
65         {\r
66                 TranslatedGC tgc = new TranslatedGC(gc, componentPositions.get(component));\r
67                 component.render(tgc);\r
68                 tgc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));\r
69                 for(int i = 0; i < component.getConnectedWireArraysCount(); i ++)\r
70                 {\r
71                         Point connectionPoint = component.getWireArrayConnectionPoint(i);\r
72                         if(connectionPoint != null)\r
73                                 tgc.fillOval(connectionPoint.x - 2, connectionPoint.y - 2, 4, 4);\r
74                 }\r
75         }\r
76         public void run()\r
77         {\r
78                 shell.open();\r
79                 while(!shell.isDisposed())\r
80                         if(!display.readAndDispatch())\r
81                                 display.sleep();\r
82         }\r
83 \r
84         public static void main(String[] args)\r
85         {\r
86                 new LogicUI().run();\r
87         }\r
88 }