1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent;
3 import java.util.function.Consumer;
5 import net.mograsim.logic.model.model.components.ModelComponent;
6 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
7 import net.mograsim.logic.model.serializing.IdentifyParams;
8 import net.mograsim.logic.model.snippets.SnippetDefinintion;
9 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers;
11 public class DelegatingSubcomponentHighLevelStateHandler implements SubcomponentHighLevelStateHandler
13 private final SubmodelComponent parentComponent;
14 private ModelComponent delegateTarget;
15 private String prefix;
17 public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component)
19 this(component, null);
22 public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component,
23 DelegatingSubcomponentHighLevelStateHandlerParams params)
25 this.parentComponent = component;
29 if (params.delegateTarget == null)
30 setDelegateTarget(parentComponent);
33 ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget);
34 if (delegateTarget == null)
35 throw new NullPointerException("No subcomponent with name " + params.delegateTarget);
36 setDelegateTarget(delegateTarget);
38 setPrefix(params.prefix);
40 parentComponent.submodel.addComponentRemovedListener(c ->
42 if (delegateTarget == c)
43 delegateTarget = null;
47 public void set(ModelComponent delegateTarget, String prefix)
49 setDelegateTarget(delegateTarget);
53 public void setDelegateTarget(ModelComponent delegateTarget)
55 if (delegateTarget == null || delegateTarget == parentComponent)
56 this.delegateTarget = parentComponent;
57 else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) == delegateTarget)
58 this.delegateTarget = delegateTarget;
60 throw new IllegalArgumentException(
61 "Can only set components belonging to the submodel of the parent component of this handler or the parent component itself as the delegate target");
64 public ModelComponent getDelegateTarget()
66 return delegateTarget;
69 public void setPrefix(String prefix)
74 public String getPrefix()
80 public Object getHighLevelState(String subStateID)
83 return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID));
87 public void setHighLevelState(String subStateID, Object newState)
90 delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState);
94 public void addListener(String subStateID, Consumer<Object> stateChanged)
97 delegateTarget.addHighLevelStateListener(getDelegateTargetHighLevelStateID(subStateID), stateChanged);
101 public void removeListener(String subStateID, Consumer<Object> stateChanged)
104 delegateTarget.removeHighLevelStateListener(getDelegateTargetHighLevelStateID(subStateID), stateChanged);
107 private void checkTarget()
109 if (delegateTarget == null)
110 throw new IllegalStateException("Delegating to a component that was destroyed");
113 private String getDelegateTargetHighLevelStateID(String subStateID)
115 return prefix == null ? subStateID : prefix + '.' + subStateID;
119 public String getIDForSerializing(IdentifyParams idParams)
125 public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
128 DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams();
129 params.delegateTarget = delegateTarget == parentComponent ? null : delegateTarget.getName();
130 params.prefix = prefix;
134 public static class DelegatingSubcomponentHighLevelStateHandlerParams
136 public String delegateTarget;
137 public String prefix;
142 StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier
143 .setSnippetSupplier(DelegatingSubcomponentHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion
144 .create(DelegatingSubcomponentHighLevelStateHandlerParams.class, DelegatingSubcomponentHighLevelStateHandler::new));