Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.dynform / org.gvsig.tools.dynform.services / src / main / java / org / gvsig / tools / dynform / services / dynform / AbeilleJDynForm.java @ 1405

History | View | Annotate | Download (9.74 KB)

1

    
2
package org.gvsig.tools.dynform.services.dynform;
3

    
4
import com.jeta.forms.components.panel.FormPanel;
5
import java.awt.Component;
6
import java.util.ArrayList;
7
import java.util.HashMap;
8
import java.util.Iterator;
9
import java.util.List;
10
import java.util.Map;
11
import javax.swing.JComponent;
12
import javax.swing.text.JTextComponent;
13
import org.apache.commons.lang3.StringUtils;
14
import org.gvsig.tools.dataTypes.CoercionException;
15
import org.gvsig.tools.dataTypes.DataTypes;
16
import org.gvsig.tools.dynform.DynFormDefinition;
17
import org.gvsig.tools.dynform.DynFormFieldDefinition;
18
import org.gvsig.tools.dynform.JDynFormField;
19
import org.gvsig.tools.dynform.JDynFormField.JDynFormFieldListener;
20
import org.gvsig.tools.dynform.spi.AbstractJDynForm;
21
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
22
import org.gvsig.tools.dynform.spi.dynformfield.AbstractJDynFormField;
23
import org.gvsig.tools.dynobject.DynClass;
24
import org.gvsig.tools.dynobject.DynField;
25
import org.gvsig.tools.dynobject.DynField_v2;
26
import org.gvsig.tools.dynobject.DynObject;
27
import org.gvsig.tools.service.Manager;
28
import org.gvsig.tools.service.Service;
29
import org.gvsig.tools.service.ServiceException;
30
import org.gvsig.tools.service.spi.ServiceManager;
31

    
32

    
33
public class AbeilleJDynForm extends AbstractJDynForm implements Service, JDynFormFieldListener {
34

    
35
    private Map components = null;
36
    private FormPanel form = null;
37
    private String formPathname = null;
38
    private final DynFormSPIManager spimanager;
39
    
40
    public AbeilleJDynForm(ServiceManager manager, DynFormDefinition definition) throws ServiceException {
41
        super(((DynFormSPIManager)manager).getDynFormManager(),definition);
42
        this.spimanager = (DynFormSPIManager) manager;
43
        this.components = new HashMap();
44
        formPathname = (String) definition.getTags().get(DynFormSPIManager.TAG_DYNFORM_ABEILLE_FORM);
45
        if( formPathname == null ) {
46
            throw new IllegalArgumentException("Need tag 'dynform.abeille.form'.");
47
        }
48
        this.form = null;
49
    }
50

    
51
    @Override
52
    public Manager getManager() {
53
        return this.spimanager;
54
    }
55

    
56
    
57
    @Override
58
    protected JComponent getFieldsContainer() {
59
        this.form = new FormPanel(formPathname);
60

    
61
        List fields = this.getDefinition().getDefinitions();
62
        Iterator it = fields.iterator();
63
        while (it.hasNext()) {
64
            DynFormFieldDefinition fieldDefinition = (DynFormFieldDefinition) it.next();
65
            if (fieldDefinition.isHidden()) {
66
                continue;
67
            }
68
            Component component = this.form.getComponentByName("txt"+fieldDefinition.getName());
69
            if( component != null && component instanceof JTextComponent ) {
70
                JDynFormField jfield = new AbeilleTextJDynFormField(fieldDefinition, (JTextComponent)component);
71
                ((AbstractJDynFormField) jfield).setForm(this);
72
                jfield.setReadOnly(this.isReadOnly());
73
                jfield.addListener(this);
74
                if (this.isReadOnly()) {
75
                    jfield.setReadOnly(this.isReadOnly());
76
                }
77

    
78
                this.components.put(jfield.getName(), jfield);
79
            }
80
        }
81
        return this.form;
82
    }
83

    
84
    @Override
85
    public void setValues(DynObject values) {
86
        if (!this.isContentsInitialized()) {
87
            this.values = values;
88
            return;
89
        }
90
        DynClass def = values.getDynClass();
91
        DynField[] fields = def.getDynFields();
92
        for (int i = 0; i < fields.length; i++) {
93
            String name = fields[i].getName();
94
            if ( StringUtils.isEmpty(name) ) {
95
                logger.warn("Field name " + i + " of '" + def.getFullName() + "' is null or empty ");
96
                continue;
97
            }
98
            JDynFormField jfield = (JDynFormField) this.getField(name);
99
            if (jfield == null) {
100
                logger.info("Can't retrieve form field asociated to the field '" + name + "' of class '" + def.getFullName() + "'.");
101
                continue;
102
            }
103
            if (values.getDynValue(name) == null) {
104
                if (fields[i].getDataType().getType() == DataTypes.LIST) {
105
                    try {
106
                        if (((DynField_v2) fields[i]).getDynClassOfItems() != null) {
107
                            values.setDynValue(name, new ArrayList<DynObject>());
108
                        }
109
                    } catch (Exception e) {
110
                        logger.warn("Problems initializing the DynObject List", e);
111
                    }
112
                }
113
            }
114
            jfield.setValue(values.getDynValue(name));
115
        }
116
    }
117

    
118
    @Override
119
    public JDynFormField getField(String fieldName) {
120
        JDynFormField field = (JDynFormField) this.components.get(fieldName);
121
        return field;
122
    }
123
    
124
    @Override
125
    public void getValues(DynObject values) {
126
        if (values == null) {
127
            return;
128
        }
129
        DynField[] fields = values.getDynClass().getDynFields();
130
        for (DynField field : fields) {
131
            String name = field.getName();
132
            JDynFormField jfield = (JDynFormField) this.getField(name);
133
            if (jfield != null) {
134
                try {
135
                    jfield.fetch(values);
136
                } catch (Exception ex) {
137
                    logger.warn("Can't get value of field '" + name + "'.", ex);
138
                }
139
            }
140
        }
141
    }
142

    
143
    @Override
144
    public Object getValue(String fieldName) {
145
        JDynFormField field = (JDynFormField) this.getField(fieldName);
146
        return field.getValue();
147
    }
148

    
149
    @Override
150
    public void setValue(String fieldName, Object value) {
151
        JDynFormField field = (JDynFormField) this.getField(fieldName);
152
        try {
153
            value = field.getDefinition().getDataType().coerce(value);
154
        } catch (CoercionException e) {
155
            String msg = "Invalid value '" + ((value == null) ? "(null)" : value.toString()) + "' for field '" + fieldName + "'.";
156
            logger.warn(msg, e);
157
            throw new RuntimeException(msg, e);
158
        }
159
        field.setValue(value);
160
    }
161
    
162
    public Iterator getFieldsIterator() {
163
        if (!this.isContentsInitialized()) {
164
            this.initComponents();
165
        }
166
        return this.components.values().iterator();
167
    }
168
    
169
    @Override
170
    public boolean hasValidValues() {
171
        Iterator it = this.getFieldsIterator();
172
        while (it.hasNext()) {
173
            JDynFormField jfield = (JDynFormField) it.next();
174
            if (!jfield.hasValidValue()) {
175
                return false;
176
            }
177
        }
178
        return true;    }
179

    
180
    @Override
181
    public boolean hasValidValues(List<String> fieldsName) {
182
        if (fieldsName == null) {
183
            fieldsName = new ArrayList<>();
184
        }
185
        Iterator it = this.getFieldsIterator();
186
        while (it.hasNext()) {
187
            JDynFormField jfield = (JDynFormField) it.next();
188
            if (!jfield.hasValidValue()) {
189
                fieldsName.add(jfield.getName());
190
            }
191
        }
192
        return fieldsName.isEmpty();
193
    }
194

    
195
    @Override
196
    public boolean isModified() {
197
        Iterator it = this.getFieldsIterator();
198
        while (it.hasNext()) {
199
            JDynFormField jfield = (JDynFormField) it.next();
200
            if (jfield.isModified()) {
201
                return true;
202
            }
203
        }
204
        return false;
205
    }
206

    
207
    @Override
208
    public void clear() {
209
        Iterator it = this.components.entrySet().iterator();
210
        while (it.hasNext()) {
211
            Map.Entry entry = (Map.Entry) it.next();
212
            ((JDynFormField) (entry.getValue())).clear();
213
        }
214
    }
215

    
216
    @Override
217
    public void fieldEnter(JDynFormField field) {
218
        message(field.getDefinition().getDescription());
219
    }
220

    
221
    @Override
222
    public void fieldExit(JDynFormField field) {
223
        message();
224
    }
225

    
226
    @Override
227
    public void fieldChanged(JDynFormField field) {
228
        fireFieldChangeEvent(field);
229
    }
230

    
231
    @Override
232
    public void message(JDynFormField field, String message) {
233
        message(message);
234
    }
235
    
236
    private class AbeilleTextJDynFormField extends AbstractJDynFormField {
237
        private final JTextComponent text;
238
        private final DynFormFieldDefinition fieldDefinition;
239

    
240
        private AbeilleTextJDynFormField(DynFormFieldDefinition fieldDefinition, JTextComponent text) {
241
            super(null, AbeilleJDynForm.this.getServiceManager());
242
            this.text = text;
243
            this.fieldDefinition = fieldDefinition;
244
        }
245

    
246
        @Override
247
        public Object getParameterValue() {
248
                return null;
249
        }
250
        
251
        @Override
252
        public DynFormFieldDefinition getDefinition() {
253
                return this.fieldDefinition;
254
        }        
255
        
256
        @Override
257
        public void initComponent() {
258
            // Do nothing
259
        }
260

    
261
        @Override
262
        public Object getAssignedValue() {
263
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
264
        }
265

    
266
        @Override
267
        public boolean hasValidValue() {
268
            try {
269
                String s = this.text.getText();
270
                Object v = this.fieldDefinition.getDataType().coerce(s);
271
                return true;
272
            } catch (CoercionException ex) {
273
                return false;
274
            }
275
        }
276

    
277
        @Override
278
        public void setValue(Object value) {
279
            if( value == null ) {
280
                this.text.setText("");
281
            } else {
282
                this.text.setText(value.toString());
283
            }
284
        }
285

    
286
        @Override
287
        public Object getValue() {
288
            try {
289
                String s = this.text.getText();
290
                return this.fieldDefinition.getDataType().coerce(s);
291
            } catch (CoercionException ex) {
292
                return null;
293
            }
294
        }
295
        
296
        
297
    }
298
    
299
}