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.duplicate / src / main / java / org / gvsig / vectorediting / lib / prov / duplicate / PasteFromClipboardEditingProvider.java @ 4237

History | View | Annotate | Download (17.9 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.duplicate;
25

    
26
import java.awt.geom.AffineTransform;
27
import java.util.ArrayList;
28
import java.util.HashMap;
29
import java.util.Iterator;
30
import java.util.List;
31
import java.util.Map;
32
import java.util.function.Predicate;
33
import java.util.logging.Level;
34
import java.util.logging.Logger;
35
import org.apache.commons.collections4.CollectionUtils;
36
import org.gvsig.fmap.dal.exception.DataException;
37
import org.gvsig.fmap.dal.feature.EditableFeature;
38
import org.gvsig.fmap.dal.feature.Feature;
39
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
40
import org.gvsig.fmap.dal.feature.FeatureSelection;
41
import org.gvsig.fmap.dal.feature.FeatureStore;
42
import org.gvsig.fmap.geom.Geometry;
43
import org.gvsig.fmap.geom.GeometryLocator;
44
import org.gvsig.fmap.geom.GeometryManager;
45
import org.gvsig.fmap.geom.aggregate.Aggregate;
46
import org.gvsig.fmap.geom.aggregate.MultiCurve;
47
import org.gvsig.fmap.geom.aggregate.MultiPoint;
48
import org.gvsig.fmap.geom.aggregate.MultiSurface;
49
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
50
import org.gvsig.fmap.geom.operation.GeometryOperationException;
51
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
52
import org.gvsig.fmap.geom.primitive.Curve;
53
import org.gvsig.fmap.geom.primitive.Envelope;
54
import org.gvsig.fmap.geom.primitive.Point;
55
import org.gvsig.fmap.geom.primitive.Surface;
56
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
57
import org.gvsig.tools.ToolsLocator;
58
import org.gvsig.tools.dataTypes.DataTypes;
59
import org.gvsig.tools.dynobject.DynObject;
60
import org.gvsig.tools.i18n.I18nManager;
61
import org.gvsig.tools.service.spi.ProviderServices;
62
import org.gvsig.tools.swing.api.ToolsSwingLocator;
63
import org.gvsig.vectorediting.lib.api.DrawingStatus;
64
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
65
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
66
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
67
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
68
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
69
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
70
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
71
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
72
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
73
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
74
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameterOptions;
75
import org.gvsig.vectorediting.lib.spi.EditingProvider;
76
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
77
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
78
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
79
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
80

    
81
/**
82
 * @author gvSIG Team
83
 *
84
 */
85
@SuppressWarnings("UseSpecificCatch")
86
public class PasteFromClipboardEditingProvider extends AbstractEditingProvider implements
87
        EditingProvider {
88

    
89
    private final EditingServiceParameter clipboard;
90

    
91
    private final EditingServiceParameter location;
92

    
93
    private final EditingServiceParameter copyAlphanumericAttributes;
94

    
95
    private final FeatureStore featureStore;
96

    
97
    private Map<EditingServiceParameter, Object> values;
98

    
99
    private Point firstPoint;
100
    private final java.util.Observer clipboardObserver;
101

    
102
    /**
103
     * Default constructor.
104
     *
105
     * @param services available services for this provider
106
     * @param parameters of this provider
107
     */
108
    public PasteFromClipboardEditingProvider(DynObject parameters,
109
            ProviderServices services) {
110
        super(services);
111

    
112
        I18nManager i18nManager = ToolsLocator.getI18nManager();
113
//        Map<String, String> options = new LinkedHashMap<>();
114
//        options.put(i18nManager.getTranslation("_yes"), "true");
115
//        options.put(i18nManager.getTranslation("_no"), "false");
116
        EditingProviderServices editingProviderServices = (EditingProviderServices) getProviderServices();
117

    
118
        this.featureStore
119
                = (FeatureStore) parameters
120
                        .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
121

    
122
        this.clipboard
123
                = new DefaultEditingServiceParameter("clipboard", "_Clipboard",
124
                        TYPE.CLIPBOARD);
125

    
126
        String locationMsg = "_Press_[ENTER]_to_place_the_geometries_in_the_original_position_or_provide_a_new_location";
127
        this.location
128
                = new DefaultEditingServiceParameter("location", i18nManager.getTranslation(locationMsg),
129
                        TYPE.POSITION);
130

    
131
        DefaultEditingServiceParameterOptions copyAlphanumericAttributesOptions = new DefaultEditingServiceParameterOptions()
132
                .add("_Copy_alphanumeric_attributes", true, i18nManager.getTranslation("_yes"))
133
                .add("_Dont_copy_alphanumeric_attributes", false, i18nManager.getTranslation("_no"));
134

    
135
        String copyAlphanumericAttributesConsoleMsg
136
                = editingProviderServices.makeConsoleMessage(
137
                        "_Copy_alphanumeric_attributes", copyAlphanumericAttributesOptions);
138

    
139
        this.copyAlphanumericAttributes
140
                = new DefaultEditingServiceParameter(
141
                        "copyAlphanumericAttributes",
142
                        copyAlphanumericAttributesConsoleMsg,
143
                        copyAlphanumericAttributesOptions,
144
                        i18nManager.getTranslation("_yes"),
145
                        true,
146
                        TYPE.OPTION
147
                ).setDataType(DataTypes.BOOLEAN);
148

    
149
        this.clipboardObserver = (java.util.Observable o, Object arg) -> {
150
            doClipboardChanged();
151
        };
152
    }
153

    
154
    @Override
155
    public boolean isEnabled(EditingServiceParameter parameter) {
156
        return true;
157
    }
158

    
159
    private void doClipboardChanged() {
160
        EditingProviderManager manager = EditingProviderLocator.getProviderManager();
161
        List<EditableFeature> featuresFromClipBoard = manager.getFeaturesFromClipboard(
162
                this.getProviderServices(),
163
                featureStore
164
        );
165
        if (CollectionUtils.isNotEmpty(featuresFromClipBoard)) {
166
            try {
167
                setValue(clipboard, featuresFromClipBoard);
168
            } catch (InvalidEntryException ex) {
169
            }
170
        }
171
    }
172

    
173
    @Override
174
    public EditingServiceParameter next() {
175
        if (values.get(clipboard) == null) {
176
            return clipboard;
177
        } else if (values.get(location) == null) {
178
            return location;
179
//        } else if (values.get(copyAlphanumericAttributes) == null) {
180
//            return copyAlphanumericAttributes;
181
        }
182
        return null;
183
    }
184

    
185
    @Override
186
    public DrawingStatus getDrawingStatus(Point mousePosition)
187
            throws DrawServiceException {
188
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
189

    
190
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
191
        EditingProviderManager editingProviderManager
192
                = EditingProviderLocator.getProviderManager();
193
        EditingProviderServices editingProviderServices = getProviderServices();
194
        int subtype;
195
        try {
196
            subtype = editingProviderServices.getSubType(featureStore);
197
        } catch (DataException e2) {
198
            throw new DrawServiceException(e2);
199
        }
200
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
201
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
202
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
203

    
204
        ISymbol previewSymbol = this.getPreviewSymbol();
205

    
206
        if (values != null) {
207

    
208
            List<Feature> features = (List<Feature>) values.get(clipboard);
209
            if (features != null && firstPoint != null) {
210
                try {
211
                    AffineTransform at
212
                            = getMoveAffineTransform(firstPoint,
213
                                    mousePosition);
214
                    Iterator<Feature> it = features.iterator();
215

    
216
                    while (it.hasNext()) {
217
                        Feature feature = (Feature) it.next();
218
                        Geometry geometry = feature.getDefaultGeometry().cloneGeometry();
219

    
220
                        ISymbol featurePreviewSymbol = this.getPreviewSymbol(feature);
221
                        if (featurePreviewSymbol == null) {
222
                            featurePreviewSymbol = previewSymbol;
223
                        }
224

    
225
                        geometry.transform(at);
226
                        ISymbol symbol = null;
227
                        if (geometry instanceof Curve || geometry instanceof MultiCurve) {
228
                            symbol = lineSymbolEditing;
229
                        } else if (geometry instanceof Surface || geometry instanceof MultiSurface) {
230
                            symbol = polygonSymbolEditing;
231
                        } else if (geometry instanceof Point || geometry instanceof MultiPoint) {
232
                            symbol = auxiliaryPointSymbolEditing;
233
                        }
234
                        if (geometry instanceof Aggregate) {
235
                            int primitivesNumber = ((Aggregate) geometry).getPrimitivesNumber();
236
                            for (int i = 0; i < primitivesNumber; i++) {
237
                                drawingStatus.addStatus(((Aggregate) geometry).getPrimitiveAt(i), symbol, "");
238
                                drawingStatus.addStatus(((Aggregate) geometry).getPrimitiveAt(i), featurePreviewSymbol, "");
239
                            }
240
                        } else {
241
                            drawingStatus.addStatus(geometry, symbol, "");
242
                            drawingStatus.addStatus(geometry, featurePreviewSymbol, "");
243
                        }
244
                    }
245
                } catch (Exception ex) {
246
                    Logger.getLogger(PasteFromClipboardEditingProvider.class.getName()).log(Level.SEVERE, null, ex);
247
                }
248
            }
249

    
250
        }
251
        return drawingStatus;
252
    }
253

    
254
    private AffineTransform getMoveAffineTransform(Point p1, Point p2)
255
            throws GeometryOperationNotSupportedException,
256
            GeometryOperationException {
257

    
258
        AffineTransform translate
259
                = AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
260
                        p2.getY() - p1.getY());
261

    
262
        return translate;
263
    }
264

    
265
    @Override
266
    public void stop() throws StopServiceException {
267
        if (values != null) {
268
            values.clear();
269
        }
270
        ToolsSwingLocator.getToolsSwingManager().deleteClipboardObserver(this.clipboardObserver);
271
    }
272

    
273
    @Override
274
    public List<EditingServiceParameter> getParameters() {
275
        List<EditingServiceParameter> parameters
276
                = new ArrayList<>();
277
        parameters.add(clipboard);
278
        parameters.add(location);
279
        parameters.add(copyAlphanumericAttributes);
280
        return parameters;
281
    }
282

    
283
    @Override
284
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
285
        validateAndInsertValue(parameter, value);
286
    }
