/[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 534 by alfonx, Fri Nov 20 10:28:01 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.HashMap;
33    import java.util.Vector;
34    
35    import org.apache.log4j.Logger;
36    import org.geotools.data.DefaultQuery;
37    import org.geotools.data.FeatureSource;
38    import org.geotools.data.Query;
39    import org.geotools.feature.FeatureCollection;
40    import org.opengis.feature.simple.SimpleFeature;
41    import org.opengis.feature.simple.SimpleFeatureType;
42    import org.opengis.feature.type.AttributeDescriptor;
43    import org.opengis.filter.Filter;
44    
45    import schmitzm.geotools.feature.FeatureUtil;
46    import schmitzm.geotools.gui.FeatureCollectionTableModel;
47    import skrueger.AttributeMetadata;
48    
49    import com.vividsolutions.jts.geom.Envelope;
50    
51    /**
52     * This class extends the the {@link FeatureCollectionTableModel} with the
53     * functionalities of the {@link AttributeMetadata}.
54     * <ul>
55     * <li>column names are translated according to
56     * {@link AttributeMetadata#getTitle()}</li>
57     * <li>columns are hidden according to {@link AttributeMetaData#isVisible()()}</li>
58     * <li>Any filter defined in the {@link StyledFeaturesInterface} will be
59     * applied.</li>
60     * </ul>
61     *
62     * @author Stefan A. Krüger
63     */
64    public class StyledFeatureCollectionTableModel extends
65                    FeatureCollectionTableModel {
66            final static private Logger LOGGER = Logger
67                            .getLogger(StyledFeatureCollectionTableModel.class);
68            /** Contains the complete {@link AttributeMetadata}-Map of the styled layer. */
69            protected AttributeMetadataMap amdMap = null;
70            /** Holds the current filter on the table */
71            protected Filter filter = null;
72            /** Holds the Bounds for all features. Only set once during the constructor **/
73            protected Envelope bounds;
74            /**
75             * Tooltips für die Spaltennamen. Wird nur beim Aufruf von
76             * {@link #reorganize} befuellt.
77             */
78            protected String[] colTooltips = null;
79    
80            /**
81             * Creates a new table model for a styled layer.
82             *
83             * @param styledFeatures
84             *            the styled layer
85             * @param filter
86             *            filter applied to the table
87             */
88            public StyledFeatureCollectionTableModel(
89                            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 amdm
99             *            {@link AttributeMetadata}-Map to define the visible attributes
100             *            and translation
101             */
102            protected void setFeatureSource(
103                            FeatureSource<SimpleFeatureType, SimpleFeature> fs,
104                            AttributeMetadataMap amdm, Filter filter) throws Exception {
105    
106                    if (filter == null)
107                            filter = Filter.INCLUDE;
108    
109                    // this.featureSource = fs;
110                    this.filter = filter;
111                    this.amdMap = amdm;
112    
113                    FeatureCollection<SimpleFeatureType, SimpleFeature> fc = null;
114                    if (fs != null) {
115    
116                            bounds = fs.getBounds();
117    
118                            final SimpleFeatureType schema = fs.getSchema();
119                            Query query = new DefaultQuery(schema.getTypeName(), filter);
120                            if (amdm != null) {
121                                    Vector<String> visibleAttrNames = new Vector<String>();
122    
123                                    // Add the column with the geometry (usually "the_geom")
124                                    visibleAttrNames.add(schema.getGeometryDescriptor()
125                                                    .getLocalName());
126    
127                                    // Add other visible attributes as ordered by weights
128                                    for (AttributeMetadata a : amdm.sortedValuesVisibleOnly()) {
129                                            visibleAttrNames.add(a.getLocalName());
130                                    }
131    
132                                    // for (AttributeDescriptor aDesc :
133                                    // schema.getAttributeDescriptors()) {
134                                    //                                      
135                                    // // Always add the geometry
136                                    // if (schema.getGeometryDescriptor()
137                                    // .getName().equals(aDesc.getName())) {
138                                    // visibleAttrNames.add(schema.getGeometryDescriptor()
139                                    // .getLocalName());
140                                    // continue;
141                                    // }
142                                    //                                      
143                                    // if (amd.get(aDesc.getName()).isVisible())
144                                    // visibleAttrNames.add(aDesc.getName().getLocalPart());
145                                    // }
146                                    //
147                                    // // create a query for the visible attributes
148                                    String[] properties = visibleAttrNames.toArray(new String[] {});
149                                    //
150                                    // LOGGER.debug("Query contains the following attributes: "
151                                    // + visibleAttrNames);
152    
153                                    /**
154                                     * I got NPEs when properties contained only [the_geom] ?!??!!??
155                                     * TODO Try again one day... Not today... 20.11.2009, SK
156                                     */
157                                    if (properties.length > 1) {
158                                            query = new DefaultQuery(schema.getTypeName(), filter,
159                                                            properties);
160                                    } else {
161                                            query = new DefaultQuery(schema.getTypeName(), filter);
162                                    }
163                            }
164                            fc = fs.getFeatures(query);
165                    }
166                    setFeatureCollection(fc);
167            }
168    
169            /**
170             * Converts the {@code StyledFeatureCollection} to a {@code FeatureSource}
171             * and sets this as the new data source for the table.
172             *
173             * @param fs
174             *            the feature source
175             * @param amd
176             *            {@link AttributeMetadata}-Map to define the visible attributes
177             *            and translation
178             */
179            public void setStyledFeatures(StyledFeaturesInterface<?> styledFeatures) {
180                    try {
181                            if (styledFeatures == null)
182                                    setFeatureSource(null, null, null);
183                            else {
184                                    setFeatureSource(styledFeatures.getFeatureSource(),
185                                                    styledFeatures.getAttributeMetaDataMap(),
186                                                    styledFeatures.getFilter());
187                            }
188                    } catch (Exception err) {
189                            throw new RuntimeException(err);
190                    }
191            }
192    
193            /**
194             * After calling {@code super.reorganize(.)} this method replaced the column
195             * descriptions with the titles of the {@code AttributeMetaData}.
196             *
197             * @param fireTableStructureChanged
198             *            indicates whether a table event is initiated after reorganize
199             */
200            @Override
201            protected void reorganize(boolean fireTableStructureChanged) {
202    
203                    featureArray = FeatureUtil.featuresToArray(featureTable);
204                    if (featureArray == null || featureArray.length == 0) {
205                            colNames = new String[0];
206                            colTooltips = new String[0]; // Only set and used in
207                                                                                            // StyledFeatureCollectionTableModel
208                            colClass = new Class[0];
209                    } else {
210                            // Struktur der Tabelle vom AttributeMetaDtaaMap übernehmen
211                            SimpleFeatureType schema = featureArray[0].getFeatureType();
212                            // Pruefen, welche Attribute angezeigt werden
213                            attrTypes.clear();
214                            for (AttributeMetadata amd : amdMap.sortedValuesVisibleOnly()) {
215                                    AttributeDescriptor type = schema.getDescriptor(amd.getName());
216                                    if (attrFilter == null || attrFilter.accept(type))
217                                            attrTypes.add(type);
218                            }
219                            // Namen und Attribut-Indizes der angezeigten Spalten ermitteln
220                            colNames = new String[attrTypes.size()];
221                            colTooltips = new String[attrTypes.size()]; // Only set and used in
222                                                                                                                    // StyledFeatureCollectionTableModel
223                            colClass = new Class[attrTypes.size()];
224                            attrIdxForCol = new int[attrTypes.size()];
225                            for (int i = 0; i < colNames.length; i++) {
226                                    AttributeDescriptor descriptor = schema.getDescriptor(amdMap.sortedValuesVisibleOnly().get(i).getName());
227    
228                                    // Not so nice in 26: find the index of an attribute...
229                                    int idx = schema.getAttributeDescriptors().indexOf(descriptor);
230                                    attrIdxForCol[i] = idx;
231    
232                                    String attName = schema.getAttributeDescriptors().get(idx)
233                                                    .getLocalName();
234                                    colNames[i] = amdMap.get(attName).getTitle().toString();
235                                    AttributeMetadata amd = amdMap.get(attName);
236                                    colTooltips[i] = "<html>"+amd.getDesc().toString()+"<br>"+amd.getName()+"</html>";
237                                    colClass[i] = schema.getAttributeDescriptors().get(idx).getType()
238                                                    .getBinding();
239                            }
240                    }
241    
242                    // store feature indexes in HashMap to optimize findFeature(.)
243                    featureIdx = new HashMap<String, Integer>();
244                    for (int i = 0; i < featureArray.length; i++)
245                            if (featureArray[i] != null)
246                                    featureIdx.put(featureArray[i].getID(), i);
247    //
248    //              // translate the column names
249    //              if (amdMap != null) {
250    //                      for (int i = 0; i < colNames.length; i++) {
251    //                              colTooltips[i] = amdMap.get(colNames[i]).getDesc().toString()
252    //                                              + "<br>" + colNames[i];
253    //                              colNames[i] = amdMap.get(colNames[i]).getTitle().toString();
254    //
255    //                      }
256    //              }
257                    if (fireTableStructureChanged)
258                            fireTableStructureChanged();
259    
260            }
261    
262            /**
263             * @return Cached bounds for the whole dataset (without applying the filter)
264             *         or <code>null</code>
265             */
266            public Envelope getBounds() {
267                    return bounds;
268            }
269    }

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26