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.rotate / src / main / java / org / gvsig / vectorediting / lib / prov / rotate / RotateEditingProvider.java @ 2998

History | View | Annotate | Download (29.8 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
package org.gvsig.vectorediting.lib.prov.rotate;
25

    
26
import java.awt.geom.AffineTransform;
27
import java.util.ArrayList;
28
import java.util.HashMap;
29
import java.util.List;
30
import java.util.Map;
31
import org.gvsig.fmap.dal.exception.DataException;
32
import org.gvsig.fmap.dal.feature.EditableFeature;
33
import org.gvsig.fmap.dal.feature.Feature;
34
import org.gvsig.fmap.dal.feature.FeatureSelection;
35
import org.gvsig.fmap.dal.feature.FeatureStore;
36
import org.gvsig.fmap.geom.Geometry;
37
import org.gvsig.fmap.geom.GeometryLocator;
38
import org.gvsig.fmap.geom.GeometryManager;
39
import org.gvsig.fmap.geom.GeometryUtils;
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.CreateEnvelopeException;
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.Arc;
49
import org.gvsig.fmap.geom.primitive.Curve;
50
import org.gvsig.fmap.geom.primitive.Envelope;
51
import org.gvsig.fmap.geom.primitive.Line;
52
import org.gvsig.fmap.geom.primitive.Point;
53
import org.gvsig.fmap.geom.primitive.Surface;
54
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
55
import org.gvsig.symbology.SymbologyLocator;
56
import org.gvsig.symbology.SymbologyManager;
57
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text.ISimpleTextSymbol;
58
import org.gvsig.tools.ToolsLocator;
59
import org.gvsig.tools.dispose.DisposableIterator;
60
import org.gvsig.tools.dynobject.DynObject;
61
import org.gvsig.tools.exception.BaseException;
62
import org.gvsig.tools.i18n.I18nManager;
63
import org.gvsig.tools.service.spi.ProviderServices;
64
import org.gvsig.vectorediting.lib.api.DrawingStatus;
65
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
66
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
67
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
68
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
69
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
70
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
71
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
72
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
73
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
74
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
75
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameterOptions;
76
import org.gvsig.vectorediting.lib.spi.EditingProvider;
77
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
78
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
79
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
80
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
81

    
82
public class RotateEditingProvider extends AbstractEditingProvider implements
83
        EditingProvider {
84

    
85
    public static final String KEY_PIVOT_CENTER = "_Key_pivot_center";
86

    
87
    public static final String PIVOT_CENTER = "_Pivot_center";
88

    
89
    public static final String ROTATE_MODE = "_Rotate_mode";
90

    
91
    public static final String ROTATE_ACTIVE_ANGLE_MODE = "_Rotate_active_angle_mode";
92

    
93
    public static final String ROTATE_TWO_POINTS_MODE = "_Rotate_two_points_mode";
94

    
95
    public static final String ROTATE_THREE_POINTS_MODE = "_Rotate_three_points_mode";
96

    
97
    public static final String KEY_ROTATE_ACTIVE_ANGLE_MODE = "_Key_rotate_active_angle_mode";
98

    
99
    public static final String KEY_ROTATE_TWO_POINTS_MODE = "_Key_rotate_two_points_mode";
100

    
101
    public static final String KEY_ROTATE_THREE_POINTS_MODE = "_Key_rotate_three_points_mode";
102

    
103
    //Variable est?tica para guardarnos el rotate_mode
104
    private static String savedRotateMode;
105

    
106
    private final EditingServiceParameter selectionParameter;
107

    
108
    private final EditingServiceParameter pivotPointParameter;
109

    
110
    private String center;
111

    
112
    private final EditingServiceParameter modeParameter;
113

    
114
    private final EditingServiceParameter angleParameter;
115

    
116
    private final EditingServiceParameter firstPointParameter;
117

    
118
    private final EditingServiceParameter secondPointParameter;
119

    
120
    private Map<EditingServiceParameter, Object> values;
121

    
122
    private final FeatureStore featureStore;
123

    
124
    public RotateEditingProvider(ProviderServices providerServices,
125
            DynObject parameters) {
126
        super(providerServices);
127
        this.featureStore
128
                = (FeatureStore) parameters
129
                        .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
130

    
131
        I18nManager i18nManager = ToolsLocator.getI18nManager();
132

    
133
        this.selectionParameter
134
                = new DefaultEditingServiceParameter("selection",
135
                        i18nManager.getTranslation("selection"), TYPE.SELECTION);
136

    
137
        DefaultEditingServiceParameterOptions options = new DefaultEditingServiceParameterOptions()
138
                .add(i18nManager.getTranslation(PIVOT_CENTER), PIVOT_CENTER, i18nManager.getTranslation(KEY_PIVOT_CENTER));
139

    
140
        String consoleMsg
141
                = ((EditingProviderServices) providerServices).makeConsoleMessage(
142
                        "_Pivot_point", options);
143

    
144
        this.pivotPointParameter
145
                = new DefaultEditingServiceParameter(
146
                        "_Pivot_point",
147
                        consoleMsg,
148
                        options,
149
                        null,
150
                        TYPE.POSITION, TYPE.OPTION
151
                );
152
        
153
        DefaultEditingServiceParameterOptions modeOptions = new DefaultEditingServiceParameterOptions()
154
                .add(i18nManager.getTranslation(ROTATE_ACTIVE_ANGLE_MODE), ROTATE_ACTIVE_ANGLE_MODE, i18nManager.getTranslation(KEY_ROTATE_ACTIVE_ANGLE_MODE))
155
                .add(i18nManager.getTranslation(ROTATE_TWO_POINTS_MODE), ROTATE_TWO_POINTS_MODE, i18nManager.getTranslation(KEY_ROTATE_TWO_POINTS_MODE))
156
                .add(i18nManager.getTranslation(ROTATE_THREE_POINTS_MODE), ROTATE_THREE_POINTS_MODE, i18nManager.getTranslation(KEY_ROTATE_THREE_POINTS_MODE));
157

    
158
        String modeConsoleMsg
159
                = ((EditingProviderServices) providerServices).makeConsoleMessage(
160
                        ROTATE_MODE, options);
161

    
162
        this.modeParameter
163
                = new DefaultEditingServiceParameter(
164
                        ROTATE_MODE,
165
                        modeConsoleMsg,
166
                        modeOptions,
167
                        i18nManager.getTranslation(ROTATE_TWO_POINTS_MODE),
168
                        true, //Optional
169
                        TYPE.OPTION
170
                );
171

    
172
        this.angleParameter
173
                = new DefaultEditingServiceParameter(
174
                        "_Angle",
175
                        i18nManager.getTranslation("_Angle"),
176
                        TYPE.VALUE
177
                );
178

    
179
        this.firstPointParameter
180
                = new DefaultEditingServiceParameter(
181
                        "Start_of_rotation",
182
                        i18nManager.getTranslation("_Start_of_rotation"),
183
                        TYPE.POSITION);
184

    
185
        this.secondPointParameter
186
                = new DefaultEditingServiceParameter(
187
                        "_End_of_rotation",
188
                        i18nManager.getTranslation("_End_of_rotation"),
189
                        TYPE.POSITION
190
                );
191

    
192
        this.values = new HashMap<>();
193

    
194
    }
195

    
196
    private ISimpleTextSymbol getTextSymbol() {
197
        SymbologyManager symbologyManager = SymbologyLocator.getSymbologyManager();
198
        ISimpleTextSymbol textSymbol = symbologyManager.createSimpleTextSymbol();
199
        textSymbol.setFontSize(10);
200
        return textSymbol;
201
    }
202

    
203
    @Override
204
    public DrawingStatus getDrawingStatus(Point mousePosition)
205
            throws DrawServiceException {
206
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
207
        EditingProviderManager editingProviderManager
208
                = EditingProviderLocator.getProviderManager();
209
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
210
        ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
211
        ISymbol ruleAxisSymbol = editingProviderManager.getSymbol("rule-axis-symbol");
212
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
213
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
214

    
215
        EditingProviderServices editingProviderServices = (EditingProviderServices) getProviderServices();
216

    
217
        FeatureSelection selected
218
                = (FeatureSelection) values.get(selectionParameter);
219
        try {
220
            int subType
221
                    = editingProviderServices.getSubType(featureStore);
222
            if ((selected != null) && !selected.isEmpty()) {
223
                Point p1 = (Point) values.get(pivotPointParameter);
224
                Point p2 = null;
225
                Point p3 = null;
226
                Double angle = null;
227
                if (p1 != null) {
228
                    drawingStatus.addStatus(p1, auxiliaryPointSymbolEditing, "");
229

    
230
                    switch ((String) values.get(modeParameter)) {
231
                        case ROTATE_ACTIVE_ANGLE_MODE:
232
                            return drawingStatus;
233
                        case ROTATE_TWO_POINTS_MODE:
234
                            p3 = (Point) values.get(secondPointParameter);
235
                            if (p3 == null) {
236
                                angle = GeometryUtils.calculateAngle(
237
                                        (Point) values.get(pivotPointParameter),
238
                                        mousePosition);
239

    
240
                                Line line;
241
                                GeometryManager geometryManager
242
                                        = GeometryLocator.getGeometryManager();
243
                                line = geometryManager.createLine(subType);
244
                                line.addVertex(p1);
245
                                p3 = geometryManager.createPoint(
246
                                        p1.getX() + p1.distance(mousePosition),
247
                                        p1.getY(), subType);
248
                                line.addVertex(p3);
249
                                drawingStatus.addStatus(line, ruleAxisSymbol, "");
250
                                Line line2;
251
                                line2 = geometryManager.createLine(subType);
252
                                line2.addVertex(p1);
253
                                line2.addVertex(mousePosition);
254
                                drawingStatus.addStatus(line2, ruleAxisSymbol, "");
255
                                Double ext = (2 * Math.PI) - angle;
256
                                Arc arc = GeometryUtils.createArc(
257
                                        p1,
258
                                        p1.distance(mousePosition) / 2,
259
                                        0,
260
                                        angle,
261
                                        Geometry.SUBTYPES.GEOM2D);
262
                                drawingStatus.addStatus(arc, auxiliaryLineSymbolEditing, "");
263
                                double textDistance = 3 * p1.distance(mousePosition) / 4;
264
                                Point pointText = geometryManager.createPoint(p1.getX() + textDistance * Math.cos(angle / 2), p1.getY() + textDistance * Math.sin(angle / 2), subType);
265
                                ISimpleTextSymbol textSymbol = getTextSymbol();
266
                                drawingStatus.addStatus(pointText, textSymbol, degToDms(Math.toDegrees(angle)));
267
                            }
268
                            break;
269
                        case ROTATE_THREE_POINTS_MODE:
270
                            p2 = (Point) values.get(firstPointParameter);
271
                            p3 = (Point) values.get(secondPointParameter);
272
                            if (p2 == null) {
273
                                Line line;
274
                                GeometryManager geometryManager
275
                                        = GeometryLocator.getGeometryManager();
276
                                line = geometryManager.createLine(subType);
277
                                line.addVertex(p1);
278
                                line.addVertex(mousePosition);
279
                                drawingStatus.addStatus(line, ruleAxisSymbol, "");
280
                            } else {
281
                                if (p3 == null) {
282
                                    angle = GeometryUtils.calculateAngle(
283
                                            (Point) values.get(pivotPointParameter),
284
                                            p2,
285
                                            mousePosition);
286

    
287
                                    double startAngle = GeometryUtils.calculateAngle(
288
                                            (Point) values.get(pivotPointParameter),
289
                                            p2);
290

    
291
                                    Line line;
292
                                    GeometryManager geometryManager
293
                                            = GeometryLocator.getGeometryManager();
294
                                    line = geometryManager.createLine(subType);
295
                                    line.addVertex(p1);
296
                                    line.addVertex(p2);
297
                                    drawingStatus.addStatus(line, ruleAxisSymbol, "");
298
                                    Line line2;
299
                                    line2 = geometryManager.createLine(subType);
300
                                    line2.addVertex(p1);
301
                                    line2.addVertex(mousePosition);
302
                                    drawingStatus.addStatus(line2, ruleAxisSymbol, "");
303
                                    Double ext = (2 * Math.PI) - angle;
304
                                    Arc arc = GeometryUtils.createArc(
305
                                            p1,
306
                                            p1.distance(mousePosition) / 2,
307
                                            GeometryUtils.calculateAngle(p1, p2),
308
                                            GeometryUtils.calculateAngle(p1, p2, mousePosition),
309
                                            subType);
310
                                    drawingStatus.addStatus(arc, auxiliaryLineSymbolEditing, "");
311
                                    double textDistance = 3 * p1.distance(mousePosition) / 4;
312
                                    Point pointText = geometryManager.createPoint(p1.getX() + textDistance * Math.cos(startAngle+(angle / 2)), p1.getY() + textDistance * Math.sin(startAngle+(angle / 2)), subType);
313
                                    ISimpleTextSymbol textSymbol = getTextSymbol();
314
                                    drawingStatus.addStatus(pointText, textSymbol, degToDms(Math.toDegrees(angle)));
315
                                }
316
                            }
317
                            break;
318
                    }
319

    
320
                    if (angle != null) {
321
                        DisposableIterator it;
322
                        it = selected.fastIterator();
323

    
324
                        AffineTransform at;
325
                        try {
326
                            at = getRotateAffineTransform(p1, angle);
327
                        } catch (Exception e) {
328
                            throw new DrawServiceException(e);
329
                        }
330

    
331
                        while (it.hasNext()) {
332
                            Feature feat = (Feature) it.next();
333

    
334
                            ISymbol previewSymbol = this.getPreviewSymbol(feat);
335

    
336
                            Geometry transformedGeometry = feat.getDefaultGeometry().cloneGeometry();
337
                            transformedGeometry.transform(at);
338

    
339
                            ISymbol symbol = null;
340
                            if (transformedGeometry instanceof Curve || transformedGeometry instanceof MultiCurve) {
341
                                symbol = lineSymbolEditing;
342
                            } else if (transformedGeometry instanceof Surface || transformedGeometry instanceof MultiSurface) {
343
                                symbol = polygonSymbolEditing;
344
                            } else if (transformedGeometry instanceof Point || transformedGeometry instanceof MultiPoint) {
345
                                symbol = auxiliaryPointSymbolEditing;
346
                            }
347
                            if (transformedGeometry instanceof Aggregate) {
348
                                int primitivesNumber = ((Aggregate) transformedGeometry).getPrimitivesNumber();
349
                                for (int i = 0; i < primitivesNumber; i++) {
350
                                    drawingStatus.addStatus(((Aggregate) transformedGeometry).getPrimitiveAt(i), symbol, "");
351
                                    drawingStatus.addStatus(((Aggregate) transformedGeometry).getPrimitiveAt(i), previewSymbol, "");
352
                                }
353
                            } else {
354
                                drawingStatus.addStatus(transformedGeometry, symbol, "");
355
                                drawingStatus.addStatus(transformedGeometry, previewSymbol, "");
356
                            }
357

    
358
                        }
359
                        it.dispose();
360
                    }
361
                }
362
                return drawingStatus;
363
            }
364
        } catch (Exception e) {
365
            throw new DrawServiceException(e);
366
        }
367

    
368
        return null;
369

    
370
    }
371

    
372
    private String degToDms(double deg) {
373
        int d = (int) Math.floor(deg);
374
        double minfloat = (deg - d) * 60;
375
        int m = (int) Math.floor(minfloat);
376
        double secfloat = (minfloat - m) * 60;
377
        int s = (int) Math.round(secfloat);
378
        // After rounding, the seconds might become 60. These two
379
        // if-tests are not necessary if no rounding is done.
380
        if (s == 60) {
381
            m++;
382
            s = 0;
383
        }
384
        if (m == 60) {
385
            d++;
386
            m = 0;
387
        }
388
        return ("" + d + "\u00B0" + m + "\u2032" + s + "\u2033");
389
    }
390

    
391
    private AffineTransform getRotateAffineTransform(Point axisP1, Double angle)
392
            throws GeometryOperationNotSupportedException,
393
            GeometryOperationException {
394

    
395
        AffineTransform translate
396
                = AffineTransform
397
                        .getTranslateInstance(-axisP1.getX(), -axisP1.getY());
398

    
399
        AffineTransform rotate = AffineTransform.getRotateInstance(angle);
400

    
401
        AffineTransform inverseTranslate
402
                = AffineTransform.getTranslateInstance(axisP1.getX(), axisP1.getY());
403
        AffineTransform at = new AffineTransform(translate);
404

    
405
        at.preConcatenate(rotate);
406
        at.preConcatenate(inverseTranslate);
407
        return at;
408
    }
409

    
410
    @Override
411
    public EditingServiceParameter next() {
412
        if (values.get(selectionParameter) == null) {
413
            return this.selectionParameter;
414
        } else if (values.get(pivotPointParameter) == null) {
415
            return this.pivotPointParameter;
416
        } else if (((String) values.get(modeParameter)).equalsIgnoreCase(ROTATE_ACTIVE_ANGLE_MODE)) {
417
            if (values.get(angleParameter) == null) {
418
                return angleParameter;
419
            }
420
        } else if (((String) values.get(modeParameter)).equalsIgnoreCase(ROTATE_TWO_POINTS_MODE)) {
421
            if (values.get(secondPointParameter) == null) {
422
                return secondPointParameter;
423
            }
424
        } else if (((String) values.get(modeParameter)).equalsIgnoreCase(ROTATE_THREE_POINTS_MODE)) {
425
            if (values.get(firstPointParameter) == null) {
426
                return firstPointParameter;
427
            }
428
            if (values.get(secondPointParameter) == null) {
429
                return secondPointParameter;
430
            }
431
        }
432
        return null;
433
    }
434

    
435
    public void stop() {
436
        values.clear();
437
    }
438

    
439
    private void validateAndInsertValue(EditingServiceParameter param,
440
            Object value) throws InvalidEntryException {
441
        if (param == selectionParameter) {
442
            if (value instanceof FeatureSelection) {
443
                values.put(param, value);
444
            } else {
445
                throw new InvalidEntryException(null);
446
            }
447

    
448
        } else if (param == modeParameter) {
449
            savedRotateMode = (String) param.getOptions2().getValue(value, param.getDefaultValue());
450
            values.put(param, savedRotateMode);
451

    
452
        } else if (param == pivotPointParameter) {
453
            if (value == null) {
454
                center = null;
455
                values.remove(param);
456
            } else if (value instanceof Point) {
457
                values.put(param, value);
458
                center = null;
459
            } else if (value instanceof String) {
460
                if (PIVOT_CENTER.equalsIgnoreCase((String) param.getOptions2().getValue(value, param.getDefaultValue()))) {
461
                    center = PIVOT_CENTER;
462
                    GeometryManager geomManager = GeometryLocator.getGeometryManager();
463
                    FeatureSelection selected
464
                            = (FeatureSelection) values.get(this.selectionParameter);
465
                    if ((selected != null) && !selected.isEmpty()) {
466
                        try {
467
                            int subType = this.getProviderServices().getSubType(featureStore);
468
                            Envelope envelope = geomManager.createEnvelope(subType);
469
                            for (Feature feature : selected) {
470
                                Envelope featEnv = feature.getDefaultEnvelope();
471
                                envelope.add(featEnv);
472
                            }
473
                            if (!envelope.isEmpty()) {
474
                                Point center = geomManager.createPoint(envelope.getCenter(0), envelope.getCenter(1), subType);
475
                                values.put(param, center);
476
                            }
477
                        } catch (DataException | CreateGeometryException | CreateEnvelopeException ex) {
478
                            throw new InvalidEntryException(ex);
479
                        }
480
                    }
481
                } else {
482
                    center = null;
483
                    values.remove(param);
484
                }
485
            } else {
486
                throw new InvalidEntryException(null);
487
            }
488
        } else if (param == firstPointParameter) {
489
            if (value instanceof Point) {
490
                if (((Point) value).equals((Point) values.get(pivotPointParameter))) {
491
                    throw new InvalidEntryException(null);
492
                }
493
                values.put(param, value);
494
            } else {
495
                throw new InvalidEntryException(null);
496
            }
497
        } else if (param == secondPointParameter) {
498
            if (value instanceof Point) {
499
                if (((Point) value).equals((Point) values.get(firstPointParameter))
500
                        || ((Point) value).equals((Point) values.get(pivotPointParameter))) {
501
                    throw new InvalidEntryException(null);
502
                }
503
                values.put(param, value);
504
            } else {
505
                throw new InvalidEntryException(null);
506
            }
507
        } else if (param == angleParameter) {
508
            if (value instanceof Double) {
509
                if ((Double)value == 0.0){
510
                    throw new InvalidEntryException(null);
511
                }
512
                values.put(param, value);
513
            } else {
514
                throw new InvalidEntryException(null);
515
            }
516
        }
517
    }
518

    
519
    @Override
520
    public List<EditingServiceParameter> getParameters() {
521
        List<EditingServiceParameter> list
522
                = new ArrayList<>();
523
        list.add(selectionParameter);
524
        list.add(modeParameter);
525
        list.add(pivotPointParameter);
526
        list.add(angleParameter);
527
        list.add(firstPointParameter);
528
        list.add(secondPointParameter);
529
        return list;
530
    }
531

    
532
    @Override
533
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
534
        validateAndInsertValue(parameter, value);
535
    }
536

    
537
    @Override
538
    public void setValue(Object value) throws InvalidEntryException {
539
        EditingServiceParameter param = next();
540
        validateAndInsertValue(param, value);
541
    }
542

    
543
    @Override
544
    public void finishAndStore() throws FinishServiceException {
545

    
546
        FeatureSelection selected
547
                = (FeatureSelection) values.get(selectionParameter);
548
        try {
549
            if (!selected.isEmpty()) {
550
                Point p0 = (Point) values.get(pivotPointParameter);
551
                Point p1 = null;
552
                Object p2;
553
                Double angle = null;
554
                if(values.get(angleParameter) != null){
555
                    angle = Math.toRadians((Double) values.get(angleParameter));
556
                }
557
                switch ((String) values.get(modeParameter)) {
558
                    case ROTATE_ACTIVE_ANGLE_MODE:
559
                        break;
560
                    case ROTATE_TWO_POINTS_MODE:
561
                        p2 = values.get(secondPointParameter);
562
                        angle = GeometryUtils.calculateAngle(p0, (Point)p2);
563
                        break;
564
                    case ROTATE_THREE_POINTS_MODE:
565
                        p1 = (Point) values.get(firstPointParameter);
566
                        p2 = values.get(secondPointParameter);
567
                        angle = GeometryUtils.calculateAngle(p0, p1, (Point)p2);
568
                        break;
569
                }
570
                
571
                if(angle != null){
572

    
573
                    final AffineTransform at;
574
                    try {
575
                        at = getRotateAffineTransform(p0, angle);
576
                    } catch (GeometryOperationNotSupportedException | GeometryOperationException e) {
577
                        throw new FinishServiceException(e);
578
                    }
579
                    try {
580
                        selected.accept((Object obj) -> {
581
                            Feature feature = (Feature) obj;
582
                            Geometry geom
583
                                    = feature.getDefaultGeometry()
584
                                            .cloneGeometry();
585
                            geom.transform(at);
586
                            // Se sustituye la geometr?a original por la
587
                            // calculada
588
                            EditableFeature editableFeature
589
                                    = feature.getEditable();
590
                            editableFeature.setDefaultGeometry(geom);
591
                            ((EditingProviderServices) getProviderServices())
592
                                    .updateFeatureInFeatureStore(
593
                                            editableFeature, featureStore);
594
                        });
595
                    } catch (BaseException e) {
596
                        throw new FinishServiceException(e);
597
                    }
598
                    featureStore.getFeatureSelection().deselectAll();
599
                }
600
            }
601
        } catch (DataException e) {
602
            throw new FinishServiceException(e);
603
        }
604
    }
605

    
606
    @Override
607
    public Geometry finish() throws FinishServiceException {
608
        return null;
609
    }
610

    
611
    @Override
612
    public void start() throws StartServiceException {
613
        this.values = new HashMap<>();
614
        FeatureSelection selected = null;
615
        if (featureStore != null) {
616
            try {
617
                selected
618
                        = (FeatureSelection) featureStore.getFeatureSelection()
619
                                .clone();
620
            } catch (DataException e) {
621
                throw new StartServiceException(e);
622
            } catch (CloneNotSupportedException e) {
623
                // Do nothing
624
            }
625
            if ((selected != null) && (selected.getSelectedCount() > 0)) {
626
                values.put(selectionParameter, selected);
627
            }
628
        }
629
        if (savedRotateMode != null) {
630
            this.values.put(modeParameter, savedRotateMode);
631
        }
632
    }
633

    
634
    @Override
635
    public void restart() throws StartServiceException, InvalidEntryException, StopServiceException {
636
        values.put(selectionParameter, null);
637
        values.put(pivotPointParameter, null);
638
        center = null;
639
        values.put(angleParameter, null);
640
        values.put(firstPointParameter, null);
641
        values.put(secondPointParameter, null);
642
    }
643

    
644
    @Override
645
    public String getName() {
646
        return RotateEditingProviderFactory.PROVIDER_NAME;
647
    }
648

    
649
    @Override
650
    public Object getValue(EditingServiceParameter parameter) {
651
        return values != null ? values.get(parameter) : null;
652
    }
653

    
654
    public Object getValue(EditingServiceParameter parameter, EditingServiceParameter.TYPE type) {
655
        if(values == null){
656
            return null;
657
        }
658
        if(parameter == pivotPointParameter){
659
            if (type == TYPE.OPTION) {
660
                return center;
661
            }
662
        }
663
        return values != null ? values.get(parameter) : null;
664
    }
665

    
666
    @Override
667
    public boolean isEnabled(EditingServiceParameter parameter) {
668
        return true;
669
    }
670

    
671

    
672
}