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

History | View | Annotate | Download (13.7 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.logging.Level;
33
import java.util.logging.Logger;
34
import org.gvsig.fmap.dal.exception.DataException;
35
import org.gvsig.fmap.dal.feature.EditableFeature;
36
import org.gvsig.fmap.dal.feature.FeatureSelection;
37
import org.gvsig.fmap.dal.feature.FeatureStore;
38
import org.gvsig.fmap.geom.Geometry;
39
import org.gvsig.fmap.geom.GeometryLocator;
40
import org.gvsig.fmap.geom.GeometryManager;
41
import org.gvsig.fmap.geom.GeometryUtils;
42
import org.gvsig.fmap.geom.aggregate.Aggregate;
43
import org.gvsig.fmap.geom.aggregate.MultiCurve;
44
import org.gvsig.fmap.geom.aggregate.MultiPoint;
45
import org.gvsig.fmap.geom.aggregate.MultiSurface;
46
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
47
import org.gvsig.fmap.geom.operation.GeometryOperationException;
48
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
49
import org.gvsig.fmap.geom.primitive.Curve;
50
import org.gvsig.fmap.geom.primitive.Envelope;
51
import org.gvsig.fmap.geom.primitive.Point;
52
import org.gvsig.fmap.geom.primitive.Surface;
53
import org.gvsig.fmap.geom.type.GeometryType;
54
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
55
import org.gvsig.tools.dynobject.DynObject;
56
import org.gvsig.tools.service.spi.ProviderServices;
57
import org.gvsig.vectorediting.lib.api.DrawingStatus;
58
import org.gvsig.vectorediting.lib.api.EditingLocator;
59
import org.gvsig.vectorediting.lib.api.EditingManager;
60
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
61
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
62
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
63
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
64
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
65
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
66
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
67
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
68
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
69
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
70
import org.gvsig.vectorediting.lib.spi.EditingProvider;
71
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
72
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
73
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
74
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
75

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

    
83
    private final EditingServiceParameter clipboard;
84

    
85
    private final EditingServiceParameter location;
86

    
87
    private final FeatureStore featureStore;
88

    
89
    private Map<EditingServiceParameter, Object> values;
90
    private Point firstPoint;
91

    
92
    /**
93
     * Default constructor.
94
     *
95
     * @param services available services for this provider
96
     * @param parameters of this provider
97
     */
98
    public PasteFromClipboardEditingProvider(DynObject parameters,
99
            ProviderServices services) {
100
        super(services);
101

    
102
        this.featureStore
103
                = (FeatureStore) parameters
104
                        .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
105

    
106
        this.clipboard
107
                = new DefaultEditingServiceParameter("clipboard", "_Clipboard",
108
                        TYPE.CLIPBOARD);
109

    
110
        this.location
111
                = new DefaultEditingServiceParameter("location", "_Location",
112
                        TYPE.POSITION);
113
    }
114

    
115
    @Override
116
    public EditingServiceParameter next() {
117
        if (values.get(clipboard) == null) {
118
            return clipboard;
119
        } else if (values.get(location) == null) {
120
            return location;
121
        }
122
        return null;
123
    }
124

    
125
    @Override
126
    public DrawingStatus getDrawingStatus(Point mousePosition)
127
            throws DrawServiceException {
128
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
129

    
130
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
131
        EditingProviderManager editingProviderManager
132
                = EditingProviderLocator.getProviderManager();
133
        EditingProviderServices editingProviderServices
134
                = (EditingProviderServices) getProviderServices();
135
        int subtype;
136
        try {
137
            subtype = editingProviderServices.getSubType(featureStore);
138
        } catch (DataException e2) {
139
            throw new DrawServiceException(e2);
140
        }
141
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
142
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
143
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
144

    
145
        if (values != null) {
146

    
147
            List<Geometry> geometries = null;
148
            geometries = (List<Geometry>) values.get(clipboard);
149
            if (geometries != null && firstPoint != null) {
150
                try {
151
                    AffineTransform at
152
                            = getMoveAffineTransform(firstPoint,
153
                                    mousePosition);
154
                    Iterator<Geometry> it = geometries.iterator();
155

    
156
                    while (it.hasNext()) {
157
                        Geometry geometry = ((Geometry) it.next()).cloneGeometry();
158

    
159
                        geometry.transform(at);
160
                        ISymbol symbol = null;
161
                        if (geometry instanceof Curve || geometry instanceof MultiCurve) {
162
                            symbol = lineSymbolEditing;
163
                        } else if (geometry instanceof Surface || geometry instanceof MultiSurface) {
164
                            symbol = polygonSymbolEditing;
165
                        } else if (geometry instanceof Point || geometry instanceof MultiPoint) {
166
                            symbol = auxiliaryPointSymbolEditing;
167
                        }
168
                        if (geometry instanceof Aggregate) {
169
                            int primitivesNumber = ((Aggregate) geometry).getPrimitivesNumber();
170
                            for (int i = 0; i < primitivesNumber; i++) {
171
                                drawingStatus.addStatus(((Aggregate) geometry).getPrimitiveAt(i), symbol, "");
172
                            }
173
                        } else {
174
                            drawingStatus.addStatus(geometry, symbol, "");
175
                        }
176
                    }
177
                } catch (Exception ex) {
178
                    Logger.getLogger(PasteFromClipboardEditingProvider.class.getName()).log(Level.SEVERE, null, ex);
179
                }
180
            }
181

    
182
        }
183
        return drawingStatus;
184
    }
185

    
186
    private AffineTransform getMoveAffineTransform(Point p1, Point p2)
187
            throws GeometryOperationNotSupportedException,
188
            GeometryOperationException {
189

    
190
        AffineTransform translate
191
                = AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
192
                        p2.getY() - p1.getY());
193

    
194
        return translate;
195
    }
