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 @ 588

History | View | Annotate | Download (12.3 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
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
/*
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
import java.util.ArrayList;
37
import java.util.List;
38

    
39
import javax.swing.JComponent;
40

    
41
import org.slf4j.Logger;
42
import org.slf4j.LoggerFactory;
43

    
44
import org.gvsig.tools.ToolsLocator;
45
import org.gvsig.tools.dataTypes.DataTypes;
46
import org.gvsig.tools.dynobject.DynClass;
47
import org.gvsig.tools.dynobject.DynField;
48
import org.gvsig.tools.dynobject.DynObject;
49
import org.gvsig.tools.dynobject.DynObjectManager;
50
import org.gvsig.tools.dynobject.exception.DynFieldValidateException;
51
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

    
59
public class JDynObjectDynFieldComponent implements JDynFieldComponent,
60
                ValueChangedListener {
61

    
62
        private static final Logger LOG = LoggerFactory
63
                        .getLogger(JDynObjectDynFieldComponent.class);
64

    
65
        private JDynObjectComponent jDynObjectComponent;
66

    
67
        private DynObject dynObject;
68
        private DynField dynField;
69
        private DynClass dynClass;
70
        private ValueField dynValueField;
71

    
72
        private JComponent component;
73
        private DynObjectManager manager;
74
        private List<ValueChangedListener> listeners;
75

    
76
        private boolean writable;
77

    
78
        /**
79
         * @param definition
80
         * @param dynObjectValueField
81
         * @param writable
82
         * @throws ServiceException
83
         */
84
        public JDynObjectDynFieldComponent(DynField definition,
85
                        ValueField dynObjectValueField, boolean writable)
86
                        throws ServiceException {
87
                this.dynField = definition;
88
                this.dynValueField = dynObjectValueField;
89
                this.writable = writable;
90
                if (definition == null) {
91
                        this.dynField = dynObjectValueField.getDynField();
92
                }
93
                this.dynObject = (DynObject) dynValueField.getFieldValue();
94
                this.manager = ToolsLocator.getDynObjectManager();
95

    
96
                this.listeners = new ArrayList<ValueChangedListener>();
97

    
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
                        }
109
                }
110
                return getDynObjectComponent().asJComponent();
111
        }
112

    
113
        public JDynObjectComponent getDynObjectComponent() {
114
                if (this.jDynObjectComponent == null) {
115
                        // if (this.dynObject!=null){
116
                        try {
117
                                this.jDynObjectComponent = ToolsSwingLocator
118
                                                .getDynObjectSwingManager().createJDynObjectComponent(
119
                                                                this.getDynClass(), this.getDynObject(),
120
                                                                writable);
121
                        } catch (ServiceException e) {
122
                                return null;
123
                        }
124
                        // this.jDynObjectComponent.setValue(this.dynObject);
125
                        this.jDynObjectComponent.addValueChangedListener(this);
126
                        // this.dynObject = createDynObject(dynObjectValue.getValue());
127

    
128
                }
129
                return this.jDynObjectComponent;
130
        }
131

    
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
         */
139
        public void addValueChangedListener(ValueChangedListener listener) {
140
                this.listeners.add(listener);
141
        }
142

    
143
        /*
144
         * (non-Javadoc)
145
         * 
146
         * @seeorg.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#
147
         * fireValueChangedEvent()
148
         */
149
        public void fireValueChangedEvent() {
150
                for (ValueChangedListener listener : this.listeners)
151
                        listener.handleValueChanged(this);
152
        }
153

    
154
        public DynObject getDynObject() {
155
                if (this.dynObject != null)
156
                        return this.dynObject;
157
                createDynObject(this.getInitialValue());
158
                return this.dynObject;
159
        }
160

    
161
        /**
162
     * 
163
     */
164
        private DynObject createDynObject(Object value) {
165
                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
                this.dynObject = manager.createDynObject(this.dynClass);
182
                if (this.dynObject instanceof DynObject) {
183
                        setValue(this.dynObject);
184
                }
185
                return dynObject;
186

    
187
        }
