1 package org.catacomb.druid.build;
2
3 import org.catacomb.interlish.annotation.ControlPoint;
4 import org.catacomb.interlish.annotation.Editable;
5 import org.catacomb.interlish.annotation.IOPoint;
6 import org.catacomb.interlish.content.*;
7 import org.catacomb.interlish.structure.*;
8 import org.catacomb.report.E;
9
10
11 import java.lang.annotation.*;
12 import java.lang.reflect.Field;
13
14
15 public class AnnotationConnector {
16
17 TargetStore targetStore;
18
19
20 public AnnotationConnector(TargetStore tgs) {
21 targetStore = tgs;
22 }
23
24
25
26 public void annotationConnect(Object ctrl) {
27
28 int nanot = 0;
29 for (Field fld : ctrl.getClass().getFields()) {
30 Annotation[] aa = fld.getDeclaredAnnotations();
31 if (aa != null && aa.length > 0) {
32 nanot += aa.length;
33 for (Annotation ant : aa) {
34
35 if (ant instanceof IOPoint) {
36 ioPointConnect(ctrl, fld, ((IOPoint)ant).xid());
37
38 } else if (ant instanceof Editable) {
39 editableConnect(ctrl, fld, ((Editable)ant).xid());
40
41 } else if (ant instanceof ControlPoint) {
42 controlConnect(ctrl, fld, ((ControlPoint)ant).xid());
43
44 } else {
45 E.warning("unhandled annotation " + ant);
46 }
47
48 }
49 }
50 }
51
52
53 int nta = 0;
54 for (Field fld : ctrl.getClass().getDeclaredFields()) {
55 Annotation[] aa = fld.getDeclaredAnnotations();
56 if (aa != null) {
57 nta += aa.length;
58 }
59 }
60 if (nta > nanot) {
61 E.shortError("Class " + ctrl.getClass() + " has unused annotations\n " +
62 "(anotatiosn of private fields) - shoud these be public fields?");
63 }
64
65
66 }
67
68
69 private void editableConnect(Object ctrl, Field fld, String guiID) {
70 Object fval = null;
71
72 try {
73 fval = fld.get(ctrl);
74 } catch (Exception ex) {
75 E.warning("cant get field " + fld + " on " + ctrl);
76 }
77
78 if (fval == null) {
79 E.warning("all editable fields should be set in the constructor - " +
80 "not so for " + fld.getName() + " on " + ctrl);
81 } else {
82
83 Object cpt = targetStore.get(guiID);
84 if (cpt == null) {
85 E.error("No such cpt in target store : " + guiID);
86
87 } else {
88
89 setEditable(fval, cpt);
90
91 }
92 }
93 }
94
95
96 private void setEditable(Object fval, Object edtr) {
97 if (fval instanceof StringValue && edtr instanceof StringValueEditor) {
98 ((StringValueEditor)edtr).setStringValue((StringValue)fval);
99
100 } else if (fval instanceof BooleanValue && edtr instanceof BooleanValueEditor) {
101 ((BooleanValueEditor)edtr).setBooleanValue((BooleanValue)fval);
102
103 } else if (fval instanceof IntegerValue && edtr instanceof IntegerValueEditor) {
104 ((IntegerValueEditor)edtr).setIntegerValue((IntegerValue)fval);
105
106 } else if (fval instanceof DoubleValue && edtr instanceof DoubleValueEditor) {
107 ((DoubleValueEditor)edtr).setDoubleValue((DoubleValue)fval);
108
109 } else if (fval instanceof ColorValue && edtr instanceof ColorValueEditor) {
110 ((ColorValueEditor)edtr).setColorValue((ColorValue)fval);
111
112 } else {
113 E.error("cant connect val to editor " + fval + " " + edtr);
114 }
115 }
116
117
118
119 private void controlConnect(Object ctrl, Field fld, String guiID) {
120 Object cpt = targetStore.get(guiID);
121
122 if (cpt == null) {
123 E.linkToWarning("No such cpt in target store : " + guiID + " when connecting " +
124 "controller ", ctrl);
125 targetStore.printAvailable();
126
127 } else {
128 Object subctrl = null;
129 if (cpt instanceof Druid) {
130 subctrl = ((Druid)cpt).getController();
131 } else if (cpt instanceof Controller) {
132 subctrl = cpt;
133 } else {
134 E.error("cant control connect " + cpt + " " + cpt.getClass().getName());
135 }
136 if (subctrl != null) {
137 try {
138 fld.set(ctrl, subctrl);
139
140 } catch (Exception ex) {
141 E.error("cant set gui cpt in controller: " + guiID + " cpt is " + cpt
142 + " but field needs " + fld.getType());
143 }
144 }
145 }
146 }
147
148
149 private void ioPointConnect(Object ctrl, Field fld, String guiID) {
150 Object cpt = targetStore.get(guiID);
151
152
153 if (cpt == null) {
154 E.linkToWarning("No such cpt in target store : " + guiID + " when connecting " +
155 "controller ", ctrl);
156 targetStore.printAvailable();
157
158 } else {
159
160 try {
161 fld.set(ctrl, cpt);
162
163 } catch (Exception ex) {
164 E.error("cant set gui cpt in controller: " + guiID + " cpt is " + cpt
165 + " but field needs " + fld.getType());
166 }
167 }
168
169 }
170
171
172
173
174
175 }