c4cb2f19264c9e9ac5010723602402517aa8746b
[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                 pin1.addPinMovedListener(p -> pin1Moved());
32                 pin2.addPinMovedListener(p -> pin2Moved());
33                 pin1Moved();
34                 pin2Moved();
35
36                 model.wireCreated(this);
37         }
38
39         private void pin1Moved()
40         {
41                 Point pos = pin1.getPos();
42                 this.path[0] = pos.x;
43                 this.path[1] = pos.y;
44         }
45
46         private void pin2Moved()
47         {
48                 Point pos = pin2.getPos();
49                 this.path[this.path.length - 2] = pos.x;
50                 this.path[this.path.length - 1] = pos.y;
51         }
52
53         public void destroy()
54         {
55                 model.wireDestroyed(this);
56         }
57
58         public void render(GeneralGC gc)
59         {
60                 Color oldFG = gc.getForeground();
61                 gc.setForeground(gc.getDevice().getSystemColor(getSWTColorConstantForWire(wire)));
62                 gc.drawPolyline(path);
63                 gc.setForeground(oldFG);
64         }
65
66         public void setLogicModelWire(Wire wire)
67         {
68                 this.wire = wire;
69         }
70
71         public static int getSWTColorConstantForWire(Wire wire)
72         {
73                 if (wire != null && wire.length == 1)
74                         return getSWTColorConstantForBit(wire.getValue());
75                 else
76                         return SWT.COLOR_BLACK;
77         }
78
79         public static int getSWTColorConstantForBit(Bit bit)
80         {
81                 switch (bit)
82                 {
83                 case ONE:
84                         return SWT.COLOR_GREEN;
85                 case ZERO:
86                         return SWT.COLOR_BLUE;
87                 case Z:
88                         return SWT.COLOR_BLACK;
89                 case U:
90                 case X:
91                         return SWT.COLOR_RED;
92                 default:
93                         throw new IllegalArgumentException("Unknown enum constant: " + bit);
94                 }
95         }
96 }