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);
}
/**
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
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
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;
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();
}
/**
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.
*/
{
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
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;
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()
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