8ecf1c459309751a50a7ffc0b5e2483119bbb1fa
[Mograsim.git] / LogicUI / src / era / mi / gui / model / wires / GUIWire.java
1 package era.mi.gui.model.wires;
2
3 import org.eclipse.swt.SWT;
4 import org.eclipse.swt.graphics.Color;
5
6 import era.mi.gui.model.ViewModel;
7 import era.mi.logic.types.Bit;
8 import era.mi.logic.wires.Wire;
9 import net.haspamelodica.swt.helper.gcs.GeneralGC;
10 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
11
12 public class GUIWire
13 {
14         private final ViewModel model;
15         private Pin pin1;
16         private Pin pin2;
17         private double[] path;
18
19         private Wire wire;
20
21         public GUIWire(ViewModel model, Pin pin1, Pin pin2, Point... path)
22         {
23                 this.model = model;
24                 this.path = new double[path.length * 2 + 4];
25                 for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2)
26                 {
27                         this.path[dstI + 0] = path[srcI].x;
28                         this.path[dstI + 1] = path[srcI].y;
29                 }
30
31                 this.pin1 = pin1;
32                 this.pin2 = pin2;
33
34                 pin1.addPinMovedListener(p -> pin1Moved());
35                 pin2.addPinMovedListener(p -> pin2Moved());
36                 pin1Moved();
37                 pin2Moved();
38
39                 model.wireCreated(this);
40         }
41
42         private void pin1Moved()
43         {
44                 Point pos = pin1.getPos();
45                 this.path[0] = pos.x;
46                 this.path[1] = pos.y;
47         }
48
49         private void pin2Moved()
50         {
51                 Point pos = pin2.getPos();
52                 this.path[this.path.length - 2] = pos.x;
53                 this.path[this.path.length - 1] = pos.y;
54         }
55
56         public void destroy()
57         {
58                 model.wireDestroyed(this);
59         }
60
61         public void render(GeneralGC gc)
62         {
63                 Color oldFG = gc.getForeground();
64                 gc.setForeground(gc.getDevice().getSystemColor(getSWTColorConstantForWire(wire)));
65                 gc.drawPolyline(path);
66                 gc.setForeground(oldFG);
67         }
68
69         public void setLogicModelWire(Wire wire)
70         {
71                 this.wire = wire;
72         }
73
74         public static int getSWTColorConstantForWire(Wire wire)
75         {
76                 if (wire != null && wire.length == 1)
77                         return getSWTColorConstantForBit(wire.getValue());
78                 else
79                         return SWT.COLOR_BLACK;
80         }
81
82         public static int getSWTColorConstantForBit(Bit bit)
83         {
84                 switch (bit)
85                 {
86                 case ONE:
87                         return SWT.COLOR_GREEN;
88                 case ZERO:
89                         return SWT.COLOR_BLUE;
90                 case Z:
91                         return SWT.COLOR_BLACK;
92                 case U:
93                 case X:
94                         return SWT.COLOR_RED;
95                 default:
96                         throw new IllegalArgumentException("Unknown enum constant: " + bit);
97                 }
98         }
99 }