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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/src/skrueger/geotools/StyledFeatureCollectionTableModel.java revision 46 by mojays, Fri Apr 17 11:44:05 2009 UTC branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFeatureCollectionTableModel.java revision 428 by alfonx, Sun Oct 4 14:28:07 2009 UTC
# Line 1  Line 1 
1  package skrueger.geotools;  /*******************************************************************************
2     * Copyright (c) 2009 Martin O. J. Schmitz.
3  import schmitzm.geotools.gui.FeatureCollectionTableModel;   *
4     * This file is part of the SCHMITZM library - a collection of utility
5  public class StyledFeatureCollectionTableModel extends FeatureCollectionTableModel {   * classes based on Java 1.6, focusing (not only) on Java Swing
6       * and the Geotools library.
7    public StyledFeatureCollectionTableModel(StyledFeatureCollectionInterface map) {   *
8      super(null);   * The SCHMITZM project is hosted at:
9    }   * http://wald.intevation.org/projects/schmitzm/
10       *
11    public StyledFeatureCollectionTableModel(StyledFeatureSourceInterface map) {   * This program is free software; you can redistribute it and/or
12      super(null);   * 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    public String[] createColumnNames() {   *
16      return new String[0];   * 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    public int getRowCount() {   * GNU General Public License for more details.
20      return 0;   *
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    public Object getValueAt(int row, int col) {   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
24      return "";   * 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    }

Legend:
Removed from v.46  
changed lines
  Added in v.428

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26