Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-cvsgis1 / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.swing / org.gvsig.fmap.dal.swing.impl / src / main / java / org / gvsig / fmap / dal / swing / impl / featuretable / SimpleFeaturesTableModelImpl.java @ 45393

History | View | Annotate | Download (10.2 KB)

1
package org.gvsig.fmap.dal.swing.impl.featuretable;
2

    
3
import org.gvsig.fmap.dal.swing.featuretable.SimpleFeaturesTableModel;
4
import java.math.BigDecimal;
5
import java.util.ArrayList;
6
import java.util.Iterator;
7
import java.util.List;
8
import javax.swing.JTable;
9
import javax.swing.table.AbstractTableModel;
10
import javax.swing.table.DefaultTableCellRenderer;
11
import org.gvsig.fmap.dal.complements.Search;
12
import org.gvsig.fmap.dal.exception.DataException;
13
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
14
import org.gvsig.fmap.dal.feature.Feature;
15
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
16
import org.gvsig.fmap.dal.feature.FeatureStore;
17
import org.gvsig.fmap.dal.feature.FeatureType;
18
import org.gvsig.fmap.dal.feature.paging.FacadeOfAFeaturePagingHelper;
19
import org.gvsig.tools.ToolsLocator;
20
import org.gvsig.tools.dataTypes.Coercion;
21
import org.gvsig.tools.dataTypes.CoercionException;
22
import org.gvsig.tools.dataTypes.DataTypes;
23
import org.gvsig.tools.dispose.DisposeUtils;
24
import org.gvsig.tools.logger.FilteredLogger;
25
import org.slf4j.Logger;
26
import org.slf4j.LoggerFactory;
27

    
28
/**
29
 *
30
 * @author jjdelcerro
31
 */
32
public class SimpleFeaturesTableModelImpl
33
        extends AbstractTableModel