188

    
189
        /*
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
        /**
223
         * @return
224
         */
225
        private String getFieldName(boolean doRemoveListItemString) {
226
                String name = "";
227
                String suffix = "-list-List-item";
228

    
229
                if (this.dynField.isContainer())
230
                        name = this.dynField.getElementsType().getName();
231
                else if (this.dynField.getType() == DataTypes.DYNOBJECT) {
232
                        name = this.getParentDynField().getSubtype();
233
                        if (name == null) {
234
                                name = this.dynField.getSubtype();
235
                        }
236
                }
237
                if (name == null) {
238
                        name = this.dynField.getName();
239
                }
240

    
241
                if (name.endsWith(suffix)) {
242
                        if (doRemoveListItemString)
243
                                return name.replace(suffix, "");
244
                }
245
                return name;
246
        }
247

    
248
        /*
249
         * (non-Javadoc)
250
         * 
251
         * @see
252
         * org.gvsig.tools.swing.api.dynobject.dynfield.JComponent#getComponent()
253
         */
254
        public JComponent asJComponent() {
255
                return this.getComponent();
256
        }
257

    
258
        /*
259
         * (non-Javadoc)
260
         * 
261
         * @see
262
         * org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getDefaultValue()
263
         */
264
        public Object getDefaultValue() {
265
                return this.dynField.getDefaultValue();
266
        }
267

    
268
        /*
269
         * (non-Javadoc)
270
         * 
271
         * @see
272
         * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#getDynField
273
         * ()
274
         */
275
        public DynField getDynField() {
276
                return this.dynField;
277
        }
278

    
279
        private DynObject getDynObjectValue() {
280
                DynObject dynObj = this.manager.createDynObject(getDynClass());
281
                Object value = null;
282
                for (DynField field : dynObject.getDynClass().getDeclaredDynFields()) {
283
                        value = dynObject.getDynValue(field.getName());
284
                        if (value != null) {
285
                                try {
286
                                        field.validate(value);
287
                                        dynObj.setDynValue(field.getName(), value);
288
                                } catch (DynFieldValidateException e) {
289
                                        // TODO Auto-generated catch block
290
                                        e.printStackTrace();
291
                                }
292
                        }
293

    
294
                }
295
                return dynObj;
296
        }
297

    
298
        /*
299
         * (non-Javadoc)
300
         * 
301
         * @see org.gvsig.tools.swing.spi.DelegatedJFieldComponent#getFieldValue()
302
         */
303
        public Object getInitialValue() {
304
                if (this.dynObject == null) {
305
                        this.dynObject = (DynObject) dynValueField.getDefaultFieldValue();
306
                }
307
                return this.dynObject;
308
        }
309

    
310
        /*
311
         * (non-Javadoc)
312
         * 
313
         * @see org.gvsig.tools.service.Service#getManager()
314
         */
315
        public Manager getManager() {
316
                return ToolsSwingLocator.getDynObjectSwingManager();
317
        }
318

    
319
        /*
320
         * (non-Javadoc)
321
         * 
322
         * @see org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getValue()
323
         */
324
        public Object getValue() {
325
                return getDynObjectValue();
326
        }
327

    
328
        /*
329
         * (non-Javadoc)
330
         * 
331
         * @see
332
         * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isMandatory
333
         * ()
334
         */
335
        public boolean isMandatory() {
336
                return this.dynField.isMandatory();
337
        }
338

    
339
        /*
340
         * (non-Javadoc)
341
         * 
342
         * @see
343
         * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isValid()
344
         */
345
        public boolean isValid() {
346
                if (getDynObjectComponent() != null)
347
                        return this.getDynObjectComponent().isValid();
348
                return true;
349
        }
350

    
351
        /*
352
         * (non-Javadoc)
353
         * 
354
         * @see
355
         * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#requestFocus
356
         * ()
357
         */
