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 @ 1209

History | View | Annotate | Download (18.4 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.event.ActionEvent;
27
import java.awt.event.ComponentAdapter;
28
import java.awt.event.ComponentEvent;
29
import java.awt.event.InputEvent;
30
import java.awt.event.MouseEvent;
31
import java.util.List;
32
import java.util.function.Predicate;
33
import javax.swing.Action;
34

    
35
import javax.swing.JOptionPane;
36
import javax.swing.SwingUtilities;
37
import org.apache.commons.lang3.StringUtils;
38

    
39
import org.cresques.cts.IProjection;
40
import org.gvsig.expressionevaluator.Expression;
41
import org.gvsig.expressionevaluator.GeometryExpressionBuilder;
42
import org.gvsig.expressionevaluator.GeometryExpressionUtils;
43
import org.slf4j.Logger;
44
import org.slf4j.LoggerFactory;
45

    
46
import org.gvsig.featureform.swing.CreateJFeatureFormException;
47
import org.gvsig.featureform.swing.JFeaturesForm;
48
import org.gvsig.fmap.dal.DataStoreProviderFactory;
49
import org.gvsig.fmap.dal.exception.DataException;
50
import org.gvsig.fmap.dal.feature.FacadeOfAFeature;
51
import org.gvsig.fmap.dal.feature.Feature;
52
import org.gvsig.fmap.dal.feature.FeatureQuery;
53
import org.gvsig.fmap.dal.feature.FeatureSelection;
54
import org.gvsig.fmap.dal.feature.FeatureSet;
55
import org.gvsig.fmap.dal.feature.FeatureStore;
56
import org.gvsig.fmap.dal.feature.FeatureStoreNotification;
57
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
58
import org.gvsig.fmap.dal.feature.FeatureType;
59
import org.gvsig.fmap.dal.swing.DALSwingLocator;
60
import org.gvsig.fmap.dal.swing.DataSwingManager;
61
import org.gvsig.fmap.geom.Geometry;
62
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
63
import org.gvsig.fmap.geom.Geometry.TYPES;
64
import org.gvsig.fmap.geom.GeometryLocator;
65
import org.gvsig.fmap.geom.GeometryManager;
66
import org.gvsig.fmap.geom.exception.CreateGeometryException;
67
import org.gvsig.fmap.geom.primitive.Circle;
68
import org.gvsig.fmap.geom.primitive.Point;
69
import org.gvsig.fmap.mapcontext.ViewPort;
70
import org.gvsig.fmap.mapcontext.layers.FLayer;
71
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
72
import org.gvsig.fmap.mapcontext.layers.vectorial.SpatialEvaluatorsFactory;
73
import org.gvsig.fmap.mapcontrol.MapControl;
74
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
75
import org.gvsig.fmap.mapcontrol.tools.Events.EnvelopeEvent;
76
import org.gvsig.fmap.mapcontrol.tools.Events.PointEvent;
77
import org.gvsig.tools.ToolsLocator;
78
import org.gvsig.tools.dispose.DisposeUtils;
79
import org.gvsig.tools.evaluator.Evaluator;
80
import org.gvsig.tools.i18n.I18nManager;
81
import org.gvsig.tools.observer.Observable;
82
import org.gvsig.tools.observer.Observer;
83
import org.gvsig.tools.service.ServiceException;
84
import org.gvsig.tools.swing.api.ToolsSwingLocator;
85
import org.gvsig.tools.swing.api.windowmanager.WindowManager.MODE;
86

    
87
/**
88
 * @author gvSIG Team
89
 *
90
 */
91
@SuppressWarnings("UseSpecificCatch")
92
public class AttributeEditorPointListener 
93
        extends AbstractToolListener  
94
        implements RectangleListener
95
    {
96

    
97
    private static Logger LOGGER = LoggerFactory.getLogger(AttributeEditorPointListener.class);
98

    
99
    public static final String ATTRIBUTE_EDITOR_TOOL_NAME = "attributeEditorTool";
100
    private static final String ATTRIBUTE_EDITOR_FORM_NAME = "attributeEditorForm";
101
    
102
    private final MapControl mapControl;
103
    private JFeaturesForm form;
104
    private Predicate<FeatureStore> refreshCallback;
105
    private Observer refreshFormObserver;
106

    
107
    public AttributeEditorPointListener(MapControl mapControl, JFeaturesForm form) {
108
        super();
109
        this.mapControl = mapControl;
110
        this.form = form;
111
        this.refreshFormObserver = (Observable o, Object o1) -> {
112
            doRefreshFormObserver(o, o1);
113
        };
114
    }
115

    
116
    public AttributeEditorPointListener(MapControl mapControl) {
117
        super();
118
        this.mapControl = mapControl;
119
        this.refreshFormObserver = (Observable o, Object o1) -> {
120
            doRefreshFormObserver(o, o1);
121
        };
122
        
123
    }
124

    
125
    private FLyrVect getLayer() {
126
        FLayer[] layers = mapControl.getMapContext().getLayers().getActives();
127
        if (layers == null || layers.length != 1) {
128
            return null;
129
        }
130
        return (FLyrVect) layers[0];
131

    
132
    }
133

    
134
//    @Override
135
//    public void point(PointEvent e) throws BehaviorException {
136
//        MouseEvent mouseEvent = e.getEvent();
137
//        if (((mouseEvent.getModifiersEx() & (InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK
138
//            | InputEvent.ALT_DOWN_MASK | InputEvent.ALT_GRAPH_DOWN_MASK | InputEvent.META_DOWN_MASK)) != 0)
139
//            || !SwingUtilities.isLeftMouseButton(mouseEvent)) {
140
//            return;
141
//        }
142
//        String layerName = "";
143
//        I18nManager i18nManager = ToolsLocator.getI18nManager();
144
//        try {
145
//            FLyrVect layer = getLayer();
146
//            if (layer == null) {
147
//                String msg = i18nManager.getTranslation("There_is_no_one_and_only_one_active_layer");
148
//                ToolsSwingLocator.getThreadSafeDialogsManager().messageDialog(msg,
149
//                    i18nManager.getTranslation("attribute_editor"), JOptionPane.INFORMATION_MESSAGE);
150
//                return;
151
//            }
152
//            layerName = layer.getName();
153
//            ViewPort vp = this.mapControl.getViewPort();
154
//            Point point = vp.convertToMapPoint(e.getPoint());
155
//            double tolerance = vp.toMapDistance(layer.getDefaultTolerance());
156
//            FeatureQuery query = queryByPoint(point, tolerance);
157
//            showOrUpdateForm(layer, query);
158
//        } catch (Exception ex) {
159
//            LOGGER.warn("Can't show attribute information from point on the layer " + layerName, ex);
160
//            String msg =
161
//                i18nManager.getTranslation("Cant_show_attribute_information_for_layer_%1_on_point",
162
//                    new String[] { layerName });
163
//            ToolsSwingLocator.getThreadSafeDialogsManager().messageDialog(msg,
164
//                i18nManager.getTranslation("attribute_editor"), JOptionPane.WARNING_MESSAGE);
165
//        }
166
//    }
167
    
168
    public void showOrUpdateForm() {
169
        String layerName = "";
170
        I18nManager i18nManager = ToolsLocator.getI18nManager();
171
        try {
172
            FLyrVect layer = getLayer();
173
            if (layer == null) {
174
                return;
175
            }
176
            layerName = layer.getName();
177
            FeatureQuery query;
178
            FeatureStore store = layer.getFeatureStore();
179
            if(store.isFeatureSelectionEmpty()){
180
                return;
181
            }
182
            FeatureSelection selection = store.getFeatureSelectionQuietly();
183
            Expression filter = selection.makeFilter(100);
184
            
185
            if(filter == null){
186
                String msg =
187
                    i18nManager.getTranslation("_Unable_to_get_filter_for_XlayernameX_layer_selection",
188
                        new String[] { layerName });
189
                ToolsSwingLocator.getThreadSafeDialogsManager().message(msg, JOptionPane.WARNING_MESSAGE);
190
                return;
191
            }
192
            if(selection.size()>100){
193
                String msg =
194
                    i18nManager.getTranslation("_Too_many_items_selected_Only_the_first_100_will_be_displayed",
195
                        new String[] { layerName });
196
                ToolsSwingLocator.getThreadSafeDialogsManager().message(msg, JOptionPane.WARNING_MESSAGE);
197

    
198
            }
199
            query = store.createFeatureQuery(filter);
200
            
201
            showOrUpdateForm(layer, query);
202
        } catch (Exception ex) {
203
            LOGGER.warn("Can't show attribute information from selection on the layer " + layerName, ex);
204
            String msg =
205
                i18nManager.getTranslation("_Cant_show_attribute_information_for_layer_XlayernameX_on_selection",
206
                    new String[] { layerName });
207
            ToolsSwingLocator.getThreadSafeDialogsManager().messageDialog(msg,
208
                i18nManager.getTranslation("attribute_editor"), JOptionPane.WARNING_MESSAGE);
209
        }
210
        
211
    }
212
    
213
    private void showOrUpdateForm(FLyrVect layer, FeatureQuery query) {
214
        if( layer == null || query==null ) {
215
            return;
216
        }
217
        String layerName = layer.getName();
218
        if( layerName == null ) {
219
            layerName = "";
220
        }
221
        showOrUpdateForm(layerName, layer.getFeatureStore(), query);
222
    }
223
    
224
    public void showOrUpdateForm(String storeName, FeatureStore featureStore, FeatureQuery query) {
225
        if( featureStore == null || query==null ) {
226
            return;
227
        }
228
        I18nManager i18n = ToolsLocator.getI18nManager();
229
        try {
230
            synchronized (featureStore) {
231

    
232
            if( StringUtils.isBlank(storeName) ) {
233
                storeName = featureStore.getLabel();
234
            }
235
            if (this.form == null) {
236
                this.form = getForm(featureStore, query);
237
//                this.form.showForm(makeTitle("attribute_editor", storeName, featureStore.getName()), MODE.TOOL);
238
            } else if( this.form.getFeatureStore()!=featureStore ) {
239
//                Dimension size = this.form.asJComponent().getPreferredSize();
240
                disposeForm();
241
                this.form = getForm(featureStore, query);
242
//                this.form.asJComponent().setPreferredSize(size);
243
//                this.form.showForm(makeTitle("attribute_editor", storeName, featureStore.getName()), MODE.TOOL);
244
            } else {
245
                this.form.setQuery(query);
246
            }
247
            List<Feature> values = this.form.getFormset().getValues();
248
            FeatureSelection selection = (FeatureSelection) featureStore.getSelection();
249
            selection.deselectAll();
250
            FeatureSelection selectionTmp = featureStore.createFeatureSelection();
251
            for (Feature fof : values) {
252
               selectionTmp.select(fof);
253
            }
254
            selection.select(selectionTmp);
255
//            try {
256
//                synchronized (featureStore) {
257
//                    FeatureSet featSet = featureStore.getFeatureSet(query);
258
//                    if( featSet.isEmpty() ) {
259
//                        return;
260
//                    }
261
//                    FeatureSelection selection = (FeatureSelection) featureStore.getSelection();
262
//                    selection.deselectAll();
263
//                    selection.select(featSet);
264
//                }
265
//            } catch (DataException ex) {
266
//                LOGGER.warn("Can't query layer " + storeName+", query: "+query, ex);
267
//                return;
268
//            }
269

    
270
            this.form.showForm(makeTitle("attribute_editor", storeName, featureStore.getName()), MODE.TOOL);
271
            }
272
        } catch (Exception ex) {
273
            LOGGER.warn("Can't show attribute information from point on the layer " + storeName, ex);
274
            String msg =
275
                i18n.getTranslation("Cant_show_attribute_information_for_layer_%1_on_point",
276
                    new String[] { storeName });
277
            ToolsSwingLocator.getThreadSafeDialogsManager().messageDialog(msg,
278
                i18n.getTranslation("attribute_editor"), JOptionPane.WARNING_MESSAGE);
279
            disposeForm();
280
        }
281
    }
282
    
283
    private void disposeForm() {
284
        if( this.form != null ) {
285
            FeatureStore store = this.form.getFeatureStore();
286
            if( store!=null ) {
287
                store.deleteObserver(this.refreshFormObserver);
288
            }
289
        }
290
        DisposeUtils.disposeQuietly(this.form);
291
        this.form = null;
292
    }
293
    
294
    public void setRefreshCallback(Predicate<FeatureStore> refreshCallback) {
295
        this.refreshCallback = refreshCallback;
296
    }
297

    
298
    private JFeaturesForm getForm(FeatureStore store, FeatureQuery query) throws CreateJFeatureFormException, ServiceException, DataException {
299
        if (this.form == null) {
300
            DataSwingManager swingManager = DALSwingLocator.getSwingManager();
301
            JFeaturesForm theForm = swingManager.createJFeaturesForm(store, query);
302
            this.form = theForm;
303
            this.form.setTerminateEditingOnClose(false);
304
            this.form.asJComponent().setName(ATTRIBUTE_EDITOR_FORM_NAME);
305
            this.form.asJComponent().addComponentListener(new ComponentAdapter() {
306
                @Override
307
                public void componentHidden(ComponentEvent e) {
308
                    DisposeUtils.disposeQuietly(theForm);
309
                }
310
            });
311
            this.form.addActionListener((ActionEvent e) -> {
312
                switch (e.getActionCommand()) {
313
                    case "formAfterSave":
314
                    case "formAfterDelete":
315
                        if( this.refreshCallback!=null ) {
316
                            this.refreshCallback.test(store);
317
                        }
318
                        break;
319
                }
320
            });
321
            store.addObserver(this.refreshFormObserver);
322
        }
323
        return this.form;
324
    }
325
    
326
    private void doRefreshFormObserver(Observable o, Object o1) {
327
        if( this.form == null || 
328
                !(o instanceof FeatureStore && o1 instanceof FeatureStoreNotification ) ) {
329
            return;
330
        }
331
        try {
332
            FeatureStoreNotification n = (FeatureStoreNotification) o1;
333
            if( n.getType().equalsIgnoreCase(FeatureStoreNotification.AFTER_REFRESH) ) {
334
                Action refreshAction = this.form.getFormset().getAction(JFeaturesForm.REFRESHFORM_ACTION);
335
                if( refreshAction!=null ) {
336
                    refreshAction.actionPerformed(null);
337
                }
338
            }
339
        } catch(Exception ex) {
340
            LOGGER.warn("Can't refresh attribute editor",ex);
341
        }
342
    }
343

    
344
    private FeatureQuery queryByPoint(Point point, double tol) throws CreateGeometryException, DataException {
345
        GeometryManager manager = GeometryLocator.getGeometryManager();
346
        Circle circle = (Circle) manager.create(TYPES.CIRCLE, SUBTYPES.GEOM2D);
347
        circle.setPoints(point, tol);
348
        
349
        FLyrVect currentLayer = this.getLayer();
350
        if( currentLayer==null ) {
351
            return null;
352
        }
353
        FeatureStore featureStore = currentLayer.getFeatureStore();
354
        FeatureQuery featureQuery = featureStore.createFeatureQuery();
355
        FeatureType featureType = featureStore.getDefaultFeatureType();
356
        featureQuery.setFeatureType(featureType);
357

    
358
        Geometry query_geo = currentLayer.transformToSourceCRS(circle, true);
359

    
360
        IProjection query_proj = currentLayer.getMapContext().getProjection();
361
        if (currentLayer.getCoordTrans() != null) {
362
            query_proj = currentLayer.getCoordTrans().getPOrig();
363
        }
364

    
365
        Evaluator iee = SpatialEvaluatorsFactory.getInstance().intersects(
366
                query_geo, 
367
                query_proj, 
368
                featureStore
369
        );
370
        featureQuery.setFilter(iee);
371
        featureQuery.retrievesAllAttributes();
372
        return featureQuery;
373
    }
374

    
375
    @Override
376
    public void rectangle(EnvelopeEvent e) throws BehaviorException {
377
        MouseEvent mouseEvent = e.getEvent();
378
        if (((mouseEvent.getModifiersEx() & (InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK
379
            | InputEvent.ALT_DOWN_MASK | InputEvent.ALT_GRAPH_DOWN_MASK | InputEvent.META_DOWN_MASK)) != 0)
380
            || !SwingUtilities.isLeftMouseButton(mouseEvent)) {
381
            return;
382
        }
383
        String layerName = "";
384
        I18nManager i18nManager = ToolsLocator.getI18nManager();
385
        try {
386
            FLyrVect layer = getLayer();
387
            if (layer == null) {
388
                String msg = i18nManager.getTranslation("There_is_no_one_and_only_one_active_layer");
389
                ToolsSwingLocator.getThreadSafeDialogsManager().messageDialog(msg,
390
                    i18nManager.getTranslation("attribute_editor"), JOptionPane.INFORMATION_MESSAGE);
391
                return;
392
            }
393
            layerName = layer.getName();
394
            FeatureQuery query;
395
            Geometry geom = e.getWorldCoordRect().getGeometry();            
396
            if( geom instanceof Point ) {
397
                ViewPort vp = this.mapControl.getViewPort();
398
                double tolerance = vp.toMapDistance(layer.getDefaultTolerance());
399
                query = queryByPoint((Point) geom, tolerance);
400
            } else {
401
                FeatureStore store = layer.getFeatureStore();
402
                FeatureType featureType = store.getDefaultFeatureTypeQuietly();
403
                GeometryExpressionBuilder builder = GeometryExpressionUtils.createExpressionBuilder();
404
                String filter = builder.ST_Intersects(
405
                        builder.column(featureType.getDefaultGeometryAttributeName()), 
406
                        builder.geometry(e.getWorldCoordRect().getGeometry())
407
                ).toString();
408
                query = store.createFeatureQuery(filter);
409
            }
410
            showOrUpdateForm(layer, query);
411
        } catch (Exception ex) {
412
            LOGGER.warn("Can't show attribute information from point on the layer " + layerName, ex);
413
            String msg =
414
                i18nManager.getTranslation("Cant_show_attribute_information_for_layer_%1_on_point",
415
                    new String[] { layerName });
416
            ToolsSwingLocator.getThreadSafeDialogsManager().messageDialog(msg,
417
                i18nManager.getTranslation("attribute_editor"), JOptionPane.WARNING_MESSAGE);
418
        }
419
    }
420

    
421
    public String makeTitle(String base, String docname, String docname2) {
422
        I18nManager i18n = ToolsLocator.getI18nManager();
423
//        if( StringUtils.startsWith(base, "_") ) {
424
            base = i18n.getTranslation(base);
425
//        }
426
        String title = base + ": " + docname;
427
        if( StringUtils.isNotBlank(docname2) && !StringUtils.equals(docname, docname2)) {
428
            title = title + " ("+docname2+")";
429
        }
430
        return title;
431
    }
432
}