Fixed a stupid deserializing bug
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / highlevelstatehandlers / standard / subcomponent / DelegatingSubcomponentHighLevelStateHandler.java
1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent;
2
3 import net.mograsim.logic.model.model.components.GUIComponent;
4 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
5 import net.mograsim.logic.model.serializing.IdentifierGetter;
6 import net.mograsim.logic.model.snippets.SnippetDefinintion;
7 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
8 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers;
9
10 public class DelegatingSubcomponentHighLevelStateHandler implements SubcomponentHighLevelStateHandler
11 {
12         private final SubmodelComponent parentComponent;
13         private GUIComponent delegateTarget;
14         private String prefix;
15
16         public DelegatingSubcomponentHighLevelStateHandler(HighLevelStateHandlerContext context)
17         {
18                 this(context, null);
19         }
20
21         public DelegatingSubcomponentHighLevelStateHandler(HighLevelStateHandlerContext context,
22                         DelegatingSubcomponentHighLevelStateHandlerParams params)
23         {
24                 this.parentComponent = context.component;
25                 if (params != null)
26                 {
27                         // TODO document this
28                         if (params.delegateTarget == null)
29                                 setDelegateTarget(parentComponent);
30                         else
31                                 this.delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget);
32                         setPrefix(params.prefix);
33                 }
34         }
35
36         public void set(GUIComponent delegateTarget, String prefix)
37         {
38                 setDelegateTarget(delegateTarget);
39                 setPrefix(prefix);
40         }
41
42         public void setDelegateTarget(GUIComponent delegateTarget)
43         {
44                 if (delegateTarget == null)
45                         this.delegateTarget = parentComponent;
46                 else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.name) != delegateTarget)
47                         throw new IllegalArgumentException(
48                                         "Can only set components belonging to the submodel of the parent component of this handler as the delegate target");
49                 this.delegateTarget = delegateTarget;
50         }
51
52         public void setPrefix(String prefix)
53         {
54                 this.prefix = prefix;
55         }
56
57         @Override
58         public Object getHighLevelState(String subStateID)
59         {
60                 return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID));
61         }
62
63         @Override
64         public void setHighLevelState(String subStateID, Object newState)
65         {
66                 delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState);
67         }
68
69         private String getDelegateTargetHighLevelStateID(String subStateID)
70         {
71                 return prefix == null ? subStateID : prefix + '.' + subStateID;
72         }
73
74         @Override
75         public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifierGetter idGetter)
76         {
77                 DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams();
78                 params.delegateTarget = delegateTarget.name;
79                 params.prefix = prefix;
80                 return params;
81         }
82
83         public static class DelegatingSubcomponentHighLevelStateHandlerParams
84         {
85                 public String delegateTarget;
86                 public String prefix;
87         }
88
89         static
90         {
91                 StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier
92                                 .setSnippetSupplier(DelegatingSubcomponentHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion
93                                                 .create(DelegatingSubcomponentHighLevelStateHandlerParams.class, DelegatingSubcomponentHighLevelStateHandler::new));
94         }
95 }