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

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

    
76
/**
77
 * @author gvSIG Team
78
 *
79
 */
80
public class MoveEditingProvider extends AbstractEditingProvider implements
81
    EditingProvider {
82

    
83
    private final EditingServiceParameter selection;
84

    
85
    private final EditingServiceParameter firstPoint;
86

    
87
    private final EditingServiceParameter secondPoint;
88

    
89
    private final FeatureStore featureStore;
90

    
91
    private Map<EditingServiceParameter, Object> values;
92

    
93
    private List<Feature> selectedFeatures;
94

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

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

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

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

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

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

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

    
157
        if (values != null) {
158

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

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

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

    
176
                DisposableIterator it = null;
177
                try {
178
                    for (Feature feature :this.selectedFeatures) {
179
                        ISymbol previewSymbol = this.getPreviewSymbol(feature);
180
                        Geometry geometry = feature.getDefaultGeometry().cloneGeometry();
181

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

    
205
                    }
206
                } catch (BaseException e) {
207
                    throw new DrawServiceException(e);
208
                } finally {
209
                    DisposeUtils.disposeQuietly(it);
210
                }
211
            }
212
        }
213
        return drawingStatus;
214
    }
215

    
216
    private AffineTransform getMoveAffineTransform(Point p1, Point p2)
217
        throws GeometryOperationNotSupportedException,
218
        GeometryOperationException {
219

    
220
        AffineTransform translate =
221
            AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
222
                p2.getY() - p1.getY());
223

    
224
        return translate;
225
    }
226

    
227
    @Override
228
    public void stop() throws StopServiceException {
229
        if (values != null) {
230
            values.clear();
231
        }
232
        this.selectedFeatures = Collections.EMPTY_LIST;
233
    }
234

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

    
245
    @Override
246
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
247
        validateAndInsertValue(parameter, value);
248
    }
249

    
250
    @Override
251
    public void setValue(Object value) throws InvalidEntryException {
252
        EditingServiceParameter parameter = next();
253
        validateAndInsertValue(parameter, value);
254

    
255
    }
256

    
257
    private void validateAndInsertValue(EditingServiceParameter parameter,
258
        Object value) {
259

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

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

    
279
    @Override
280
    public void finishAndStore() throws FinishServiceException {
281

    
282
        if (values != null) {
283

    
284
            final Point p1 = (Point) values.get(firstPoint);
285
            final Point p2 = (Point) values.get(secondPoint);
286

    
287
            try {
288
                for (Feature feature : this.selectedFeatures) {
289
                    EditableFeature editable = feature.getEditable();
290
                    
291
                    Geometry geometry =
292
                            feature.getDefaultGeometry().cloneGeometry();
293
                    geometry.transform(getMoveAffineTransform(p1, p2));
294
                    
295
                    editable.setDefaultGeometry(geometry);
296
                    ((EditingProviderServices) getProviderServices())
297
                            .updateFeatureInFeatureStore(editable, featureStore);
298
                }
299
                featureStore.getFeatureSelection().deselectAll();
300

    
301
            } catch (BaseException e) {
302
                throw new FinishServiceException(e);
303
            }
304
        }
305
    }
306

    
307
    @Override
308
    public void start() throws StartServiceException, InvalidEntryException {
309
        values = new HashMap<>();
310
        this.selectedFeatures = Collections.EMPTY_LIST;
311
        if (featureStore != null) {
312
            FeatureSelection selected = null;
313
            try {
314
                selected = (FeatureSelection) featureStore.getFeatureSelection().clone();
315
            } catch (DataException e) {
316
                throw new StartServiceException(e);
317
            } catch (CloneNotSupportedException ex) {
318
                LOGGER.debug("Can't init selection",ex);
319
            }
320
            if ((selected != null) && (selected.getSelectedCount() > 0)) {
321
                values.put(selection, selected);
322
                this.selectedFeatures = this.getSelectedFeaturesCopy(selected);
323
            }
324
        }
325
    }
326

    
327
    @Override
328
    public String getName() {
329
        return MoveEditingProviderFactory.PROVIDER_NAME;
330
    }
331

    
332
    @Override
333
    public Object getValue(EditingServiceParameter parameter) {
334
        return values!=null?values.get(parameter):null;
335
    }
336
}