Implemented some high level state handlers; changed standard snippet IDs
[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.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
6
7 public class DelegatingSubcomponentHighLevelStateHandler implements SubcomponentHighLevelStateHandler
8 {
9         private final SubmodelComponent parentComponent;
10         private GUIComponent delegateTarget;
11         private String prefix;
12
13         public DelegatingSubcomponentHighLevelStateHandler(HighLevelStateHandlerContext context)
14         {
15                 this(context, null);
16         }
17
18         public DelegatingSubcomponentHighLevelStateHandler(HighLevelStateHandlerContext context,
19                         DelegatingSubcomponentHighLevelStateHandlerParams params)
20         {
21                 this.parentComponent = context.component;
22                 if (params != null)
23                 {
24                         // TODO document this
25                         if (params.delegateTarget == null)
26                                 setDelegateTarget(parentComponent);
27                         else
28                                 this.delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget);
29                         setPrefix(prefix);
30                 }
31         }
32
33         public void set(GUIComponent delegateTarget, String prefix)
34         {
35                 setDelegateTarget(delegateTarget);
36                 setPrefix(prefix);
37         }
38
39         public void setDelegateTarget(GUIComponent delegateTarget)
40         {
41                 if (delegateTarget == null)
42                         this.delegateTarget = parentComponent;
43                 else if (!parentComponent.submodel.getComponentsByName().containsValue(delegateTarget))
44                         throw new IllegalArgumentException(
45                                         "Can only set components belonging to the submodel of the parent component of this handler as the delegate target");
46                 this.delegateTarget = delegateTarget;
47         }
48
49         public void setPrefix(String prefix)
50         {
51                 this.prefix = prefix;
52         }
53
54         @Override
55         public Object getHighLevelState(String subStateID)
56         {
57                 return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID));
58         }
59
60         @Override
61         public void setHighLevelState(String subStateID, Object newState)
62         {
63                 delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState);
64         }
65
66         private String getDelegateTargetHighLevelStateID(String subStateID)
67         {
68                 return prefix == null ? subStateID : prefix + '.' + subStateID;
69         }
70
71         public static class DelegatingSubcomponentHighLevelStateHandlerParams
72         {
73                 public String delegateTarget;
74                 public String prefix;
75         }
76 }