Statistics
| Revision:

svn-gvsig-desktop / trunk / 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 @ 45695

History | View | Annotate | Download (10.7 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.apache.commons.lang3.StringUtils;
12
import org.gvsig.fmap.dal.complements.Search;
13
import org.gvsig.fmap.dal.exception.DataException;
14
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
15
import org.gvsig.fmap.dal.feature.Feature;
16
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.FeatureStore;
18
import org.gvsig.fmap.dal.feature.FeatureType;
19
import org.gvsig.fmap.dal.feature.paging.FacadeOfAFeaturePagingHelper;
20
import org.gvsig.tools.ToolsLocator;
21
import org.gvsig.tools.dataTypes.Coercion;
22
import org.gvsig.tools.dataTypes.CoercionException;
23
import org.gvsig.tools.dataTypes.DataTypes;
24
import org.gvsig.tools.dispose.DisposeUtils;
25
import org.gvsig.tools.logger.FilteredLogger;
26
import org.slf4j.Logger;
27
import org.slf4j.LoggerFactory;
28

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

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

    
39
    private static class FeatureAttributeCellRenderer extends DefaultTableCellRenderer {
40

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

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

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

    
63
    }
64

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

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

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

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

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

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

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

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

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

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

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

    
222
    @Override
223
    public boolean isCellEditable(int rowIndex, int columnIndex) {
224
        return false;
225
    }
226
    
227
    public FeatureAttributeDescriptor getFeatureDescriptor(int columnIndex) {
228
        String attrName = this.columnNames.get(columnIndex);
229
        if (this.featureType == null) {
230
            return null;
231
        }
232
        for (FeatureAttributeDescriptor attr : this.featureType.getAllAttributeDescriptors()) {
233
            if (StringUtils.equals(attrName,attr.getName())) {
234
                return attr;
235
            }
236
        }
237
        return null;
238
    }
239

    
240
    @Override
241
    public Feature get(int position) {
242
        if (this.features == null) {
243
            return null;
244
        }
245
        Feature feature = this.features.get(position);
246
        return feature;
247
    }
248

    
249
    @Override
250
    public Object getValueAt(int rowIndex, int columnIndex) {
251
        if (this.features == null) {
252
            return null;
253
        }
254
        try {
255
            Feature feature = this.features.get(rowIndex);
256
            String attrName = this.columnNames.get(columnIndex);
257
            Object value = null;
258
            value = feature.get(attrName);
259
            FeatureAttributeDescriptor attrdesc = this.featureType.getAttributeDescriptor(attrName);
260
            if (attrdesc != null) {
261
                if (value == null) {
262
                    return null;
263
                }
264
                if (attrdesc.isForeingKey() && attrdesc.getForeingKey().isClosedList()) {
265
                    value = attrdesc.getForeingKey().getLabelForValue(value);
266
                }
267
            }
268
            return value;
269
        } catch (Throwable th) {
270
            this.errors = true;
271
            logger.warn("Can't get cell value at " + rowIndex + ", " + columnIndex + ".", th);
272
            return null;
273
        }
274
    }
275

    
276
    @Override
277
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
278

    
279
    }
280

    
281
    @Override
282
    public List<Feature> toList() {
283
        return this.features;
284
    }
285

    
286
    @Override
287
    public boolean isEmpty() {
288
        return this.features.isEmpty();
289
    }
290

    
291
    @Override
292
    public int size() {
293
        return this.features.size();
294
    }
295

    
296
    @Override
297
    public Iterator<Feature> iterator() {
298
        return this.features.iterator();
299
    }
300

    
301
    @Override
302
    public void dispose() {
303
        if (this.features != null) {
304
            DisposeUtils.disposeQuietly(((FacadeOfAFeaturePagingHelper) features).getFeaturePagingHelper());
305
            this.features = null;
306
        }
307
        this.features = null;
308
    }
309

    
310
}