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

History | View | Annotate | Download (9.41 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.List;
40

    
41
import javax.swing.JComponent;
42

    
43
import org.gvsig.tools.ToolsLocator;
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
public class JDynObjectDynFieldComponent implements JDynFieldComponent, 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(DynField dynField, ValueField dynObjectValue, DynObject dynObject) throws ServiceException {
75
        this.dynField = dynField;
76
        this.dynValueField = dynObjectValue;
77
        this.manager = ToolsLocator.getDynObjectManager();
78
        this.listeners = new ArrayList<ValueChangedListener>();
79
        this.dynClass = manager.get(getFieldName());
80
        
81
        this.jDynObjectComponent = ToolsSwingLocator.getDynObjectSwingManager().createJDynObjectComponent(getDynObject());
82
//        this.dynObject = createDynObject(dynObjectValue.getValue());
83
        
84
        this.jDynObjectComponent.handleValueChanged(this);
85
        this.component = (Component) this.jDynObjectComponent.asJComponent();        
86
        this.jDynObjectComponent.addValueChangedListener(this);
87
    }
88

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

    
100
    /* (non-Javadoc)
101
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#fireValueChangedEvent()
102
     */
103
    public void fireValueChangedEvent() {
104
        for (ValueChangedListener listener: this.listeners)
105
            listener.handleValueChanged(this);
106
    }
107
    
108
    public DynObject getDynObject(){
109
        if (this.dynObject!=null)
110
            return this.dynObject;
111
        createDynObject(this.getFieldValue());
112
        return this.dynObject;
113
    }
114
    
115
    
116
    /**
117
     * 
118
     */
119
    private DynObject createDynObject(Object value) {
120
        this.dynObject = manager.createDynObject(this.dynClass);
121
        if (value instanceof DynObject){
122
            setValue((DynObject) value);
123
        }
124
        return dynObject;
125

    
126
    }
127

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

    
147

    
148

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

    
157
    /* (non-Javadoc)
158
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getDefaultValue()
159
     */
160
    public Object getDefaultValue() {
161
        return this.dynField.getDefaultValue();
162
    }
163

    
164
    /* (non-Javadoc)
165
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#getDynField()
166
     */
167
    public DynField getDynField() {
168
        return this.dynField;
169
    }
170

    
171

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

    
191

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

    
201
    /* (non-Javadoc)
202
     * @see org.gvsig.tools.service.Service#getManager()
203
     */
204
    public Manager getManager() {
205
        return ToolsSwingLocator.getDynObjectSwingManager();
206
    }
207

    
208

    
209
    /* (non-Javadoc)
210
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getValue()
211
     */
212
    public Object getValue() {
213
        return getDynObjectValue();
214
    }
215

    
216

    
217
    /* (non-Javadoc)
218
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isMandatory()
219
     */
220
    public boolean isMandatory() {
221
        return this.dynField.isMandatory();
222
    }
223

    
224

    
225
    /* (non-Javadoc)
226
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#isValid()
227
     */
228
    public boolean isValid() {
229
        return this.jDynObjectComponent.isValid();
230
    }
231

    
232

    
233
    /* (non-Javadoc)
234
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#requestFocus()
235
     */
236
    public void requestFocus() {
237
        this.component.requestFocus();
238
        
239
    }
240

    
241

    
242
    /* (non-Javadoc)
243
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#saveStatus()
244
     */
245
    public void saveStatus() {
246
        this.jDynObjectComponent.saveStatus();
247
    }
248

    
249

    
250
    /* (non-Javadoc)
251
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent#setEnabled(boolean)
252
     */
253
    public void setEnabled(boolean isEnabled) {
254
        component.setEnabled(isEnabled);
255
    }
256

    
257

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

    
267

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

    
309

    
310
    /* (non-Javadoc)
311
     * @see org.gvsig.tools.swing.api.dynobject.dynfield.ValueField#getDynClass()
312
     */
313
    public DynClass getDynClass() {
314
        return this.dynObject.getDynClass();
315
    }
316

    
317
    /* (non-Javadoc)
318
     * @see org.gvsig.tools.swing.api.dynobject.ValueChangedListener#handleValueChanged(org.gvsig.tools.swing.api.dynobject.dynfield.JDynFieldComponent)
319
     */
320
    public void handleValueChanged(JDynFieldComponent field) {
321
        setValue(field);
322
    }
323
}