Further improvements in LogicUI:
[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.GUIMux;\r
13 import era.mi.logic.Simulation;\r
14 import era.mi.logic.components.Merger;\r
15 import era.mi.logic.components.Splitter;\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                 new Merger(h, c, g);\r
56                 addComponent(new GUIMux(1, i, e, h, d), 10, 10);\r
57                 addComponent(new GUIMux(1, a, new WireArray(10, 1), a, b, e, f), 100, 100);\r
58                 new Splitter(i, k, j);\r
59         }\r
60         private void addComponent(BasicGUIComponent component, double x, double y)\r
61         {\r
62                 components.add(component);\r
63                 componentPositions.put(component, new Point(x, y));\r
64         }\r
65         private void drawComponent(GeneralGC gc, BasicGUIComponent component)\r
66         {\r
67                 TranslatedGC tgc = new TranslatedGC(gc, componentPositions.get(component));\r
68                 component.render(tgc);\r
69                 tgc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));\r
70                 for(int i = 0; i < component.getConnectedWireArraysCount(); i ++)\r
71                 {\r
72                         Point connectionPoint = component.getWireArrayConnectionPoint(i);\r
73                         if(connectionPoint != null)\r
74                                 tgc.fillOval(connectionPoint.x - 2, connectionPoint.y - 2, 4, 4);\r
75                 }\r
76         }\r
77         public void run()\r
78         {\r
79                 shell.open();\r
80                 while(!shell.isDisposed())\r
81                         if(!display.readAndDispatch())\r
82                                 display.sleep();\r
83         }\r
84 \r
85         public static void main(String[] args)\r
86         {\r
87                 new LogicUI().run();\r
88         }\r
89 }