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

History | View | Annotate | Download (10.2 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
    public void setValue(Object value) throws InvalidEntryException {
120
        EditingServiceParameter parameter = next();
121
        validateAndInsertValue(parameter, value);
122
    }
123

    
124
    private void validateAndInsertValue(EditingServiceParameter parameter,
125
        Object value) throws InvalidEntryException {
126

    
127
        if (parameter == selectionParameter) {
128

    
129
            if (value instanceof FeatureSelection) {
130
                FeatureSelection featureSelection = (FeatureSelection) value;
131

    
132
                if (featureSelection.getSelectedCount() > 0) {
133
                    try {
134
                        featureSelection.accept(new Visitor() {
135

    
136
                            public void visit(Object obj)
137
                                throws VisitCanceledException, BaseException {
138

    
139
                                Feature feature = (Feature) obj;
140
                                Geometry geometry =
141
                                    feature.getDefaultGeometry();
142
                                GeometryType geometryType =
143
                                    geometry.getGeometryType();
144

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

    
164
    public Geometry finish() throws FinishServiceException {
165
        return null;
166
    }
167

    
168
    public void finishAndStore() throws FinishServiceException {
169

    
170
        if (selection != null) {
171

    
172
            final EditingProviderServices editingProviderServices =
173
                (EditingProviderServices) getProviderServices();
174

    
175
            try {
176
                selection.accept(new Visitor() {
177

    
178
                    public void visit(Object obj)
179
                        throws VisitCanceledException, BaseException {
180

    
181
                        Feature feature = (Feature) obj;
182
                        EditableFeature eFeature = feature.getEditable();
183
                        Geometry geometry = eFeature.getDefaultGeometry();
184

    
185
                        eFeature.setDefaultGeometry(reverseDirection(geometry));
186
                        editingProviderServices.updateFeatureInFeatureStore(
187
                            eFeature, featureStore);
188
                    }
189
                });
190

    
191
                ToolsLocator.getDisposableManager().release(selection);
192
                DisposeUtils.dispose(selection);
193
                featureStore.getFeatureSelection().deselectAll();
194

    
195
            } catch (BaseException e) {
196
                // TODO Auto-generated catch block
197
                e.printStackTrace();
198
            }
199
        }
200
    }
201

    
202
    private Geometry reverseDirection(Geometry geometry)
203
        throws GeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
204
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
205
        GeometryType geometryType = geometry.getGeometryType();
206

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

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

    
240
    public void start() throws StartServiceException, InvalidEntryException {
241
        FeatureSelection selected = null;
242
        if (featureStore != null) {
243
            try {
244
                selected = featureStore.getFeatureSelection();
245
            } catch (DataException e) {
246
                throw new StartServiceException(e);
247
            }
248

    
249
            if (selected.getSelectedCount() > 0) {
250
                try {
251
                    setValue(selected);
252
                } catch (InvalidEntryException e) {
253
                    throw new InvalidEntryException(e);
254
                }
255
            }
256
        }
257
    }
258

    
259
    public String getName() {
260
        return ReverseDirectionEditingProviderFactory.PROVIDER_NAME;
261
    }
262

    
263
}