Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / highlevelstatehandlers / standard / atomic / DelegatingAtomicHighLevelStateHandler.java
index 621dde3..9d2645d 100644 (file)
@@ -4,7 +4,6 @@ import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.snippets.SnippetDefinintion;
-import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers;
 
 public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
@@ -13,23 +12,33 @@ public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelSta
        private ModelComponent delegateTarget;
        private String subStateID;
 
-       public DelegatingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
+       public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component)
        {
-               this(context, null);
+               this(component, null);
        }
 
-       public DelegatingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context, DelegatingAtomicHighLevelStateHandlerParams params)
+       public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component, DelegatingAtomicHighLevelStateHandlerParams params)
        {
-               this.parentComponent = context.component;
+               this.parentComponent = component;
                if (params != null)
                {
                        // TODO document this
                        if (params.delegateTarget == null)
                                setDelegateTarget(parentComponent);
                        else
-                               setDelegateTarget(parentComponent.submodel.getComponentsByName().get(params.delegateTarget));
+                       {
+                               ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget);
+                               if (delegateTarget == null)
+                                       throw new NullPointerException("No subcomponent with name " + params.delegateTarget);
+                               setDelegateTarget(delegateTarget);
+                       }
                        setSubStateID(params.subStateID);
                }
+               parentComponent.submodel.addComponentRemovedListener(c ->
+               {
+                       if (delegateTarget == c)
+                               delegateTarget = null;
+               });
        }
 
        public void set(ModelComponent delegateTarget, String subStateID)
@@ -48,20 +57,34 @@ public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelSta
                this.delegateTarget = delegateTarget;
        }
 
+       public ModelComponent getDelegateTarget()
+       {
+               return delegateTarget;
+       }
+
        public void setSubStateID(String subStateID)
        {
                this.subStateID = subStateID;
        }
 
+       public String getSubStateID()
+       {
+               return subStateID;
+       }
+
        @Override
        public Object getHighLevelState()
        {
+               if (delegateTarget == null)
+                       throw new IllegalStateException("Delegating to a component that was destroyed");
                return delegateTarget.getHighLevelState(subStateID);
        }
 
        @Override
        public void setHighLevelState(Object newState)
        {
+               if (delegateTarget == null)
+                       throw new IllegalStateException("Delegating to a component that was destroyed");
                delegateTarget.setHighLevelState(subStateID, newState);
        }
 
@@ -74,6 +97,8 @@ public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelSta
        @Override
        public DelegatingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
        {
+               if (delegateTarget == null)
+                       throw new IllegalStateException("Delegating to a component that was destroyed");
                DelegatingAtomicHighLevelStateHandlerParams params = new DelegatingAtomicHighLevelStateHandlerParams();
                params.delegateTarget = delegateTarget.getName();
                params.subStateID = subStateID;