1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.uruma.binding.value.binder;
17
18 import java.lang.reflect.Array;
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.eclipse.jface.viewers.IBaseLabelProvider;
23 import org.eclipse.jface.viewers.IContentProvider;
24 import org.eclipse.jface.viewers.IStructuredSelection;
25 import org.eclipse.jface.viewers.StructuredSelection;
26 import org.eclipse.jface.viewers.StructuredViewer;
27 import org.eclipse.jface.viewers.Viewer;
28 import org.seasar.framework.beans.PropertyDesc;
29 import org.seasar.uruma.binding.value.ValueBinder;
30 import org.seasar.uruma.component.UIComponent;
31 import org.seasar.uruma.core.UrumaConstants;
32 import org.seasar.uruma.core.UrumaMessageCodes;
33 import org.seasar.uruma.exception.BindingException;
34 import org.seasar.uruma.log.UrumaLogger;
35 import org.seasar.uruma.util.AssertionUtil;
36 import org.seasar.uruma.viewer.ContentsHolder;
37 import org.seasar.uruma.viewer.TargetClassHoldingProvider;
38
39
40
41
42
43
44
45
46 public abstract class AbstractValueBinder<WIDGET_TYPE> implements ValueBinder {
47 private UrumaLogger logger = UrumaLogger.getLogger(getClass());
48
49 private Class<WIDGET_TYPE> widgetType;
50
51 protected static final String IMPORT_VALUE = "[ImportValue]";
52
53 protected static final String EXPORT_VALUE = "[ExportValue]";
54
55 protected static final String IMPORT_SELECTION = "[ImportSelection]";
56
57 protected static final String EXPORT_SELECTION = "[ExportSelection]";
58
59
60
61
62
63
64
65 public AbstractValueBinder(final Class<WIDGET_TYPE> widgetType) {
66 AssertionUtil.assertNotNull("widgetType", widgetType);
67 this.widgetType = widgetType;
68 }
69
70
71
72
73
74 public void importValue(final Object widget, final Object formObj,
75 final PropertyDesc propDesc, final UIComponent uiComp) {
76 doImportValue(getWidgetType().cast(widget), formObj, propDesc, uiComp);
77 }
78
79
80
81
82
83 public void exportValue(final Object widget, final Object formObj,
84 final PropertyDesc propDesc, final UIComponent uiComp) {
85 doExportValue(getWidgetType().cast(widget), formObj, propDesc, uiComp);
86 }
87
88
89
90
91
92 public void importSelection(final Object widget, final Object formObj,
93 final PropertyDesc propDesc, final UIComponent uiComp) {
94 doImportSelection(getWidgetType().cast(widget), formObj, propDesc,
95 uiComp);
96 }
97
98
99
100
101
102 public void exportSelection(final Object widget, final Object formObj,
103 final PropertyDesc propDesc, final UIComponent uiComp) {
104 doExportSelection(getWidgetType().cast(widget), formObj, propDesc,
105 uiComp);
106 }
107
108
109
110
111 public Class<WIDGET_TYPE> getWidgetType() {
112 return this.widgetType;
113 }
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 protected void doImportValue(final WIDGET_TYPE widget,
130 final Object formObj, final PropertyDesc propDesc,
131 final UIComponent uiComp) {
132
133 }
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 protected void doExportValue(final WIDGET_TYPE widget,
152 final Object formObj, final PropertyDesc propDesc,
153 final UIComponent uiComp) {
154 if (widget instanceof StructuredViewer) {
155 StructuredViewer viewer = StructuredViewer.class.cast(widget);
156
157 Class<?> formFieldType = propDesc.getField().getType();
158 Object contents = propDesc.getValue(formObj);
159 IContentProvider contentProvider = viewer.getContentProvider();
160 IBaseLabelProvider labelProvider = viewer.getLabelProvider();
161
162 if (contentProvider != null
163 && contentProvider instanceof ContentsHolder) {
164 ContentsHolder holder = (ContentsHolder) contentProvider;
165 if (formFieldType.isArray()) {
166 if (contents != null) {
167 holder.setContents((Object[]) contents);
168 } else {
169 holder.setContents(new Object[] {});
170 }
171 setClassToProvider(labelProvider, formFieldType
172 .getComponentType());
173 } else if (List.class.isAssignableFrom(formFieldType)) {
174 List<?> listContents = (List<?>) contents;
175
176 if ((listContents != null) && (listContents.size() > 0)) {
177 holder.setContents(listContents);
178
179 Object content = listContents.get(0);
180 setClassToProvider(labelProvider, content.getClass());
181 } else {
182 holder.setContents(new ArrayList<Object>());
183 setClassToProvider(labelProvider, Object.class);
184 }
185 } else {
186 if (contents != null) {
187 holder.setContents(new Object[] { contents });
188 setClassToProvider(labelProvider, contents.getClass());
189 } else {
190 holder.setContents(new Object[] {});
191 setClassToProvider(labelProvider, Object.class);
192 }
193 }
194
195 logBinding(EXPORT_VALUE, formObj, propDesc, widget, null,
196 contents);
197
198 viewer.setInput(contents);
199 }
200 }
201 }
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220 protected void doImportSelection(final WIDGET_TYPE widget,
221 final Object formObj, final PropertyDesc propDesc,
222 final UIComponent uiComp) {
223 if (widget instanceof Viewer) {
224 Viewer viewer = Viewer.class.cast(widget);
225
226 IStructuredSelection selection = (IStructuredSelection) viewer
227 .getSelection();
228 int size = selection.size();
229 if (size > 0) {
230 Class<?> propertyType = propDesc.getPropertyType();
231 Object firstElement = selection.getFirstElement();
232 if (propertyType.isArray()) {
233 Object[] selectedArray = selection.toArray();
234 Object content = Array.newInstance(propertyType
235 .getComponentType(), selectedArray.length);
236 System.arraycopy(selectedArray, 0, content, 0,
237 selectedArray.length);
238
239 logBinding(IMPORT_SELECTION, widget, null, formObj,
240 propDesc, content);
241 propDesc.setValue(formObj, content);
242 } else if (propertyType.isAssignableFrom(List.class)) {
243 List<?> list = selection.toList();
244 logBinding(IMPORT_SELECTION, widget, null, formObj,
245 propDesc, list);
246 propDesc.setValue(formObj, list);
247 } else if (propertyType.isAssignableFrom(firstElement
248 .getClass())) {
249 logBinding(IMPORT_SELECTION, widget, null, formObj,
250 propDesc, firstElement);
251 propDesc.setValue(formObj, firstElement);
252 } else {
253 throw new BindingException(
254 UrumaMessageCodes.CLASS_NOT_MUTCH, formObj
255 .getClass().getName(), propDesc
256 .getPropertyName());
257 }
258 }
259 }
260 }
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278 protected void doExportSelection(final WIDGET_TYPE widget,
279 final Object formObj, final PropertyDesc propDesc,
280 final UIComponent uiComp) {
281 if (widget instanceof Viewer) {
282 Viewer viewer = Viewer.class.cast(widget);
283 Object selection = propDesc.getValue(formObj);
284 if (selection != null) {
285 logBinding(EXPORT_SELECTION, formObj, propDesc, viewer, null,
286 selection);
287
288 viewer.setSelection(new StructuredSelection(selection), true);
289 }
290 }
291 }
292
293 protected void setClassToProvider(final IBaseLabelProvider provider,
294 final Class<?> clazz) {
295 if ((provider != null)
296 && (provider instanceof TargetClassHoldingProvider)) {
297 TargetClassHoldingProvider.class.cast(provider).setTargetClass(
298 clazz);
299 }
300 }
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318 protected void logBinding(final String command, final Object srcObj,
319 final PropertyDesc srcProp, final Object destObj,
320 final PropertyDesc destProp, final Object value) {
321 if (logger.isInfoEnabled()) {
322 String srcName = UrumaConstants.NULL_STRING;
323 if (srcProp != null) {
324 srcName = srcProp.getPropertyName();
325 }
326 String destName = UrumaConstants.NULL_STRING;
327 if (destProp != null) {
328 destName = destProp.getPropertyName();
329 }
330 logger.log(UrumaMessageCodes.DO_BINDING, command, UrumaLogger
331 .getObjectDescription(srcObj), srcName, UrumaLogger
332 .getObjectDescription(destObj), destName, value);
333 }
334 }
335 }