Improved listener system
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Tue, 28 May 2019 09:36:26 +0000 (11:36 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Tue, 28 May 2019 09:36:26 +0000 (11:36 +0200)
LogicUI/src/era/mi/gui/model/ViewModel.java
LogicUI/src/era/mi/gui/model/components/GUIComponent.java
LogicUI/src/era/mi/gui/model/wires/Pin.java

index de22f44..5a41d0e 100644 (file)
@@ -37,7 +37,7 @@ public class ViewModel
                if (components.contains(component))
                        throw new IllegalStateException("Don't add the same component twice!");
                components.add(component);
-               componentAddedListeners.forEach(l -> l.accept(component));
+               callComponentAddedListeners(component);
        }
 
        /**
@@ -49,7 +49,7 @@ public class ViewModel
                if (!components.contains(component))
                        throw new IllegalStateException("Don't remove the same component twice!");
                components.remove(component);
-               componentRemovedListeners.forEach(l -> l.accept(component));
+               callComponentRemovedListeners(component);
        }
 
        // @formatter:off
@@ -62,5 +62,10 @@ public class ViewModel
        public void removeComponentRemovedListener(Consumer<GUIComponent> listener){componentRemovedListeners.remove(listener);}
        public void removeWireAddedListener       (Consumer<GUIWire     > listener){wireAddedListeners       .remove(listener);}
        public void removeWireRemovedListener     (Consumer<GUIWire     > listener){wireRemovedListeners     .remove(listener);}
+
+       private void callComponentAddedListeners  (GUIComponent c) {componentAddedListeners  .forEach(l -> l.accept(c));}
+       private void callComponentRemovedListeners(GUIComponent c) {componentRemovedListeners.forEach(l -> l.accept(c));}
+       private void callWireAddedListeners       (GUIWire w     ) {wireAddedListeners       .forEach(l -> l.accept(w));}
+       private void callWireRemovedListeners     (GUIWire w     ) {wireRemovedListeners     .forEach(l -> l.accept(w));}
        // @formatter:on
 }
\ No newline at end of file
index 75a7a53..7f4107d 100644 (file)
@@ -3,6 +3,7 @@ package era.mi.gui.model.components;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Consumer;
 
 import era.mi.gui.model.ViewModel;
 import era.mi.gui.model.wires.Pin;
@@ -16,18 +17,29 @@ public abstract class GUIComponent
        private final List<Pin> pins;
        protected final List<Pin> pinsUnmodifiable;
 
+       private final List<Consumer<GUIComponent>> componentChangedListeners;
+       private final List<Consumer<GUIComponent>> componentMovedListeners;
+       private final List<Consumer<Pin>> pinAddedListeners;
+       private final List<Consumer<Pin>> pinRemovedListeners;
+
        public GUIComponent(ViewModel model)
        {
                this.model = model;
                this.bounds = new Rectangle(0, 0, 0, 0);
                this.pins = new ArrayList<>();
                this.pinsUnmodifiable = Collections.unmodifiableList(pins);
+
+               this.componentChangedListeners = new ArrayList<>();
+               this.componentMovedListeners = new ArrayList<>();
+               this.pinAddedListeners = new ArrayList<>();
+               this.pinRemovedListeners = new ArrayList<>();
        }
 
        public void moveTo(double x, double y)
        {
                bounds.x = x;
                bounds.y = y;
+               callComponentMovedListeners();
        }
 
        /**
@@ -55,6 +67,23 @@ public abstract class GUIComponent
                return pinsUnmodifiable;
        }
 
+       // @formatter:off
+       public void addComponentChangedListener   (Consumer<GUIComponent> listener) {componentChangedListeners.add   (listener);}
+       public void addComponentMovedListener     (Consumer<GUIComponent> listener) {componentMovedListeners  .add   (listener);}
+       public void addPinAddedListener           (Consumer<Pin         > listener) {pinAddedListeners        .add   (listener);}
+       public void addPinRemovedListener         (Consumer<Pin         > listener) {pinRemovedListeners      .add   (listener);}
+
+       public void removeComponentChangedListener(Consumer<GUIComponent> listener) {componentChangedListeners.remove(listener);}
+       public void removeComponentMovedListener  (Consumer<GUIComponent> listener) {componentMovedListeners  .remove(listener);}
+       public void removePinAddedListener        (Consumer<Pin         > listener) {pinAddedListeners        .remove(listener);}
+       public void removePinRemovedListener      (Consumer<Pin         > listener) {pinRemovedListeners      .remove(listener);}
+
+       private void callComponentChangedListeners(     ) {componentChangedListeners.forEach(l -> l.accept(this));}
+       private void callComponentMovedListeners  (     ) {componentMovedListeners  .forEach(l -> l.accept(this));}
+       private void callPinAddedListeners        (Pin p) {pinAddedListeners        .forEach(l -> l.accept(p   ));}
+       private void callPinRemovedListeners      (Pin p) {pinRemovedListeners      .forEach(l -> l.accept(p   ));}
+       // @formatter:on
+
        /**
         * Render this component to the given gc.
         */
@@ -64,15 +93,18 @@ public abstract class GUIComponent
        {
                bounds.width = width;
                bounds.height = height;
+               callComponentChangedListeners();
        }
 
        protected void addPin(Pin pin)
-       {// TODO notify pins they are "created"
+       {
                pins.add(pin);
+               callPinAddedListeners(pin);
        }
 
        protected void removePin(Pin pin)
-       {// TODO notify pins they are "destroyed"
+       {
                pins.remove(pin);
+               callPinRemovedListeners(pin);
        }
 }
\ No newline at end of file
index 1ab7404..3dc8967 100644 (file)
@@ -1,5 +1,9 @@
 package era.mi.gui.model.wires;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
 import era.mi.gui.model.components.GUIComponent;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
@@ -10,11 +14,17 @@ public class Pin
        protected double relX;
        protected double relY;
 
+       private final List<Consumer<Pin>> pinMovedListeners;
+
        public Pin(GUIComponent component, double relX, double relY)
        {
                this.component = component;
                this.relX = relX;
                this.relY = relY;
+
+               this.pinMovedListeners = new ArrayList<>();
+
+               component.addComponentMovedListener(c -> callPinMovedListeners());
        }
 
        public double getRelX()
@@ -38,9 +48,18 @@ public class Pin
                return new Point(relX + componentBounds.x, relY + componentBounds.y);
        }
 
+       // @formatter:off
+       public void addPinMovedListener   (Consumer<Pin> listener){pinMovedListeners.add   (listener);}
+
+       public void removePinMovedListener(Consumer<Pin> listener){pinMovedListeners.remove(listener);}
+
+       private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));}
+       // @formatter:on
+
        protected void setRelPos(double relX, double relY)
        {
                this.relX = relX;
                this.relY = relY;
+               callPinMovedListeners();
        }
 }
\ No newline at end of file