/[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 428 - (show annotations)
Sun Oct 4 14:28:07 2009 UTC (15 years, 4 months ago) by alfonx
Original Path: branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
File size: 7555 byte(s)
* Changed the constructor of AttributetableDialog to be more standard
* StyledFeatureCollectionTableModel now uses the Filter from StyledFeaturesInterface
* Created a test case for AttributeTableJDialog
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.Iterator;
33 import java.util.Map;
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.gui.FeatureCollectionTableModel;
47 import skrueger.AttributeMetaData;
48 import skrueger.i8n.I8NUtil;
49 import skrueger.i8n.Translation;
50
51 import com.vividsolutions.jts.geom.Envelope;
52
53 /**
54 * This class extends the the {@link FeatureCollectionTableModel} with the
55 * functionalities of the {@link AttributeMetaData}.
56 * <ul>
57 * <li>column names are translated according to
58 * {@link AttributeMetaData#getTitle()}</li>
59 * <li>columns are hidden according to {@link AttributeMetaData#isVisible()()}</li>
60 * <li>Any filter defined in the {@link StyledFeaturesInterface} will be 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 only the visible elements of the {@link AttributeMetaData}-Map */
70 protected Map<Integer, AttributeMetaData> visibleAMD = null;
71 // /** Holds the data source for the table as {@code FeatureSource}. */
72 // protected FeatureSource featureSource = null;
73 /** Contains the complete {@link AttributeMetaData}-Map of the styled layer. */
74 protected Map<Integer, AttributeMetaData> origAMD = null;
75 /** Holds the current filter on the table */
76 protected Filter filter = null;
77 /** Holds the Bounds for all features. Only set once during the constructor **/
78 protected Envelope bounds;
79
80
81 /**
82 * Creates a new table model for a styled layer.
83 *
84 * @param styledFeatures
85 * the styled layer
86 * @param filter
87 * filter applied to the table
88 */
89 public StyledFeatureCollectionTableModel(StyledFeaturesInterface<?> styledFeatures) {
90 setStyledFeatures(styledFeatures);
91 }
92
93 /**
94 * Sets a new data source for the table.
95 *
96 * @param fs
97 * the feature source
98 * @param amd
99 * {@link AttributeMetaData}-Map to define the visible attributes
100 * and translation
101 */
102 protected void setFeatureSource(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
103 Map<Integer, AttributeMetaData> amd, Filter filter)
104 throws Exception {
105
106 if (filter == null)
107 filter = Filter.INCLUDE;
108
109 // this.featureSource = fs;
110 this.filter = filter;
111 this.origAMD = amd;
112 this.visibleAMD = null;
113
114 FeatureCollection<SimpleFeatureType, SimpleFeature> fc = null;
115 if (fs != null) {
116
117 bounds = fs.getBounds();
118
119 Query query = new DefaultQuery(fs.getSchema().getName().getLocalPart(), filter);
120 if (amd != null) {
121 // determine the names of the visible Attributes
122 this.visibleAMD = StyledLayerUtil.getVisibleAttributeMetaData(
123 amd, true);
124 Vector<String> visibleAttrNames = new Vector<String>();
125 // Add the column with the geometry (usually "the_geom")
126 visibleAttrNames.add(fs.getSchema().getGeometryDescriptor()
127 .getLocalName());
128 for (int attrIdx : visibleAMD.keySet()) {
129
130 /**
131 * If the user removed columns from the schema of the DBF
132 * file, there might exist AttributeMetaData for columns
133 * that don't exists. We check here to avoid an
134 * ArrayOutOfIndex.
135 */
136 if (attrIdx < fs.getSchema().getAttributeCount()) {
137 final AttributeDescriptor attributeTypeAtIdx = fs.getSchema()
138 .getAttributeDescriptors().get(attrIdx);
139 visibleAttrNames.add(attributeTypeAtIdx.getLocalName());
140 } else {
141 LOGGER.warn("AttributeMetaData has been found for columnIdx="+attrIdx+", but fs.getSchema().getAttributeCount() = "+fs.getSchema().getAttributeCount()+". Ignored.");
142 }
143 }
144
145 // create a query for the visible attributes
146 String[] properties = visibleAttrNames.toArray(new String[0]);
147
148 LOGGER.debug("Query contains the following attributes: "
149 + visibleAttrNames);
150
151 query = new DefaultQuery(fs.getSchema().getTypeName(), filter,
152 properties);
153 }
154 fc = fs.getFeatures(query);
155 }
156 setFeatureCollection(fc);
157 }
158
159 /**
160 * Converts the {@code StyledFeatureCollection} to a {@code FeatureSource}
161 * and sets this as the new data source for the table.
162 *
163 * @param fs
164 * the feature source
165 * @param amd
166 * {@link AttributeMetaData}-Map to define the visible attributes
167 * and translation
168 */
169 public void setStyledFeatures(StyledFeaturesInterface<?> styledFeatures) {
170 try {
171 if (styledFeatures == null)
172 setFeatureSource(null, null, null);
173 else {
174 setFeatureSource(styledFeatures.getFeatureSource(), styledFeatures.getAttributeMetaDataMap(), styledFeatures.getFilter());
175 }
176 } catch (Exception err) {
177 throw new RuntimeException(err);
178 }
179 }
180
181 /**
182 * After calling {@code super.reorganize(.)} this method replaced the column
183 * descriptions with the titles of the {@code AttributeMetaData}.
184 *
185 * @param fireTableStructureChanged
186 * indicates whether a table event is initiated after reorganize
187 */
188 @Override
189 protected void reorganize(boolean fireTableStructureChanged) {
190 super.reorganize(false);
191 // translate the column names
192 if (visibleAMD != null) {
193 Iterator<Integer> keys = visibleAMD.keySet().iterator();
194 for (int i = 0; i < colNames.length && keys.hasNext(); i++) {
195 Translation title = visibleAMD.get(keys.next()).getTitle();
196 if (!I8NUtil.isEmpty(title)) {
197 // System.out.println("set colname " + i + " to " +
198 // title.toString());
199 colNames[i] = title.toString();
200 }
201 }
202 }
203 if (fireTableStructureChanged)
204 fireTableStructureChanged();
205 }
206
207 /**
208 * @return Cached bounds for the whole dataset (without applying the filter)
209 * or <code>null</code>
210 */
211 public Envelope getBounds() {
212 return bounds;
213 }
214 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26