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

History | View | Annotate | Download (15.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.LinkedHashMap;
31
import java.util.List;
32
import java.util.Map;
33
import java.util.Observable;
34
import java.util.logging.Level;
35
import java.util.logging.Logger;
36
import org.apache.commons.collections4.CollectionUtils;
37
import org.apache.commons.lang.BooleanUtils;
38
import org.gvsig.fmap.dal.exception.DataException;
39
import org.gvsig.fmap.dal.feature.EditableFeature;
40
import org.gvsig.fmap.dal.feature.Feature;
41
import org.gvsig.fmap.dal.feature.FeatureSelection;
42
import org.gvsig.fmap.dal.feature.FeatureStore;
43
import org.gvsig.fmap.geom.Geometry;
44
import org.gvsig.fmap.geom.GeometryLocator;
45
import org.gvsig.fmap.geom.GeometryManager;
46
import org.gvsig.fmap.geom.aggregate.Aggregate;
47
import org.gvsig.fmap.geom.aggregate.MultiCurve;
48
import org.gvsig.fmap.geom.aggregate.MultiPoint;
49
import org.gvsig.fmap.geom.aggregate.MultiSurface;
50
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
51
import org.gvsig.fmap.geom.operation.GeometryOperationException;
52
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
53
import org.gvsig.fmap.geom.primitive.Curve;
54
import org.gvsig.fmap.geom.primitive.Envelope;
55
import org.gvsig.fmap.geom.primitive.Point;
56
import org.gvsig.fmap.geom.primitive.Surface;
57
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
58
import org.gvsig.tools.ToolsLocator;
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.EditingProvider;
75
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
76
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
77
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
78
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
79

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

    
88
    private final EditingServiceParameter clipboard;
89

    
90
    private final EditingServiceParameter location;
91

    
92
    private final EditingServiceParameter copyAlphanumericAttributes;
93

    
94
    private final FeatureStore featureStore;
95

    
96
    private Map<EditingServiceParameter, Object> values;
97
    
98
    private Point firstPoint;
99
    private final java.util.Observer clipboardObserver;
100

    
101
    /**
102
     * Default constructor.
103
     *
104
     * @param services available services for this provider
105
     * @param parameters of this provider
106
     */
107
    public PasteFromClipboardEditingProvider(DynObject parameters,
108
            ProviderServices services) {
109
        super(services);
110
        
111
        I18nManager i18nManager = ToolsLocator.getI18nManager();
112
        Map<String, String> options = new LinkedHashMap<>();
113
        options.put(i18nManager.getTranslation("_yes"), "true");
114
        options.put(i18nManager.getTranslation("_no"), "false");
115

    
116

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

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

    
125
        this.location
126
                = new DefaultEditingServiceParameter("location", "_Location",
127
                        TYPE.POSITION);
128

    
129
        this.copyAlphanumericAttributes =
130
                new DefaultEditingServiceParameter(
131
                    "copyAlphanumericAttributes", 
132
                    "_Copy_alphanumeric_attributes", 
133
                    options,
134
                    i18nManager.getTranslation("_yes"),
135
                    true,
136
                    TYPE.OPTION
137
                );
138
        
139
        this.clipboardObserver = (java.util.Observable o, Object arg) -> {
140
            doClipboardChanged();
141
        };
142
    }
143

    
144
    @Override
145
    public boolean isEnabled(EditingServiceParameter parameter) {
146
        return true;
147
    }
148
    
149
    private void doClipboardChanged() {
150
        EditingProviderManager manager = EditingProviderLocator.getProviderManager();
151
        List<EditableFeature> featuresFromClipBoard = manager.getFeaturesFromClipboard(
152
                this.getProviderServices(), 
153
                featureStore
154
        );
155
        if (CollectionUtils.isNotEmpty(featuresFromClipBoard)) {
156
            try {
157
                setValue(clipboard, featuresFromClipBoard);
158
            } catch (InvalidEntryException ex) {
159
            }
160
        }
161
    }
162

    
163
    @Override
164
    public EditingServiceParameter next() {
165
        if (values.get(clipboard) == null) {
166
            return clipboard;
167
        } else if (values.get(location) == null) {
168
            return location;
169
//        } else if (values.get(copyAlphanumericAttributes) == null) {
170
//            return copyAlphanumericAttributes;
171
        }
172
        return null;
173
    }
174

    
175
    @Override
176
    public DrawingStatus getDrawingStatus(Point mousePosition)
177
            throws DrawServiceException {
178
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
179

    
180
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
181
        EditingProviderManager editingProviderManager
182
                = EditingProviderLocator.getProviderManager();
183
        EditingProviderServices editingProviderServices = getProviderServices();
184
        int subtype;
185
        try {
186
            subtype = editingProviderServices.getSubType(featureStore);
187
        } catch (DataException e2) {
188
            throw new DrawServiceException(e2);
189
        }
190
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
191
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
192
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
193

    
194
        if (values != null) {
195

    
196
            List<Feature> features;
197
            features = (List<Feature>) values.get(clipboard);
198
            if (features != null && firstPoint != null) {
199
                try {
200
                    AffineTransform at
201
                            = getMoveAffineTransform(firstPoint,
202
                                    mousePosition);
203
                    Iterator<Feature> it = features.iterator();
204

    
205
                    while (it.hasNext()) {
206
                        Geometry geometry = ((Feature) it.next()).getDefaultGeometry().cloneGeometry();
207

    
208
                        geometry.transform(at);
209
                        ISymbol symbol = null;
210
                        if (geometry instanceof Curve || geometry instanceof MultiCurve) {
211
                            symbol = lineSymbolEditing;
212
                        } else if (geometry instanceof Surface || geometry instanceof MultiSurface) {
213
                            symbol = polygonSymbolEditing;
214
                        } else if (geometry instanceof Point || geometry instanceof MultiPoint) {
215
                            symbol = auxiliaryPointSymbolEditing;
216
                        }
217
                        if (geometry instanceof Aggregate) {
218
                            int primitivesNumber = ((Aggregate) geometry).getPrimitivesNumber();
219
                            for (int i = 0; i < primitivesNumber; i++) {
220
                                drawingStatus.addStatus(((Aggregate) geometry).getPrimitiveAt(i), symbol, "");
221
                            }
222
                        } else {
223
                            drawingStatus.addStatus(geometry, symbol, "");
224
                        }
225
                    }
226
                } catch (Exception ex) {
227
                    Logger.getLogger(PasteFromClipboardEditingProvider.class.getName()).log(Level.SEVERE, null, ex);
228
                }
229
            }
230

    
231
        }
232
        return drawingStatus;
233
    }
234

    
235
    private AffineTransform getMoveAffineTransform(Point p1, Point p2)
236
            throws GeometryOperationNotSupportedException,
237
            GeometryOperationException {
238

    
239
        AffineTransform translate
240
                = AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
241
                        p2.getY() - p1.getY());
242

    
243
        return translate;
244
    }
