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.arc / src / main / java / org / gvsig / vectorediting / lib / prov / arc / ArcEditingProvider.java @ 202

History | View | Annotate | Download (9.92 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.arc;
26

    
27
import java.util.ArrayList;
28
import java.util.HashMap;
29
import java.util.List;
30
import java.util.Map;
31

    
32
import org.gvsig.fmap.dal.feature.FeatureStore;
33
import org.gvsig.fmap.geom.Geometry;
34
import org.gvsig.fmap.geom.GeometryLocator;
35
import org.gvsig.fmap.geom.aggregate.MultiCurve;
36
import org.gvsig.fmap.geom.primitive.Curve;
37
import org.gvsig.fmap.geom.primitive.Point;
38
import org.gvsig.fmap.geom.type.GeometryType;
39
import org.gvsig.tools.dynobject.DynObject;
40
import org.gvsig.tools.service.spi.ProviderServices;
41
import org.gvsig.vectorediting.lib.api.DrawingStatus;
42
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
43
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
44
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
45
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
46
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
47
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
48
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
49
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
50
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
51
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
52
import org.gvsig.vectorediting.lib.spi.EditingProvider;
53
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
54
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
55

    
56
/**
57
 * @author llmarques
58
 *
59
 */
60
public class ArcEditingProvider extends AbstractEditingProvider implements
61
    EditingProvider {
62

    
63
    private EditingServiceParameter startPoint;
64

    
65
    private EditingServiceParameter endPoint;
66

    
67
    private EditingServiceParameter middlePoint;
68

    
69
    private Map<EditingServiceParameter, Object> values;
70

    
71
    private FeatureStore featureStore;
72

    
73
    /**
74
     * Default constructor.
75
     * 
76
     * @param providerServices
77
     *            available services for this provider
78
     * @param parameters
79
     *            of this provider
80
     */
81
    public ArcEditingProvider(ProviderServices providerServices,
82
        DynObject parameters) {
83
        super(providerServices);
84

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

    
89
        this.startPoint =
90
            new DefaultEditingServiceParameter("Start point", "start_point",
91
                TYPE.POSITION);
92

    
93
        this.endPoint =
94
            new DefaultEditingServiceParameter("End point", "end_point",
95
                TYPE.POSITION);
96

    
97
        this.middlePoint =
98
            new DefaultEditingServiceParameter("Middle point", "middle_point",
99
                TYPE.POSITION);
100
    }
101

    
102
    /*
103
     * (non-Javadoc)
104
     * 
105
     * @see org.gvsig.vectorediting.lib.spi.EditingProvider#next()
106
     */
107
    public EditingServiceParameter next() {
108
        if (values.get(startPoint) == null) {
109
            return this.startPoint;
110
        } else if (values.get(endPoint) == null) {
111
            return this.endPoint;
112
        } else if (values.get(middlePoint) == null) {
113
            return this.middlePoint;
114
        }
115
        return null;
116
    }
117

    
118
    /*
119
     * (non-Javadoc)
120
     * 
121
     * @see
122
     * org.gvsig.vectorediting.lib.spi.EditingProvider#getDrawingStatus(org.
123
     * gvsig.fmap.geom.primitive.Point)
124
     */
125
    public DrawingStatus getDrawingStatus(Point mousePosition)
126
        throws DrawServiceException {
127
        DefaultDrawingStatus geometries = new DefaultDrawingStatus();
128
        if (values != null && values.get(startPoint) != null) {
129

    
130
            Point startPointValue = (Point) values.get(startPoint);
131
            EditingProviderServices editingProviderServices =
132
                (EditingProviderServices) getProviderServices();
133

    
134
            if (values.get(endPoint) == null) {
135

    
136
                try {
137
                    int subtype =
138
                        editingProviderServices.getSubType(featureStore);
139
                    Curve line =
140
                        editingProviderServices.createLine(startPointValue,
141
                            mousePosition, subtype);
142
                    geometries.addGeometry(line);
143

    
144
                } catch (Exception e) {
145
                    throw new DrawServiceException(e);
146
                }
147

    
148
                return geometries;
149

    
150
            } else {
151

    
152
                Point endPointValue = (Point) values.get(endPoint);
153
                try {
154
                    int subtype =
155
                        editingProviderServices.getSubType(featureStore);
156
                    Curve arc =
157
                        editingProviderServices.createArc(startPointValue,
158
                            mousePosition, endPointValue, subtype);
159
                    geometries.addGeometry(arc);
160

    
161
                    Point center =
162
                        editingProviderServices.getCenter(startPointValue,
163
                            mousePosition, endPointValue, subtype);
164

    
165
                    geometries.addGeometry(center);
166
                    geometries.addGeometry(startPointValue);
167
                    geometries.addGeometry(endPointValue);
168

    
169
                } catch (Exception e) {
170
                    throw new DrawServiceException(e);
171
                }
172

    
173
                return geometries;
174
            }
175
        }
176
        return null;
177
    }
178

    
179
    /*
180
     * (non-Javadoc)
181
     * 
182
     * @see org.gvsig.vectorediting.lib.spi.EditingProvider#stop()
183
     */
184
    public void stop() throws StopServiceException {
185
        values.clear();
186
    }
187

    
188
    /*
189
     * (non-Javadoc)
190
     * 
191
     * @see org.gvsig.vectorediting.lib.spi.EditingProvider#getParameters()
192
     */
193
    public List<EditingServiceParameter> getParameters() {
194
        List<EditingServiceParameter> parameters =
195
            new ArrayList<EditingServiceParameter>();
196
        parameters.add(startPoint);
197
        parameters.add(endPoint);
198
        parameters.add(middlePoint);
199
        return parameters;
200
    }
201

    
202
    /*
203
     * (non-Javadoc)
204
     * 
205
     * @see
206
     * org.gvsig.vectorediting.lib.spi.EditingProvider#setValue(java.lang.Object
207
     * )
208
     */
209
    public void setValue(Object value) throws InvalidEntryException {
210
        EditingServiceParameter param = next();
211
        validateAndInsertValue(param, value);
212
    }
213

    
214
    private void validateAndInsertValue(EditingServiceParameter param,
215
        Object value) throws InvalidEntryException {
216
        if (param == startPoint) {
217
            if (value instanceof Point) {
218
                values.put(param, value);
219
                return;
220
            }
221
        } else if (param == endPoint) {
222
            if (value instanceof Point) {
223
                values.put(param, value);
224
                return;
225
            }
226
        } else if (param == middlePoint) {
227
            if (value instanceof Point) {
228
                values.put(param, value);
229
                return;
230
            }
231
        }
232
        throw new InvalidEntryException(null);
233
    }
234

    
235
    /*
236
     * (non-Javadoc)
237
     * 
238
     * @see org.gvsig.vectorediting.lib.spi.EditingProvider#finish()
239
     */
240
    public Geometry finish() throws FinishServiceException {
241
        Point startPointValue = (Point) values.get(startPoint);
242
        Point middlePointValue = (Point) values.get(middlePoint);
243
        Point endPointValue = (Point) values.get(endPoint);
244
        EditingProviderServices editingProviderServices =
245
            (EditingProviderServices) getProviderServices();
246

    
247
        try {
248
            GeometryType storeGeomType =
249
                editingProviderServices.getGeomType(featureStore);
250
            Geometry geometry = null;
251
            int subtype = editingProviderServices.getSubType(featureStore);
252

    
253
            geometry =
254
                editingProviderServices.createArc(startPointValue,
255
                    middlePointValue, endPointValue, subtype);
256

    
257
            if (storeGeomType.isTypeOf(MULTICURVE)) {
258

    
259
                MultiCurve multiCurve;
260
                multiCurve =
261
                    GeometryLocator.getGeometryManager().createMultiCurve(
262
                        storeGeomType.getSubType());
263
                multiCurve.addCurve((Curve) geometry);
264
                return multiCurve;
265
            }
266

    
267
            return geometry;
268
        } catch (Exception e) {
269
            throw new FinishServiceException(e);
270
        }
271
    }
272

    
273
    /*
274
     * (non-Javadoc)
275
     * 
276
     * @see org.gvsig.vectorediting.lib.spi.EditingProvider#finishAndStore()
277
     */
278
    public void finishAndStore() throws FinishServiceException {
279
        Geometry geometry = finish();
280
        EditingProviderServices editingProviderServices =
281
            (EditingProviderServices) getProviderServices();
282
        editingProviderServices.insertGeometryIntoFeatureStore(geometry,
283
            featureStore);
284
    }
285

    
286
    /*
287
     * (non-Javadoc)
288
     * 
289
     * @see org.gvsig.vectorediting.lib.spi.EditingProvider#start()
290
     */
291
    public void start() throws StartServiceException {
292
        values = new HashMap<EditingServiceParameter, Object>();
293
    }
294

    
295
    /*
296
     * (non-Javadoc)
297
     * 
298
     * @see org.gvsig.vectorediting.lib.spi.EditingProvider#getName()
299
     */
300
    public String getName() {
301
        return ArcEditingProviderFactory.PROVIDER_NAME;
302
    }
303

    
304
}