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

History | View | Annotate | Download (9.52 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

    
37
import java.awt.Component;
38
import java.util.ArrayList;
39
import java.util.HashMap;
40
import java.util.List;
41

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

    
57
/**
58
 * @author <a href="mailto:reinhold@uji.es">cmartin</a>
59
 *
60
 */
61
public class JDynObjectDynFieldComponent implements JDynFieldComponent, ValueChangedListener{
62
    
63
    private JDynObjectComponent jDynObjectComponent;
64
    private DynObject dynObject;
65
    private DynField dynField;
66
    private Component component;
67
    private ValueField dynValueField;
68
    private DynObjectManager manager;
69
    private DynClass dynClass;
70
    private List<ValueChangedListener> listeners;
71

    
72
    /**
73
     * @param dynField
74
     * @param dynObject2 
75
     * @param dynObject
76
     * @throws ServiceException 
77
     */
78
    public JDynObjectDynFieldComponent(DynField dynField, ValueField dynObjectValue, DynObject dynObject) throws ServiceException {
79
        this.dynField = dynField;
80
        this.dynValueField = dynObjectValue;
81
        this.manager = ToolsLocator.getDynObjectManager();
82
        this.listeners = new ArrayList<ValueChangedListener>();
83
        this.dynClass = manager.get(getFieldName());
84
        
85
        this.jDynObjectComponent = ToolsSwingLocator.getDynObjectSwingManager().createJDynObjectComponent(getDynObject());
86
//        this.dynObject = createDynObject(dynObjectValue.getValue());
87
        
88
        this.jDynObjectComponent.handleValueChanged(this);
89
        this.component = (Component) this.jDynObjectComponent.getComponent();        
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
    /* (non-Javadoc)
105
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#fireValueChangedEvent()
106
     */
107
    public void fireValueChangedEvent() {
108
        for (ValueChangedListener listener: this.listeners)
109
            listener.handleValueChanged(this);
110
    }
111
    
112
    public DynObject getDynObject(){
113
        if (this.dynObject!=null)
114
            return this.dynObject;
115
        createDynObject(this.getFieldValue());
116
        return this.dynObject;
117
    }
118
    
119
    
120
    /**
121
     * 
122
     */
123
    private DynObject createDynObject(Object value) {
124
        this.dynObject = manager.createDynObject(this.dynClass);
125
        if (value instanceof DynObject){
126
            setValue((DynObject) value);
127
        }
128
        return dynObject;
129

    
130
    }
131

    
132
    /**
133
     * @return
134
     */
135
    private String getFieldName() {
136
        String name ="";
137
        String suffix = "-list-List-item";
138
        
139
        if (this.dynField.isContainer())
140
            name = this.dynField.getElementsType().getName();
141
        else 
142
//            if (this.dynField.getType()==DataTypes.DYNOBJECT)
143
            name = this.dynField.getName();
144
        
145
        
146
        if (name.endsWith(suffix))
147
            return name.replace(suffix, "");
148
        return name;
149
    }
150

    
151

    
152

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

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

    
168
    /* (non-Javadoc)
169
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#getDynField()
170
     */
171
    public DynField getDynField() {
172
        return this.dynField;
173
    }
174

    
175

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

    
195

    
196
    /* (non-Javadoc)
197
     * @see org.gvsig.tools.swing.spi.DelegatedJFieldComponent#getFieldValue()
198
     */
199
    public Object getFieldValue() {        
200
        if (this.dynObject==null)
201
            return null;
202
        return this.dynObject;
203
    }
204

    
205
    /* (non-Javadoc)
206
     * @see org.gvsig.tools.service.Service#getManager()
207
     */
208
    public Manager getManager() {
209
        return ToolsSwingLocator.getDynObjectSwingManager();
210
    }
211

    
212

    
213
    /* (non-Javadoc)
214
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getValue()
215
     */
216
    public Object getValue() {
217
        return getDynObjectValue();
218
    }
219

    
220

    
221
    /* (non-Javadoc)
222
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isMandatory()
223
     */
224
    public boolean isMandatory() {
225
        return this.dynField.isMandatory();
226
    }
227

    
228

    
229
    /* (non-Javadoc)
230
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isValid()
231
     */
232
    public boolean isValid() {
233
        return this.jDynObjectComponent.isValid();
234
    }
235

    
236

    
237
    /* (non-Javadoc)
238
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#requestFocus()
239
     */
240
    public void requestFocus() {
241
        this.component.requestFocus();
242
        
243
    }
244

    
245

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

    
253

    
254
    /* (non-Javadoc)
255
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#setEnabled(boolean)
256
     */
257
    public void setEnabled(boolean isEnabled) {
258
        component.setEnabled(isEnabled);
259
    }
260

    
261

    
262
    /* (non-Javadoc)
263
     * @see org.gvsig.tools.swing.spi.DelegatedJFieldComponent#setFieldValue(java.lang.Object)
264
     */
265
    public void setFieldValue(Object value) {
266
        if (value!=null){
267
            this.dynObject = (DynObject) value;         
268
        }
269
    }
270

    
271

    
272
    /* (non-Javadoc)
273
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#setValue(java.lang.Object)
274
     */
275
    public void setValue(Object value) {
276
        Object dynValue = null;
277
        if (value instanceof DynObject){
278
            boolean validated = true;
279
            DynObject dynObj = (DynObject) value;
280
            for (DynField field: dynObject.getDynClass().getDeclaredDynFields()){
281
                dynValue = dynObj.getDynValue(field.getName());
282
                if (value != null) {
283
                    try {
284
                        field.validate(dynValue);
285
                        dynObj.setDynValue(field.getName(), dynValue);
286
        
287
                    } catch (DynFieldValidateException e) {
288
                        e.printStackTrace();
289
                        validated = false;
290
                    }
291
                }
292
            }
293
            if (validated)
294
                this.jDynObjectComponent.setValue(this.dynObject);
295
        }else if (value instanceof JDynFieldComponent){
296
            JDynFieldComponent field = (JDynFieldComponent) value;
297
            String name = field.getDynField().getName();
298
            if (this.dynClass.getDynField(name)!=null){
299
                  try {
300
                              dynValue = field.getValue();
301
                        field.getDynField().validate(dynValue);
302
                        this.dynObject.setDynValue(name,dynValue);
303
                    } catch (DynFieldValidateException e) {
304
                        e.printStackTrace();
305
                    }
306
                    
307
            }
308
        }else
309
            this.jDynObjectComponent.setValue(null);
310
        this.fireValueChangedEvent();
311
    }
312

    
313

    
314
    /* (non-Javadoc)
315
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getDynClass()
316
     */
317
    public DynClass getDynClass() {
318
        return this.dynObject.getDynClass();
319
    }
320

    
321
    /* (non-Javadoc)
322
     * @see org.gvsig.tools.swing.api.dynobject.ValueChangedListener#handleValueChanged(org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent)
323
     */
324
    public void handleValueChanged(JDynFieldComponent field) {
325
        setValue(field);
326
    }
327
}