/[schmitzm]/trunk/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
ViewVC logotype

Contents of /trunk/src/skrueger/geotools/StyledFeatureCollectionTableModel.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 681 - (show annotations)
Tue Feb 9 22:08:26 2010 UTC (15 years ago) by alfonx
Original Path: branches/2.0-RC2/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
File size: 9175 byte(s)
* NODATA handling in the attribute table
* NODATA buttons in DesignAtlasChartDialog
1 /*******************************************************************************
2 * Copyright (c) 2009 Martin O. J. Schmitz.
3 *
4 * This file is part of the SCHMITZM library - a collection of utility
5 * classes based on Java 1.6, focusing (not only) on Java Swing
6 * and the Geotools library.
7 *
8 * The SCHMITZM project is hosted at:
9 * http://wald.intevation.org/projects/schmitzm/
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 3
14 * of the License, or (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public License (license.txt)
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 * or try this link: http://www.gnu.org/licenses/lgpl.html
25 *
26 * Contributors:
27 * Martin O. J. Schmitz - initial API and implementation
28 * Stefan A. Krüger - additional utility classes
29 ******************************************************************************/
30 package skrueger.geotools;
31
32 import java.util.HashMap;
33 import java.util.List;
34 import java.util.Vector;
35
36 import org.apache.log4j.Logger;
37 import org.geotools.data.DefaultQuery;
38 import org.geotools.data.FeatureSource;
39 import org.geotools.data.Query;
40 import org.geotools.feature.FeatureCollection;
41 import org.opengis.feature.simple.SimpleFeature;
42 import org.opengis.feature.simple.SimpleFeatureType;
43 import org.opengis.feature.type.AttributeDescriptor;
44 import org.opengis.filter.Filter;
45
46 import schmitzm.geotools.feature.FeatureUtil;
47 import schmitzm.geotools.gui.FeatureCollectionTableModel;
48 import skrueger.AttributeMetadata;
49
50 import com.vividsolutions.jts.geom.Envelope;
51
52 /**
53 * This class extends the the {@link FeatureCollectionTableModel} with the
54 * functionalities of the {@link AttributeMetadata}.
55 * <ul>
56 * <li>column names are translated according to
57 * {@link AttributeMetadata#getTitle()}</li>
58 * <li>columns are hidden according to {@link AttributeMetaData#isVisible()()}</li>
59 * <li>Any filter defined in the {@link StyledFeaturesInterface} will be
60 * applied.</li>
61 * </ul>
62 *
63 * @author Stefan A. Krüger
64 */
65 public class StyledFeatureCollectionTableModel extends
66 FeatureCollectionTableModel {
67 final static private Logger LOGGER = Logger
68 .getLogger(StyledFeatureCollectionTableModel.class);
69 /** Contains the complete {@link AttributeMetadata}-Map of the styled layer. */
70 protected AttributeMetadataMap amdMap = null;
71 /** Holds the current filter on the table */
72 protected Filter filter = null;
73 /** Holds the Bounds for all features. Only set once during the constructor **/
74 protected Envelope bounds;
75 /**
76 * Tooltips für die Spaltennamen. Wird nur beim Aufruf von
77 * {@link #reorganize} befuellt.
78 */
79 protected String[] colTooltips = null;
80
81 /** A cache for the #sortedValuesVisibleOnly() **/
82 protected List<AttributeMetadata> amdMapVisibleOnly = null;
83
84 /**
85 * Creates a new table model for a styled layer.
86 *
87 * @param styledFeatures
88 * the styled layer
89 * @param filter
90 * filter applied to the table
91 */
92 public StyledFeatureCollectionTableModel(
93 StyledFeaturesInterface<?> styledFeatures) {
94 setStyledFeatures(styledFeatures);
95 }
96
97 /**
98 * This overwritten method filters the values for NODATA-values defined in
99 * the {@link AttributeMetadata}
100 */
101 @Override
102 public Object getValueAt(int row, int col) {
103 Object rawValue = super.getValueAt(row, col);
104 return amdMap.sortedValuesVisibleOnly().get(col).fiterNodata(rawValue);
105 }
106
107 /**
108 * Sets a new data source for the table.
109 *
110 * @param fs
111 * the feature source
112 * @param amdm
113 * {@link AttributeMetadata}-Map to define the visible attributes
114 * and translation
115 */
116 protected void setFeatureSource(
117 FeatureSource<SimpleFeatureType, SimpleFeature> fs,
118 AttributeMetadataMap amdm, Filter filter) throws Exception {
119
120 if (filter == null)
121 filter = Filter.INCLUDE;
122
123 // this.featureSource = fs;
124 this.filter = filter;
125 this.amdMap = amdm;
126 this.amdMapVisibleOnly = amdMap.sortedValuesVisibleOnly();
127
128 FeatureCollection<SimpleFeatureType, SimpleFeature> fc = null;
129 if (fs != null) {
130
131 bounds = fs.getBounds();
132
133 final SimpleFeatureType schema = fs.getSchema();
134 Query query = new DefaultQuery(schema.getTypeName(), filter);
135 if (amdm != null) {
136 Vector<String> visibleAttrNames = new Vector<String>();
137
138 // Add the column with the geometry (usually "the_geom") always
139 visibleAttrNames.add(schema.getGeometryDescriptor()
140 .getLocalName());
141
142 // Add other visible attributes as ordered by weights
143 for (AttributeMetadata a : amdMapVisibleOnly) {
144 visibleAttrNames.add(a.getLocalName());
145 }
146
147 // Tested with 2.6.x trunk from 2009-11-26 and it now works. So
148 // we only request the properties we need!
149 // /**
150 // * I got NPEs when properties contained only [the_geom]
151 // ?!??!!??
152 // */
153 // if (properties.length > 1) {
154 query = new DefaultQuery(schema.getTypeName(), filter,
155 visibleAttrNames.toArray(new String[] {}));
156 // } else {
157 // query = new DefaultQuery(schema.getTypeName(), filter);
158 // }
159 }
160 fc = fs.getFeatures(query);
161 }
162 setFeatureCollection(fc);
163 }
164
165 /**
166 * Converts the {@code StyledFeatureCollection} to a {@code FeatureSource}
167 * and sets this as the new data source for the table.
168 *
169 * @param fs
170 * the feature source
171 * @param amd
172 * {@link AttributeMetadata}-Map to define the visible attributes
173 * and translation
174 */
175 public void setStyledFeatures(StyledFeaturesInterface<?> styledFeatures) {
176 try {
177 if (styledFeatures == null)
178 setFeatureSource(null, null, null);
179 else {
180 setFeatureSource(styledFeatures.getFeatureSource(),
181 styledFeatures.getAttributeMetaDataMap(),
182 styledFeatures.getFilter());
183 }
184 } catch (Exception err) {
185 throw new RuntimeException(err);
186 }
187 }
188
189 /**
190 * After calling {@code super.reorganize(.)} this method replaced the column
191 * descriptions with the titles of the {@code AttributeMetaData}.
192 *
193 * @param fireTableStructureChanged
194 * indicates whether a table event is initiated after reorganize
195 */
196 @Override
197 protected void reorganize(boolean fireTableStructureChanged) {
198
199 featureArray = FeatureUtil.featuresToArray(featureTable);
200 if (featureArray == null || featureArray.length == 0) {
201 colNames = new String[0];
202 colTooltips = new String[0]; // Only set and used in
203 // StyledFeatureCollectionTableModel
204 colClass = new Class[0];
205 } else {
206 // Struktur der Tabelle vom AttributeMetaDtaaMap übernehmen
207 SimpleFeatureType schema = featureArray[0].getFeatureType();
208 // Pruefen, welche Attribute angezeigt werden
209 attrTypes.clear();
210 for (AttributeMetadata amd : amdMapVisibleOnly) {
211 AttributeDescriptor type = schema.getDescriptor(amd.getName());
212 if (attrFilter == null || attrFilter.accept(type))
213 attrTypes.add(type);
214 }
215 // Namen und Attribut-Indizes der angezeigten Spalten ermitteln
216 colNames = new String[attrTypes.size()];
217 colTooltips = new String[attrTypes.size()]; // Only set and used in
218 // StyledFeatureCollectionTableModel
219 colClass = new Class[attrTypes.size()];
220 attrIdxForCol = new int[attrTypes.size()];
221 for (int i = 0; i < colNames.length; i++) {
222 AttributeDescriptor descriptor = schema
223 .getDescriptor(amdMapVisibleOnly.get(i).getName());
224
225 // Not so nice in 26: find the index of an attribute...
226 int idx = schema.getAttributeDescriptors().indexOf(descriptor);
227 attrIdxForCol[i] = idx;
228
229 String attName = schema.getAttributeDescriptors().get(idx)
230 .getLocalName();
231 colNames[i] = amdMap.get(attName).getTitle().toString();
232 AttributeMetadata amd = amdMap.get(attName);
233 colTooltips[i] = "<html>" + amd.getDesc().toString() + "<br>"
234 + amd.getName() + "</html>";
235 colClass[i] = schema.getAttributeDescriptors().get(idx)
236 .getType().getBinding();
237 }
238 }
239
240 // store feature indexes in HashMap to optimize findFeature(.)
241 featureIdx = new HashMap<String, Integer>();
242 for (int i = 0; i < featureArray.length; i++)
243 if (featureArray[i] != null)
244 featureIdx.put(featureArray[i].getID(), i);
245 //
246 // // translate the column names
247 // if (amdMap != null) {
248 // for (int i = 0; i < colNames.length; i++) {
249 // colTooltips[i] = amdMap.get(colNames[i]).getDesc().toString()
250 // + "<br>" + colNames[i];
251 // colNames[i] = amdMap.get(colNames[i]).getTitle().toString();
252 //
253 // }
254 // }
255 if (fireTableStructureChanged)
256 fireTableStructureChanged();
257
258 }
259
260 /**
261 * @return Cached bounds for the whole dataset (without applying the filter)
262 * or <code>null</code>
263 */
264 public Envelope getBounds() {
265 return bounds;
266 }
267 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26