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.reversedirection / src / main / java / org / gvsig / vectorediting / lib / prov / reversedirection / ReverseDirectionEditingProvider.java @ 2444

History | View | Annotate | Download (10.5 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2015 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
package org.gvsig.vectorediting.lib.prov.reversedirection;
24

    
25
import java.util.ArrayList;
26
import java.util.List;
27

    
28
import org.gvsig.fmap.dal.exception.DataException;
29
import org.gvsig.fmap.dal.feature.EditableFeature;
30
import org.gvsig.fmap.dal.feature.Feature;
31
import org.gvsig.fmap.dal.feature.FeatureSelection;
32
import org.gvsig.fmap.dal.feature.FeatureStore;
33
import org.gvsig.fmap.geom.Geometry;
34
import org.gvsig.fmap.geom.Geometry.TYPES;
35
import org.gvsig.fmap.geom.GeometryException;
36
import org.gvsig.fmap.geom.GeometryLocator;
37
import org.gvsig.fmap.geom.GeometryManager;
38
import org.gvsig.fmap.geom.aggregate.MultiCurve;
39
import org.gvsig.fmap.geom.operation.GeometryOperationException;
40
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
41
import org.gvsig.fmap.geom.primitive.Curve;
42
import org.gvsig.fmap.geom.primitive.Line;
43
import org.gvsig.fmap.geom.primitive.Point;
44
import org.gvsig.fmap.geom.primitive.Spline;
45
import org.gvsig.fmap.geom.type.GeometryType;
46
import org.gvsig.tools.ToolsLocator;
47
import org.gvsig.tools.dispose.DisposeUtils;
48
import org.gvsig.tools.dynobject.DynObject;
49
import org.gvsig.tools.exception.BaseException;
50
import org.gvsig.tools.service.spi.ProviderServices;
51
import org.gvsig.tools.visitor.VisitCanceledException;
52
import org.gvsig.tools.visitor.Visitor;
53
import org.gvsig.vectorediting.lib.api.DrawingStatus;
54
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
55
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
56
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
57
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
58
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
59
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
60
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
61
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
62
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
63
import org.gvsig.vectorediting.lib.spi.EditingProvider;
64
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
65
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
66

    
67
/**
68
 *
69
 * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
70
 *
71
 */
72
public class ReverseDirectionEditingProvider extends AbstractEditingProvider
73
    implements EditingProvider {
74

    
75
    private EditingServiceParameter selectionParameter;
76

    
77
    private FeatureSelection selection;
78

    
79
    private FeatureStore featureStore;
80

    
81
    public ReverseDirectionEditingProvider(ProviderServices providerServices,
82
        DynObject parameters) {
83
        super(providerServices);
84

    
85
        this.featureStore =
86
            (FeatureStore) parameters
87
                .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
88

    
89
        this.selectionParameter =
90
            new DefaultEditingServiceParameter("selection", "selection",
91
                TYPE.SELECTION);
92
    }
93

    
94
    public EditingServiceParameter next() {
95
        if (selection == null) {
96
            return this.selectionParameter;
97
        }
98
        return null;
99
    }
100

    
101
    public DrawingStatus getDrawingStatus(Point mousePosition)
102
        throws DrawServiceException {
103
        return null;
104
    }
105

    
106
    public void stop() throws StopServiceException {
107
        ToolsLocator.getDisposableManager().release(selection);
108
        DisposeUtils.disposeQuietly(selection);
109
        this.selection = null;
110
    }
111

    
112
    public List<EditingServiceParameter> getParameters() {
113
        List<EditingServiceParameter> parameters =
114
            new ArrayList<EditingServiceParameter>();
115
        parameters.add(selectionParameter);
116
        return parameters;
117
    }
118

    
119
    @Override
120
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
121
        validateAndInsertValue(parameter, value);
122
    }
123

    
124
    public void setValue(Object value) throws InvalidEntryException {
125
        EditingServiceParameter parameter = next();
126
        validateAndInsertValue(parameter, value);
127
    }
128

    
129
    private void validateAndInsertValue(EditingServiceParameter parameter,
130
        Object value) throws InvalidEntryException {
131

    
132
        if (parameter == selectionParameter) {
133

    
134
            if (value instanceof FeatureSelection) {
135
                FeatureSelection featureSelection = (FeatureSelection) value;
136

    
137
                if (featureSelection.getSelectedCount() > 0) {
138
                    try {
139
                        featureSelection.accept(new Visitor() {
140

    
141
                            public void visit(Object obj)
142
                                throws VisitCanceledException, BaseException {
143

    
144
                                Feature feature = (Feature) obj;
145
                                Geometry geometry =
146
                                    feature.getDefaultGeometry();
147
                                GeometryType geometryType =
148
                                    geometry.getGeometryType();
149

    
150
                                if (!geometryType.isTypeOf(TYPES.CURVE)
151
                                    && !geometryType.isTypeOf(TYPES.MULTICURVE)) {
152
                                    throw new InvalidEntryException(null);
153
                                }
154
                            }
155
                        });
156
                    } catch (BaseException e) {
157
                        throw new InvalidEntryException(e);
158
                    }
159
                    ToolsLocator.getDisposableManager().bind(
160
                        (FeatureSelection) value);
161
                    this.selection = featureSelection;
162
                } else {
163
                    throw new InvalidEntryException(null);
164
                }
165
            }
166
        }
167
    }
168

    
169
    public Geometry finish() throws FinishServiceException {
170
        return null;
171
    }
172

    
173
    public void finishAndStore() throws FinishServiceException {
174

    
175
        if (selection != null) {
176

    
177
            final EditingProviderServices editingProviderServices =
178
                (EditingProviderServices) getProviderServices();
179

    
180
            try {
181
                selection.accept(new Visitor() {
182

    
183
                    public void visit(Object obj)
184
                        throws VisitCanceledException, BaseException {
185

    
186
                        Feature feature = (Feature) obj;
187
                        EditableFeature eFeature = feature.getEditable();
188
                        Geometry geometry = eFeature.getDefaultGeometry();
189

    
190
                        eFeature.setDefaultGeometry(reverseDirection(geometry));
191
                        editingProviderServices.updateFeatureInFeatureStore(
192
                            eFeature, featureStore);
193
                    }
194
                });
195

    
196
                ToolsLocator.getDisposableManager().release(selection);
197
                DisposeUtils.dispose(selection);
198
                featureStore.getFeatureSelection().deselectAll();
199

    
200
            } catch (BaseException e) {
201
                // TODO Auto-generated catch block
202
                e.printStackTrace();
203
            }
204
        }
205
    }
206

    
207
    private Geometry reverseDirection(Geometry geometry)
208
        throws GeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
209
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
210
        GeometryType geometryType = geometry.getGeometryType();
211

    
212
        if (geometryType.isTypeOf(TYPES.MULTICURVE)) {
213
            MultiCurve reversedMultiCurve =
214
                geometryManager.createMultiCurve(geometryType.getSubType());
215
            MultiCurve multicurve = (MultiCurve) geometry;
216
            for (int i = 0; i < multicurve.getPrimitivesNumber(); i++) {
217
                reversedMultiCurve.addCurve(reverseCurve(multicurve.getCurveAt(i)));
218
            }
219
            return reversedMultiCurve;
220
        } else if (geometryType.isTypeOf(TYPES.CURVE)) {
221
            return reverseCurve((Curve) geometry);
222
        } else {
223
            throw new IllegalArgumentException(String.format(
224
                "Can't reverse geometry with {} type", geometryType.getType()));
225
        }
226
    }