196

    
197
    @Override
198
    public void stop() throws StopServiceException {
199
        if (values != null) {
200
            values.clear();
201
        }
202
    }
203

    
204
    @Override
205
    public List<EditingServiceParameter> getParameters() {
206
        List<EditingServiceParameter> parameters
207
                = new ArrayList<>();
208
        parameters.add(clipboard);
209
        parameters.add(location);
210
        return parameters;
211
    }
212

    
213
    @Override
214
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
215
        validateAndInsertValue(parameter, value);
216
    }
217

    
218
    @Override
219
    public void setValue(Object value) throws InvalidEntryException {
220
        EditingServiceParameter parameter = next();
221
        validateAndInsertValue(parameter, value);
222
    }
223

    
224
    private void validateAndInsertValue(EditingServiceParameter parameter,
225
            Object value) {
226

    
227
        if (parameter == clipboard) {
228
            if (value instanceof List) {
229
                List<Geometry> targetGeometries = new ArrayList();
230
                List<Geometry> srcGeometries = (List<Geometry>) value;
231
                Iterator<Geometry> it = srcGeometries.iterator();
232
                while (it.hasNext()) {
233
                    Geometry geometry = it.next();
234
                    GeometryType storeGeomType = featureStore.getDefaultFeatureTypeQuietly().getDefaultGeometryAttribute().getGeomType();
235
                    if (GeometryUtils.isSubtype(storeGeomType.getType(), geometry.getGeometryType().getType())
236
                            || GeometryUtils.canAggregate(storeGeomType.getType(), geometry.getGeometryType().getType())) {
237
                        targetGeometries.add(geometry);
238
                    }
239
                }
240
                if (targetGeometries.size() > 0) {
241
                    values.put(clipboard, targetGeometries);
242
                    try {
243

    
244
                        Envelope envelope = getEnvelope(targetGeometries);
245
                        firstPoint = null;
246
                        if (envelope != null) {
247
                            firstPoint = envelope.getLowerCorner();
248
                        }
249
                    } catch (CreateEnvelopeException ex) {
250

    
251
                    }
252
                }
253
            }
254

    
255
            if (values.get(clipboard) == null && value instanceof FeatureSelection) {
256
                if (((FeatureSelection) value).getSelectedCount() > 0) {
257
                    values.put(clipboard, value);
258
                }
259
            }
260
        } else if (parameter == location) {
261
            if (value == null) {
262
                values.put(parameter, firstPoint);
263
            }
264
            if (value instanceof Point) {
265
                values.put(parameter, value);
266
            }
267
        }
268
    }
269

    
270
    @Override
271
    public Geometry finish() throws FinishServiceException {
272
        return null;
273
    }
274

    
275
    @Override
276
    public void finishAndStore() throws FinishServiceException {
277
        if (values != null) {
278

    
279
            final Point p2 = (Point) values.get(location);
280

    
281
            List<Geometry> geometries = (List<Geometry>) values.get(clipboard);
282

    
283
            try {
284

    
285
                Iterator<Geometry> it = geometries.iterator();
286
                EditingProviderServices editingProviderServices
287
                        = (EditingProviderServices) getProviderServices();
288

    
289
                AffineTransform at
290
                        = getMoveAffineTransform(firstPoint, p2);
291
                while (it.hasNext()) {
292
                    Geometry geometry = ((Geometry) it.next()).cloneGeometry();
293

    
294
                    geometry.transform(at);
295

    
296
                    EditableFeature editableFeature = featureStore.createNewFeature();
297
                    editableFeature.setDefaultGeometry(geometry);
298
                    editingProviderServices.insertFeatureIntoFeatureStore(editableFeature, featureStore);
299
                }
300

    
301
                featureStore.getFeatureSelection().deselectAll();
302

    
303
            } catch (Exception e) {
304
                throw new FinishServiceException(e);
305
            }
306

    
307
        }
308
    }
309

    
310
    public void start() throws StartServiceException, InvalidEntryException {
311
        values = new HashMap<EditingServiceParameter, Object>();
312

    
313
        EditingManager manager = EditingLocator.getManager();
314
        List<Geometry> geometriesFromClipBoard = manager.getGeometriesFromClipboard();
315
        if (geometriesFromClipBoard != null && geometriesFromClipBoard.size() > 0) {
316
            try {
317
                setValue(geometriesFromClipBoard);
318
            } catch (InvalidEntryException ex) {
319
            }
320
        }
321

    
322
//        if (getValue(clipboard) == null) {
323
//            FeatureSelection selected = null;
324
//            if (featureStore != null) {
325
//                try {
326
//                    selected = featureStore.getFeatureSelection();
327
//                } catch (DataException e) {
328
//                    throw new StartServiceException(e);
329
//                }
330
//                try {
331
//                    setValue(selected);
332
//                } catch (InvalidEntryException e) {
333
//                    throw new InvalidEntryException(e);
334
//                }
335
//            }
336
//        }
337
    }
338

    
339
    public String getName() {
340
        return PasteFromClipboardEditingProviderFactory.PROVIDER_NAME;
341
    }
342

    
343
    @Override
344
    public Object getValue(EditingServiceParameter parameter) {
345
        return values != null ? values.get(parameter) : null;
346
    }
347

    
348
    private Envelope getEnvelope(List<Geometry> geometries) throws CreateEnvelopeException {
349
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
350
        Envelope envelope = geomManager.createEnvelope(GEOM2D);
351
        for (Geometry geometry : geometries) {
352
            envelope.add(geometry);
353
        }
354
        return envelope;
355
    }
356

    
357
}