Renamed project folders to match the respective project name
[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 public class Pin
12 {
13         public final GUIComponent component;
14         public final int logicWidth;
15
16         protected double relX;
17         protected double relY;
18
19         private final List<Consumer<? super Pin>> pinMovedListeners;
20
21         public Pin(GUIComponent component, int logicWidth, double relX, double relY)
22         {
23                 this.component = component;
24                 this.logicWidth = logicWidth;
25                 this.relX = relX;
26                 this.relY = relY;
27
28                 this.pinMovedListeners = new ArrayList<>();
29
30                 component.addComponentMovedListener(c -> callPinMovedListeners());
31         }
32
33         public double getRelX()
34         {
35                 return relX;
36         }
37
38         public double getRelY()
39         {
40                 return relY;
41         }
42
43         public Point getRelPos()
44         {
45                 return new Point(relX, relY);
46         }
47
48         public Point getPos()
49         {
50                 Rectangle componentBounds = component.getBounds();
51                 return new Point(relX + componentBounds.x, relY + componentBounds.y);
52         }
53
54         // @formatter:off
55         public void addPinMovedListener   (Consumer<? super Pin> listener){pinMovedListeners.add   (listener);}
56
57         public void removePinMovedListener(Consumer<? super Pin> listener){pinMovedListeners.remove(listener);}
58
59         private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));}
60         // @formatter:on
61
62         protected void setRelPos(double relX, double relY)
63         {
64                 this.relX = relX;
65                 this.relY = relY;
66                 callPinMovedListeners();
67         }
68 }