Improved rendering:
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / wires / WireCrossPoint.java
1 package net.mograsim.logic.ui.model.wires;\r
2 \r
3 import net.haspamelodica.swt.helper.gcs.GeneralGC;\r
4 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;\r
5 import net.mograsim.logic.core.LogicObservable;\r
6 import net.mograsim.logic.core.LogicObserver;\r
7 import net.mograsim.logic.core.types.BitVectorFormatter;\r
8 import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
9 import net.mograsim.logic.ui.ColorHelper;\r
10 import net.mograsim.logic.ui.model.ViewModel;\r
11 import net.mograsim.logic.ui.model.components.GUIComponent;\r
12 \r
13 public class WireCrossPoint extends GUIComponent\r
14 {\r
15         private final Pin pin;\r
16         private final int logicWidth;\r
17 \r
18         private final LogicObserver logicObs;\r
19         private ReadEnd end;\r
20 \r
21         public WireCrossPoint(ViewModel model, int logicWidth)\r
22         {\r
23                 super(model);\r
24                 logicObs = (i) -> requestRedraw();\r
25 \r
26                 this.logicWidth = logicWidth;\r
27                 setSize(0, 0);\r
28                 addPin(this.pin = new Pin(this, logicWidth, 0, 0));\r
29         }\r
30 \r
31         @Override\r
32         public void render(GeneralGC gc, Rectangle visibleRegion)\r
33         {\r
34                 Rectangle bounds = getBounds();\r
35                 ColorHelper.executeWithDifferentBackground(gc, BitVectorFormatter.formatAsColor(end),\r
36                                 () -> gc.fillOval(bounds.x - 1, bounds.y - 1, 2, 2));\r
37         }\r
38 \r
39         public void setLogicModelBinding(ReadEnd end)\r
40         {\r
41                 deregisterLogicObs(this.end);\r
42                 this.end = end;\r
43                 registerLogicObs(end);\r
44         }\r
45 \r
46         private void registerLogicObs(LogicObservable observable)\r
47         {\r
48                 if (observable != null)\r
49                         observable.registerObserver(logicObs);\r
50         }\r
51 \r
52         private void deregisterLogicObs(LogicObservable observable)\r
53         {\r
54                 if (observable != null)\r
55                         observable.deregisterObserver(logicObs);\r
56         }\r
57 \r
58         public int getLogicWidth()\r
59         {\r
60                 return logicWidth;\r
61         }\r
62 \r
63         public Pin getPin()\r
64         {\r
65                 return pin;\r
66         }\r
67 }