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
/* 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 =
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
            // 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
232
            if (this.dynField.getType() == DataTypes.DYNOBJECT) {
233
                name = this.getParentDynField().getSubtype();
234
                if (name == null) {
235
                    name = this.dynField.getSubtype();
236
                }
237
            }
238
        if (name == null) {
239
            name = this.dynField.getName();
240
        }
241

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

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

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

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

    
280
    private DynObject getDynObjectValue() {
281
        DynObject dynObj = this.manager.createDynObject(getDynClass());
282
        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

    
295
        }
296
        return dynObj;
297
    }
298

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

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

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

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

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

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

    
363
    }
364

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

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

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

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

    
420
                    } catch (DynFieldValidateException e) {
421
                        // e.printStackTrace();
422
                        validated = false;
423
                    }
424
                }
425
            }
426
            if (validated) {
427
                this.getDynObjectComponent().setValue(this.getDynObject());
428
            }
429
        } 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
                    try {
435
                        dynValue = field.getValue();
436
                        field.getDynField().validate(dynValue);
437
                        this.getDynObject().setDynValue(name, dynValue);
438
                    } catch (DynFieldValidateException e) {
439
                        LOG.info("Validation error on: " + name
440
                            + " with value " + dynValue);
441
                    }
442

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

    
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
    public void handleValueChanged(JDynFieldComponent field) {
458
        setValue(field);
459
        this.fireValueChangedEvent();
460
    }
461

    
462
    public Object getDefaultFieldValue() {
463
        return this.dynValueField.getDefaultFieldValue();
464
    }
465

    
466
    public Object getFieldValue() {
467
        return this.dynValueField.getFieldValue();
468
    }
469

    
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
        if (value != null) {
477
            return value.toString();
478
        }
479
        return null;
480
    }
481

    
482
    public String getValidationMessage() {
483
        return null;
484

    
485
    }
486

    
487
    public DynField getParentDynField() {
488
        return dynValueField.getParentDynField();
489
    }
490
}