Splitted ViewModel and ViewModelModifiable
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / ViewModel.java
index 717ee13..869f1a1 100644 (file)
@@ -19,8 +19,11 @@ public class ViewModel
        private final List<Consumer<? super GUIComponent>> componentRemovedListeners;
        private final List<Consumer<? super GUIWire>> wireAddedListeners;
        private final List<Consumer<? super GUIWire>> wireRemovedListeners;
+       private final List<Runnable> redrawListeners;
 
-       public ViewModel()
+       private final Runnable redrawListenerForSubcomponents;
+
+       protected ViewModel()
        {
                components = new ArrayList<>();
                componentsUnmodifiable = Collections.unmodifiableList(components);
@@ -31,54 +34,65 @@ public class ViewModel
                componentRemovedListeners = new ArrayList<>();
                wireAddedListeners = new ArrayList<>();
                wireRemovedListeners = new ArrayList<>();
+               redrawListeners = new ArrayList<>();
+
+               redrawListenerForSubcomponents = this::callRedrawListeners;
        }
 
        /**
         * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application
         * code as it is automatically called in GUIComponent::new.
         */
-       public void componentCreated(GUIComponent component)
+       protected void componentCreated(GUIComponent component)
        {
                if (components.contains(component))
                        throw new IllegalStateException("Don't add the same component twice!");
                components.add(component);
                callComponentAddedListeners(component);
+               component.addRedrawListener(redrawListenerForSubcomponents);
+               callRedrawListeners();
        }
 
        /**
         * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
         * application code as it is automatically called in GUIComponent::destroy.
         */
-       public void componentDestroyed(GUIComponent component)
+       protected void componentDestroyed(GUIComponent component)
        {
                if (!components.contains(component))
                        throw new IllegalStateException("Don't remove the same component twice!");
                components.remove(component);
                callComponentRemovedListeners(component);
+               component.removeRedrawListener(redrawListenerForSubcomponents);
+               callRedrawListeners();
        }
 
        /**
         * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application
         * code as it is automatically called in GUIComponent::new.
         */
-       public void wireCreated(GUIWire wire)
+       protected void wireCreated(GUIWire wire)
        {
                if (wires.contains(wire))
                        throw new IllegalStateException("Don't add the same wire twice!");
                wires.add(wire);
                callWireAddedListeners(wire);
+               wire.addRedrawListener(redrawListenerForSubcomponents);
+               callRedrawListeners();
        }
 
        /**
         * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
         * application code as it is automatically called in GUIComponent::destroy.
         */
-       public void wireDestroyed(GUIWire wire)
+       protected void wireDestroyed(GUIWire wire)
        {
                if (!wires.contains(wire))
                        throw new IllegalStateException("Don't remove the same wire twice!");
                wires.remove(wire);
                callWireRemovedListeners(wire);
+               wire.removeRedrawListener(redrawListenerForSubcomponents);
+               callRedrawListeners();
        }
 
        public List<GUIComponent> getComponents()
@@ -92,19 +106,22 @@ public class ViewModel
        }
 
        // @formatter:off
-       public void addComponentAddedListener     (Consumer<? super GUIComponent> listener){componentAddedListeners  .add   (listener);}
-       public void addComponentRemovedListener   (Consumer<? super GUIComponent> listener){componentRemovedListeners.add   (listener);}
-       public void addWireAddedListener          (Consumer<? super GUIWire     > listener){wireAddedListeners       .add   (listener);}
-       public void addWireRemovedListener        (Consumer<? super GUIWire     > listener){wireRemovedListeners     .add   (listener);}
+       public void addComponentAddedListener     (Consumer<? super GUIComponent> listener) {componentAddedListeners  .add   (listener);}
+       public void addComponentRemovedListener   (Consumer<? super GUIComponent> listener) {componentRemovedListeners.add   (listener);}
+       public void addWireAddedListener          (Consumer<? super GUIWire     > listener) {wireAddedListeners       .add   (listener);}
+       public void addWireRemovedListener        (Consumer<? super GUIWire     > listener) {wireRemovedListeners     .add   (listener);}
+       public void addRedrawListener             (Runnable                       listener) {redrawListeners          .add   (listener);}
 
-       public void removeComponentAddedListener  (Consumer<? super GUIComponent> listener){componentAddedListeners  .remove(listener);}
-       public void removeComponentRemovedListener(Consumer<? super GUIComponent> listener){componentRemovedListeners.remove(listener);}
-       public void removeWireAddedListener       (Consumer<? super GUIWire     > listener){wireAddedListeners       .remove(listener);}
-       public void removeWireRemovedListener     (Consumer<? super GUIWire     > listener){wireRemovedListeners     .remove(listener);}
+       public void removeComponentAddedListener  (Consumer<? super GUIComponent> listener) {componentAddedListeners  .remove(listener);}
+       public void removeComponentRemovedListener(Consumer<? super GUIComponent> listener) {componentRemovedListeners.remove(listener);}
+       public void removeWireAddedListener       (Consumer<? super GUIWire     > listener) {wireAddedListeners       .remove(listener);}
+       public void removeWireRemovedListener     (Consumer<? super GUIWire     > listener) {wireRemovedListeners     .remove(listener);}
+       public void removeRedrawListener          (Runnable                       listener) {redrawListeners          .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));}
+       private void callRedrawListeners          (              ) {redrawListeners          .forEach(l -> l.run(    ));}
        // @formatter:on
 }
\ No newline at end of file