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

History | View | Annotate | Download (14.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.logging.Level;
34
import java.util.logging.Logger;
35
import org.apache.commons.collections4.CollectionUtils;
36
import org.apache.commons.lang.BooleanUtils;
37
import org.gvsig.fmap.dal.exception.DataException;
38
import org.gvsig.fmap.dal.feature.EditableFeature;
39
import org.gvsig.fmap.dal.feature.Feature;
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.dynobject.DynObject;
59
import org.gvsig.tools.i18n.I18nManager;
60
import org.gvsig.tools.service.spi.ProviderServices;
61
import org.gvsig.vectorediting.lib.api.DrawingStatus;
62
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
63
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
64
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
65
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
66
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
67
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
68
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
69
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
70
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
71
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
72
import org.gvsig.vectorediting.lib.spi.EditingProvider;
73
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
74
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
75
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
76
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
77

    
78
/**
79
 * @author llmarques
80
 *
81
 */
82
public class PasteFromClipboardEditingProvider extends AbstractEditingProvider implements
83
        EditingProvider {
84

    
85
    private final EditingServiceParameter clipboard;
86

    
87
    private final EditingServiceParameter location;
88

    
89
    private final EditingServiceParameter copyAlphanumericAttributes;
90

    
91
    private final FeatureStore featureStore;
92

    
93
    private Map<EditingServiceParameter, Object> values;
94
    private Point firstPoint;
95

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

    
111

    
112
        this.featureStore
113
                = (FeatureStore) parameters
114
                        .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
115

    
116
        this.clipboard
117
                = new DefaultEditingServiceParameter("clipboard", "_Clipboard",
118
                        TYPE.CLIPBOARD);
119

    
120
        this.location
121
                = new DefaultEditingServiceParameter("location", "_Location",
122
                        TYPE.POSITION);
123

    
124
        this.copyAlphanumericAttributes =
125
                new DefaultEditingServiceParameter(
126
                    "copyAlphanumericAttributes", 
127
                    "_Copy_alphanumeric_attributes", 
128
                    options,
129
                    i18nManager.getTranslation("_yes"),
130
                    true,
131
                    TYPE.OPTION
132
                );
133
    }
134

    
135
    @Override
136
    public boolean isEnabled(EditingServiceParameter parameter) {
137
        return true;
138
    }
139
    
140
    
141

    
142
    @Override
143
    public EditingServiceParameter next() {
144
        if (values.get(clipboard) == null) {
145
            return clipboard;
146
        } else if (values.get(location) == null) {
147
            return location;
148
//        } else if (values.get(copyAlphanumericAttributes) == null) {
149
//            return copyAlphanumericAttributes;
150
        }
151
        return null;
152
    }
153

    
154
    @Override
155
    public DrawingStatus getDrawingStatus(Point mousePosition)
156
            throws DrawServiceException {
157
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
158

    
159
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
160
        EditingProviderManager editingProviderManager
161
                = EditingProviderLocator.getProviderManager();
162
        EditingProviderServices editingProviderServices = getProviderServices();
163
        int subtype;
164
        try {
165
            subtype = editingProviderServices.getSubType(featureStore);
166
        } catch (DataException e2) {
167
            throw new DrawServiceException(e2);
168
        }
169
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
170
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
171
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
172

    
173
        if (values != null) {
174

    
175
            List<Feature> features = null;
176
            features = (List<Feature>) values.get(clipboard);
177
            if (features != null && firstPoint != null) {
178
                try {
179
                    AffineTransform at
180
                            = getMoveAffineTransform(firstPoint,
181
                                    mousePosition);
182
                    Iterator<Feature> it = features.iterator();
183

    
184
                    while (it.hasNext()) {
185
                        Geometry geometry = ((Feature) it.next()).getDefaultGeometry().cloneGeometry();
186

    
187
                        geometry.transform(at);
188
                        ISymbol symbol = null;
189
                        if (geometry instanceof Curve || geometry instanceof MultiCurve) {
190
                            symbol = lineSymbolEditing;
191
                        } else if (geometry instanceof Surface || geometry instanceof MultiSurface) {
192
                            symbol = polygonSymbolEditing;
193
                        } else if (geometry instanceof Point || geometry instanceof MultiPoint) {
194
                            symbol = auxiliaryPointSymbolEditing;
195
                        }
196
                        if (geometry instanceof Aggregate) {
197
                            int primitivesNumber = ((Aggregate) geometry).getPrimitivesNumber();
198
                            for (int i = 0; i < primitivesNumber; i++) {
199
                                drawingStatus.addStatus(((Aggregate) geometry).getPrimitiveAt(i), symbol, "");
200
                            }
201
                        } else {
202
                            drawingStatus.addStatus(geometry, symbol, "");
203
                        }
204
                    }
205
                } catch (Exception ex) {
206
                    Logger.getLogger(PasteFromClipboardEditingProvider.class.getName()).log(Level.SEVERE, null, ex);
207
                }
208
            }
209

    
210
        }
211
        return drawingStatus;
212
    }
213

    
214
    private AffineTransform getMoveAffineTransform(Point p1, Point p2)
215
            throws GeometryOperationNotSupportedException,
216
            GeometryOperationException {
217

    
218
        AffineTransform translate
219
                = AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
220
                        p2.getY() - p1.getY());
221

    
222
        return translate;
223
    }
224

    
225
    @Override
226
    public void stop() throws StopServiceException {
227
        if (values != null) {
228
            values.clear();
229
        }
230
    }
231

    
232
    @Override
