Revision 3067 org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.lib/org.gvsig.vectorediting.lib.prov/org.gvsig.vectorediting.lib.prov.trimline/src/main/java/org/gvsig/vectorediting/lib/prov/trimline/TrimLineEditingProvider.java

View differences:

TrimLineEditingProvider.java
25 25
package org.gvsig.vectorediting.lib.prov.trimline;
26 26

  
27 27
import java.util.ArrayList;
28
import java.util.Collections;
28 29
import java.util.HashMap;
29 30
import java.util.List;
30 31
import java.util.Map;
......
51 52
import org.gvsig.fmap.geom.type.GeometryType;
52 53
import org.gvsig.fmap.mapcontext.MapContext;
53 54
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
54
import org.gvsig.tools.dispose.DisposableIterator;
55
import org.gvsig.tools.dispose.DisposeUtils;
56 55
import org.gvsig.tools.dynobject.DynObject;
57 56
import org.gvsig.tools.exception.BaseException;
58 57
import org.gvsig.tools.service.spi.ProviderServices;
......
96 95

  
97 96
    private final MapContext mapContext;
98 97

  
98
    private List<Feature> selectedFeatures;
99
    
99 100
    /**
100 101
     * Default constructor.
101 102
     *
......
156 157
                editingProviderManager.getSymbol("line-symbol-editing");
157 158

  
158 159
            try {
159
                
160
                DisposableIterator selectionIterator = selection.fastIterator();
161
                while (selectionIterator.hasNext()) {
162
                    Feature feature = (Feature) selectionIterator.next();
160
                for (Feature feature : selectedFeatures) {
163 161
                    if (feature != null) {
164 162
                        ISymbol previewSymbol = this.getPreviewSymbol(feature);
165
                        
166 163
                        Geometry geometry = feature.getDefaultGeometry();
167
                        
168 164
                        if(geometry != null && geometry.intersects(shears)) {
169 165
                            if (geometry instanceof MultiCurve) {
170 166
                                MultiCurve multiCurve = (MultiCurve) geometry;
171

  
172
                                for (int i = 0; i < multiCurve
173
                                        .getPrimitivesNumber(); i++) {
174

  
167
                                for (int i = 0; i < multiCurve.getPrimitivesNumber(); i++) {
175 168
                                    Curve curve = multiCurve.getCurveAt(i);
176
                                    MultiCurve trimmedCurve
177
                                            = trimLine(mousePosition, curve, shears);
178
                                    for (int j = 0; j < trimmedCurve
179
                                            .getPrimitivesNumber(); j++) {
169
                                    MultiCurve trimmedCurve = trimLine(mousePosition, curve, shears);
170
                                    for (int j = 0; j < trimmedCurve.getPrimitivesNumber(); j++) {
180 171
                                        final Curve primitive = trimmedCurve.getCurveAt(j);
181 172
                                        drawingStatus.addStatus(primitive, lineSymbolEditing, "");
182 173
                                        drawingStatus.addStatus(primitive, previewSymbol, "");
......
221 212
    @Override
222 213
    public void stop() throws StopServiceException {
223 214
        values.clear();
215
        this.selectedFeatures = Collections.EMPTY_LIST;
224 216
    }
225 217

  
226 218
    @Override
......
341 333

  
342 334
    @Override
343 335
    public void finishAndStore() throws FinishServiceException {
344
        
336

  
345 337
        FeatureSelection selection = (FeatureSelection) values.get(selectionParameter);
346 338
        Geometry shearsGeometry = (Geometry) values.get(geometryToTrimWithParameter);
347 339
        Point point = (Point) values.get(shearingPointParameter);
348 340

  
349 341
        if (selection != null && shearsGeometry != null && point != null) {
350
            DisposableIterator selectionIterator = null;
351 342
            try {
352
                selectionIterator = selection.fastIterator();
353
                while (selectionIterator.hasNext()) {
354
                    Feature feature = (Feature) selectionIterator.next();
355

  
343
                for (Feature feature : selectedFeatures) {
356 344
                    Geometry geometry = feature.getDefaultGeometry();
357
                    
358 345
                    EditableFeature eFeature = feature.getEditable();
359

  
360
                    if(geometry.intersects(shearsGeometry)){
346
                    if (geometry.intersects(shearsGeometry)) {
361 347
                        if (geometry instanceof Curve) {
362

  
363 348
                            Curve curveToTrim = (Curve) geometry;
364
                            MultiCurve result =
365
                                trimLine(point, curveToTrim, shearsGeometry);
349
                            MultiCurve result = trimLine(point, curveToTrim, shearsGeometry);
366 350
                            eFeature.setDefaultGeometry(result);
367 351
                            selection.update(eFeature);
368 352

  
369 353
                        } else if (geometry instanceof MultiCurve) {
370

  
371
                            int subType =
372
                                geometry.getGeometryType().getSubType();
373
                            MultiCurve trimmedMultiCurve =
374
                                createMultiCurve(subType);
354
                            int subType = geometry.getGeometryType().getSubType();
355
                            MultiCurve trimmedMultiCurve = createMultiCurve(subType);
375 356
                            MultiCurve multiCurveToTrim = (MultiCurve) geometry;
376 357

  
377 358
                            double minDistance = Double.POSITIVE_INFINITY;
378 359
                            int nearestCurveIndex = -1;
379 360

  
380
                            for (int i = 0; i < multiCurveToTrim
381
                                .getPrimitivesNumber(); i++) {
382

  
383
                                Curve primitive =
384
                                    multiCurveToTrim.getCurveAt(i);
385

  
386
                                double distance =
387
                                    primitive.distance(point);
361
                            for (int i = 0; i < multiCurveToTrim .getPrimitivesNumber(); i++) {
362
                                Curve primitive = multiCurveToTrim.getCurveAt(i);
363
                                double distance = primitive.distance(point);
388 364
                                if (distance < minDistance) {
389 365
                                    nearestCurveIndex = i;
390 366
                                    minDistance = distance;
391 367
                                }
392 368
                            }
393

  
394
                            MultiCurve result =
395
                                trimLine(point, multiCurveToTrim
396
                                    .getCurveAt(nearestCurveIndex), shearsGeometry);
397

  
369
                            MultiCurve result = trimLine(
370
                                    point,
371
                                    multiCurveToTrim.getCurveAt(nearestCurveIndex),
372
                                    shearsGeometry
373
                            );
398 374
                            for (int i = 0; i < result.getPrimitivesNumber(); i++) {
399 375
                                trimmedMultiCurve.addCurve(result.getCurveAt(i));
400 376
                            }
401

  
402
                            for (int i = 0; i < multiCurveToTrim
403
                                .getPrimitivesNumber(); i++) {
377
                            for (int i = 0; i < multiCurveToTrim.getPrimitivesNumber(); i++) {
404 378
                                if (i != nearestCurveIndex) {
405
                                    trimmedMultiCurve.addCurve(multiCurveToTrim
406
                                        .getCurveAt(i));
379
                                    trimmedMultiCurve.addCurve(
380
                                            multiCurveToTrim.getCurveAt(i)
381
                                    );
407 382
                                }
408 383
                            }
409

  
410 384
                            eFeature.setDefaultGeometry(trimmedMultiCurve);
411 385
                            selection.update(eFeature);
412

  
413 386
                        }
414 387
                    }
415
                }  
388
                }
416 389
            } catch (BaseException ex) {
417 390
                throw new FinishServiceException(ex);
418
            } finally {
419
                DisposeUtils.disposeQuietly(selectionIterator);
420 391
            }
421 392
        }
422 393
    }
......
436 407
    public void start() throws StartServiceException, InvalidEntryException {
437 408

  
438 409
        this.values = new HashMap<>();
439
        FeatureSelection selected = null;
440
        if (featureStore != null && values.get(selectionParameter) == null) {
410
        this.selectedFeatures = Collections.EMPTY_LIST;
411
        if (featureStore != null) {
412
            FeatureSelection selected = null;
441 413
            try {
442
                selected = featureStore.getFeatureSelection();
414
                selected = (FeatureSelection) featureStore.getFeatureSelection().clone();
443 415
            } catch (DataException e) {
444 416
                throw new StartServiceException(e);
417
            } catch (CloneNotSupportedException ex) {
418
                LOGGER.debug("Can't init selection",ex);
445 419
            }
446
            if (selected.getSelectedCount() > 0) {
447
                try {
448
                    setValue(selected);
449
                } catch (InvalidEntryException e) {
450
                    throw new InvalidEntryException(e);
451
                }
420
            if ((selected != null) && (selected.getSelectedCount() > 0)) {
421
                values.put(selectionParameter, selected);
422
                this.selectedFeatures = this.getSelectedFeaturesCopy(selected);
452 423
            }
453 424
        }
454

  
455 425
    }
456 426

  
457 427
    @Override

Also available in: Unified diff