287

    
288
    @Override
289
    public void setValue(Object value) throws InvalidEntryException {
290
        EditingServiceParameter parameter = next();
291
        validateAndInsertValue(parameter, value);
292
    }
293

    
294
    private void validateAndInsertValue(EditingServiceParameter parameter,
295
            Object value) throws InvalidEntryException {
296

    
297
        if (parameter == clipboard) {
298
            if (value instanceof List) {
299
                List<Feature> features = (List<Feature>) value;
300
                if (CollectionUtils.isNotEmpty(features)) {
301
                    Iterator<Feature> it = features.iterator();
302
                    values.put(clipboard, features);
303
                    try {
304
                        Envelope envelope = getEnvelope(features);
305
                        firstPoint = null;
306
                        if (envelope != null) {
307
                            firstPoint = envelope.getLowerCorner();
308
                        }
309
                    } catch (CreateEnvelopeException ex) {
310

    
311
                    }
312
                }
313
            }
314

    
315
            if (values.get(clipboard) == null && value instanceof FeatureSelection) {
316
                if (((FeatureSelection) value).getSelectedCount() > 0) {
317
                    values.put(clipboard, value);
318
                }
319
            }
320
        } else if (parameter == location) {
321
            if (value == null) {
322
                values.put(parameter, firstPoint);
323
            }
324
            if (value instanceof Point) {
325
                values.put(parameter, value);
326
            }
327
        } else if (parameter == copyAlphanumericAttributes) {
328
            values.put(parameter, parameter.getOptions2().getValue(value, parameter.getDefaultValue()));
329
            
330
//            if (value instanceof String) {
331
//                Boolean copy = BooleanUtils.toBooleanObject((String) value);
332
//                if (copy == null) {
333
//                    I18nManager i18nManager = ToolsLocator.getI18nManager();
334
//                    try {
335
//                        copy = BooleanUtils.toBooleanObject(
336
//                                (String) value,
337
//                                i18nManager.getTranslation("_yes"),
338
//                                i18nManager.getTranslation("_no"),
339
//                                ""
340
//                        );
341
//                    } catch (Exception e) {
342
//                        copy = Boolean.FALSE;
343
//                    }
344
//                }
345
//                values.put(parameter, copy == null ? false : copy);
346
//            }
347
        }
348
    }
