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

Annotation of /trunk/src/skrueger/geotools/selection/ChartSelectionSynchronizer.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 244 - (hide annotations)
Wed Jul 29 09:33:33 2009 UTC (15 years, 7 months ago) by alfonx
File size: 6057 byte(s)
* Updated all .java and .properties headers with a recent LGPL 3.0 and a link to the project webpage.
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     * classes based on Java 1.6, focussing (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.selection;
31    
32     import java.beans.PropertyChangeEvent;
33     import java.beans.PropertyChangeListener;
34     import java.util.Vector;
35    
36     import org.jfree.data.general.Dataset;
37    
38     import schmitzm.jfree.chart.renderer.SelectionRenderer;
39     import schmitzm.jfree.chart.selection.DatasetSelectionChangeEvent;
40     import schmitzm.jfree.chart.selection.DatasetSelectionListener;
41     import schmitzm.jfree.chart.selection.DatasetSelectionModel;
42     import schmitzm.jfree.chart.selection.DatasetSelectionModelProvider;
43     import schmitzm.jfree.feature.FeatureDatasetSelectionModel;
44    
45     /**
46     * This class keeps the selection of a {@link Dataset} (based on feature
47     * attributes) synchronized with the {@link StyledLayerSelectionModel} of a layer.
48     * This is done by implementing:
49     * <ul>
50     * <li>a {@link PropertyChangeListener} which listens to the
51     * {@link StyledLayerSelectionModel} and accordingly changes the {@link SelectionRenderer}
52     * selection</li>
53     * <li>a {@link DatasetSelectionModel} which listens to the {@link SelectionRenderer} and
54     * accordingly changes the {@link StyledLayerSelectionModel} selection</li>
55     * </ul>
56     * After creating, the instance of this synchronizer must be added as listener
57     * to both, the {@link StyledLayerSelectionModel} and the chart's
58     * {@link DatasetSelectionModel} (e.g. the renderer).
59     * @see DatasetSelectionModelProvider
60     * @author <a href="mailto:[email protected]">Martin Schmitz</a>
61     */
62     public class ChartSelectionSynchronizer extends StyledLayerSelectionModelSynchronizer<StyledFeatureLayerSelectionModel>
63     implements DatasetSelectionListener {
64    
65     /** Holds the chart datset to keep synchronized with the layer selection model. */
66     protected FeatureDatasetSelectionModel<?> datasetSelModel = null;
67    
68     /**
69     * Creates a new synchronizer.
70     * @param layerSelModel
71     * layer selection model to keep synchronized with the dataset
72     * selection model
73     * @param datasetSelModel
74     * dataset selection model to keep synchronized with the layer
75     * selection model
76     */
77     public ChartSelectionSynchronizer(StyledFeatureLayerSelectionModel layerSelModel, FeatureDatasetSelectionModel<?> datasetSelModel) {
78     super(layerSelModel);
79     this.datasetSelModel = datasetSelModel;
80     }
81    
82     /**
83     * Called by {@link StyledLayerSelectionModel} when the selection on other
84     * selection components (map, table, ...) has changed. When calling this
85     * method changes the dataset selection according to the
86     * {@link StyledLayerSelectionModel} selection.
87     * @param evt an event
88     */
89     @Override
90     public void propertyChange(PropertyChangeEvent evt) {
91     if (!(evt instanceof StyledLayerSelectionEvent))
92     return;
93     StyledLayerSelectionEvent selEvt = (StyledLayerSelectionEvent) evt;
94     // Only react on own layer and ignore events invoked by
95     // this component itself
96     if (selEvt.getEmitter() != layerSelModel || selectionChangeCausedByMe)
97     return;
98     // Apply new selection on chart (except this event is one of
99     // some more events)
100     Vector<String> newSelection = layerSelModel.getSelection();
101     if (newSelection == null)
102     return;
103    
104     // Avoid event circles in valueChanged(..)
105     selectionChangeCausedByMe = true;
106    
107     datasetSelModel.setValueIsAdjusting(true);
108     datasetSelModel.clearSelection();
109     for (String fID : newSelection)
110     datasetSelModel.setItemSelected(fID, true);
111     datasetSelModel.setValueIsAdjusting(false); // event is fired autmatically!
112    
113     // Danger of event circles in valueChanged(..) banned
114     selectionChangeCausedByMe = false;
115     }
116    
117     /**
118     * Called when the chart selection is changed by the user. When calling this
119     * method changes the selection of the {@link StyledLayerSelectionModel}.
120     * @param evt an event
121     */
122     @Override
123     public void selectionChanged(DatasetSelectionChangeEvent evt) {
124     // ignore event if it is part of multiple events
125     if (evt != null && evt.getSource().getValueIsAdjusting())
126     return;
127     // ignore event if it is caused by the ChartSelectionSynchronizer
128     if (selectionChangeCausedByMe)
129     return;
130    
131     // Avoid event circles in propertyChange(..)
132     selectionChangeCausedByMe = true;
133    
134     // reset the selection of the DpLayerSelectionModel
135     layerSelModel.setValueIsAdjusting(true);
136     layerSelModel.clearSelection();
137     for (String featureID : datasetSelModel.getSelectedFeatures())
138     layerSelModel.addSelection(featureID);
139     layerSelModel.setValueIsAdjusting(false);
140    
141     // Danger of event circles in propertyChange(..) banned
142     selectionChangeCausedByMe = false;
143     }
144    
145    
146     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26