+
+ /**
+ * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this
+ * click.
+ *
+ * @author Daniel Kirschten
+ */
+ @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden
+ public boolean clicked(double x, double y)
+ {
+ return false;
+ }
+
+ /**
+ * Render this component to the given gc, in absoulute coordinates.
+ *
+ * @author Daniel Kirschten
+ */
+ public abstract void render(GeneralGC gc, Rectangle visibleRegion);
+
+ // serializing
+
+ @SuppressWarnings("static-method") // this method is intended to be overridden
+ public JsonElement getParams()
+ {
+ return JsonNull.INSTANCE;
+ }
+
+ // listeners
+
+ /**
+ * Calls redraw listeners.
+ *
+ * @author Daniel Kirschten
+ */
+ protected void requestRedraw()
+ {
+ callRedrawListeners();
+ }
+
+ // @formatter:off
+ public void addComponentMovedListener (Consumer<? super GUIComponent> listener) {componentMovedListeners .add (listener);}
+ public void addComponentResizedListener (Consumer<? super GUIComponent> listener) {componentResizedListeners.add (listener);}
+ public void addPinAddedListener (Consumer<? super Pin > listener) {pinAddedListeners .add (listener);}
+ public void addPinRemovedListener (Consumer<? super Pin > listener) {pinRemovedListeners .add (listener);}
+ public void addRedrawListener (Runnable listener) {redrawListeners .add (listener);}
+
+ public void removeComponentMovedListener (Consumer<? super GUIComponent> listener) {componentMovedListeners .remove(listener);}
+ public void removeComponentResizedListener (Consumer<? super GUIComponent> listener) {componentResizedListeners.remove(listener);}
+ public void removePinAddedListener (Consumer<? super Pin > listener) {pinAddedListeners .remove(listener);}
+ public void removePinRemovedListener (Consumer<? super Pin > listener) {pinRemovedListeners .remove(listener);}
+ public void removeRedrawListener (Runnable listener) {redrawListeners .remove(listener);}
+
+ private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));}
+ private void callComponentResizedListener( ) {componentResizedListeners.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 ));}
+ private void callRedrawListeners ( ) {redrawListeners .forEach(l -> l.run( ));}
+ // @formatter:on