349

    
350
    @Override
351
    public Geometry finish() throws FinishServiceException {
352
        return null;
353
    }
354

    
355
    @Override
356
    public void finishAndStore() throws FinishServiceException {
357
        if (values != null) {
358

    
359
            final Point p2 = (Point) values.get(location);
360

    
361
            List<EditableFeature> features = (List<EditableFeature>) values.get(clipboard);
362
            Boolean copyAttributes = (Boolean) values.get(copyAlphanumericAttributes);
363

    
364
            try {
365

    
366
                Iterator<EditableFeature> it = features.iterator();
367
                EditingProviderServices editingProviderServices = getProviderServices();
368

    
369
                AffineTransform at
370
                        = getMoveAffineTransform(firstPoint, p2);
371
                while (it.hasNext()) {
372
                    EditableFeature editableFeature = it.next();
373
                    Geometry geometry = editableFeature.getDefaultGeometry().cloneGeometry();
374

    
375
                    geometry.transform(at);
376
                    EditableFeature targetEditableFeature;
377
                    if (copyAttributes == null || copyAttributes) {
378
                        targetEditableFeature = editableFeature;
379
                    } else {
380
                        targetEditableFeature = this.getProviderServices().createNewFeature(featureStore);
381
                    }
382

    
383
                    targetEditableFeature.setDefaultGeometry(geometry);
384
                    
385
                    // Rellenamos los valores nulos con los valores por defecto de edicion.
386
                    EditableFeature defaultValues = this.getProviderServices().getDefaultFeatureValues();
387
                    targetEditableFeature.copyFrom(
388
                            defaultValues, 
389
                            (FeatureAttributeDescriptor t) -> editableFeature.isNull(t.getName())
390
                    );
391
                    editingProviderServices.insertFeatureIntoFeatureStore(targetEditableFeature, featureStore);
392
                }
393

    
394
                featureStore.getFeatureSelection().deselectAll();
395

    
396
            } catch (Exception e) {
397
                throw new FinishServiceException(e);
398
            }
399

    
400
        }
401
    }
