Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.lib / org.gvsig.vectorediting.lib.prov / org.gvsig.vectorediting.lib.prov.move / src / main / java / org / gvsig / vectorediting / lib / prov / move / MoveEditingProvider.java @ 2872

History | View | Annotate | Download (12.9 KB)

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

    
25
package org.gvsig.vectorediting.lib.prov.move;
26

    
27
import java.awt.geom.AffineTransform;
28
import java.util.ArrayList;
29
import java.util.HashMap;
30
import java.util.List;
31
import java.util.Map;
32
import org.gvsig.fmap.dal.exception.DataException;
33
import org.gvsig.fmap.dal.feature.EditableFeature;
34
import org.gvsig.fmap.dal.feature.Feature;
35
import org.gvsig.fmap.dal.feature.FeatureSelection;
36
import org.gvsig.fmap.dal.feature.FeatureStore;
37
import org.gvsig.fmap.geom.Geometry;
38
import org.gvsig.fmap.geom.GeometryLocator;
39
import org.gvsig.fmap.geom.GeometryManager;
40
import org.gvsig.fmap.geom.aggregate.Aggregate;
41
import org.gvsig.fmap.geom.aggregate.MultiCurve;
42
import org.gvsig.fmap.geom.aggregate.MultiPoint;
43
import org.gvsig.fmap.geom.aggregate.MultiSurface;
44
import org.gvsig.fmap.geom.exception.CreateGeometryException;
45
import org.gvsig.fmap.geom.operation.GeometryOperationException;
46
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
47
import org.gvsig.fmap.geom.primitive.Curve;
48
import org.gvsig.fmap.geom.primitive.Line;
49
import org.gvsig.fmap.geom.primitive.Point;
50
import org.gvsig.fmap.geom.primitive.Surface;
51
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
52
import org.gvsig.tools.ToolsLocator;
53
import org.gvsig.tools.dispose.DisposableIterator;
54
import org.gvsig.tools.dispose.DisposeUtils;
55
import org.gvsig.tools.dynobject.DynObject;
56
import org.gvsig.tools.exception.BaseException;
57
import org.gvsig.tools.service.spi.ProviderServices;
58
import org.gvsig.tools.visitor.VisitCanceledException;
59
import org.gvsig.tools.visitor.Visitor;
60
import org.gvsig.vectorediting.lib.api.DrawingStatus;
61
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
62
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
63
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
64
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
65
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
66
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
67
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
68
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
69
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
70
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
71
import org.gvsig.vectorediting.lib.spi.EditingProvider;
72
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
73
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
74
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
75
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
76

    
77
/**
78
 * @author llmarques
79
 *
80
 */
81
public class MoveEditingProvider extends AbstractEditingProvider implements
82
    EditingProvider {
83

    
84
    private final EditingServiceParameter selection;
85

    
86
    private final EditingServiceParameter firstPoint;
87

    
88
    private final EditingServiceParameter secondPoint;
89

    
90
    private final FeatureStore featureStore;
91

    
92
    private Map<EditingServiceParameter, Object> values;
93

    
94
    /**
95
     * Default constructor.
96
     *
97
     * @param providerServices
98
     *            available services for this provider
99
     * @param parameters
100
     *            of this provider
101
     */
102
    public MoveEditingProvider(ProviderServices providerServices,
103
        DynObject parameters) {
104
        super(providerServices);
105

    
106
        this.featureStore =
107
            (FeatureStore) parameters
108
                .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
109

    
110
        this.selection =
111
            new DefaultEditingServiceParameter("selection", "selection",
112
                TYPE.SELECTION);
113

    
114
        this.firstPoint =
115
            new DefaultEditingServiceParameter("first_point", "first_point",
116
                TYPE.POSITION);
117

    
118
        this.secondPoint =
119
            new DefaultEditingServiceParameter("second_point", "second_point",
120
                TYPE.POSITION);
121
    }
122

    
123
    @Override
124
    public EditingServiceParameter next() {
125
        if (values.get(selection) == null) {
126
            return selection;
127
        } else if (values.get(firstPoint) == null) {
128
            return firstPoint;
129
        } else if (values.get(secondPoint) == null) {
130
            return secondPoint;
131
        }
132
        return null;
133
    }
134

    
135
    @Override
136
    public DrawingStatus getDrawingStatus(Point mousePosition)
137
        throws DrawServiceException {
138
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
139
        EditingProviderManager editingProviderManager =
140
            EditingProviderLocator.getProviderManager();
141
        EditingProviderServices editingProviderServices =
142
            (EditingProviderServices) getProviderServices();
143
        int subtype;
144
        try {
145
            subtype = editingProviderServices.getSubType(featureStore);
146
        } catch (DataException e2) {
147
            throw new DrawServiceException(e2);
148
        }
149
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
150
        ISymbol auxiliarylineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
151
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
152
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
153
        
154
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
155

    
156
        if (values != null) {
157

    
158
            FeatureSelection featureSelection =
159
                (FeatureSelection) values.get(selection);
160
            ToolsLocator.getDisposableManager().bind(featureSelection);
161

    
162
            Point firstPointValue = (Point) values.get(firstPoint);
163

    
164
            if (featureSelection != null && firstPointValue != null) {
165
                drawingStatus.addStatus(firstPointValue, auxiliaryPointSymbolEditing, "");
166
                Line auxLine;
167
                try {
168
                    auxLine = geometryManager.createLine(subtype);
169
                } catch (CreateGeometryException e1) {
170
                    throw new DrawServiceException(e1);
171
                }
172
                auxLine.setPoints(firstPointValue, mousePosition);
173
                drawingStatus.addStatus(auxLine, auxiliarylineSymbolEditing, "");
174

    
175
                DisposableIterator it = null;
176
                try {
177
                    it = featureSelection.fastIterator();
178
                    while (it.hasNext()) {
179
                        Feature feature = (Feature) it.next();
180
                        
181
                        ISymbol previewSymbol = this.getPreviewSymbol(feature);
182

    
183
                        Geometry geometry =
184
                            feature.getDefaultGeometry().cloneGeometry();
185

    
186
                        AffineTransform at =
187
                            getMoveAffineTransform(firstPointValue,
188
                                mousePosition);
189
                        geometry.transform(at);
190
                        ISymbol symbol=null;
191
                        if(geometry instanceof Curve || geometry instanceof MultiCurve){
192
                            symbol = lineSymbolEditing;
193
                        } else if(geometry instanceof Surface || geometry instanceof MultiSurface){
194
                            symbol = polygonSymbolEditing;
195
                        } else if(geometry instanceof Point || geometry instanceof MultiPoint){
196
                            symbol = auxiliaryPointSymbolEditing;
197
                        }
198
                        if(geometry instanceof Aggregate){
199
                            int primitivesNumber = ((Aggregate)geometry).getPrimitivesNumber();
200
                            for (int i = 0; i < primitivesNumber; i++) {
201
                                drawingStatus.addStatus(((Aggregate)geometry).getPrimitiveAt(i), symbol, "");
202
                                drawingStatus.addStatus(((Aggregate)geometry).getPrimitiveAt(i), previewSymbol, "");
203
                            }
204
                        } else {
205
                            drawingStatus.addStatus(geometry, symbol, "");
206
                            drawingStatus.addStatus(geometry, previewSymbol, "");
207
                        }
208

    
209
                    }
210
                } catch (BaseException e) {
211
                    throw new DrawServiceException(e);
212
                } finally {
213
                    DisposeUtils.disposeQuietly(it);
214
                }
215
            }
216
        }
217
        return drawingStatus;
218
    }
219

    
220
    private AffineTransform getMoveAffineTransform(Point p1, Point p2)
221
        throws GeometryOperationNotSupportedException,
222
        GeometryOperationException {
223

    
224
        AffineTransform translate =
225
            AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
226
                p2.getY() - p1.getY());
227

    
228
        return translate;
229
    }
