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