402

    
403
    @Override
404
    public void start() throws StartServiceException, InvalidEntryException {
405
        values = new HashMap<>();
406

    
407
        EditingProviderManager manager = EditingProviderLocator.getProviderManager();
408
        List<EditableFeature> featuresFromClipBoard = manager.getFeaturesFromClipboard(this.getProviderServices(), featureStore);
409
        if (CollectionUtils.isNotEmpty(featuresFromClipBoard)) {
410
            try {
411
                setValue(featuresFromClipBoard);
412
            } catch (InvalidEntryException ex) {
413
            }
414
        }
415
        if (getValue(copyAlphanumericAttributes) == null) {
416
            setValue(copyAlphanumericAttributes, "true");
417
        }
418
        ToolsSwingLocator.getToolsSwingManager().addClipboardObserver(this.clipboardObserver);
419
    }
420

    
421
    @Override
422
    public String getName() {
423
        return PasteFromClipboardEditingProviderFactory.PROVIDER_NAME;
424
    }
425

    
426
    @Override
427
    public Object getValue(EditingServiceParameter parameter) {
428
        return values != null ? values.get(parameter) : null;
429
    }
430

    
431
    private Envelope getEnvelope(List<Feature> features) throws CreateEnvelopeException {
432
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
433
        Envelope envelope = geomManager.createEnvelope(GEOM2D);
434
        for (Feature feature : features) {
435
            envelope.add(feature.getDefaultGeometry());
436
        }
437
        return envelope;
438
    }
439

    
440
}