245

    
246
    @Override
247
    public void stop() throws StopServiceException {
248
        if (values != null) {
249
            values.clear();
250
        }
251
        ToolsSwingLocator.getToolsSwingManager().deleteClipboardObserver(this.clipboardObserver);        
252
    }
253

    
254
    @Override
255
    public List<EditingServiceParameter> getParameters() {
256
        List<EditingServiceParameter> parameters
257
                = new ArrayList<>();
258
        parameters.add(clipboard);
259
        parameters.add(location);
260
        parameters.add(copyAlphanumericAttributes);
261
        return parameters;
262
    }
263

    
264
    @Override
265
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
266
        validateAndInsertValue(parameter, value);
267
    }
268

    
269
    @Override
270
    public void setValue(Object value) throws InvalidEntryException {
271
        EditingServiceParameter parameter = next();
272
        validateAndInsertValue(parameter, value);
273
    }
274

    
275
    private void validateAndInsertValue(EditingServiceParameter parameter,
276
            Object value) {
277

    
278
        if (parameter == clipboard) {
279
            if (value instanceof List) {
280
                List<Feature> features = (List<Feature>) value;
281
                if (CollectionUtils.isNotEmpty(features)) {
282
                    Iterator<Feature> it = features.iterator();
283
                    values.put(clipboard, features);
284
                    try {
285
                        Envelope envelope = getEnvelope(features);
286
                        firstPoint = null;
287
                        if (envelope != null) {
288
                            firstPoint = envelope.getLowerCorner();
289
                        }
290
                    } catch (CreateEnvelopeException ex) {
291

    
292
                    }
293
                }
294
            }
295

    
296
            if (values.get(clipboard) == null && value instanceof FeatureSelection) {
297
                if (((FeatureSelection) value).getSelectedCount() > 0) {
298
                    values.put(clipboard, value);
299
                }
300
            }
301
        } else if (parameter == location) {
302
            if (value == null) {
303
                values.put(parameter, firstPoint);
304
            }
305
            if (value instanceof Point) {
306
                values.put(parameter, value);
307
            }
308
        } else if (parameter == copyAlphanumericAttributes) {
309
            if (value instanceof String) {
310
                Boolean copy = BooleanUtils.toBooleanObject((String)value);
311
                if(copy == null){
312
                    I18nManager i18nManager = ToolsLocator.getI18nManager();
313
                    try {
314
                        copy = BooleanUtils.toBooleanObject(
315
                                (String)value, 
316
                                i18nManager.getTranslation("_yes"), 
317
                                i18nManager.getTranslation("_no"), 
318
                                "" 
319
                        );
320
                    } catch (Exception e) {
321
                        copy = Boolean.FALSE;
322
                    }
323
                }
324
                values.put(parameter, copy == null ? false : copy);
325
            }
326
        }
327
    }
