Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.impl / src / main / java / org / gvsig / tools / swing / impl / dynobject / dynfield / JDynObjectDynFieldComponent.java @ 586

History | View | Annotate | Download (14.5 KB)

1 168 cmartin
/* gvSIG. Geographic Information System of the Valencian Government
2 270 cmartin
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22 168 cmartin
/*
23
 * AUTHORS (In addition to CIT):
24
 * 2010 Institute of New Imaging Technologies (INIT):
25
 *   http://www.init.uji.es
26
 * Geographic Information research group:
27
 *   http://www.geoinfo.uji.es
28
 * Universitat Jaume I, Spain
29
 */
30
31
/**
32
 *
33
 */
34
package org.gvsig.tools.swing.impl.dynobject.dynfield;
35
36 202 cmartin
import java.util.ArrayList;
37
import java.util.List;
38 168 cmartin
39 230 cordinyana
import javax.swing.JComponent;
40
41 494 cmartin
import org.slf4j.Logger;
42
import org.slf4j.LoggerFactory;
43
44 202 cmartin
import org.gvsig.tools.ToolsLocator;
45 483 cmartin
import org.gvsig.tools.dataTypes.DataTypes;
46 180 cmartin
import org.gvsig.tools.dynobject.DynClass;
47 168 cmartin
import org.gvsig.tools.dynobject.DynField;
48
import org.gvsig.tools.dynobject.DynObject;
49 202 cmartin
import org.gvsig.tools.dynobject.DynObjectManager;
50
import org.gvsig.tools.dynobject.exception.DynFieldValidateException;
51 168 cmartin
import org.gvsig.tools.service.Manager;
52
import org.gvsig.tools.service.ServiceException;
53
import org.gvsig.tools.swing.api.ToolsSwingLocator;
54
import org.gvsig.tools.swing.api.dynobject.JDynObjectComponent;
55
import org.gvsig.tools.swing.api.dynobject.ValueChangedListener;
56
import org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent;
57
import org.gvsig.tools.swing.api.dynobject.dynfield.ValueField;
58 270 cmartin
59
public class JDynObjectDynFieldComponent implements JDynFieldComponent,
60
    ValueChangedListener {
61 535 cmartin
62 494 cmartin
    private static final Logger LOG = LoggerFactory
63 535 cmartin
        .getLogger(JDynObjectDynFieldComponent.class);
64 270 cmartin
65 168 cmartin
    private JDynObjectComponent jDynObjectComponent;
66 535 cmartin
67 168 cmartin
    private DynObject dynObject;
68
    private DynField dynField;
69 535 cmartin
    private DynClass dynClass;
70 180 cmartin
    private ValueField dynValueField;
71 535 cmartin
72
    private JComponent component;
73 202 cmartin
    private DynObjectManager manager;
74
    private List<ValueChangedListener> listeners;
75 168 cmartin
76 535 cmartin
    private boolean writable;
77
78 168 cmartin
    /**
79 535 cmartin
     * @param definition
80 494 cmartin
     * @param dynObjectValueField
81
     * @param writable
82 270 cmartin
     * @throws ServiceException
83 168 cmartin
     */
84 535 cmartin
    public JDynObjectDynFieldComponent(DynField definition,
85
        ValueField dynObjectValueField, boolean writable)
86
        throws ServiceException {
87
        this.dynField = definition;
88 281 cmartin
        this.dynValueField = dynObjectValueField;
89 535 cmartin
        this.writable = writable;
90
        if (definition == null) {
91
            this.dynField = dynObjectValueField.getDynField();
92
        }
93 281 cmartin
        this.dynObject = (DynObject) dynValueField.getFieldValue();
94 270 cmartin
        this.manager = ToolsLocator.getDynObjectManager();
95 535 cmartin
96 270 cmartin
        this.listeners = new ArrayList<ValueChangedListener>();
97 535 cmartin
98
        // this.jDynObjectComponent.handleValueChanged(this);
99
        this.component = getComponent();
100
        // }
101
    }
102
103
    public JComponent getComponent() {
104
        if (this.component == null) {
105
            JDynObjectComponent jComponent = getDynObjectComponent();
106
            if (jComponent == null) {
107
                return null;
108 494 cmartin
            }
109 364 cmartin
        }
110 535 cmartin
        return getDynObjectComponent().asJComponent();
111
    }
112
113
    public JDynObjectComponent getDynObjectComponent() {
114
        if (this.jDynObjectComponent == null) {
115
            // if (this.dynObject!=null){
116
            try {
117
                this.jDynObjectComponent =
118
                    ToolsSwingLocator.getDynObjectSwingManager()
119
                        .createJDynObjectComponent(this.getDynClass(),
120
                            this.getDynObject(), writable);
121
            } catch (ServiceException e) {
122
                return null;
123
            }
124
            // this.jDynObjectComponent.setValue(this.dynObject);
125
            this.jDynObjectComponent.addValueChangedListener(this);
126 494 cmartin
            // this.dynObject = createDynObject(dynObjectValue.getValue());
127 270 cmartin
128 535 cmartin
        }
129
        return this.jDynObjectComponent;
130 168 cmartin
    }
131 202 cmartin
132
    /*
133
     * (non-Javadoc)
134
     *
135
     * @seeorg.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#
136
     * addValueChangedListener
137
     * (org.gvsig.tools.swing.api.dynobject.ValueChangedListener)
138 168 cmartin
     */
139
    public void addValueChangedListener(ValueChangedListener listener) {
140 270 cmartin
        this.listeners.add(listener);
141 168 cmartin
    }
142
143 270 cmartin
    /*
144
     * (non-Javadoc)
145
     *
146 306 cordinyana
     * @seeorg.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#
147
     * fireValueChangedEvent()
148 168 cmartin
     */
149 477 jjdelcerro
    public void fireValueChangedEvent() {
150 306 cordinyana
        for (ValueChangedListener listener : this.listeners)
151
            listener.handleValueChanged(this);
152 168 cmartin
    }
153 270 cmartin
154 306 cordinyana
    public DynObject getDynObject() {
155
        if (this.dynObject != null)
156
            return this.dynObject;
157 477 jjdelcerro
        createDynObject(this.getInitialValue());
158 306 cordinyana
        return this.dynObject;
159
    }
160
161 202 cmartin
    /**
162
     *
163
     */
164 477 jjdelcerro
    private DynObject createDynObject(Object value) {
165 535 cmartin
        if (this.dynClass == null) {
166
            // String id = dynField.getName().replace("-List-item", "");
167
            // this.dynClass =
168
            // manager.get(manager.createDynClassName("metadata",
169
            // id).getFullName());
170
            this.dynClass = getDynClass();
171
172
            if (this.dynClass == null)
173
                return null;
174
        }
175
        dynObject = (DynObject) value;
176
177
        if (dynObject != null) {
178
            return dynObject;
179
        }
180
181 270 cmartin
        this.dynObject = manager.createDynObject(this.dynClass);
182 535 cmartin
        if (this.dynObject instanceof DynObject) {
183
            setValue(this.dynObject);
184 270 cmartin
        }
185
        return dynObject;
186 168 cmartin
187 202 cmartin
    }
188 168 cmartin
189 535 cmartin
    /*
190
     * (non-Javadoc)
191
     *
192
     * @see
193
     * org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getDynClass()
194
     */
195
    public DynClass getDynClass() {
196
        if (dynClass == null) {
197
198
            String dynObjectID = getFieldName(true);
199
            this.dynClass = manager.get(dynObjectID);
200
            if (dynClass != null) {
201
202
                return getDynObject().getDynClass();
203
            }
204
205
            dynObjectID = dynField.getSubtype();
206
            if (dynObjectID == null) {
207
                dynObjectID = dynValueField.getParentDynField().getSubtype();
208
            }
209
            if (dynObjectID != null) {
210
                this.dynClass = manager.get(dynObjectID);
211
            }
212
            if (dynClass == null) {
213
                if (this.dynObject == null) {
214
                    return null;
215
                }
216
                this.dynClass = getDynObject().getDynClass();
217
            }
218
        }
219
        return dynClass;
220
    }
221
222 306 cordinyana
    /**
223
     * @return
224 202 cmartin
     */
225 364 cmartin
    private String getFieldName(boolean doRemoveListItemString) {
226 306 cordinyana
        String name = "";
227
        String suffix = "-list-List-item";
228 202 cmartin
229 306 cordinyana
        if (this.dynField.isContainer())
230
            name = this.dynField.getElementsType().getName();
231
        else
232 535 cmartin
            if (this.dynField.getType() == DataTypes.DYNOBJECT) {
233
                name = this.getParentDynField().getSubtype();
234
                if (name == null) {
235
                    name = this.dynField.getSubtype();
236
                }
237 483 cmartin
            }
238 535 cmartin
        if (name == null) {
239
            name = this.dynField.getName();
240
        }
241 306 cordinyana
242 364 cmartin
        if (name.endsWith(suffix)) {
243
            if (doRemoveListItemString)
244
                return name.replace(suffix, "");
245
        }
246 306 cordinyana
        return name;
247 270 cmartin
    }
248 202 cmartin
249 270 cmartin
    /*
250
     * (non-Javadoc)
251
     *
252
     * @see
253 306 cordinyana
     * org.gvsig.tools.swing.api.dynobject.dynfield.JComponent#getComponent()
254 168 cmartin
     */
255 306 cordinyana
    public JComponent asJComponent() {
256 535 cmartin
        return this.getComponent();
257 168 cmartin
    }
258
259 270 cmartin
    /*
260
     * (non-Javadoc)
261
     *
262
     * @see
263 306 cordinyana
     * org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getDefaultValue()
264 168 cmartin
     */
265 306 cordinyana
    public Object getDefaultValue() {
266
        return this.dynField.getDefaultValue();
267 168 cmartin
    }
268
269 270 cmartin
    /*
270
     * (non-Javadoc)
271
     *
272
     * @see
273
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#getDynField
274
     * ()
275 168 cmartin
     */
276
    public DynField getDynField() {
277 270 cmartin
        return this.dynField;
278 168 cmartin
    }
279
280 270 cmartin
    private DynObject getDynObjectValue() {
281 535 cmartin
        DynObject dynObj = this.manager.createDynObject(getDynClass());
282 270 cmartin
        Object value = null;
283
        for (DynField field : dynObject.getDynClass().getDeclaredDynFields()) {
284
            value = dynObject.getDynValue(field.getName());
285
            if (value != null) {
286
                try {
287
                    field.validate(value);
288
                    dynObj.setDynValue(field.getName(), value);
289
                } catch (DynFieldValidateException e) {
290
                    // TODO Auto-generated catch block
291
                    e.printStackTrace();
292
                }
293
            }
294 168 cmartin
295 270 cmartin
        }
296
        return dynObj;
297 168 cmartin
    }
298
299 270 cmartin
    /*
300
     * (non-Javadoc)
301
     *
302 168 cmartin
     * @see org.gvsig.tools.swing.spi.DelegatedJFieldComponent#getFieldValue()
303
     */
304 281 cmartin
    public Object getInitialValue() {
305 298 cmartin
        if (this.dynObject == null) {
306 281 cmartin
            this.dynObject = (DynObject) dynValueField.getDefaultFieldValue();
307 298 cmartin
        }
308 270 cmartin
        return this.dynObject;
309 168 cmartin
    }
310
311 270 cmartin
    /*
312
     * (non-Javadoc)
313
     *
314 168 cmartin
     * @see org.gvsig.tools.service.Service#getManager()
315
     */
316
    public Manager getManager() {
317 270 cmartin
        return ToolsSwingLocator.getDynObjectSwingManager();
318 168 cmartin
    }
319
320 270 cmartin
    /*
321
     * (non-Javadoc)
322
     *
323 168 cmartin
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getValue()
324
     */
325
    public Object getValue() {
326 270 cmartin
        return getDynObjectValue();
327 168 cmartin
    }
328
329 270 cmartin
    /*
330
     * (non-Javadoc)
331
     *
332
     * @see
333
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isMandatory
334
     * ()
335 168 cmartin
     */
336
    public boolean isMandatory() {
337 270 cmartin
        return this.dynField.isMandatory();
338 168 cmartin
    }
339
340 270 cmartin
    /*
341
     * (non-Javadoc)
342
     *
343
     * @see
344
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isValid()
345 168 cmartin
     */
346
    public boolean isValid() {
347 535 cmartin
        if (getDynObjectComponent() != null)
348
            return this.getDynObjectComponent().isValid();
349 364 cmartin
        return true;
350 168 cmartin
    }
351
352 270 cmartin
    /*
353
     * (non-Javadoc)
354
     *
355
     * @see
356
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#requestFocus
357
     * ()
358 168 cmartin
     */
359
    public void requestFocus() {
360 364 cmartin
        if (this.component != null)
361
            this.component.requestFocus();
362 270 cmartin
363 168 cmartin
    }
364
365 270 cmartin
    /*
366
     * (non-Javadoc)
367
     *
368
     * @see
369
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#saveStatus
370
     * ()
371 168 cmartin
     */
372 477 jjdelcerro
    public void saveStatus() {
373 535 cmartin
        this.getDynObjectComponent().saveStatus();
374 168 cmartin
    }
375
376 270 cmartin
    /*
377
     * (non-Javadoc)
378
     *
379
     * @see
380
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#setEnabled
381
     * (boolean)
382 168 cmartin
     */
383
    public void setEnabled(boolean isEnabled) {
384 270 cmartin
        component.setEnabled(isEnabled);
385 168 cmartin
    }
386
387 270 cmartin
    /*
388
     * (non-Javadoc)
389
     *
390
     * @see
391
     * org.gvsig.tools.swing.spi.DelegatedJFieldComponent#setFieldValue(java
392
     * .lang.Object)
393 168 cmartin
     */
394 477 jjdelcerro
    public void setFieldValue(Object value) {
395 270 cmartin
        if (value != null) {
396 477 jjdelcerro
            this.dynObject = (DynObject) value;
397 270 cmartin
        }
398 168 cmartin
    }
399
400 270 cmartin
    /*
401
     * (non-Javadoc)
402
     *
403
     * @see
404
     * org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#setValue(java
405
     * .lang.Object)
406 168 cmartin
     */
407 477 jjdelcerro
    public void setValue(Object value) {
408 270 cmartin
        Object dynValue = null;
409
        if (value instanceof DynObject) {
410
            boolean validated = true;
411
            DynObject dynObj = (DynObject) value;
412 535 cmartin
            for (DynField field : getDynObject().getDynClass()
413 270 cmartin
                .getDeclaredDynFields()) {
414
                dynValue = dynObj.getDynValue(field.getName());
415
                if (value != null) {
416 477 jjdelcerro
                    try {
417
                        field.validate(dynValue);
418
                        dynObj.setDynValue(field.getName(), dynValue);
419
420
                    } catch (DynFieldValidateException e) {
421 535 cmartin
                        // e.printStackTrace();
422 477 jjdelcerro
                        validated = false;
423
                    }
424 270 cmartin
                }
425
            }
426 298 cmartin
            if (validated) {
427 535 cmartin
                this.getDynObjectComponent().setValue(this.getDynObject());
428 298 cmartin
            }
429 270 cmartin
        } else
430
            if (value instanceof JDynFieldComponent) {
431
                JDynFieldComponent field = (JDynFieldComponent) value;
432
                String name = field.getDynField().getName();
433
                if (this.dynClass.getDynField(name) != null) {
434 477 jjdelcerro
                    try {
435
                        dynValue = field.getValue();
436
                        field.getDynField().validate(dynValue);
437 535 cmartin
                        this.getDynObject().setDynValue(name, dynValue);
438 477 jjdelcerro
                    } catch (DynFieldValidateException e) {
439 535 cmartin
                        LOG.info("Validation error on: " + name
440
                            + " with value " + dynValue);
441 477 jjdelcerro
                    }
442
443 270 cmartin
                }
444 298 cmartin
            } else {
445 535 cmartin
                this.getDynObjectComponent().setValue(null);
446 298 cmartin
            }
447 270 cmartin
        this.fireValueChangedEvent();
448 168 cmartin
    }
449 306 cordinyana
450
    /*
451
     * (non-Javadoc)
452
     *
453
     * @see
454
     * org.gvsig.tools.swing.api.dynobject.ValueChangedListener#handleValueChanged
455
     * (org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent)
456
     */
457 477 jjdelcerro
    public void handleValueChanged(JDynFieldComponent field) {
458
        setValue(field);
459 494 cmartin
        this.fireValueChangedEvent();
460 306 cordinyana
    }
461
462
    public Object getDefaultFieldValue() {
463
        return this.dynValueField.getDefaultFieldValue();
464
    }
465
466
    public Object getFieldValue() {
467
        return this.dynValueField.getFieldValue();
468
    }
469 494 cmartin
470
    public void setPrintValue(Object value) {
471
        // DO nothing. Override if necessary by inhereted classes.
472
    }
473
474
    public String getPrintValue() {
475
        Object value = this.getValue();
476 535 cmartin
        if (value != null) {
477 494 cmartin
            return value.toString();
478
        }
479
        return null;
480
    }
481
482
    public String getValidationMessage() {
483
        return null;
484 535 cmartin
485 494 cmartin
    }
486 535 cmartin
487
    public DynField getParentDynField() {
488
        return dynValueField.getParentDynField();
489
    }
490 168 cmartin
}