358
        public void requestFocus() {
359
                if (this.component != null)
360
                        this.component.requestFocus();
361

    
362
        }
363

    
364
        /*
365
         * (non-Javadoc)
366
         * 
367
         * @see
368
         * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#saveStatus
369
         * ()
370
         */
371
        public void saveStatus() {
372
                this.getDynObjectComponent().saveStatus();
373
        }
374

    
375
        /*
376
         * (non-Javadoc)
377
         * 
378
         * @see
379
         * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#setEnabled
380
         * (boolean)
381
         */
382
        public void setEnabled(boolean isEnabled) {
383
                component.setEnabled(isEnabled);
384
        }
385

    
386
        /*
387
         * (non-Javadoc)
388
         * 
389
         * @see
390
         * org.gvsig.tools.swing.spi.DelegatedJFieldComponent#setFieldValue(java
391
         * .lang.Object)
392
         */
393
        public void setFieldValue(Object value) {
394
                if (value != null) {
395
                        this.dynObject = (DynObject) value;
396
                }
397
        }
398

    
399
        /*
400
         * (non-Javadoc)
401
         * 
402
         * @see
403
         * org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#setValue(java
404
         * .lang.Object)
405
         */
406
        public void setValue(Object value) {
407
                Object dynValue = null;
408
                if (value instanceof DynObject) {
409
                        boolean validated = true;
410
                        DynObject dynObj = (DynObject) value;
411
                        for (DynField field : getDynObject().getDynClass()
412
                                        .getDeclaredDynFields()) {
413
                                dynValue = dynObj.getDynValue(field.getName());
414
                                if (value != null) {
415
                                        try {
416
                                                field.validate(dynValue);
417
                                                dynObj.setDynValue(field.getName(), dynValue);
418

    
419
                                        } catch (DynFieldValidateException e) {
420
                                                // e.printStackTrace();
421
                                                validated = false;
422
                                        }
423
                                }
424
                        }
425
                        if (validated) {
426
                                this.getDynObjectComponent().setValue(this.getDynObject());
427
                        }
428
                } else if (value instanceof JDynFieldComponent) {
429
                        JDynFieldComponent field = (JDynFieldComponent) value;
430
                        String name = field.getDynField().getName();
431
                        if (this.dynClass.getDynField(name) != null) {
432
                                try {
433
                                        dynValue = field.getValue();
434
                                        field.getDynField().validate(dynValue);
435
                                        this.getDynObject().setDynValue(name, dynValue);
436
                                } catch (DynFieldValidateException e) {
437
                                        LOG.info("Validation error on: " + name + " with value "
438
                                                        + dynValue);
439
                                }
440

    
441
                        }
442
                } else {
443
                        this.getDynObjectComponent().setValue(null);
444
                }
445
                this.fireValueChangedEvent();
446
        }
447

    
448
        /*
449
         * (non-Javadoc)
450
         * 
451
         * @see
452
         * org.gvsig.tools.swing.api.dynobject.ValueChangedListener#handleValueChanged
453
         * (org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent)
454
         */
455
        public void handleValueChanged(JDynFieldComponent field) {
456
                setValue(field);
457
                this.fireValueChangedEvent();
458
        }
459

    
460
        public Object getDefaultFieldValue() {
461
                return this.dynValueField.getDefaultFieldValue();
462
        }
463

    
464
        public Object getFieldValue() {
465
                return this.dynValueField.getFieldValue();
466
        }
467

    
468
        public void setPrintValue(Object value) {
469
                // DO nothing. Override if necessary by inhereted classes.
470
        }
471

    
472
        public String getPrintValue() {
473
                Object value = this.getValue();
474
                if (value != null) {
475
                        return value.toString();
476
                }
477
                return null;
478
        }
479

    
480
        public String getValidationMessage() {
481
                return null;
482

    
483
        }
484

    
485
        public DynField getParentDynField() {
486
                return dynValueField.getParentDynField();
487
        }
488
}