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

History | View | Annotate | Download (11.2 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.awt.Component;
37
import java.util.ArrayList;
38
import java.util.List;
39

    
40
import javax.swing.JComponent;
41

    
42
import org.gvsig.tools.ToolsLocator;
43
import org.gvsig.tools.dynobject.DynClass;
44
import org.gvsig.tools.dynobject.DynField;
45
import org.gvsig.tools.dynobject.DynObject;
46
import org.gvsig.tools.dynobject.DynObjectManager;
47
import org.gvsig.tools.dynobject.exception.DynFieldValidateException;
48
import org.gvsig.tools.service.Manager;
49
import org.gvsig.tools.service.ServiceException;
50
import org.gvsig.tools.swing.api.ToolsSwingLocator;
51
import org.gvsig.tools.swing.api.dynobject.JDynObjectComponent;
52
import org.gvsig.tools.swing.api.dynobject.ValueChangedListener;
53
import org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent;
54
import org.gvsig.tools.swing.api.dynobject.dynfield.ValueField;
55

    
56
public class JDynObjectDynFieldComponent implements JDynFieldComponent,
57
    ValueChangedListener {
58

    
59
    private JDynObjectComponent jDynObjectComponent;
60
    private DynObject dynObject;
61
    private DynField dynField;
62
    private Component component;
63
    private ValueField dynValueField;
64
    private DynObjectManager manager;
65
    private DynClass dynClass;
66
    private List<ValueChangedListener> listeners;
67

    
68
    /**
69
     * @param dynField
70
     * @param dynObject2
71
     * @param dynObject
72
     * @throws ServiceException
73
     */
74
        public JDynObjectDynFieldComponent(ValueField dynObjectValueField,
75
                        boolean writable) throws ServiceException {
76
        this.dynField = dynObjectValueField.getDynField();
77
        this.dynValueField = dynObjectValueField;
78
        this.dynObject = (DynObject) dynValueField.getFieldValue();
79
        this.manager = ToolsLocator.getDynObjectManager();
80
        this.listeners = new ArrayList<ValueChangedListener>();
81
        this.dynClass = manager.get(getFieldName());
82

    
83
        this.jDynObjectComponent =
84
            ToolsSwingLocator.getDynObjectSwingManager()
85
                                .createJDynObjectComponent(getDynObject(), writable);
86
        // this.dynObject = createDynObject(dynObjectValue.getValue());
87

    
88
        // this.jDynObjectComponent.handleValueChanged(this);
89
        this.component = this.jDynObjectComponent.asJComponent();
90
        this.jDynObjectComponent.addValueChangedListener(this);
91
    }
92

    
93
    /*
94
     * (non-Javadoc)
95
     * 
96
     * @seeorg.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#
97
     * addValueChangedListener
98
     * (org.gvsig.tools.swing.api.dynobject.ValueChangedListener)
99
     */
100
    public void addValueChangedListener(ValueChangedListener listener) {
101
        this.listeners.add(listener);
102
    }
103

    
104
    /*
105
     * (non-Javadoc)
106
     * 
107
     * @seeorg.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#
108
     * fireValueChangedEvent()
109
     */
110
    public void fireValueChangedEvent() {
111
        for (ValueChangedListener listener : this.listeners)
112
            listener.handleValueChanged(this);
113
    }
114

    
115
    public DynObject getDynObject() {
116
        if (this.dynObject != null)
117
            return this.dynObject;
118
        createDynObject(this.getInitialValue());
119
        return this.dynObject;
120
    }
121

    
122
    /**
123
     * 
124
     */
125
    private DynObject createDynObject(Object value) {
126
        this.dynObject = manager.createDynObject(this.dynClass);
127
        if (value instanceof DynObject) {
128
            setValue(value);
129
        }
130
        return dynObject;
131

    
132
    }
133

    
134
    /**
135
     * @return
136
     */
137
    private String getFieldName() {
138
        String name = "";
139
        String suffix = "-list-List-item";
140

    
141
        if (this.dynField.isContainer())
142
            name = this.dynField.getElementsType().getName();
143
        else
144
            // if (this.dynField.getType()==DataTypes.DYNOBJECT)
145
            name = this.dynField.getName();
146

    
147
        if (name.endsWith(suffix))
148
            return name.replace(suffix, "");
149
        return name;
150
    }
151

    
152
    /*
153
     * (non-Javadoc)
154
     * 
155
     * @see
156
     * org.gvsig.tools.swing.api.dynobject.dynfield.JComponent#getComponent()
157
     */
158
    public JComponent asJComponent() {
159
        return this.jDynObjectComponent.asJComponent();
160
    }
161

    
162
    /*
163
     * (non-Javadoc)
164
     * 
165
     * @see
166
     * org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getDefaultValue()
167
     */
168
    public Object getDefaultValue() {
169
        return this.dynField.getDefaultValue();
170
    }
171

    
172
    /*
173
     * (non-Javadoc)
174
     * 
175
     * @see
176
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#getDynField
177
     * ()
178
     */
179
    public DynField getDynField() {
180
        return this.dynField;
181
    }
182

    
183
    private DynObject getDynObjectValue() {
184
        DynObject dynObj = this.manager.createDynObject(this.dynClass);
185
        Object value = null;
186
        for (DynField field : dynObject.getDynClass().getDeclaredDynFields()) {
187
            value = dynObject.getDynValue(field.getName());
188
            if (value != null) {
189
                try {
190
                    field.validate(value);
191
                    dynObj.setDynValue(field.getName(), value);
192
                } catch (DynFieldValidateException e) {
193
                    // TODO Auto-generated catch block
194
                    e.printStackTrace();
195
                }
196
            }
197

    
198
        }
199
        return dynObj;
200
    }
201

    
202
    /*
203
     * (non-Javadoc)
204
     * 
205
     * @see org.gvsig.tools.swing.spi.DelegatedJFieldComponent#getFieldValue()
206
     */
207
    public Object getInitialValue() {
208
        if (this.dynObject == null) {
209
            this.dynObject = (DynObject) dynValueField.getDefaultFieldValue();
210
        }
211
        return this.dynObject;
212
    }
213

    
214
    /*
215
     * (non-Javadoc)
216
     * 
217
     * @see org.gvsig.tools.service.Service#getManager()
218
     */
219
    public Manager getManager() {
220
        return ToolsSwingLocator.getDynObjectSwingManager();
221
    }
222

    
223
    /*
224
     * (non-Javadoc)
225
     * 
226
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getValue()
227
     */
228
    public Object getValue() {
229
        return getDynObjectValue();
230
    }
231

    
232
    /*
233
     * (non-Javadoc)
234
     * 
235
     * @see
236
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isMandatory
237
     * ()
238
     */
239
    public boolean isMandatory() {
240
        return this.dynField.isMandatory();
241
    }
242

    
243
    /*
244
     * (non-Javadoc)
245
     * 
246
     * @see
247
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isValid()
248
     */
249
    public boolean isValid() {
250
        return this.jDynObjectComponent.isValid();
251
    }
252

    
253
    /*
254
     * (non-Javadoc)
255
     * 
256
     * @see
257
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#requestFocus
258
     * ()
259
     */
260
    public void requestFocus() {
261
        this.component.requestFocus();
262

    
263
    }
264

    
265
    /*
266
     * (non-Javadoc)
267
     * 
268
     * @see
269
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#saveStatus
270
     * ()
271
     */
272
    public void saveStatus() {
273
        this.jDynObjectComponent.saveStatus();
274
    }
275

    
276
    /*
277
     * (non-Javadoc)
278
     * 
279
     * @see
280
     * org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#setEnabled
281
     * (boolean)
282
     */
283
    public void setEnabled(boolean isEnabled) {
284
        component.setEnabled(isEnabled);
285
    }
286

    
287
    /*
288
     * (non-Javadoc)
289
     * 
290
     * @see
291
     * org.gvsig.tools.swing.spi.DelegatedJFieldComponent#setFieldValue(java
292
     * .lang.Object)
293
     */
294
    public void setFieldValue(Object value) {
295
        if (value != null) {
296
            this.dynObject = (DynObject) value;
297
        }
298
    }
299

    
300
    /*
301
     * (non-Javadoc)
302
     * 
303
     * @see
304
     * org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#setValue(java
305
     * .lang.Object)
306
     */
307
    public void setValue(Object value) {
308
        Object dynValue = null;
309
        if (value instanceof DynObject) {
310
            boolean validated = true;
311
            DynObject dynObj = (DynObject) value;
312
            for (DynField field : dynObject.getDynClass()
313
                .getDeclaredDynFields()) {
314
                dynValue = dynObj.getDynValue(field.getName());
315
                if (value != null) {
316
                    try {
317
                        field.validate(dynValue);
318
                        dynObj.setDynValue(field.getName(), dynValue);
319

    
320
                    } catch (DynFieldValidateException e) {
321
                        e.printStackTrace();
322
                        validated = false;
323
                    }
324
                }
325
            }
326
            if (validated) {
327
                this.jDynObjectComponent.setValue(this.dynObject);
328
            }
329
        } else
330
            if (value instanceof JDynFieldComponent) {
331
                JDynFieldComponent field = (JDynFieldComponent) value;
332
                String name = field.getDynField().getName();
333
                if (this.dynClass.getDynField(name) != null) {
334
                    try {
335
                        dynValue = field.getValue();
336
                        field.getDynField().validate(dynValue);
337
                        this.dynObject.setDynValue(name, dynValue);
338
                    } catch (DynFieldValidateException e) {
339
                        e.printStackTrace();
340
                    }
341

    
342
                }
343
            } else {
344
                this.jDynObjectComponent.setValue(null);
345
            }
346
        this.fireValueChangedEvent();
347
    }
348

    
349
    /*
350
     * (non-Javadoc)
351
     * 
352
     * @see
353
     * org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getDynClass()
354
     */
355
    public DynClass getDynClass() {
356
        return this.dynObject.getDynClass();
357
    }
358

    
359
    /*
360
     * (non-Javadoc)
361
     * 
362
     * @see
363
     * org.gvsig.tools.swing.api.dynobject.ValueChangedListener#handleValueChanged
364
     * (org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent)
365
     */
366
    public void handleValueChanged(JDynFieldComponent field) {
367
        setValue(field);
368
    }
369

    
370
    public Object getDefaultFieldValue() {
371
        return this.dynValueField.getDefaultFieldValue();
372
    }
373

    
374
    public Object getFieldValue() {
375
        return this.dynValueField.getFieldValue();
376
    }
377
}