/[schmitzm]/branches/2.0-RC1/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
ViewVC logotype

Annotation of /branches/2.0-RC1/src/skrueger/geotools/StyledFeatureCollectionTableModel.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 490 - (hide 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 alfonx 244 /*******************************************************************************
2     * Copyright (c) 2009 Martin O. J. Schmitz.
3     *
4     * This file is part of the SCHMITZM library - a collection of utility
5 alfonx 256 * classes based on Java 1.6, focusing (not only) on Java Swing
6 alfonx 244 * 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 alfonx 335 import org.opengis.feature.simple.SimpleFeature;
40     import org.opengis.feature.simple.SimpleFeatureType;
41 alfonx 332 import org.opengis.feature.type.AttributeDescriptor;
42 alfonx 244 import org.opengis.filter.Filter;
43    
44     import schmitzm.geotools.gui.FeatureCollectionTableModel;
45 alfonx 464 import skrueger.AttributeMetadata;
46 alfonx 244
47     import com.vividsolutions.jts.geom.Envelope;
48    
49     /**
50     * This class extends the the {@link FeatureCollectionTableModel} with the
51 alfonx 464 * functionalities of the {@link AttributeMetadata}.
52 alfonx 244 * <ul>
53     * <li>column names are translated according to
54 alfonx 464 * {@link AttributeMetadata#getTitle()}</li>
55 alfonx 244 * <li>columns are hidden according to {@link AttributeMetaData#isVisible()()}</li>
56 alfonx 428 * <li>Any filter defined in the {@link StyledFeaturesInterface} will be applied.</li>
57 alfonx 244 * </ul>
58     *
59 alfonx 428 * @author Stefan A. Krüger
60 alfonx 244 */
61     public class StyledFeatureCollectionTableModel extends
62     FeatureCollectionTableModel {
63     final static private Logger LOGGER = Logger
64     .getLogger(StyledFeatureCollectionTableModel.class);
65 alfonx 464 /** Contains the complete {@link AttributeMetadata}-Map of the styled layer. */
66     protected AttributeMetadataMap origAMD = null;
67 alfonx 244 /** 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 alfonx 428 * @param styledFeatures
77 alfonx 244 * the styled layer
78     * @param filter
79     * filter applied to the table
80     */
81 alfonx 428 public StyledFeatureCollectionTableModel(StyledFeaturesInterface<?> styledFeatures) {
82     setStyledFeatures(styledFeatures);
83 alfonx 244 }
84    
85     /**
86     * Sets a new data source for the table.
87     *
88     * @param fs
89     * the feature source
90     * @param amd
91 alfonx 464 * {@link AttributeMetadata}-Map to define the visible attributes
92 alfonx 244 * and translation
93     */
94 alfonx 335 protected void setFeatureSource(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
95 alfonx 464 AttributeMetadataMap amd, Filter filter)
96 alfonx 244 throws Exception {
97 alfonx 428
98 alfonx 244 if (filter == null)
99     filter = Filter.INCLUDE;
100    
101 alfonx 428 // this.featureSource = fs;
102 alfonx 244 this.filter = filter;
103     this.origAMD = amd;
104    
105 alfonx 428 FeatureCollection<SimpleFeatureType, SimpleFeature> fc = null;
106 alfonx 244 if (fs != null) {
107    
108     bounds = fs.getBounds();
109    
110 alfonx 464 final SimpleFeatureType schema = fs.getSchema();
111     Query query = new DefaultQuery(schema.getTypeName(), filter);
112 alfonx 244 if (amd != null) {
113     Vector<String> visibleAttrNames = new Vector<String>();
114     // Add the column with the geometry (usually "the_geom")
115 alfonx 464
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 alfonx 244 }
125 alfonx 464
126     if (amd.get(aDesc.getName()).isVisible())
127     visibleAttrNames.add(aDesc.getName().getLocalPart());
128 alfonx 244 }
129    
130     // create a query for the visible attributes
131 alfonx 464 String[] properties = visibleAttrNames.toArray(new String[] {});
132 alfonx 244
133     LOGGER.debug("Query contains the following attributes: "
134     + visibleAttrNames);
135    
136 alfonx 490
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 alfonx 244 }
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 alfonx 464 * {@link AttributeMetadata}-Map to define the visible attributes
160 alfonx 244 * and translation
161     */
162 alfonx 428 public void setStyledFeatures(StyledFeaturesInterface<?> styledFeatures) {
163 alfonx 244 try {
164 alfonx 428 if (styledFeatures == null)
165 alfonx 244 setFeatureSource(null, null, null);
166     else {
167 alfonx 428 setFeatureSource(styledFeatures.getFeatureSource(), styledFeatures.getAttributeMetaDataMap(), styledFeatures.getFilter());
168 alfonx 244 }
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 alfonx 464
184 alfonx 244 super.reorganize(false);
185 alfonx 464
186 alfonx 244 // translate the column names
187 alfonx 464 if (origAMD != null) {
188     for (int i = 0; i < colNames.length; i++) {
189     colNames[i] = origAMD.get(colNames[i]).getTitle().toString();
190 alfonx 244 }
191 alfonx 464
192 alfonx 244 }
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