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