Implemented some high level state handlers; changed standard snippet IDs
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / highlevelstatehandlers / standard / atomic / DelegatingAtomicHighLevelStateHandler.java
diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java
new file mode 100644 (file)
index 0000000..0ed207f
--- /dev/null
@@ -0,0 +1,70 @@
+package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic;
+
+import net.mograsim.logic.model.model.components.GUIComponent;
+import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
+import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
+
+public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
+{
+       private final SubmodelComponent parentComponent;
+       private GUIComponent delegateTarget;
+       private String subStateID;
+
+       public DelegatingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
+       {
+               this(context, null);
+       }
+
+       public DelegatingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context, DelegatingAtomicHighLevelStateHandlerParams params)
+       {
+               this.parentComponent = context.component;
+               if (params != null)
+               {
+                       // TODO document this
+                       if (params.delegateTarget == null)
+                               setDelegateTarget(parentComponent);
+                       else
+                               setDelegateTarget(parentComponent.submodel.getComponentsByName().get(params.delegateTarget));
+                       setSubStateID(params.subStateID);
+               }
+       }
+
+       public void set(GUIComponent delegateTarget, String subStateID)
+       {
+               setDelegateTarget(delegateTarget);
+               setSubStateID(subStateID);
+       }
+
+       public void setDelegateTarget(GUIComponent delegateTarget)
+       {
+               if (delegateTarget == null)
+                       this.delegateTarget = parentComponent;
+               else if (!parentComponent.submodel.getComponentsByName().containsValue(delegateTarget))
+                       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;
+       }
+
+       public void setSubStateID(String subStateID)
+       {
+               this.subStateID = subStateID;
+       }
+
+       @Override
+       public Object getHighLevelState()
+       {
+               return delegateTarget.getHighLevelState(subStateID);
+       }
+
+       @Override
+       public void setHighLevelState(Object newState)
+       {
+               delegateTarget.setHighLevelState(subStateID, newState);
+       }
+
+       public static class DelegatingAtomicHighLevelStateHandlerParams
+       {
+               public String delegateTarget;
+               public String subStateID;
+       }
+}
\ No newline at end of file