/[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 490 - (show annotations)
Fri Oct 23 12:35:59 2009 UTC (15 years, 4 months ago) by alfonx
Original Path: branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
File size: 6626 byte(s)
setRelWindowPosition auf Component umgestellt

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.Vector;
33
34 import org.apache.log4j.Logger;
35 import org.geotools.data.DefaultQuery;
36 import org.geotools.data.FeatureSource;
37 import org.geotools.data.Query;
38 import org.geotools.feature.FeatureCollection;
39 import org.opengis.feature.simple.SimpleFeature;
40 import org.opengis.feature.simple.SimpleFeatureType;
41 import org.opengis.feature.type.AttributeDescriptor;
42 import org.opengis.filter.Filter;
43
44 import schmitzm.geotools.gui.FeatureCollectionTableModel;
45 import skrueger.AttributeMetadata;
46
47 import com.vividsolutions.jts.geom.Envelope;
48
49 /**
50 * This class extends the the {@link FeatureCollectionTableModel} with the
51 * functionalities of the {@link AttributeMetadata}.
52 * <ul>
53 * <li>column names are translated according to
54 * {@link AttributeMetadata#getTitle()}</li>
55 * <li>columns are hidden according to {@link AttributeMetaData#isVisible()()}</li>
56 * <li>Any filter defined in the {@link StyledFeaturesInterface} will be applied.</li>
57 * </ul>
58 *
59 * @author Stefan A. Krüger
60 */
61 public class StyledFeatureCollectionTableModel extends
62 FeatureCollectionTableModel {
63 final static private Logger LOGGER = Logger
64 .getLogger(StyledFeatureCollectionTableModel.class);
65 /** Contains the complete {@link AttributeMetadata}-Map of the styled layer. */
66 protected AttributeMetadataMap origAMD = null;
67 /** Holds the current filter on the table */
68 protected Filter filter = null;
69 /** Holds the Bounds for all features. Only set once during the constructor **/
70 protected Envelope bounds;
71
72
73 /**
74 * Creates a new table model for a styled layer.
75 *
76 * @param styledFeatures
77 * the styled layer
78 * @param filter
79 * filter applied to the table
80 */
81 public StyledFeatureCollectionTableModel(StyledFeaturesInterface<?> styledFeatures) {
82 setStyledFeatures(styledFeatures);
83 }
84
85 /**
86 * Sets a new data source for the table.
87 *
88 * @param fs
89 * the feature source
90 * @param amd
91 * {@link AttributeMetadata}-Map to define the visible attributes
92 * and translation
93 */
94 protected void setFeatureSource(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
95 AttributeMetadataMap amd, Filter filter)
96 throws Exception {
97
98 if (filter == null)
99 filter = Filter.INCLUDE;
100
101 // this.featureSource = fs;
102 this.filter = filter;
103 this.origAMD = amd;
104
105 FeatureCollection<SimpleFeatureType, SimpleFeature> fc = null;
106 if (fs != null) {
107
108 bounds = fs.getBounds();
109
110 final SimpleFeatureType schema = fs.getSchema();
111 Query query = new DefaultQuery(schema.getTypeName(), filter);
112 if (amd != null) {
113 Vector<String> visibleAttrNames = new Vector<String>();
114 // Add the column with the geometry (usually "the_geom")
115
116 for (AttributeDescriptor aDesc : schema.getAttributeDescriptors()) {
117
118 // Always add the geometry
119 if (schema.getGeometryDescriptor()
120 .getName().equals(aDesc.getName())) {
121 visibleAttrNames.add(schema.getGeometryDescriptor()
122 .getLocalName());
123 continue;
124 }
125
126 if (amd.get(aDesc.getName()).isVisible())
127 visibleAttrNames.add(aDesc.getName().getLocalPart());
128 }
129
130 // create a query for the visible attributes
131 String[] properties = visibleAttrNames.toArray(new String[] {});
132
133 LOGGER.debug("Query contains the following attributes: "
134 + visibleAttrNames);
135
136
137 /**
138 * I got NPEs when properties contained only [the_geom] ?!??!!??
139 */
140 if (properties.length > 1) {
141 query = new DefaultQuery(schema.getTypeName(), filter,
142 properties);
143 } else {
144 query = new DefaultQuery(schema.getTypeName(), filter);
145 }
146 }
147 fc = fs.getFeatures(query);
148 }
149 setFeatureCollection(fc);
150 }
151
152 /**
153 * Converts the {@code StyledFeatureCollection} to a {@code FeatureSource}
154 * and sets this as the new data source for the table.
155 *
156 * @param fs
157 * the feature source
158 * @param amd
159 * {@link AttributeMetadata}-Map to define the visible attributes
160 * and translation
161 */
162 public void setStyledFeatures(StyledFeaturesInterface<?> styledFeatures) {
163 try {
164 if (styledFeatures == null)
165 setFeatureSource(null, null, null);
166 else {
167 setFeatureSource(styledFeatures.getFeatureSource(), styledFeatures.getAttributeMetaDataMap(), styledFeatures.getFilter());
168 }
169 } catch (Exception err) {
170 throw new RuntimeException(err);
171 }
172 }
173
174 /**
175 * After calling {@code super.reorganize(.)} this method replaced the column
176 * descriptions with the titles of the {@code AttributeMetaData}.
177 *
178 * @param fireTableStructureChanged
179 * indicates whether a table event is initiated after reorganize
180 */
181 @Override
182 protected void reorganize(boolean fireTableStructureChanged) {
183
184 super.reorganize(false);
185
186 // translate the column names
187 if (origAMD != null) {
188 for (int i = 0; i < colNames.length; i++) {
189 colNames[i] = origAMD.get(colNames[i]).getTitle().toString();
190 }
191
192 }
193 if (fireTableStructureChanged)
194 fireTableStructureChanged();
195 }
196
197 /**
198 * @return Cached bounds for the whole dataset (without applying the filter)
199 * or <code>null</code>
200 */
201 public Envelope getBounds() {
202 return bounds;
203 }
204 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26