Statistics
| Revision:

gvsig-attributeeditor / org.gvsig.attributeeditor / trunk / org.gvsig.attributeeditor / org.gvsig.attributeeditor.mapcontrol / src / main / java / org / gvsig / fmap / mapcontrol / tools / Listeners / AttributeEditorPointListener.java @ 741

History | View | Annotate | Download (9.54 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2014 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23

    
24
package org.gvsig.fmap.mapcontrol.tools.Listeners;
25

    
26
import java.awt.Dimension;
27
import java.awt.event.ActionEvent;
28
import java.awt.event.ComponentAdapter;
29
import java.awt.event.ComponentEvent;
30
import java.awt.event.ComponentListener;
31
import java.awt.event.InputEvent;
32
import java.awt.event.MouseEvent;
33
import java.util.function.Predicate;
34

    
35
import javax.swing.JOptionPane;
36
import javax.swing.SwingUtilities;
37

    
38
import org.cresques.cts.IProjection;
39
import org.slf4j.Logger;
40
import org.slf4j.LoggerFactory;
41

    
42
import org.gvsig.featureform.swing.CreateJFeatureFormException;
43
import org.gvsig.featureform.swing.JFeaturesForm;
44
import org.gvsig.fmap.dal.exception.DataException;
45
import org.gvsig.fmap.dal.feature.FeatureQuery;
46
import org.gvsig.fmap.dal.feature.FeatureSelection;
47
import org.gvsig.fmap.dal.feature.FeatureSet;
48
import org.gvsig.fmap.dal.feature.FeatureStore;
49
import org.gvsig.fmap.dal.feature.FeatureType;
50
import org.gvsig.fmap.dal.swing.DALSwingLocator;
51
import org.gvsig.fmap.dal.swing.DataSwingManager;
52
import org.gvsig.fmap.geom.Geometry;
53
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
54
import org.gvsig.fmap.geom.Geometry.TYPES;
55
import org.gvsig.fmap.geom.GeometryLocator;
56
import org.gvsig.fmap.geom.GeometryManager;
57
import org.gvsig.fmap.geom.exception.CreateGeometryException;
58
import org.gvsig.fmap.geom.primitive.Circle;
59
import org.gvsig.fmap.geom.primitive.Point;
60
import org.gvsig.fmap.mapcontext.ViewPort;
61
import org.gvsig.fmap.mapcontext.layers.FLayer;
62
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
63
import org.gvsig.fmap.mapcontext.layers.vectorial.SpatialEvaluatorsFactory;
64
import org.gvsig.fmap.mapcontrol.MapControl;
65
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
66
import org.gvsig.fmap.mapcontrol.tools.Events.PointEvent;
67
import org.gvsig.tools.ToolsLocator;
68
import org.gvsig.tools.evaluator.Evaluator;
69
import org.gvsig.tools.i18n.I18nManager;
70
import org.gvsig.tools.service.ServiceException;
71
import org.gvsig.tools.swing.api.ToolsSwingLocator;
72
import org.gvsig.tools.swing.api.windowmanager.WindowManager.MODE;
73

    
74
/**
75
 * @author gvSIG Team
76
 *
77
 */
78
@SuppressWarnings("UseSpecificCatch")
79
public class AttributeEditorPointListener extends AbstractPointListener  {
80

    
81
    private static Logger logger = LoggerFactory.getLogger(AttributeEditorPointListener.class);
82

    
83
    public static final String ATTRIBUTE_EDITOR_TOOL_NAME = "attributeEditorTool";
84
    private static final String ATTRIBUTE_EDITOR_FORM_NAME = "attributeEditorForm";
85
    
86
    private final MapControl mapControl;
87
    private JFeaturesForm form;
88
    private FLyrVect currentLayer = null;
89
    private Predicate<FeatureStore> refreshCallback;
90

    
91
    public AttributeEditorPointListener(MapControl mapControl, JFeaturesForm form) {
92
        super();
93
        this.mapControl = mapControl;
94
        this.form = form;
95
    }
96

    
97
    public AttributeEditorPointListener(MapControl mapControl) {
98
        super();
99
        this.mapControl = mapControl;
100
    }
101

    
102
    private FLyrVect getLayer() {
103
        FLayer[] layers = mapControl.getMapContext().getLayers().getActives();
104
        if (layers == null || layers.length != 1) {
105
            return null;
106
        }
107
        return (FLyrVect) layers[0];
108

    
109
    }
110

    
111
    @Override
112
    public void point(PointEvent e) throws BehaviorException {
113
        MouseEvent mouseEvent = e.getEvent();
114
        if (((mouseEvent.getModifiersEx() & (InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK
115
            | InputEvent.ALT_DOWN_MASK | InputEvent.ALT_GRAPH_DOWN_MASK | InputEvent.META_DOWN_MASK)) != 0)
116
            || !SwingUtilities.isLeftMouseButton(mouseEvent)) {
117
            return;
118
        }
119

    
120
        I18nManager i18nManager = ToolsLocator.getI18nManager();
121
        String layerName = "";
122
        try {
123
            FLyrVect layer = getLayer();
124
            if (layer == null) {
125
                String msg = i18nManager.getTranslation("There_is_no_one_and_only_one_active_layer");
126
                ToolsSwingLocator.getThreadSafeDialogsManager().messageDialog(msg,
127
                    i18nManager.getTranslation("attribute_editor"), JOptionPane.INFORMATION_MESSAGE);
128
                return;
129
            }
130
            FeatureStore featureStore;
131
            featureStore = layer.getFeatureStore();
132
            if (layer != this.currentLayer) {
133
                if (this.currentLayer != null) {
134
                    if (this.form != null) {
135
                        this.form.saveChanges();
136
                    }
137
                }
138
                this.currentLayer = layer;
139
                if (this.form != null) {
140
                    this.form.bind(featureStore);
141
                }
142
            }
143
            layerName = layer.getName();
144
            ViewPort vp = this.mapControl.getViewPort();
145
            Point point = vp.convertToMapPoint(e.getPoint());
146
            double tolerance = vp.toMapDistance(layer.getDefaultTolerance());
147
            FeatureQuery query;
148
            query = queryByPoint(point, tolerance);
149
            if (query != null) {
150
                if (this.form == null) {
151
                    this.form = getForm(query);
152
                    this.form.showForm(MODE.TOOL);
153
                } else {
154
                    this.form.setQuery(query);
155
                }
156
                try {
157
                    synchronized (featureStore) {
158
                        FeatureSet featSet = featureStore.getFeatureSet(query);
159
                        FeatureSelection selection = (FeatureSelection) featureStore.getSelection();
160
                        selection.deselectAll();
161
                        selection.select(featSet);
162
                    }
163
                } catch (DataException ex) {
164
                    throw new RuntimeException("Error getting a feature set with the query " + query);
165
                }
166
                this.form.setQuery(query);
167
            }
168
        } catch (Exception ex) {
169
            logger.warn("Can't show attribute information from point on the layer " + layerName, ex);
170
            String msg =
171
                i18nManager.getTranslation("Cant_show_attribute_information_for_layer_%1_on_point",
172
                    new String[] { layerName });
173
            ToolsSwingLocator.getThreadSafeDialogsManager().messageDialog(msg,
174
                i18nManager.getTranslation("attribute_editor"), JOptionPane.WARNING_MESSAGE);
175
        }
176
    }
177
    
178
    public void setRefreshCallback(Predicate<FeatureStore> refreshCallback) {
179
        this.refreshCallback = refreshCallback;
180
    }
181

    
182
    private JFeaturesForm getForm(FeatureQuery query) throws CreateJFeatureFormException, ServiceException, DataException {
183
        if (this.form == null) {
184
            DataSwingManager swingManager = DALSwingLocator.getSwingManager();
185
            FeatureStore store = this.currentLayer.getFeatureStore();
186
            this.form = swingManager.createJFeaturesForm(store, query);
187
//            this.form.asJComponent().setPreferredSize(new Dimension(300, 200));
188
            this.form.asJComponent().setName(ATTRIBUTE_EDITOR_FORM_NAME);
189
            this.form.asJComponent().addComponentListener(new ComponentAdapter() {
190
                @Override
191
                public void componentHidden(ComponentEvent e) {
192
                    form = null;
193
                }
194
            });
195
            this.form.addActionListener((ActionEvent e) -> {
196
                switch (e.getActionCommand()) {
197
                    case "formAfterSave":
198
                    case "formAfterDelete":
199
                        if( this.refreshCallback!=null ) {
200
                            this.refreshCallback.test(store);
201
                        }
202
                        break;
203
                }
204
            });
205
        }
206
        return this.form;
207
    }
208

    
209
    private FeatureQuery queryByPoint(Point point, double tol) throws CreateGeometryException, DataException {
210
        GeometryManager manager = GeometryLocator.getGeometryManager();
211
        Circle circle = (Circle) manager.create(TYPES.CIRCLE, SUBTYPES.GEOM2D);
212
        circle.setPoints(point, tol);
213

    
214
        FeatureStore featureStore = this.currentLayer.getFeatureStore();
215
        FeatureQuery featureQuery = featureStore.createFeatureQuery();
216
        FeatureType featureType = featureStore.getDefaultFeatureType();
217
        featureQuery.setFeatureType(featureType);
218

    
219
        Geometry query_geo = this.currentLayer.transformToSourceCRS(circle, true);
220

    
221
        IProjection query_proj = this.currentLayer.getMapContext().getProjection();
222
        if (this.currentLayer.getCoordTrans() != null) {
223
            query_proj = this.currentLayer.getCoordTrans().getPOrig();
224
        }
225

    
226
        Evaluator iee = SpatialEvaluatorsFactory.getInstance().intersects(
227
                query_geo, 
228
                query_proj, 
229
                featureStore
230
        );
231
        featureQuery.setFilter(iee);
232
        featureQuery.retrievesAllAttributes();
233
        return featureQuery;
234
    }
235
}