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 / subcomponent / DelegatingSubcomponentHighLevelStateHandler.java
index 3347377..12a9888 100644 (file)
@@ -1,68 +1,91 @@
 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent;
 
-import net.mograsim.logic.model.model.components.GUIComponent;
+import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
-import net.mograsim.logic.model.serializing.IdentifierGetter;
+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 DelegatingSubcomponentHighLevelStateHandler implements SubcomponentHighLevelStateHandler
 {
        private final SubmodelComponent parentComponent;
-       private GUIComponent delegateTarget;
+       private ModelComponent delegateTarget;
        private String prefix;
 
-       public DelegatingSubcomponentHighLevelStateHandler(HighLevelStateHandlerContext context)
+       public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component)
        {
-               this(context, null);
+               this(component, null);
        }
 
-       public DelegatingSubcomponentHighLevelStateHandler(HighLevelStateHandlerContext context,
+       public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component,
                        DelegatingSubcomponentHighLevelStateHandlerParams params)
        {
-               this.parentComponent = context.component;
+               this.parentComponent = component;
                if (params != null)
                {
                        // TODO document this
                        if (params.delegateTarget == null)
                                setDelegateTarget(parentComponent);
                        else
-                               this.delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget);
-                       setPrefix(prefix);
+                       {
+                               ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget);
+                               if (delegateTarget == null)
+                                       throw new NullPointerException("No subcomponent with name " + params.delegateTarget);
+                               setDelegateTarget(delegateTarget);
+                       }
+                       setPrefix(params.prefix);
                }
+               parentComponent.submodel.addComponentRemovedListener(c ->
+               {
+                       if (delegateTarget == c)
+                               delegateTarget = null;
+               });
        }
 
-       public void set(GUIComponent delegateTarget, String prefix)
+       public void set(ModelComponent delegateTarget, String prefix)
        {
                setDelegateTarget(delegateTarget);
                setPrefix(prefix);
        }
 
-       public void setDelegateTarget(GUIComponent delegateTarget)
+       public void setDelegateTarget(ModelComponent delegateTarget)
        {
                if (delegateTarget == null)
                        this.delegateTarget = parentComponent;
-               else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.name) != delegateTarget)
+               else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != 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 ModelComponent getDelegateTarget()
+       {
+               return delegateTarget;
+       }
+
        public void setPrefix(String prefix)
        {
                this.prefix = prefix;
        }
 
+       public String getPrefix()
+       {
+               return prefix;
+       }
+
        @Override
        public Object getHighLevelState(String subStateID)
        {
+               if (delegateTarget == null)
+                       throw new IllegalStateException("Delegating to a component that was destroyed");
                return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID));
        }
 
        @Override
        public void setHighLevelState(String subStateID, Object newState)
        {
+               if (delegateTarget == null)
+                       throw new IllegalStateException("Delegating to a component that was destroyed");
                delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState);
        }
 
@@ -72,10 +95,16 @@ public class DelegatingSubcomponentHighLevelStateHandler implements Subcomponent
        }
 
        @Override
-       public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifierGetter idGetter)
+       public String getIDForSerializing(IdentifyParams idParams)
+       {
+               return "delegating";
+       }
+
+       @Override
+       public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
        {
                DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams();
-               params.delegateTarget = delegateTarget.name;
+               params.delegateTarget = delegateTarget.getName();
                params.prefix = prefix;
                return params;
        }