233
    public List<EditingServiceParameter> getParameters() {
234
        List<EditingServiceParameter> parameters
235
                = new ArrayList<>();
236
        parameters.add(clipboard);
237
        parameters.add(location);
238
        parameters.add(copyAlphanumericAttributes);
239
        return parameters;
240
    }
241

    
242
    @Override
243
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
244
        validateAndInsertValue(parameter, value);
245
    }
246

    
247
    @Override
248
    public void setValue(Object value) throws InvalidEntryException {
249
        EditingServiceParameter parameter = next();
250
        validateAndInsertValue(parameter, value);
251
    }
252

    
253
    private void validateAndInsertValue(EditingServiceParameter parameter,
254
            Object value) {
255

    
256
        if (parameter == clipboard) {
257
            if (value instanceof List) {
258
                List<Feature> features = (List<Feature>) value;
259
                if (CollectionUtils.isNotEmpty(features)) {
260
                    Iterator<Feature> it = features.iterator();
261
                    values.put(clipboard, features);
262
                    try {
263
                        Envelope envelope = getEnvelope(features);
264
                        firstPoint = null;
265
                        if (envelope != null) {
266
                            firstPoint = envelope.getLowerCorner();
267
                        }
268
                    } catch (CreateEnvelopeException ex) {
269

    
270
                    }
271
                }
272
            }
273

    
274
            if (values.get(clipboard) == null && value instanceof FeatureSelection) {
275
                if (((FeatureSelection) value).getSelectedCount() > 0) {
276
                    values.put(clipboard, value);
277
                }
278
            }
279
        } else if (parameter == location) {
280
            if (value == null) {
281
                values.put(parameter, firstPoint);
282
            }
283
            if (value instanceof Point) {
284
                values.put(parameter, value);
285
            }
286
        } else if (parameter == copyAlphanumericAttributes) {
287
            if (value instanceof String) {
288
                Boolean copy = BooleanUtils.toBooleanObject((String)value);
289
                if(copy == null){
290
                    I18nManager i18nManager = ToolsLocator.getI18nManager();
291
                    try {
292
                        copy = BooleanUtils.toBooleanObject(
293
                                (String)value, 
294
                                i18nManager.getTranslation("_yes"), 
295
                                i18nManager.getTranslation("_no"), 
296
                                "" 
297
                        );
298
                    } catch (Exception e) {
299
                        copy = Boolean.FALSE;
300
                    }
301
                }
302
                values.put(parameter, copy == null ? false : copy);
303
            }
304
        }
305
    }
306

    
307
    @Override
308
    public Geometry finish() throws FinishServiceException {
309
        return null;
310
    }
311

    
312
    @Override
313
    public void finishAndStore() throws FinishServiceException {
314
        if (values != null) {
315

    
316
            final Point p2 = (Point) values.get(location);
317

    
318
            List<EditableFeature> features = (List<EditableFeature>) values.get(clipboard);
319
            Boolean copyAttributes = (Boolean) values.get(copyAlphanumericAttributes);
320

    
321
            try {
322

    
323
                Iterator<EditableFeature> it = features.iterator();
324
                EditingProviderServices editingProviderServices = getProviderServices();
325

    
326
                AffineTransform at
327
                        = getMoveAffineTransform(firstPoint, p2);
328
                while (it.hasNext()) {
329
                    EditableFeature editableFeature = it.next();
330
                    Geometry geometry = editableFeature.getDefaultGeometry().cloneGeometry();
331

    
332
                    geometry.transform(at);
333
                    EditableFeature targetEditableFeature = null;
334
                    if(copyAttributes == null || copyAttributes){
335
                        targetEditableFeature = editableFeature;
336
                    } else {
337
                        targetEditableFeature = this.getProviderServices().createNewFeature(featureStore);
338
                    }
339
                    
340
                    targetEditableFeature.setDefaultGeometry(geometry);
341
                    editingProviderServices.insertFeatureIntoFeatureStore(targetEditableFeature, featureStore);
342
                }
343

    
344
                featureStore.getFeatureSelection().deselectAll();
345

    
346
            } catch (Exception e) {
347
                throw new FinishServiceException(e);
348
            }
349

    
350
        }
351
    }
352

    
353
    public void start() throws StartServiceException, InvalidEntryException {
354
        values = new HashMap<>();
355

    
356
        EditingProviderManager manager = EditingProviderLocator.getProviderManager();
357
        List<EditableFeature> featuresFromClipBoard = manager.getFeaturesFromClipboard(this.getProviderServices(), featureStore);
358
        if (CollectionUtils.isNotEmpty(featuresFromClipBoard)) {
359
            try {
360
                setValue(featuresFromClipBoard);
361
            } catch (InvalidEntryException ex) {
362
            }
363
        }
364
        if(getValue(copyAlphanumericAttributes) == null){
365
            setValue(copyAlphanumericAttributes, "true");
366
        }
367
    }
368

    
369
    public String getName() {
370
        return PasteFromClipboardEditingProviderFactory.PROVIDER_NAME;
371
    }
372

    
373
    @Override
374
    public Object getValue(EditingServiceParameter parameter) {
375
        return values != null ? values.get(parameter) : null;
376
    }
377

    
378
    private Envelope getEnvelope(List<Feature> features) throws CreateEnvelopeException {
379
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
380
        Envelope envelope = geomManager.createEnvelope(GEOM2D);
381
        for (Feature feature : features) {
382
            envelope.add(feature.getDefaultGeometry());
383
        }
384
        return envelope;
385
    }
386

    
387
}