516358360ee4206284beddb896a41b3b4bffbb87
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / wires / Pin.java
1 package net.mograsim.logic.ui.model.wires;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.function.Consumer;
6
7 import net.mograsim.logic.ui.model.components.GUIComponent;
8 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
9 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
10
11 //TODO add an ID and/or a name
12 public class Pin
13 {
14         public final GUIComponent component;
15         public final int logicWidth;
16
17         protected double relX;
18         protected double relY;
19
20         private final List<Consumer<? super Pin>> pinMovedListeners;
21
22         public Pin(GUIComponent component, int logicWidth, double relX, double relY)
23         {
24                 this.component = component;
25                 this.logicWidth = logicWidth;
26                 this.relX = relX;
27                 this.relY = relY;
28
29                 this.pinMovedListeners = new ArrayList<>();
30
31                 component.addComponentMovedListener(c -> callPinMovedListeners());
32         }
33
34         public double getRelX()
35         {
36                 return relX;
37         }
38
39         public double getRelY()
40         {
41                 return relY;
42         }
43
44         public Point getRelPos()
45         {
46                 return new Point(relX, relY);
47         }
48
49         public Point getPos()
50         {
51                 Rectangle componentBounds = component.getBounds();
52                 return new Point(relX + componentBounds.x, relY + componentBounds.y);
53         }
54
55         // @formatter:off
56         public void addPinMovedListener   (Consumer<? super Pin> listener){pinMovedListeners.add   (listener);}
57
58         public void removePinMovedListener(Consumer<? super Pin> listener){pinMovedListeners.remove(listener);}
59
60         private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));}
61         // @formatter:on
62
63         protected void setRelPos(double relX, double relY)
64         {
65                 this.relX = relX;
66                 this.relY = relY;
67                 callPinMovedListeners();
68         }
69 }