328

    
329
    @Override
330
    public Geometry finish() throws FinishServiceException {
331
        return null;
332
    }
333

    
334
    @Override
335
    public void finishAndStore() throws FinishServiceException {
336
        if (values != null) {
337

    
338
            final Point p2 = (Point) values.get(location);
339

    
340
            List<EditableFeature> features = (List<EditableFeature>) values.get(clipboard);
341
            Boolean copyAttributes = (Boolean) values.get(copyAlphanumericAttributes);
342

    
343
            try {
344

    
345
                Iterator<EditableFeature> it = features.iterator();
346
                EditingProviderServices editingProviderServices = getProviderServices();
347

    
348
                AffineTransform at
349
                        = getMoveAffineTransform(firstPoint, p2);
350
                while (it.hasNext()) {
351
                    EditableFeature editableFeature = it.next();
352
                    Geometry geometry = editableFeature.getDefaultGeometry().cloneGeometry();
353

    
354
                    geometry.transform(at);
355
                    EditableFeature targetEditableFeature;
356
                    if(copyAttributes == null || copyAttributes){
357
                        targetEditableFeature = editableFeature;
358
                    } else {
359
                        targetEditableFeature = this.getProviderServices().createNewFeature(featureStore);
360
                    }
361
                    
362
                    targetEditableFeature.setDefaultGeometry(geometry);
363
                    editingProviderServices.insertFeatureIntoFeatureStore(targetEditableFeature, featureStore);
364
                }
365

    
366
                featureStore.getFeatureSelection().deselectAll();
367

    
368
            } catch (Exception e) {
369
                throw new FinishServiceException(e);
370
            }
371

    
372
        }
373
    }
374

    
375
    @Override
376
    public void start() throws StartServiceException, InvalidEntryException {
377
        values = new HashMap<>();
378

    
379
        EditingProviderManager manager = EditingProviderLocator.getProviderManager();
380
        List<EditableFeature> featuresFromClipBoard = manager.getFeaturesFromClipboard(this.getProviderServices(), featureStore);
381
        if (CollectionUtils.isNotEmpty(featuresFromClipBoard)) {
382
            try {
383
                setValue(featuresFromClipBoard);
384
            } catch (InvalidEntryException ex) {
385
            }
386
        }
387
        if(getValue(copyAlphanumericAttributes) == null){
388
            setValue(copyAlphanumericAttributes, "true");
389
        }
390
        ToolsSwingLocator.getToolsSwingManager().addClipboardObserver(this.clipboardObserver);
391
    }
392

    
393
    @Override
394
    public String getName() {
395
        return PasteFromClipboardEditingProviderFactory.PROVIDER_NAME;
396
    }
397

    
398
    @Override
399
    public Object getValue(EditingServiceParameter parameter) {
400
        return values != null ? values.get(parameter) : null;
401
    }
402

    
403
    private Envelope getEnvelope(List<Feature> features) throws CreateEnvelopeException {
404
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
405
        Envelope envelope = geomManager.createEnvelope(GEOM2D);
406
        for (Feature feature : features) {
407
            envelope.add(feature.getDefaultGeometry());
408
        }
409
        return envelope;
410
    }
411

    
412
}