Made formatting uniform - commit for logicui
[Mograsim.git] / LogicUI / src / era / mi / gui / wires / GUIWire.java
1 package era.mi.gui.wires;\r
2 \r
3 import java.util.Objects;\r
4 \r
5 import org.eclipse.swt.SWT;\r
6 import org.eclipse.swt.graphics.Color;\r
7 \r
8 import era.mi.gui.components.BasicGUIComponent;\r
9 import era.mi.logic.Bit;\r
10 import era.mi.logic.wires.WireArray;\r
11 import net.haspamelodica.swt.helper.gcs.GeneralGC;\r
12 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;\r
13 \r
14 public class GUIWire\r
15 {\r
16         private final WireArray wa;\r
17         private final double[] path;\r
18 \r
19         public GUIWire(Runnable redraw, BasicGUIComponent component1, int component1ConnectionIndex, Point component1Pos,\r
20                         BasicGUIComponent component2, int component2ConnectionIndex, Point component2Pos, Point... path)\r
21         {\r
22                 this.wa = component1.getConnectedWireArray(component1ConnectionIndex);\r
23                 if (!Objects.equals(wa, component2.getConnectedWireArray(component2ConnectionIndex)))\r
24                         throw new IllegalArgumentException("Given connection points are not connected!");\r
25                 this.path = new double[path.length * 2 + 4];\r
26                 Point component1ConnectionPoint = component1.getWireArrayConnectionPoint(component1ConnectionIndex);\r
27                 this.path[0] = component1Pos.x + component1ConnectionPoint.x;\r
28                 this.path[1] = component1Pos.y + component1ConnectionPoint.y;\r
29                 for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2)\r
30                 {\r
31                         this.path[dstI + 0] = path[srcI].x;\r
32                         this.path[dstI + 1] = path[srcI].y;\r
33                 }\r
34                 Point component2ConnectionPoint = component2.getWireArrayConnectionPoint(component2ConnectionIndex);\r
35                 this.path[this.path.length - 2] = component2Pos.x + component2ConnectionPoint.x;\r
36                 this.path[this.path.length - 1] = component2Pos.y + component2ConnectionPoint.y;\r
37 \r
38                 wa.addObserver((initiator, oldValues) -> redraw.run());\r
39         }\r
40 \r
41         public void render(GeneralGC gc)\r
42         {\r
43                 Color oldFG = gc.getForeground();\r
44                 if (wa.length == 1)\r
45                         gc.setForeground(gc.getDevice().getSystemColor(getSWTColorConstantForBit(wa.getValue())));\r
46                 gc.drawPolyline(path);\r
47                 gc.setForeground(oldFG);\r
48         }\r
49 \r
50         public static int getSWTColorConstantForBit(Bit bit)\r
51         {\r
52                 switch (bit)\r
53                 {\r
54                 case ONE:\r
55                         return SWT.COLOR_GREEN;\r
56                 case ZERO:\r
57                         return SWT.COLOR_BLUE;\r
58                 case Z:\r
59                         return SWT.COLOR_BLACK;\r
60                 case U:\r
61                 case X:\r
62                         return SWT.COLOR_RED;\r
63                 default:\r
64                         throw new IllegalArgumentException("Unknown enum constant: " + bit);\r
65                 }\r
66         }\r
67 }