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.duplicate / src / main / java / org / gvsig / vectorediting / lib / prov / duplicate / DuplicateEditingProvider.java @ 2616

History | View | Annotate | Download (13.2 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.duplicate;
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 DuplicateEditingProvider 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 services
98
     *            available services for this provider
99
     * @param parameters
100
     *            of this provider
101
     */
102
    public DuplicateEditingProvider(DynObject parameters,
103
        ProviderServices services) {
104
        super(services);
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
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
139

    
140
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
141
        EditingProviderManager editingProviderManager =
142
            EditingProviderLocator.getProviderManager();
143
        EditingProviderServices editingProviderServices =
144
            (EditingProviderServices) getProviderServices();
145
        int subtype;
146
        try {
147
            subtype = editingProviderServices.getSubType(featureStore);
148
        } catch (DataException e2) {
149
            throw new DrawServiceException(e2);
150
        }
151
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
152
        ISymbol auxiliarylineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
153
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
154
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
155

    
156
        
157
        if (values != null) {
158

    
159
            FeatureSelection featureSelection =
160
                (FeatureSelection) values.get(selection);
161
            Point firstPointValue = (Point) values.get(firstPoint);
162

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

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

    
181
                        Geometry geometry =
182
                            feature.getDefaultGeometry().cloneGeometry();
183

    
184
                        AffineTransform at =
185
                            getMoveAffineTransform(firstPointValue,
186
                                mousePosition);
187
                        geometry.transform(at);
188
                        ISymbol symbol=null;
189
                        if(geometry instanceof Curve || geometry instanceof MultiCurve){
190
                            symbol = lineSymbolEditing;
191
                        } else if(geometry instanceof Surface || geometry instanceof MultiSurface){
192
                            symbol = polygonSymbolEditing;
193
                        } else if(geometry instanceof Point || geometry instanceof MultiPoint){
194
                            symbol = auxiliaryPointSymbolEditing;
195
                        }
196
                        if(geometry instanceof Aggregate){
197
                            int primitivesNumber = ((Aggregate)geometry).getPrimitivesNumber();
198
                            for (int i = 0; i < primitivesNumber; i++) {
199
                                drawingStatus.addStatus(((Aggregate)geometry).getPrimitiveAt(i), symbol, "");
200
                                drawingStatus.addStatus(((Aggregate)geometry).getPrimitiveAt(i), previewSymbol, "");
201
                            }
202
                        } else {
203
                            drawingStatus.addStatus(geometry, symbol, "");
204
                            drawingStatus.addStatus(geometry, previewSymbol, "");
205
                        }
206
//                        drawingStatus.addGeometry(geometry);
207
                    }
208
                } catch (BaseException e) {
209
                    throw new DrawServiceException(e);
210
                } finally {
211
                    DisposeUtils.disposeQuietly(it);
212
                }
213
            }
214
        }
215
        return drawingStatus;
216
    }
217

    
218
    private AffineTransform getMoveAffineTransform(Point p1, Point p2)
219
        throws GeometryOperationNotSupportedException,
220
        GeometryOperationException {
221

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

    
226
        return translate;
227
    }
228

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

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

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

    
251
    @Override
252
    public void setValue(Object value) throws InvalidEntryException {
253
        EditingServiceParameter parameter = next();
254
        validateAndInsertValue(parameter, value);
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
                }
265
            }
266
        } else if (parameter == firstPoint || parameter == secondPoint) {
267
            if (value instanceof Point) {
268
                values.put(parameter, value);
269
            }
270
        }
271
    }
272

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

    
278
    @Override
279
    public void finishAndStore() throws FinishServiceException {
280
        if (values != null) {
281

    
282
            final Point p1 = (Point) values.get(firstPoint);
283
            final Point p2 = (Point) values.get(secondPoint);
284

    
285
            FeatureSelection featureSelection =
286
                (FeatureSelection) values.get(selection);
287
            ToolsLocator.getDisposableManager().bind(featureSelection);
288

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

    
309
                featureStore.getFeatureSelection().deselectAll();
310
                featureSelection.dispose();
311

    
312
            } catch (BaseException e) {
313
                throw new FinishServiceException(e);
314
            }
315
        }
316
    }
317

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

    
336
    @Override
337
    public String getName() {
338
        return DuplicateEditingProviderFactory.PROVIDER_NAME;
339
    }
340

    
341
    @Override
342
    public Object getValue(EditingServiceParameter parameter) {
343
        return values!=null?values.get(parameter):null;
344
    }
345

    
346
}