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;
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()
@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)
@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;
}