227

    
228
    private Curve reverseCurve(Curve curve) throws GeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
229
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
230
        Curve curveToReverse = null;
231
        Curve reverseCurve = null;
232
        if(curve instanceof Line || curve instanceof Spline){
233
            reverseCurve = (Curve) curve.cloneGeometry();
234
            reverseCurve.flip();
235
        } else {
236
            curveToReverse = (Curve) curve.toLines().getPrimitiveAt(0);
237
            reverseCurve = (Curve) geometryManager.create(Geometry.TYPES.LINE, curve.getGeometryType().getSubType());
238
            for (int i = curveToReverse.getNumVertices() - 1; i >= 0; i--) {
239
                reverseCurve.addVertex(curveToReverse.getVertex(i));
240
            }
241
        }
242
        return reverseCurve;
243
    }
244

    
245
    public void start() throws StartServiceException, InvalidEntryException {
246
        FeatureSelection selected = null;
247
        if (featureStore != null) {
248
            try {
249
                selected = featureStore.getFeatureSelection();
250
            } catch (DataException e) {
251
                throw new StartServiceException(e);
252
            }
253

    
254
            if (selected.getSelectedCount() > 0) {
255
                try {
256
                    setValue(selected);
257
                } catch (InvalidEntryException e) {
258
                    throw new InvalidEntryException(e);
259
                }
260
            }
261
        }
262
    }
263

    
264
    public String getName() {
265
        return ReverseDirectionEditingProviderFactory.PROVIDER_NAME;
266
    }
267

    
268
    @Override
269
    public Object getValue(EditingServiceParameter parameter) {
270
        if(parameter == this.selectionParameter){
271
            return this.selection;
272
        }
273
        return null;
274
    }
275
}