Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / extension / ShowLayerAsForm.java @ 43020

History | View | Annotate | Download (10.4 KB)

1
package org.gvsig.app.extension;
2

    
3
import java.awt.Dimension;
4
import java.awt.Image;
5
import java.awt.event.ActionEvent;
6
import javax.swing.AbstractAction;
7
import static javax.swing.Action.ACTION_COMMAND_KEY;
8
import static javax.swing.Action.NAME;
9
import static javax.swing.Action.SHORT_DESCRIPTION;
10
import static javax.swing.Action.SMALL_ICON;
11
import javax.swing.JOptionPane;
12
import org.cresques.cts.IProjection;
13
import org.gvsig.andami.IconThemeHelper;
14
import org.gvsig.andami.plugins.Extension;
15
import org.gvsig.app.ApplicationLocator;
16
import org.gvsig.app.ApplicationManager;
17
import org.gvsig.app.project.documents.view.ViewDocument;
18
import org.gvsig.app.project.documents.view.ViewManager;
19
import org.gvsig.app.project.documents.view.gui.IView;
20
import org.gvsig.featureform.swing.CreateJFeatureFormException;
21
import org.gvsig.featureform.swing.JFeaturesForm;
22
import org.gvsig.fmap.dal.exception.DataException;
23
import org.gvsig.fmap.dal.feature.Feature;
24
import org.gvsig.fmap.dal.feature.FeatureQuery;
25
import org.gvsig.fmap.dal.feature.FeatureStore;
26
import org.gvsig.fmap.dal.feature.FeatureType;
27
import org.gvsig.fmap.dal.swing.DALSwingLocator;
28
import org.gvsig.fmap.dal.swing.DataSwingManager;
29
import org.gvsig.fmap.geom.Geometry;
30
import org.gvsig.fmap.geom.GeometryLocator;
31
import org.gvsig.fmap.geom.GeometryManager;
32
import org.gvsig.fmap.geom.primitive.Circle;
33
import org.gvsig.fmap.geom.primitive.Point;
34
import org.gvsig.fmap.mapcontext.layers.FLayer;
35
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
36
import org.gvsig.fmap.mapcontext.layers.vectorial.IntersectsGeometryEvaluator;
37
import org.gvsig.fmap.mapcontext.layers.vectorial.SpatialEvaluatorsFactory;
38
import org.gvsig.fmap.mapcontrol.MapControl;
39
import org.gvsig.fmap.mapcontrol.tools.Behavior.PointBehavior;
40
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
41
import org.gvsig.fmap.mapcontrol.tools.Events.PointEvent;
42
import org.gvsig.fmap.mapcontrol.tools.Listeners.PointListener;
43
import org.gvsig.tools.ToolsLocator;
44
import org.gvsig.tools.evaluator.Evaluator;
45
import org.gvsig.tools.i18n.I18nManager;
46
import org.gvsig.tools.service.ServiceException;
47
import org.gvsig.tools.swing.api.ToolsSwingLocator;
48
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
49
import org.gvsig.tools.swing.icontheme.IconTheme;
50
import org.slf4j.Logger;
51
import org.slf4j.LoggerFactory;
52

    
53
public class ShowLayerAsForm extends Extension {
54

    
55
    private static final Logger logger = LoggerFactory.getLogger(ShowLayerAsForm.class);
56

    
57
    @Override
58
    public void initialize() {
59
        IconThemeHelper.registerIcon("action", "layer-selectforediting", this);
60
    }
61

    
62
    @Override
63
    public void execute(String actionCommand) {
64
        ApplicationManager application = ApplicationLocator.getManager();
65
        if ("layer-show-form".equalsIgnoreCase(actionCommand)) {
66
            ViewDocument doc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
67
            if (doc == null) {
68
                return;
69
            }
70
            FLayer[] layers = doc.getMapContext().getLayers().getActives();
71
            for (int i = 0; i < layers.length; i++) {
72
                FLayer layer = layers[i];
73
                if (layer.isAvailable() && layer instanceof FLyrVect) {
74
                    try {
75
                        FLyrVect vectLayer = (FLyrVect) layer;
76
                        JFeaturesForm form = this.createform(vectLayer.getFeatureStore());
77
                        form.addAction(new ZoomToCurrentAction(doc, form));
78
                        form.addAction(new SelectFeatureInTheViewAction(doc, form, layer));
79
                        form.showForm(WindowManager.MODE.WINDOW);
80
                    } catch (Exception ex) {
81
                        String msg = "Can't show form for layer '" + layer.getName() + "'.";
82
                        logger.warn(msg, ex);
83
                        application.messageDialog(msg + "\n\n(See the error log for more information)", "Warning", JOptionPane.WARNING_MESSAGE);
84
                    }
85
                }
86
            }
87
        }
88
    }
89

    
90
    private static class SelectFeatureInTheViewAction extends AbstractAction implements PointListener {
91

    
92
        private final JFeaturesForm form;
93
        private final ViewDocument doc;
94
        private MapControl mapControl = null;
95
        private String previousTool = null;
96
        private final FLyrVect layer;
97

    
98
        public SelectFeatureInTheViewAction(ViewDocument doc, JFeaturesForm form, FLayer layer) {
99
            I18nManager i18nManager = ToolsLocator.getI18nManager();
100
            IconTheme iconTheme = ToolsSwingLocator.getIconThemeManager().getDefault();
101

    
102
            this.doc = doc;
103
            this.form = form;
104
            this.putValue(NAME, null);
105
            this.putValue(SHORT_DESCRIPTION, i18nManager.getTranslation("_Select_feature_in_the_View"));
106
            this.putValue(SMALL_ICON, iconTheme.get("layer-selectforediting"));
107
            this.putValue(ACTION_COMMAND_KEY, "selectInTheView");
108
            if( layer instanceof FLyrVect ) {
109
                this.layer = (FLyrVect) layer;
110
                this.setEnabled(true);
111
            } else {
112
                this.layer = null;
113
                this.setEnabled(false);
114
            }
115
        }
116

    
117
        @Override
118
        public void actionPerformed(ActionEvent ae) {
119
            ApplicationManager application = ApplicationLocator.getManager();
120
            if( this.layer == null ) {
121
                return;
122
            }
123
            if (this.mapControl == null) {
124
                IView view = (IView) application.getActiveComponent(ViewDocument.class);
125
                if (view != null) {
126
                    MapControl mapControl = view.getMapControl();
127
                    this.previousTool = mapControl.getCurrentTool();
128
                    mapControl.addBehavior("layer-selectforediting", new PointBehavior(this));
129
                    mapControl.setTool("layer-selectforediting");
130
                    this.mapControl = mapControl;
131
                    mapControl.requestFocus();
132
                }
133
            } else {
134
                this.mapControl.setTool(this.previousTool);
135
                this.mapControl = null;
136
                this.previousTool = null;
137
            }
138
        }
139

    
140
        @Override
141
        public void point(PointEvent event) throws BehaviorException {
142
            ApplicationManager application = ApplicationLocator.getManager();
143
            try {
144
                Point point = event.getMapPoint();
145
                double tolerance = mapControl.getViewPort().toMapDistance(7);
146
                GeometryManager manager = GeometryLocator.getGeometryManager();
147
                Circle circle = (Circle) manager.create(
148
                        Geometry.TYPES.CIRCLE,
149
                        Geometry.SUBTYPES.GEOM2D
150
                );
151
                circle.setPoints(point, tolerance);
152

    
153
                FeatureStore featureStore = this.form.getFeatureStore();
154
                FeatureType featureType = featureStore.getDefaultFeatureType();
155
                FeatureQuery featureQuery = featureStore.createFeatureQuery();
156
                featureQuery.setFeatureType(featureType);
157

    
158
                Geometry query_geo = this.layer.transformToSourceCRS(circle, true);
159
                IProjection query_proj = this.mapControl.getMapContext().getProjection();
160
                if (this.layer.getCoordTrans() != null) {
161
                    query_proj = this.layer.getCoordTrans().getPOrig();
162
                }
163

    
164
                Evaluator iee = SpatialEvaluatorsFactory.getInstance().intersects(
165
                                query_geo,
166
                                query_proj,
167
                                featureStore
168
                );
169
                featureQuery.setFilter(iee);
170
                featureQuery.setAttributeNames(null);
171

    
172
                this.form.setQuery(featureQuery);
173

    
174
                this.mapControl.setTool(this.previousTool);
175
                this.mapControl = null;
176
                this.previousTool = null;
177
            } catch (Exception e) {
178
                application.message("Can't filter form.", JOptionPane.WARNING_MESSAGE);
179
                throw new RuntimeException("Can't create filter", e);
180
            }
181
        }
182

    
183
        @Override
184
        public void pointDoubleClick(PointEvent event) throws BehaviorException {
185
            this.point(event);
186
        }
187

    
188
        @Override
189
        public Image getImageCursor() {
190
            return IconThemeHelper.getImage("cursor-info-by-point");
191
        }
192

    
193
        @Override
194
        public boolean cancelDrawing() {
195
            return false;
196
        }
197

    
198
    }
199

    
200
    private static class ZoomToCurrentAction extends AbstractAction {
201

    
202
        private final JFeaturesForm form;
203
        private final ViewDocument doc;
204

    
205
        public ZoomToCurrentAction(ViewDocument doc, JFeaturesForm form) {
206
            I18nManager i18nManager = ToolsLocator.getI18nManager();
207
            IconTheme iconTheme = ToolsSwingLocator.getIconThemeManager().getDefault();
208

    
209
            this.doc = doc;
210
            this.form = form;
211
            this.putValue(NAME, null);
212
            this.putValue(SHORT_DESCRIPTION, i18nManager.getTranslation("_Zoom"));
213
            this.putValue(SMALL_ICON, iconTheme.get("view-navigation-zoom-to-selection"));
214
            this.putValue(ACTION_COMMAND_KEY, "zoomToCurrent");
215

    
216
            this.setEnabled(doc != null);
217
        }
218

    
219
        @Override
220
        public void actionPerformed(ActionEvent ae) {
221
            long index = this.form.getCurrentIndex();
222
            if (index < 0) {
223
                return;
224
            }
225
            Feature f = this.form.get(index);
226
            if (f == null) {
227
                return;
228
            }
229
            Geometry g = f.getDefaultGeometry();
230
            if (g != null) {
231
                doc.getMapContext().getViewPort().setEnvelope(g.getEnvelope());
232
            }
233
        }
234

    
235
    }
236

    
237
    private JFeaturesForm createform(FeatureStore featureStore) throws CreateJFeatureFormException, ServiceException, DataException {
238
        final DataSwingManager swingManager = DALSwingLocator.getSwingManager();
239
        final JFeaturesForm form = swingManager.createJFeaturesForm(featureStore);
240
        form.setPreferredSize(new Dimension(400, 300));
241
        return form;
242
    }
243

    
244
    @Override
245
    public boolean isEnabled() {
246
        return true;
247
    }
248

    
249
    @Override
250
    public boolean isVisible() {
251
        ApplicationManager application = ApplicationLocator.getManager();
252
        ViewDocument doc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
253
        if (doc == null) {
254
            return false;
255
        }
256
        return doc.getMapContext().hasActiveVectorLayers();
257
    }
258
}