Completely changed the structure and switched to Eclipse Plugin.
[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.haspamelodica.swt.helper.swtobjectwrappers.Point;
8 import net.mograsim.logic.ui.model.components.GUIComponent;
9
10 public class Pin
11 {
12         public final GUIComponent component;
13         public final String name;
14         public final int logicWidth;
15
16         protected double relX;
17         protected double relY;
18
19         private final List<Consumer<? super Pin>> pinMovedListeners;
20         private final List<Runnable> redrawListeners;
21
22         public Pin(GUIComponent component, String name, int logicWidth, double relX, double relY)
23         {
24                 this.component = component;
25                 this.name = name;
26                 this.logicWidth = logicWidth;
27                 this.relX = relX;
28                 this.relY = relY;
29
30                 this.pinMovedListeners = new ArrayList<>();
31                 this.redrawListeners = new ArrayList<>();
32
33                 component.addComponentMovedListener(c -> callPinMovedListeners());
34         }
35
36         public double getRelX()
37         {
38                 return relX;
39         }
40
41         public double getRelY()
42         {
43                 return relY;
44         }
45
46         public Point getRelPos()
47         {
48                 return new Point(relX, relY);
49         }
50
51         public Point getPos()
52         {
53                 return new Point(relX + component.getPosX(), relY + component.getPosY());
54         }
55
56         protected void setRelPos(double relX, double relY)
57         {
58                 this.relX = relX;
59                 this.relY = relY;
60                 callPinMovedListeners();
61                 callRedrawListeners();
62         }
63
64         // @formatter:off
65         public void addPinMovedListener   (Consumer<? super Pin> listener){pinMovedListeners.add   (listener);}
66         public void addRedrawListener     (Runnable              listener){redrawListeners  .add   (listener);}
67
68         public void removePinMovedListener(Consumer<? super Pin> listener){pinMovedListeners.remove(listener);}
69         public void removeRedrawListener  (Runnable              listener){redrawListeners  .remove(listener);}
70
71         private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));}
72         private void callRedrawListeners  () {redrawListeners  .forEach(l -> l.run   (    ));}
73         // @formatter:on
74
75         @Override
76         public String toString()
77         {
78                 return "Pin [" + name + ", point=" + getPos() + "]";
79         }
80 }