34
        implements SimpleFeaturesTableModel {
35

    
36
    private static final Logger LOGGER = LoggerFactory.getLogger(SimpleFeaturesTableModelImpl.class);
37

    
38
    private static class FeatureAttributeCellRenderer extends DefaultTableCellRenderer {
39

    
40
        private final FeatureAttributeDescriptor descriptor;
41
        private final Coercion toStr;
42

    
43
        public FeatureAttributeCellRenderer(FeatureAttributeDescriptor descriptor) {
44
            this.descriptor = descriptor;
45
            this.toStr = ToolsLocator.getDataTypesManager().get(DataTypes.STRING).getCoercion();
46
        }
47

    
48
        @Override
49
        protected void setValue(Object value) {
50
            if (value == null) {
51
                setText("");
52
            } else {
53
                try {
54
                    value = toStr.coerce(value);
55
                } catch (CoercionException ex) {
56
                    LOGGER.debug("Can't coerce value to string.", ex);
57
                }
58
                setText((String) value);
59
            }
60
        }
61

    
62
    }
63

    
64
    private List<Feature> features;
65
    private final List<String> columnNames;
66
    private final FeatureType featureType;
67
    private FilteredLogger logger;
68
    private boolean errors;
69

    
70
    public SimpleFeaturesTableModelImpl(FeatureStore store) throws DataException {
71
        this(store.getDefaultFeatureType(), null, store.getFeatures());
72
    }
73

    
74
    public SimpleFeaturesTableModelImpl(FeatureType featureType) {
75
        this(featureType, null, null);
76
        this.logger = new FilteredLogger(LOGGER, "SimpleFeaturesTableModel", 10);
77
    }
78

    
79
    public SimpleFeaturesTableModelImpl(FeatureType featureType, List<String> columnNames, List<Feature> features) {
80
        this.logger = new FilteredLogger(LOGGER, "SimpleFeaturesTableModel", 10);
81
        this.features = features;
82
        this.featureType = featureType;
83
        this.errors = false;
84
        if (columnNames == null || columnNames.isEmpty()) {
85
            this.columnNames = new ArrayList<>();
86
            Search search = (Search) ToolsLocator.getComplementsManager().get(
87
                    Search.COMPLEMENT_MANE, featureType
88
            );
89
            List<Search.OrderedAttribute> attributos = search.getOrderedAttributes(
90
                    Search.BASIC_TYPES_FILTER,
91
                    Search.STR_INT_LONG_LABEL_ORDER,
92
                    12
93
            );
94
            for (Search.OrderedAttribute attrdesc : attributos) {
95
                this.columnNames.add(attrdesc.getDescriptor().getName());
96
            }
97
        } else {
98
            this.columnNames = columnNames;
99
        }
100
    }
101

    
102
    public void setCellRenderers(JTable table) {
103
        if ( table.getModel() != this ) {
104
            return;
105
        }
106
        for (String columnName : this.columnNames) {
107
            try {
108
                FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(columnName);
109
                if (descriptor == null) {
110
                    descriptor = this.featureType.getExtraColumns().get(columnName);
111
                }
112
                switch (descriptor.getType()) {
113
                    case DataTypes.BYTEARRAY:
114
                        table.setDefaultRenderer(byte[].class, new FeatureAttributeCellRenderer(descriptor));
115
                        break;
116
                    case DataTypes.DATE:
117
                        table.setDefaultRenderer(java.sql.Date.class, new FeatureAttributeCellRenderer(descriptor));
118
                        break;
119
                    case DataTypes.TIME:
120
                        table.setDefaultRenderer(java.sql.Time.class, new FeatureAttributeCellRenderer(descriptor));
121
                        break;
122
                    case DataTypes.TIMESTAMP:
123
                        table.setDefaultRenderer(java.util.Date.class, new FeatureAttributeCellRenderer(descriptor));
124
                        table.setDefaultRenderer(java.sql.Timestamp.class, new FeatureAttributeCellRenderer(descriptor));
125
                        break;
126
                    case DataTypes.FLOAT:
127
                        table.setDefaultRenderer(Float.class, new FeatureAttributeCellRenderer(descriptor));
128
                        break;
129
                    case DataTypes.DECIMAL:
130
                        table.setDefaultRenderer(BigDecimal.class, new FeatureAttributeCellRenderer(descriptor));
131
                        break;
132
                    case DataTypes.DOUBLE:
133
                        table.setDefaultRenderer(Double.class, new FeatureAttributeCellRenderer(descriptor));
134
                        break;
135
                }
136
            } catch (Exception ex) {
137
                throw new RuntimeException("Not able to get type of descriptor for column", ex);
138
            }
139
        }
140
    }
141

    
142
    @Override
143
    public List<Feature> getFeatures() {
144
        return this.features;
145
    }
146

    
147
    @Override
148
    public int getRowCount() {
149
        if (this.features == null) {
150
            return 0;
151
        }
152
        try {
153
            return this.features.size();
154
        } catch (Throwable ex) {
155
            this.errors = true;
156
            LOGGER.warn("Can't calculate row count.", ex);
157
            return 0;
158
        }
159
    }
160

    
161
    @Override
162
    public boolean hasErrors() {
163
        return this.errors;
164
    }
165

    
166
    @Override
167
    public int getColumnCount() {
168
        return this.columnNames.size();
169
    }
170

    
171
    @Override
172
    public String getColumnName(int columnIndex) {
173
        String attrName = this.columnNames.get(columnIndex);
174
        if (this.featureType == null) {
175
            return attrName;
176
        }
177
        FeatureAttributeDescriptor attrdesc = this.featureType.getAttributeDescriptor(attrName);
178
        if (attrdesc == null) {
179
            EditableFeatureAttributeDescriptor extraCol = this.featureType.getExtraColumns().get(attrName);
180
            if (extraCol != null) {
181
                return extraCol.getLocalizedShortLabel();
182
            }
183
            if (attrName == null) {
184
                return "Column" + columnIndex;
185
            }
186
            return attrName;
187
        }
188
        return attrdesc.getLocalizedShortLabel();
189
    }
190

    
191
    @Override
192
    public Class<?> getColumnClass(int columnIndex) {
193
        if (this.featureType == null) {
194
            return String.class;
195
        }
196
        try {
197
            String attrName = this.columnNames.get(columnIndex);
198
            FeatureAttributeDescriptor attrdesc = this.featureType.getAttributeDescriptor(attrName);
199
            if (attrdesc == null) {
200
                int extraIndex = featureType.getExtraColumns().getIndexOf(attrName);
201
                if (extraIndex != -1) {
202
                    attrdesc = featureType.getExtraColumns().get(extraIndex);
203
                }
204
            }
205
            if (attrdesc == null) {
206
                return String.class;
207
            }
208
            if (attrdesc.isForeingKey() && attrdesc.getForeingKey().isClosedList()) {
209
                return String.class;
210
            }
211
            Class theClass = attrdesc.getDataType().getDefaultClass();
212
            if (theClass == null) {
213
                return String.class;
214
            }
215
            return theClass;
216
        } catch (Exception ex) {
217
            return String.class;
218
        }
219
    }
220

    
221
    @Override
222
    public boolean isCellEditable(int rowIndex, int columnIndex) {
223
        return false;
224
    }
225

    
226
    @Override
227
    public Feature get(int position) {
228
        if (this.features == null) {
229
            return null;
230
        }
231
        Feature feature = this.features.get(position);
232
        return feature;
233
    }
234

    
235
    @Override
236
    public Object getValueAt(int rowIndex, int columnIndex) {
237
        if (this.features == null) {
238
            return null;
239
        }
240
        try {
241
            Feature feature = this.features.get(rowIndex);
242
            String attrName = this.columnNames.get(columnIndex);
243
            Object value = null;
244
            value = feature.get(attrName);
245
            FeatureAttributeDescriptor attrdesc = this.featureType.getAttributeDescriptor(attrName);
246
            if (attrdesc != null) {
247
                if (value == null) {
248
                    return null;
249
                }
250
                if (attrdesc.isForeingKey() && attrdesc.getForeingKey().isClosedList()) {
251
                    value = attrdesc.getForeingKey().getLabelForValue(value);
252
                }
253
            }
254
            return value;
255
        } catch (Throwable th) {
256
            this.errors = true;
257
            logger.warn("Can't get cell value at " + rowIndex + ", " + columnIndex + ".", th);
258
            return null;
259
        }
260
    }
261

    
262
    @Override
263
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
264

    
265
    }
266

    
267
    @Override
268
    public List<Feature> toList() {
269
        return this.features;
270
    }
271

    
272
    @Override
273
    public boolean isEmpty() {
274
        return this.features.isEmpty();
275
    }
276

    
277
    @Override
278
    public int size() {
279
        return this.features.size();
280
    }
281

    
282
    @Override
283
    public Iterator<Feature> iterator() {
284
        return this.features.iterator();
285
    }
286

    
287
    @Override
288
    public void dispose() {
289
        if (this.features != null) {
290
            DisposeUtils.disposeQuietly(((FacadeOfAFeaturePagingHelper) features).getFeaturePagingHelper());
291
            this.features = null;
292
        }
293
        this.features = null;
294
    }
295

    
296
}