230

    
231
    @Override
232
    public void stop() throws StopServiceException {
233
        if (values != null) {
234
            values.clear();
235
        }
236
    }
237

    
238
    @Override
239
    public List<EditingServiceParameter> getParameters() {
240
        List<EditingServiceParameter> parameters =
241
            new ArrayList<>();
242
        parameters.add(selection);
243
        parameters.add(firstPoint);
244
        parameters.add(secondPoint);
245
        return parameters;
246
    }
247

    
248
    @Override
249
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
250
        validateAndInsertValue(parameter, value);
251
    }
252

    
253
    @Override
254
    public void setValue(Object value) throws InvalidEntryException {
255
        EditingServiceParameter parameter = next();
256
        validateAndInsertValue(parameter, value);
257

    
258
    }
259

    
260
    private void validateAndInsertValue(EditingServiceParameter parameter,
261
        Object value) {
262

    
263
        if (parameter == selection) {
264
            if (value instanceof FeatureSelection) {
265
                if (((FeatureSelection) value).getSelectedCount() > 0) {
266
                    values.put(selection, value);
267
                }
268
            }
269
        } else if (parameter == firstPoint || parameter == secondPoint) {
270
            if (value instanceof Point) {
271
                values.put(parameter, value);
272
            }
273
        }
274
    }
275

    
276
    @Override
277
    public Geometry finish() throws FinishServiceException {
278
        return null;
279
    }
280

    
281
    @Override
282
    public void finishAndStore() throws FinishServiceException {
283

    
284
        if (values != null) {
285

    
286
            final Point p1 = (Point) values.get(firstPoint);
287
            final Point p2 = (Point) values.get(secondPoint);
288

    
289
            FeatureSelection featureSelection =
290
                (FeatureSelection) values.get(selection);
291

    
292
            try {
293
                featureSelection.accept((Object obj) -> {
294
                    Feature feature = (Feature) obj;
295
                    
296
                    EditableFeature editable = feature.getEditable();
297
                    
298
                    Geometry geometry =
299
                            feature.getDefaultGeometry().cloneGeometry();
300
                    geometry.transform(getMoveAffineTransform(p1, p2));
301
                    
302
                    editable.setDefaultGeometry(geometry);
303
                    ((EditingProviderServices) getProviderServices())
304
                            .updateFeatureInFeatureStore(editable, featureStore);
305
                });
306

    
307
                featureStore.getFeatureSelection().deselectAll();
308

    
309
            } catch (BaseException e) {
310
                throw new FinishServiceException(e);
311
            }
312
        }
313
    }
314

    
315
    @Override
316
    public void start() throws StartServiceException, InvalidEntryException {
317
        values = new HashMap<>();
318
        FeatureSelection selected = null;
319
        if (featureStore != null) {
320
            try {
321
                selected = featureStore.getFeatureSelection();
322
            } catch (DataException e) {
323
                throw new StartServiceException(e);
324
            }
325
            try {
326
                setValue(selected);
327
            } catch (InvalidEntryException e) {
328
                throw new InvalidEntryException(e);
329
            }
330
        }
331
    }
332

    
333
    @Override
334
    public String getName() {
335
        return MoveEditingProviderFactory.PROVIDER_NAME;
336
    }
337

    
338
    @Override
339
    public Object getValue(EditingServiceParameter parameter) {
340
        return values!=null?values.get(parameter):null;
341
    }
342
}