Improved some snippets (HighLevelStateHandlers and PinNamesRenderer)
[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.ModelComponent;
4 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
5 import net.mograsim.logic.model.serializing.IdentifyParams;
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 ModelComponent 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                         {
32                                 ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget);
33                                 if (delegateTarget == null)
34                                         throw new NullPointerException("No subcomponent with name " + params.delegateTarget);
35                                 setDelegateTarget(delegateTarget);
36                         }
37                         setPrefix(params.prefix);
38                 }
39                 parentComponent.submodel.addComponentRemovedListener(c ->
40                 {
41                         if (delegateTarget == c)
42                                 delegateTarget = null;
43                 });
44         }
45
46         public void set(ModelComponent delegateTarget, String prefix)
47         {
48                 setDelegateTarget(delegateTarget);
49                 setPrefix(prefix);
50         }
51
52         public void setDelegateTarget(ModelComponent delegateTarget)
53         {
54                 if (delegateTarget == null)
55                         this.delegateTarget = parentComponent;
56                 else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget)
57                         throw new IllegalArgumentException(
58                                         "Can only set components belonging to the submodel of the parent component of this handler as the delegate target");
59                 this.delegateTarget = delegateTarget;
60         }
61
62         public ModelComponent getDelegateTarget()
63         {
64                 return delegateTarget;
65         }
66
67         public void setPrefix(String prefix)
68         {
69                 this.prefix = prefix;
70         }
71
72         public String getPrefix()
73         {
74                 return prefix;
75         }
76
77         @Override
78         public Object getHighLevelState(String subStateID)
79         {
80                 if (delegateTarget == null)
81                         throw new IllegalStateException("Delegating to a component that was destroyed");
82                 return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID));
83         }
84
85         @Override
86         public void setHighLevelState(String subStateID, Object newState)
87         {
88                 if (delegateTarget == null)
89                         throw new IllegalStateException("Delegating to a component that was destroyed");
90                 delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState);
91         }
92
93         private String getDelegateTargetHighLevelStateID(String subStateID)
94         {
95                 return prefix == null ? subStateID : prefix + '.' + subStateID;
96         }
97
98         @Override
99         public String getIDForSerializing(IdentifyParams idParams)
100         {
101                 return "delegating";
102         }
103
104         @Override
105         public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
106         {
107                 DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams();
108                 params.delegateTarget = delegateTarget.getName();
109                 params.prefix = prefix;
110                 return params;
111         }
112
113         public static class DelegatingSubcomponentHighLevelStateHandlerParams
114         {
115                 public String delegateTarget;
116                 public String prefix;
117         }
118
119         static
120         {
121                 StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier
122                                 .setSnippetSupplier(DelegatingSubcomponentHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion
123                                                 .create(DelegatingSubcomponentHighLevelStateHandlerParams.class, DelegatingSubcomponentHighLevelStateHandler::new));
124         }
125 }