Fixed another bug in DelegatingSubcomponentHighLevelStateHandler
[Mograsim.git] / plugins / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / highlevelstatehandlers / standard / subcomponent / DelegatingSubcomponentHighLevelStateHandler.java
index 12a9888..295be02 100644 (file)
@@ -1,5 +1,7 @@
 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent;
 
+import java.util.function.Consumer;
+
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
 import net.mograsim.logic.model.serializing.IdentifyParams;
@@ -50,12 +52,13 @@ public class DelegatingSubcomponentHighLevelStateHandler implements Subcomponent
 
        public void setDelegateTarget(ModelComponent delegateTarget)
        {
-               if (delegateTarget == null)
+               if (delegateTarget == null || delegateTarget == parentComponent)
                        this.delegateTarget = parentComponent;
-               else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget)
+               else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) == delegateTarget)
+                       this.delegateTarget = delegateTarget;
+               else
                        throw new IllegalArgumentException(
-                                       "Can only set components belonging to the submodel of the parent component of this handler as the delegate target");
-               this.delegateTarget = delegateTarget;
+                                       "Can only set components belonging to the submodel of the parent component of this handler or the parent component itself as the delegate target");
        }
 
        public ModelComponent getDelegateTarget()
@@ -76,17 +79,35 @@ public class DelegatingSubcomponentHighLevelStateHandler implements Subcomponent
        @Override
        public Object getHighLevelState(String subStateID)
        {
-               if (delegateTarget == null)
-                       throw new IllegalStateException("Delegating to a component that was destroyed");
+               checkTarget();
                return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID));
        }
 
        @Override
        public void setHighLevelState(String subStateID, Object newState)
+       {
+               checkTarget();
+               delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState);
+       }
+
+       @Override
+       public void addListener(String subStateID, Consumer<Object> stateChanged)
+       {
+               checkTarget();
+               delegateTarget.addHighLevelStateListener(getDelegateTargetHighLevelStateID(subStateID), stateChanged);
+       }
+
+       @Override
+       public void removeListener(String subStateID, Consumer<Object> stateChanged)
+       {
+               checkTarget();
+               delegateTarget.removeHighLevelStateListener(getDelegateTargetHighLevelStateID(subStateID), stateChanged);
+       }
+
+       private void checkTarget()
        {
                if (delegateTarget == null)
                        throw new IllegalStateException("Delegating to a component that was destroyed");
-               delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState);
        }
 
        private String getDelegateTargetHighLevelStateID(String subStateID)
@@ -103,8 +124,9 @@ public class DelegatingSubcomponentHighLevelStateHandler implements Subcomponent
        @Override
        public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
        {
+               checkTarget();
                DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams();
-               params.delegateTarget = delegateTarget.getName();
+               params.delegateTarget = delegateTarget == parentComponent ? null : delegateTarget.getName();
                params.prefix = prefix;
                return params;
        }