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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 428 - (hide 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 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.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 alfonx 335 import org.opengis.feature.simple.SimpleFeature;
42     import org.opengis.feature.simple.SimpleFeatureType;
43 alfonx 332 import org.opengis.feature.type.AttributeDescriptor;
44 alfonx 244 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 alfonx 428 * functionalities of the {@link AttributeMetaData}.
56 alfonx 244 * <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 alfonx 428 * <li>Any filter defined in the {@link StyledFeaturesInterface} will be applied.</li>
61 alfonx 244 * </ul>
62     *
63 alfonx 428 * @author Stefan A. Krüger
64 alfonx 244 */
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 alfonx 428 // /** Holds the data source for the table as {@code FeatureSource}. */
72     // protected FeatureSource featureSource = null;
73 alfonx 244 /** 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 alfonx 428 * @param styledFeatures
85 alfonx 244 * the styled layer
86     * @param filter
87     * filter applied to the table
88     */
89 alfonx 428 public StyledFeatureCollectionTableModel(StyledFeaturesInterface<?> styledFeatures) {
90     setStyledFeatures(styledFeatures);
91 alfonx 244 }
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 alfonx 335 protected void setFeatureSource(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
103 alfonx 244 Map<Integer, AttributeMetaData> amd, Filter filter)
104     throws Exception {
105 alfonx 428
106 alfonx 244 if (filter == null)
107     filter = Filter.INCLUDE;
108    
109 alfonx 428 // this.featureSource = fs;
110 alfonx 244 this.filter = filter;
111     this.origAMD = amd;
112     this.visibleAMD = null;
113    
114 alfonx 428 FeatureCollection<SimpleFeatureType, SimpleFeature> fc = null;
115 alfonx 244 if (fs != null) {
116    
117     bounds = fs.getBounds();
118    
119 alfonx 335 Query query = new DefaultQuery(fs.getSchema().getName().getLocalPart(), filter);
120 alfonx 244 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 alfonx 335 visibleAttrNames.add(fs.getSchema().getGeometryDescriptor()
127 alfonx 244 .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 alfonx 332 final AttributeDescriptor attributeTypeAtIdx = fs.getSchema()
138 alfonx 335 .getAttributeDescriptors().get(attrIdx);
139 alfonx 244 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 alfonx 428 public void setStyledFeatures(StyledFeaturesInterface<?> styledFeatures) {
170 alfonx 244 try {
171 alfonx 428 if (styledFeatures == null)
172 alfonx 244 setFeatureSource(null, null, null);
173     else {
174 alfonx 428 setFeatureSource(styledFeatures.getFeatureSource(), styledFeatures.getAttributeMetaDataMap(), styledFeatures.getFilter());
175 alfonx 244 }
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