Statistics
| Revision:

root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / edition / VectorialEditableAdapter.java @ 13882

History | View | Annotate | Download (34.6 KB)

1 3612 fjp
/*
2
 * Created on 12-ene-2006 by fjp
3
 *
4
 * gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
5 3722 caballero
 *
6 3612 fjp
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
7 3722 caballero
 *
8 3612 fjp
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 2
11
 * of the License, or (at your option) any later version.
12 3722 caballero
 *
13 3612 fjp
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17 3722 caballero
 *
18 3612 fjp
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21 3722 caballero
 *
22 3612 fjp
 * For more information, contact:
23
 *
24
 *  Generalitat Valenciana
25
 *   Conselleria d'Infraestructures i Transport
26
 *   Av. Blasco Ib??ez, 50
27
 *   46010 VALENCIA
28
 *   SPAIN
29
 *
30
 *      +34 963862235
31
 *   gvsig@gva.es
32
 *      www.gvsig.gva.es
33 3722 caballero
 *
34 3612 fjp
 *    or
35 3722 caballero
 *
36 3612 fjp
 *   IVER T.I. S.A
37
 *   Salamanca 50
38
 *   46005 Valencia
39
 *   Spain
40 3722 caballero
 *
41 3612 fjp
 *   +34 963163400
42
 *   dac@iver.es
43
 */
44
/* CVS MESSAGES:
45 3722 caballero
 *
46 3612 fjp
 * $Id$
47
 * $Log$
48 13882 jaume
 * Revision 1.76  2007-09-19 16:25:04  jaume
49
 * ReadExpansionFileException removed from this context
50
 *
51
 * Revision 1.75  2007/07/25 06:52:08  caballero
52 12779 caballero
 * reproject
53
 *
54
 * Revision 1.74  2007/06/22 10:52:30  caballero
55 12300 caballero
 * start y stop
56
 *
57
 * Revision 1.73  2007/05/29 19:09:07  azabala
58 11880 azabala
 * using of spatial index in spatial iteration now depends of the query area (to avoid using index in full scan queries)
59
 *
60
 * Revision 1.72  2007/05/07 09:02:47  caballero
61 11468 caballero
 * editing memory
62
 *
63
 * Revision 1.71  2007/04/25 14:42:24  caballero
64 11361 caballero
 * BoundShape
65
 *
66
 * Revision 1.70  2007/04/19 17:28:24  azabala
67 11287 azabala
 * changes in ReadableVectorial interface (new iteration modes)
68
 *
69
 * Revision 1.69  2007/03/06 17:08:55  caballero
70 10627 caballero
 * Exceptions
71
 *
72
 * Revision 1.68  2007/02/19 12:36:22  caballero
73 10394 caballero
 * *** empty log message ***
74
 *
75
 * Revision 1.67  2007/02/13 11:31:08  caballero
76 10288 caballero
 * optimizo cuando el cambio es alfanum?rico
77
 *
78
 * Revision 1.66  2007/02/12 08:53:37  caballero
79 10255 caballero
 * FieldExpresion
80
 *
81
 * Revision 1.65  2007/02/08 12:03:07  caballero
82 10210 caballero
 * comentar println
83
 *
84
 * Revision 1.64  2006/09/21 17:32:11  azabala
85 7461 azabala
 * *** empty log message ***
86 7271 jaume
 *
87
 * Revision 1.62  2006/08/10 08:20:31  caballero
88 6714 caballero
 * flatness
89
 *
90
 * Revision 1.61  2006/07/20 13:03:07  fjp
91 6478 fjp
 * nuevos campos
92
 *
93
 * Revision 1.60  2006/07/12 11:48:41  fjp
94 6212 fjp
 * Draft to add, remove and delete fields
95
 *
96 6323 fjp
 * Revision 1.59  2006/07/12 10:34:52  fjp
97
 * Draft to add, remove and delete fields
98
 *
99 6313 fjp
 * Revision 1.58  2006/07/06 08:31:29  fjp
100
 * Draft to add, remove and delete fields
101
 *
102 6212 fjp
 * Revision 1.57  2006/06/22 11:38:12  caballero
103 5987 caballero
 * soluci?n error al borrar geometr?as
104
 *
105
 * Revision 1.56  2006/06/16 10:44:01  fjp
106 5880 fjp
 * Por mandato de Vicente
107 5879 caballero
 *
108
 * Revision 1.54  2006/06/01 16:15:16  fjp
109 5595 fjp
 * Escritura que permite crear drivers de manera m?s sencilla.
110
 *
111
 * Revision 1.53  2006/05/30 13:03:41  fjp
112 5535 fjp
 * setFlatness solo se debe aplicar a bases de datos espaciales.
113
 *
114
 * Revision 1.52  2006/05/24 09:29:30  caballero
115 5389 caballero
 * a?adir flatness
116
 *
117
 * Revision 1.51  2006/05/16 16:07:19  fjp
118 5223 fjp
 * snapping. Revisar
119
 *
120
 * Revision 1.50  2006/05/16 07:07:46  caballero
121 5197 caballero
 * Modificar la geometr?a desde fuera
122
 *
123
 * Revision 1.49  2006/05/15 10:52:23  caballero
124 5184 caballero
 * Saber si se realiza una operaci?n desde la vista o desde la tabla.
125
 *
126
 * Revision 1.48  2006/05/09 15:58:37  caballero
127 5115 caballero
 * Para el IGN
128
 *
129
 * Revision 1.47  2006/05/09 10:28:28  caballero
130 5114 caballero
 * faltaba controlar undo y redo
131
 *
132
 * Revision 1.46  2006/04/27 06:44:56  caballero
133 4954 caballero
 * Soluci?n undo y redo de anotaciones
134
 *
135
 * Revision 1.45  2006/04/18 06:56:55  caballero
136 4847 caballero
 * Cambiar VectorialAdapter por ReadableVectorial
137
 *
138
 * Revision 1.44  2006/04/12 17:13:39  fjp
139 4835 fjp
 * *** empty log message ***
140
 *
141
 * Revision 1.43  2006/04/11 12:12:29  fjp
142 4799 fjp
 * Con edici?n en PostGIS y guardando pseudo-arcos en los shapes.
143
 *
144
 * Revision 1.42  2006/04/11 06:53:20  fjp
145 4792 fjp
 * Preparando el driver de escritura PostGIS
146
 *
147
 * Revision 1.41  2006/04/04 11:27:16  fjp
148 4727 fjp
 * Consola escuchando bien y selecci?n en tabla sincronizada cuando hay edici?n
149
 *
150
 * Revision 1.40  2006/04/03 11:04:48  caballero
151 4709 caballero
 * Posibilidad de a?adir una anotaci?n
152
 *
153
 * Revision 1.39  2006/03/29 06:26:37  caballero
154 4637 caballero
 * acelerar con una imagen las herramientas
155
 *
156
 * Revision 1.38  2006/03/23 16:20:52  fjp
157 4568 fjp
 * Un fallo un tanto inverosimil con el mapOverview
158
 *
159
 * Revision 1.37  2006/03/23 10:08:11  caballero
160 4554 caballero
 * calculo del fullExtent recorriendo todas las geometr?as
161
 *
162
 * Revision 1.36  2006/03/22 11:46:29  caballero
163 4523 caballero
 * Editar capa de anotaciones
164
 *
165
 * Revision 1.35  2006/02/28 18:15:22  fjp
166 4225 fjp
 * Consola de CAD
167
 *
168
 * Revision 1.34  2006/02/24 11:30:32  fjp
169 4193 fjp
 * FUNCIONA!!! (Creo)
170
 *
171 4195 fjp
 * Revision 1.33  2006/02/24 07:57:58  fjp
172
 * FUNCIONA!!! (Creo)
173
 *
174 4193 fjp
 * Revision 1.32  2006/02/23 17:55:45  fjp
175 4147 fjp
 * Preparando para poder editar con el EditionManager
176
 *
177 4191 fjp
 * Revision 1.31  2006/02/21 16:44:08  fjp
178
 * Preparando para poder editar con el EditionManager
179
 *
180 4181 fjp
 * Revision 1.30  2006/02/20 18:14:59  fjp
181
 * Preparando para poder editar con el EditionManager
182
 *
183 4171 fjp
 * Revision 1.29  2006/02/20 10:32:54  fjp
184
 * Preparando para poder editar con el EditionManager
185
 *
186 4159 fjp
 * Revision 1.28  2006/02/17 13:40:03  fjp
187
 * Preparando para poder editar con el EditionManager
188
 *
189 4147 fjp
 * Revision 1.27  2006/02/17 10:41:14  fjp
190 4144 fjp
 * Evento de edici?n lanzado cuando una capa se pone en edici?n
191
 *
192
 * Revision 1.26  2006/02/17 08:21:19  fjp
193 4135 fjp
 * *** empty log message ***
194
 *
195
 * Revision 1.25  2006/02/16 09:38:10  fjp
196 4123 fjp
 * Preparando compatibilidad para bases de datos (y de paso, acelerando :-)
197
 *
198
 * Revision 1.24  2006/02/16 09:06:28  caballero
199 4120 caballero
 * commandStack
200
 *
201
 * Revision 1.23  2006/02/15 18:16:02  fjp
202 4085 fjp
 * POR TERMINAR
203
 *
204 4115 fjp
 * Revision 1.22  2006/02/13 18:18:31  fjp
205
 * POR TERMINAR
206
 *
207 4085 fjp
 * Revision 1.21  2006/02/10 13:28:23  caballero
208 4061 caballero
 * poder cambiar la selecci?n
209
 *
210
 * Revision 1.20  2006/02/09 13:11:54  caballero
211 4026 caballero
 * *** empty log message ***
212
 *
213
 * Revision 1.19  2006/02/08 16:45:29  caballero
214 4000 caballero
 * elimnar c?dio no usado
215
 *
216
 * Revision 1.18  2006/02/08 15:18:45  caballero
217 3996 caballero
 * control de las rows eliminadas
218
 *
219
 * Revision 1.17  2006/02/07 10:18:44  caballero
220 3980 caballero
 * Con BoundedShape
221
 *
222
 * Revision 1.16  2006/02/06 12:01:41  caballero
223 3958 caballero
 * driver del ova
224
 *
225
 * Revision 1.15  2006/02/03 14:09:32  fjp
226 3943 fjp
 * Preparando edici?n
227
 *
228 3952 fjp
 * Revision 1.14  2006/02/03 12:16:33  fjp
229
 * Preparando edici?n
230
 *
231 3943 fjp
 * Revision 1.13  2006/02/03 11:54:12  caballero
232 3940 caballero
 * tablas con vectorialEditableAdapter en edici?n
233 3936 fjp
 *
234
 * Revision 1.11  2006/01/31 08:10:05  caballero
235 3849 caballero
 * cambio de feature a row
236
 *
237
 * Revision 1.10  2006/01/30 08:18:14  caballero
238 3836 caballero
 * m?todos para deshacer y rehacer
239
 *
240
 * Revision 1.9  2006/01/23 17:30:28  caballero
241 3728 caballero
 * coger los datos del ova
242
 *
243
 * Revision 1.8  2006/01/23 16:16:16  caballero
244 3722 caballero
 * getRowIndex
245
 *
246
 * Revision 1.7  2006/01/20 08:37:10  fjp
247 3695 fjp
 * Preparando la edici?n
248
 *
249
 * Revision 1.6  2006/01/19 12:48:20  caballero
250 3688 caballero
 * poder modificar su vectorial Adapter
251
 *
252
 * Revision 1.5  2006/01/19 09:28:11  fjp
253 3686 fjp
 * Preparando la edici?n
254
 *
255
 * Revision 1.4  2006/01/17 10:24:02  fjp
256 3651 fjp
 * Preparando edici?n
257
 *
258 3653 fjp
 * Revision 1.3  2006/01/16 12:47:38  fjp
259
 * Preparando edici?n
260
 *
261 3652 fjp
 * Revision 1.2  2006/01/16 11:23:00  fjp
262
 * Preparando edici?n
263
 *
264 3651 fjp
 * Revision 1.1  2006/01/12 13:39:14  fjp
265 3612 fjp
 * preaparar edicion
266
 *
267
 *
268
 */
269
package com.iver.cit.gvsig.fmap.edition;
270
271 4727 fjp
import java.awt.Image;
272 3612 fjp
import java.awt.geom.Rectangle2D;
273 4637 caballero
import java.awt.image.BufferedImage;
274 3612 fjp
import java.io.IOException;
275 3722 caballero
import java.util.List;
276 3612 fjp
277 12779 caballero
import org.cresques.cts.ICoordTrans;
278 11287 azabala
import org.cresques.cts.IProjection;
279
280 5595 fjp
import com.hardcode.driverManager.Driver;
281 10627 caballero
import com.hardcode.gdbms.driver.exceptions.InitializeDriverException;
282
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
283 3943 fjp
import com.hardcode.gdbms.engine.data.DataSource;
284 10627 caballero
import com.hardcode.gdbms.engine.data.driver.DriverException;
285 3943 fjp
import com.hardcode.gdbms.engine.values.Value;
286 10627 caballero
import com.iver.cit.gvsig.exceptions.commands.EditionCommandException;
287
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
288
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileWriteException;
289
import com.iver.cit.gvsig.exceptions.expansionfile.OpenExpansionFileException;
290 11468 caballero
import com.iver.cit.gvsig.exceptions.layers.CancelEditingLayerException;
291 10627 caballero
import com.iver.cit.gvsig.exceptions.layers.StartEditionLayerException;
292
import com.iver.cit.gvsig.exceptions.visitors.StartWriterVisitorException;
293
import com.iver.cit.gvsig.exceptions.visitors.StopWriterVisitorException;
294 3940 caballero
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
295 12779 caballero
import com.iver.cit.gvsig.fmap.core.FNullGeometry;
296 3612 fjp
import com.iver.cit.gvsig.fmap.core.IFeature;
297
import com.iver.cit.gvsig.fmap.core.IGeometry;
298 3652 fjp
import com.iver.cit.gvsig.fmap.core.IRow;
299 4159 fjp
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
300 3980 caballero
import com.iver.cit.gvsig.fmap.drivers.BoundedShapes;
301 3940 caballero
import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
302 3612 fjp
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
303 11287 azabala
import com.iver.cit.gvsig.fmap.drivers.IFeatureIterator;
304 3940 caballero
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
305 11880 azabala
import com.iver.cit.gvsig.fmap.drivers.featureiterators.AttrQueryFeatureIterator;
306
import com.iver.cit.gvsig.fmap.drivers.featureiterators.DefaultFeatureIterator;
307
import com.iver.cit.gvsig.fmap.drivers.featureiterators.IndexedSptQueryFeatureIterator;
308
import com.iver.cit.gvsig.fmap.drivers.featureiterators.SpatialQueryFeatureIterator;
309 4061 caballero
import com.iver.cit.gvsig.fmap.layers.FBitSet;
310 3940 caballero
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
311 11287 azabala
import com.iver.cit.gvsig.fmap.spatialindex.ISpatialIndex;
312
import com.iver.cit.gvsig.fmap.spatialindex.QuadtreeJts;
313 3652 fjp
import com.vividsolutions.jts.geom.Envelope;
314 4523 caballero
import com.vividsolutions.jts.index.SpatialIndex;
315 3652 fjp
import com.vividsolutions.jts.index.quadtree.Quadtree;
316 3612 fjp
317
/**
318
 * @author fjp
319 5389 caballero
 *
320 3612 fjp
 */
321 5223 fjp
public class VectorialEditableAdapter extends EditableAdapter implements
322
                ReadableVectorial, BoundedShapes {
323 4847 caballero
        protected ReadableVectorial ova;
324 5223 fjp
325 4159 fjp
        protected Quadtree index;
326 4523 caballero
327 4225 fjp
        protected Rectangle2D fullExtent;
328 5223 fjp
329 4792 fjp
        protected Image selectionImage;
330 5223 fjp
331 4792 fjp
        protected BufferedImage handlersImage;
332 11468 caballero
333
334 11287 azabala
        /*
335 11468 caballero
         * azo; ReadableVectorial implementations need a reference to
336 11287 azabala
         * IProjection (of the layer) and to ISpatialIndex (of the layer)
337
         * to allow iteration with different criteria
338
         * */
339
        protected IProjection projection;
340
        protected ISpatialIndex fmapSpatialIndex;
341 12779 caballero
        private ICoordTrans ct;
342 4523 caballero
343 7461 azabala
        //private double flatness=0.8;
344
        /*
345
         * private class MyFeatureIterator implements IFeatureIterator { int numReg =
346
         * 0; Rectangle2D rect; String epsg; IFeatureIterator origFeatIt; boolean
347
         * bHasNext = true;
348
         *
349
         * public MyFeatureIterator(Rectangle2D r, String strEPSG) throws
350
         * DriverException { rect = r; epsg = strEPSG; origFeatIt =
351
         * ova.getFeatureIterator(r, epsg); } public boolean hasNext() throws
352
         * DriverException { return bHasNext; }
353
         *
354
         * public IFeature next() throws DriverException { IFeature aux =
355
         * origFeatIt.next(); return null; }
356
         *
357
         * public void closeIterator() throws DriverException {
358
         *  }
359
         *  }
360
         */
361
362 11468 caballero
363
364 5223 fjp
        public VectorialEditableAdapter() {
365 3940 caballero
                super();
366 3652 fjp
        }
367 5223 fjp
368 10627 caballero
        public void setOriginalVectorialAdapter(ReadableVectorial rv) throws ReadDriverException {
369 5223 fjp
                ova = rv;
370 10627 caballero
                setOriginalDataSource(rv.getRecordset());
371 3652 fjp
        }
372 5223 fjp
373 3652 fjp
        /*
374
         * (non-Javadoc)
375 5389 caballero
         *
376 3652 fjp
         * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#start()
377
         */
378 10627 caballero
        public void start() throws ReadDriverException, InitializeDriverException {
379 3653 fjp
                ova.start();
380 3652 fjp
        }
381
382 5595 fjp
        public IWriter getWriter() {
383
                if (ova.getDriver() instanceof IWriteable)
384
                {
385
                        IWriter writer = ((IWriteable) ova.getDriver()).getWriter();
386
                        if (writer instanceof ISpatialWriter)
387
                                return writer;
388
                }
389
                return null;
390
        }
391
392 3652 fjp
        /*
393
         * (non-Javadoc)
394 5389 caballero
         *
395 3652 fjp
         * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#stop()
396
         */
397 10627 caballero
        public void stop() throws ReadDriverException {
398 3653 fjp
                ova.stop();
399 3652 fjp
        }
400
401
        /*
402
         * (non-Javadoc)
403 5389 caballero
         *
404 3652 fjp
         * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShape(int)
405
         */
406 10627 caballero
        public IGeometry getShape(int rowIndex) throws ReadDriverException, ExpansionFileReadException {
407 3652 fjp
                // Si no est? en el fichero de expansi?n
408 5223 fjp
                int calculatedIndex = getCalculatedIndex(rowIndex);
409 3996 caballero
                Integer integer = new Integer(calculatedIndex);
410 3652 fjp
                if (!relations.containsKey(integer)) {
411
                        // Si ha sido eliminada
412 5223 fjp
                        /*
413
                         * if (delRows.get(integer.intValue())) { return null; } else {
414
                         */
415
                        return ova.getShape(calculatedIndex);
416
                        // }
417 3652 fjp
                }
418 10627 caballero
                int num = ((Integer) relations.get(integer)).intValue();
419
                DefaultRowEdited feat;
420
                feat = (DefaultRowEdited) expansionFile.getRow(num);
421
                return ((IFeature) feat.getLinkedRow()).getGeometry()
422
                                        .cloneGeometry();// getGeometry();
423 3652 fjp
        }
424
425
        /*
426
         * (non-Javadoc)
427 5389 caballero
         *
428 3652 fjp
         * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShapeType()
429
         */
430 10627 caballero
        public int getShapeType() throws ReadDriverException {
431 3653 fjp
                return ova.getShapeType();
432 3652 fjp
        }
433 5223 fjp
434
        public ReadableVectorial getOriginalAdapter() {
435 3940 caballero
                return ova;
436 3652 fjp
        }
437 5223 fjp
438 3940 caballero
        public VectorialDriver getDriver() {
439 3958 caballero
                return ova.getDriver();
440 3652 fjp
        }
441 5223 fjp
442 3940 caballero
        public void setDriver(VectorialDriver driver) {
443 3958 caballero
                this.ova.setDriver(driver);
444 3652 fjp
        }
445 5223 fjp
446
        public DriverAttributes getDriverAttributes() {
447 3958 caballero
                return ova.getDriverAttributes();
448 3940 caballero
        }
449 3652 fjp
450 5223 fjp
        /**
451
         * DOCUMENT ME!
452 10627 caballero
         * @throws StartEditionLayerException
453
         * @throws StartWriterVisitorException
454 5389 caballero
         *
455 5223 fjp
         * @throws EditionException
456
         *             DOCUMENT ME!
457
         */
458 10627 caballero
        public void startEdition(int sourceType) throws StartWriterVisitorException {
459 5223 fjp
                super.startEdition(sourceType);
460 5595 fjp
                Driver drv = ova.getDriver();
461
                if (drv instanceof IWriteable)
462
                {
463
                        setWriter(((IWriteable) drv).getWriter());
464
                }
465 3652 fjp
466 5595 fjp
467 5223 fjp
                try {
468
                        expansionFile.open();
469
                        if (index == null || fullExtent == null) {
470
                                // TODO: Si la capa dispone de un ?ndice espacial, hacer
471
                                // algo aqu? para que se use ese ?ndice espacial.
472
                                index = new Quadtree();
473 3653 fjp
474 5223 fjp
                                for (int i = 0; i < ova.getShapeCount(); i++) {
475 11361 caballero
                                        Rectangle2D r=null;
476
                                        if (ova.getDriver() instanceof BoundedShapes) {
477
                                                r = ((BoundedShapes) ova.getDriver()).getShapeBounds(i);
478
                                        } else {
479
                                                IGeometry g = null;
480
                                                g = ((DefaultFeature) ova.getFeature(i))
481
                                                                        .getGeometry();
482
                                                if (g == null) {
483
                                                        continue;
484
                                                }
485
486
                                                r = g.getBounds2D();
487 5223 fjp
                                        }
488 12779 caballero
                                        if (ct != null) {
489
                                                r = ct.convert(r);
490
                                        }
491 5223 fjp
                                        Envelope e = new Envelope(r.getX(),
492
                                                        r.getX() + r.getWidth(), r.getY(), r.getY()
493
                                                                        + r.getHeight());
494
                                        index.insert(e, new Integer(i));
495
                                        if (fullExtent == null) {
496
                                                fullExtent = r;
497
                                        } else {
498
                                                fullExtent = fullExtent.createUnion(r);
499
                                        }
500
                                }
501
                        }
502 10627 caballero
                } catch (ReadDriverException e) {
503
                        throw new StartWriterVisitorException(writer.getName(),e);
504 13882 jaume
                }
505 3652 fjp
506 5223 fjp
                System.err.println("Se han metido en el ?ndice "
507
                                + index.queryAll().size() + " geometr?as");
508
        }
509 3652 fjp
510 5223 fjp
        /*
511
         * (non-Javadoc)
512 5389 caballero
         *
513 5223 fjp
         * @see com.iver.cit.gvsig.fmap.edition.IEditableSource#getRow(int)
514
         */
515 10627 caballero
        public IRowEdited getRow(int index) throws ReadDriverException, ExpansionFileReadException {
516 12300 caballero
                start();
517 5223 fjp
                int calculatedIndex = getCalculatedIndex(index);
518
                Integer integer = new Integer(calculatedIndex);
519
                // Si no est? en el fichero de expansi?n
520
                DefaultRowEdited edRow = null;
521
                if (!relations.containsKey(integer)) {
522 10627 caballero
                        edRow = new DefaultRowEdited(ova.getFeature(calculatedIndex),
523
                                        IRowEdited.STATUS_ORIGINAL, index);
524 12300 caballero
                        stop();
525
                        return createExternalRow(edRow, 0);
526 5223 fjp
                }
527 10627 caballero
                int num = ((Integer) relations.get(integer)).intValue();
528
                IRowEdited aux = expansionFile.getRow(num);
529
                edRow = new DefaultRowEdited(aux.getLinkedRow().cloneRow(), aux
530
                                .getStatus(), index);
531 12300 caballero
                stop();
532 10627 caballero
                return edRow;
533 5223 fjp
        }
534
535
        /**
536
         * Elimina una geometria. Si es una geometr?a original de la capa en edici?n
537
         * se marca como eliminada (haya sido modificada o no). Si es una geometr?a
538
         * a?adida posteriormente se invalida en el fichero de expansi?n, para que
539
         * una futura compactaci?n termine con ella.
540 5389 caballero
         *
541 5223 fjp
         * @param index
542
         *            ?ndice de la geometr?a.
543 10627 caballero
         * @throws ReadDriverException
544
         * @throws ExpansionFileReadException
545 5389 caballero
         *
546 5223 fjp
         * @throws DriverIOException
547
         * @throws IOException
548
         */
549 10627 caballero
        public IRow doRemoveRow(int index, int sourceType) throws ReadDriverException, ExpansionFileReadException{
550 5223 fjp
                boolean cancel = fireBeforeRemoveRow(index, sourceType);
551 5114 caballero
                if (cancel)
552
                        return null;
553 5223 fjp
                // Llega el calculatedIndex
554
                Integer integer = new Integer(index);
555 3652 fjp
556 5223 fjp
                IFeature feat = null;
557
                delRows.set(index, true);
558
                // Si la geometr?a no ha sido modificada
559
                if (!relations.containsKey(integer)) {
560 10627 caballero
                        feat = (DefaultFeature) (ova.getFeature(index));
561 5223 fjp
                } else {
562 3940 caballero
                        int num = ((Integer) relations.get(integer)).intValue();
563
                        feat = (IFeature) expansionFile.getRow(num).getLinkedRow();
564 5223 fjp
                        // expansionFile.invalidateRow(num);
565 3653 fjp
                }
566 5223 fjp
                System.err.println("Elimina una Row en la posici?n: " + index);
567
                // Se actualiza el ?ndice
568
                if (feat != null) {
569
                        Rectangle2D r = feat.getGeometry().getBounds2D();
570
                        boolean borrado = this.index.remove(new Envelope(r.getX(), r.getX()
571
                                        + r.getWidth(), r.getY(), r.getY() + r.getHeight()),
572
                                        new Integer(index));
573
                        System.out.println("Est? borrado : " + borrado);
574
                        System.out.println("Index.lenght : " + this.index.size());
575 7271 jaume
                        isFullExtentDirty = true;
576 5223 fjp
                }
577
                setSelection(new FBitSet());
578
                fireAfterRemoveRow(index, sourceType);
579
                return feat;
580
        }
581
582
        /**
583
         * Si se intenta modificar una geometr?a original de la capa en edici?n se
584
         * a?ade al fichero de expansi?n y se registra la posici?n en la que se
585
         * a?adi?. Si se intenta modificar una geometria que se encuentra en el
586
         * fichero de expansi?n (por ser nueva o original pero modificada) se invoca
587
         * el m?todo modifyGeometry y se actualiza el ?ndice de la geometria en el
588
         * fichero.
589 5389 caballero
         *
590 5223 fjp
         * @param calculatedIndex
591
         *            DOCUMENT ME!
592
         * @param feat
593
         *            DOCUMENT ME!
594 5389 caballero
         *
595 5223 fjp
         * @return position inside ExpansionFile
596 10627 caballero
         * @throws ReadDriverException
597
         * @throws ExpansionFileWriteException
598
         * @throws ExpansionFileReadException
599 5389 caballero
         *
600 5223 fjp
         * @throws IOException
601
         * @throws DriverIOException
602
         */
603 10627 caballero
        public int doModifyRow(int calculatedIndex, IRow feat, int sourceType) throws ReadDriverException, ExpansionFileWriteException, ExpansionFileReadException {
604 5223 fjp
                boolean cancel = fireBeforeModifyRow(feat, calculatedIndex, sourceType);
605 5114 caballero
                if (cancel)
606
                        return -1;
607 5223 fjp
                int posAnteriorInExpansionFile = -1;
608
                Integer integer = new Integer(calculatedIndex);
609 3652 fjp
610 5223 fjp
                IFeature featAnt = null;
611 10210 caballero
//                System.err.println("Modifica una Row en la posici?n: "
612
//                                + calculatedIndex);
613 5223 fjp
                // Si la geometr?a no ha sido modificada
614
                if (!relations.containsKey(integer)) {
615
                        int newPosition = expansionFile.addRow(feat,
616 6212 fjp
                                        IRowEdited.STATUS_MODIFIED, actualIndexFields);
617 5223 fjp
                        relations.put(integer, new Integer(newPosition));
618 3652 fjp
619 10255 caballero
                        if (sourceType == EditionEvent.GRAPHIC) {
620
                                // Se actualiza el ?ndice espacial
621 10627 caballero
                                featAnt = (DefaultFeature) (ova.getFeature(calculatedIndex));
622 10255 caballero
                                IGeometry g = featAnt.getGeometry();
623
                                Rectangle2D rAnt = g.getBounds2D();
624
                                Rectangle2D r = ((IFeature) feat).getGeometry().getBounds2D();
625
                                this.index.remove(new Envelope(rAnt.getX(), rAnt.getX()
626
                                                + rAnt.getWidth(), rAnt.getY(), rAnt.getY()
627
                                                + rAnt.getHeight()), new Integer(calculatedIndex));
628
                                this.index.insert(new Envelope(r.getX(), r.getX()
629
                                                + r.getWidth(), r.getY(), r.getY() + r.getHeight()),
630
                                                new Integer(calculatedIndex));
631 3940 caballero
                        }
632 5223 fjp
                } else {
633
                        // Obtenemos el ?ndice en el fichero de expansi?n
634
                        int num = ((Integer) relations.get(integer)).intValue();
635
                        posAnteriorInExpansionFile = num;
636 3653 fjp
637 5223 fjp
                        // Obtenemos la geometr?a para actualiza el ?ndice
638
                        // espacialposteriormente
639
                        featAnt = (IFeature) expansionFile.getRow(num).getLinkedRow();
640 3652 fjp
641 5223 fjp
                        /*
642
                         * Se modifica la geometr?a y nos guardamos el ?ndice dentro del
643
                         * fichero de expansi?n en el que se encuentra la geometr?a
644
                         * modificada
645
                         */
646 6212 fjp
                        num = expansionFile.modifyRow(num, feat, actualIndexFields);
647 3652 fjp
648 5223 fjp
                        /*
649
                         * Actualiza la relaci?n del ?ndice de la geometr?a al ?ndice en el
650
                         * fichero de expansi?n.
651
                         */
652
                        relations.put(integer, new Integer(num));
653 10255 caballero
                        if (sourceType == EditionEvent.GRAPHIC) {
654
                                // Se modifica el ?ndice espacial
655
                                Rectangle2D rAnt = featAnt.getGeometry().getBounds2D();
656
                                Rectangle2D r = ((IFeature) feat).getGeometry().getBounds2D();
657
                                this.index.remove(new Envelope(rAnt.getX(), rAnt.getX()
658
                                                + rAnt.getWidth(), rAnt.getY(), rAnt.getY()
659
                                                + rAnt.getHeight()), new Integer(calculatedIndex));
660
                                this.index.insert(new Envelope(r.getX(), r.getX()
661
                                                + r.getWidth(), r.getY(), r.getY() + r.getHeight()),
662
                                                new Integer(calculatedIndex));
663
                        }
664 5223 fjp
                }
665 7271 jaume
                isFullExtentDirty = true;
666 10394 caballero
                fireAfterModifyRow(calculatedIndex, sourceType);
667 5223 fjp
                return posAnteriorInExpansionFile;
668
        }
669 5197 caballero
670 5223 fjp
        /**
671
         * Actualiza en el mapa de ?ndices, la posici?n en la que estaba la
672
         * geometr?a antes de ser modificada. Se marca como v?lida, en caso de que
673
         * fuera una modificaci?n de una geometr?a que estuviese en el fichero de
674
         * expansi?n antes de ser modificada y se pone el puntero de escritura del
675
         * expansion file a justo despues de la penultima geometr?a
676 5389 caballero
         *
677 5223 fjp
         * @param calculatedIndex
678
         *            ?ndice de la geometr?a que se quiere deshacer su modificaci?n
679
         * @param previousExpansionFileIndex
680
         *            ?ndice que ten?a antes la geometr?a en el expansionFile. Si
681
         *            vale -1 quiere decir que es una modificaci?n de una geometr?a
682
         *            original y por tanto no hay que actualizar el mapa de indices
683
         *            sino eliminar su entrada.
684
         * @throws IOException
685
         * @throws DriverIOException
686
         */
687
        public void undoModifyRow(int calculatedIndex,
688 10627 caballero
                        int previousExpansionFileIndex, int sourceType) throws EditionCommandException{
689
                try {
690 13882 jaume
                        // Llega el CalculatedIndex
691
                        /*
692
                         * Si la acci?n de modificar se realiz? sobre una geometr?a original
693
                         */
694
                        if (previousExpansionFileIndex == -1) {
695 5223 fjp
696 13882 jaume
                                // Se obtiene la geometr?a para actualizar el ?ndice
697
                                // IGeometry g = ((DefaultFeature)
698
                                // getRow(calculatedIndex).getLinkedRow()).getGeometry();
699
                                int inverse = getInversedIndex(calculatedIndex);
700
                                DefaultFeature df;
701 10627 caballero
702
                                df = (DefaultFeature) getRow(inverse).getLinkedRow();
703
704 13882 jaume
                                boolean cancel = fireBeforeModifyRow(df, calculatedIndex,
705
                                                sourceType);
706
                                if (cancel)
707
                                        return;
708
                                IGeometry g = df.getGeometry();
709
                                // IGeometry g = ova.getShape(calculatedIndex);
710
                                Rectangle2D r = g.getBounds2D();
711 3652 fjp
712 13882 jaume
                                // Se elimina de las relaciones y del fichero de expansi?n
713
                                relations.remove(new Integer(calculatedIndex));
714
                                expansionFile.deleteLastRow();
715
                                if (sourceType == EditionEvent.GRAPHIC) {
716
                                        // Se actualizan los ?ndices
717
                                        IGeometry gAnt = ova.getShape(calculatedIndex);
718
                                        /*
719
                                         * IGeometry gAnt = ((DefaultFeature) getRow(calculatedIndex)
720
                                         * .getLinkedRow()).getGeometry();
721
                                         */
722
                                        Rectangle2D rAnt = gAnt.getBounds2D();
723
                                        this.index.remove(new Envelope(r.getX(), r.getX()
724
                                                        + r.getWidth(), r.getY(), r.getY() + r.getHeight()),
725
                                                        new Integer(calculatedIndex));
726
                                        this.index.insert(new Envelope(rAnt.getX(), rAnt.getX()
727
                                                        + rAnt.getWidth(), rAnt.getY(), rAnt.getY()
728
                                                        + rAnt.getHeight()), new Integer(calculatedIndex));
729
                                }
730
                        } else {
731
                                // Se obtiene la geometr?a para actualizar el ?ndice
732
                                IGeometry g = null;
733
                                int inverse = getInversedIndex(calculatedIndex);
734
                                DefaultFeature df = (DefaultFeature) getRow(inverse).getLinkedRow();
735
                                boolean cancel = fireBeforeModifyRow(df, calculatedIndex,
736
                                                sourceType);
737
                                if (cancel)
738
                                        return;
739
                                if (sourceType == EditionEvent.GRAPHIC) {
740
                                        g = df.getGeometry();
741
                                        System.out.println("Actual: " + g.toString());
742 3652 fjp
743 13882 jaume
                                        Rectangle2D r = g.getBounds2D();
744
                                        this.index.remove(new Envelope(r.getX(), r.getX()
745
                                                        + r.getWidth(), r.getY(), r.getY() + r.getHeight()),
746
                                                        new Integer(calculatedIndex));
747 3652 fjp
748 13882 jaume
                                        // Se recupera la geometr?a
749
                                        // expansionFile.validateRow(previousExpansionFileIndex);
750 10288 caballero
751 13882 jaume
                                        // Se actualizan los ?ndices
752
                                        // g = ((IFeature)
753
                                        // (expansionFile.getRow(previousExpansionFileIndex).getLinkedRow())).getGeometry();
754
                                        // System.out.println("Anterior a la que volvemos : " +
755
                                        // g.toString());
756
                                        g = ((DefaultFeature) getRow(inverse).getLinkedRow())
757
                                        .getGeometry();
758
                                        r = g.getBounds2D();
759
                                        this.index.insert(new Envelope(r.getX(), r.getX()
760
                                                        + r.getWidth(), r.getY(), r.getY() + r.getHeight()),
761
                                                        new Integer(calculatedIndex));
762
                                }
763
                                // Se actualiza la relaci?n de ?ndices
764
                                // Integer integer = new Integer(geometryIndex);
765
                                relations.put(new Integer(calculatedIndex), new Integer(
766
                                                previousExpansionFileIndex));
767 3652 fjp
768 13882 jaume
                        }
769 10627 caballero
                } catch (ReadDriverException e) {
770
                        throw new EditionCommandException(writer.getName(),e);
771
                }
772 10288 caballero
                //fireAfterModifyRow(calculatedIndex, sourceType);
773 5223 fjp
        }
774 3653 fjp
775 5223 fjp
        /**
776
         * A?ade una geometria al fichero de expansi?n y guarda la correspondencia
777
         * en la tabla relations.
778 5389 caballero
         *
779 5223 fjp
         * @param feat
780
         *            geometr?a a guardar.
781 5389 caballero
         *
782 5223 fjp
         * @return calculatedIndex
783 10627 caballero
         * @throws ExpansionFileWriteException
784 5223 fjp
         * @throws DriverIOException
785
         * @throws IOException
786
         */
787 10627 caballero
        public int doAddRow(IRow feat, int sourceType) throws ReadDriverException, ExpansionFileWriteException{
788 5223 fjp
                int calculatedIndex = super.doAddRow(feat, sourceType);
789 3940 caballero
                // Actualiza el ?ndice espacial
790 5223 fjp
                IGeometry g = ((IFeature) feat).getGeometry();
791
                Rectangle2D r = g.getBounds2D();
792
                index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(),
793
                                r.getY() + r.getHeight()), new Integer(calculatedIndex));
794 7271 jaume
                isFullExtentDirty = true;
795 5223 fjp
                return calculatedIndex;
796
        }
797 3653 fjp
798 5223 fjp
        /**
799
         * Se desmarca como invalidada en el fichero de expansion o como eliminada
800
         * en el fichero original
801 5389 caballero
         *
802 5223 fjp
         * @param index
803
         *            DOCUMENT ME!
804
         * @throws IOException
805
         * @throws DriverIOException
806
         */
807 10627 caballero
        public void undoRemoveRow(int index, int sourceType) throws EditionCommandException  {
808 5223 fjp
                super.undoRemoveRow(index, sourceType);
809 3653 fjp
810 5223 fjp
                IGeometry g = null;
811 10627 caballero
                try {
812
                        g = ((IFeature) getRow(getInversedIndex(index)).getLinkedRow()).getGeometry();
813
                } catch (ReadDriverException e) {
814
                        throw new EditionCommandException(writer.getName(),e);
815 13882 jaume
                }
816 3653 fjp
817 5223 fjp
                Rectangle2D r = g.getBounds2D();
818
                this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r
819
                                .getY(), r.getY() + r.getHeight()), new Integer(index));
820
        }
821 3653 fjp
822 5223 fjp
        /**
823
         * Se elimina del final del fichero de expansi?n poniendo el puntero de
824
         * escritura apuntando al final de la pen?ltima geometr?a. Deber? quitar la
825
         * relaci?n del mapa de relaciones
826 5389 caballero
         *
827 5223 fjp
         * @param index
828
         *            ?ndice de la geometr?a que se a?adi?
829 10627 caballero
         * @throws EditionCommandException
830 5223 fjp
         * @throws DriverIOException
831
         * @throws IOException
832
         */
833 10627 caballero
        public void undoAddRow(int calculatedIndex, int sourceType) throws EditionCommandException{
834 5223 fjp
                int inverse = getInversedIndex(calculatedIndex);
835 10627 caballero
                IGeometry g;
836
                try {
837
                        g = ((IFeature) getRow(inverse).getLinkedRow()).getGeometry();
838
                        Rectangle2D r = g.getBounds2D();
839
                        this.index.remove(new Envelope(r.getX(), r.getX() + r.getWidth(), r
840 5223 fjp
                                .getY(), r.getY() + r.getHeight()),
841
                                new Integer(calculatedIndex));
842 3653 fjp
843 10627 caballero
                        super.undoAddRow(calculatedIndex, sourceType);
844
                        setSelection(new FBitSet());
845
                } catch (ReadDriverException e) {
846
                        throw new EditionCommandException(writer.getName(),e);
847 13882 jaume
                }
848 5223 fjp
        }
849
850
        /**
851
         * Obtiene las geometr?as que se encuentran en el rect?ngulo que se pasa
852
         * como par?metro haciendo uso del ?ndice espacial
853 5389 caballero
         *
854 5223 fjp
         * @param r
855
         *            Rect?ngulo indicando la porci?n del espacio para el cual se
856
         *            quiere saber los ?ndices de las geometr?as que se encuentran
857
         *            dentro de ?l
858 5389 caballero
         *
859 5223 fjp
         * @return Array de ?ndices para su uso con getGeometry, removeGeometry, ...
860
         */
861
        /*
862
         * public int[] getRowsIndexes_OL(Rectangle2D r) { Envelope e = new
863
         * Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(), r.getY() +
864
         * r.getHeight()); List l = index.query(e); int[] indexes = new
865
         * int[l.size()];
866 5389 caballero
         *
867 5223 fjp
         * for (int index = 0; index < l.size(); index++) { Integer i = (Integer)
868
         * l.get(index); indexes[index] = getInversedIndex(i.intValue()); }
869 5389 caballero
         *
870 5223 fjp
         * return indexes; }
871
         */
872
        /**
873 3940 caballero
         * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShapeCount()
874 3836 caballero
         */
875 10627 caballero
        public int getShapeCount() throws ReadDriverException {
876
                return getRowCount();
877 3836 caballero
        }
878 3722 caballero
879 3836 caballero
        /**
880 10627 caballero
         * @throws ExpansionFileReadException
881 3940 caballero
         * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getFullExtent()
882 3836 caballero
         */
883 10627 caballero
        public Rectangle2D getFullExtent() throws ReadDriverException, ExpansionFileReadException {
884 5223 fjp
                if (fullExtent == null) {
885
                        fullExtent = ova.getFullExtent();
886
                }
887 7271 jaume
888
                if (isFullExtentDirty) {
889
                        fullExtent = reCalculateFullExtent();
890
                        isFullExtentDirty = false;
891
                }
892 5223 fjp
                return fullExtent;
893
        }
894 4554 caballero
895 5223 fjp
        /**
896
         * Use it BEFORE writing to a file.
897 5389 caballero
         *
898 5223 fjp
         * @return real full extent.
899 10627 caballero
         * @throws ExpansionFileReadException
900
         * @throws ReadDriverException
901 5223 fjp
         * @throws DriverIOException
902
         */
903 10627 caballero
        public Rectangle2D reCalculateFullExtent() throws ReadDriverException, ExpansionFileReadException  {
904 5223 fjp
                if (getShapeCount() > 0) {
905
                        fullExtent = getShape(0).getBounds2D();
906
                        for (int i = 1; i < getShapeCount(); i++) {
907 12779 caballero
                                IGeometry geom=getShape(i);
908
                                if (fullExtent==null) {
909
                                        fullExtent=geom.getBounds2D();
910
                                        continue;
911
                                }
912
                                if (!(geom instanceof FNullGeometry)) {
913
                                        fullExtent.add(geom.getBounds2D());
914
                                }
915 5223 fjp
                        }
916
                } else {
917
                        fullExtent = ova.getFullExtent();
918
                }
919
                return fullExtent;
920 3836 caballero
        }
921 3958 caballero
922 5223 fjp
        /**
923
         * En la implementaci?n por defecto podemos hacer que cada feature tenga ID =
924
         * numero de registro. En el DBAdapter podr?amos "overrride" este m?todo y
925
         * poner como ID de la Feature el campo ?nico escogido en la base de datos.
926 5389 caballero
         *
927 5223 fjp
         * @param numReg
928
         * @return
929 10627 caballero
         * @throws ExpansionFileReadException
930 5223 fjp
         */
931 10627 caballero
        public IFeature getFeature(int numReg) throws ReadDriverException, ExpansionFileReadException {
932 5223 fjp
                IGeometry geom;
933
                IFeature feat = null;
934
                        geom = getShape(numReg);
935
                        DataSource rs = getRecordset();
936
                        Value[] regAtt = new Value[rs.getFieldCount()];
937
                        for (int fieldId = 0; fieldId < rs.getFieldCount(); fieldId++) {
938
                                regAtt[fieldId] = rs.getFieldValue(numReg, fieldId);
939
                        }
940
                        feat = new DefaultFeature(geom, regAtt, numReg + "");
941
                return feat;
942
        }
943
944 10627 caballero
        public void stopEdition(IWriter writer, int sourceType) throws StopWriterVisitorException {
945 11468 caballero
//                ISpatialWriter spatialWriter = (ISpatialWriter) writer;
946 6714 caballero
//                spatialWriter.setFlatness(FConverter.flatness);
947 5184 caballero
                super.stopEdition(writer, sourceType);
948 12779 caballero
//                try {
949
//                        ova.getDriver().reload();
950
//                } catch (ReloadDriverException e) {
951
//                        throw new StopWriterVisitorException(writer.getName(),e);
952
//                }
953 11468 caballero
                index=null;
954
                writer=null;
955 3952 fjp
        }
956 5223 fjp
957 10627 caballero
        public Rectangle2D getShapeBounds(int index) throws ReadDriverException, ExpansionFileReadException {
958 5223 fjp
                // Solo se utiliza cuando el driver es BoundedShapes
959
                // Si no est? en el fichero de expansi?n
960 10627 caballero
                Integer integer = new Integer(index);
961 3980 caballero
                if (!relations.containsKey(integer)) {
962 5223 fjp
                        if (ova.getDriver() instanceof BoundedShapes) {
963 3980 caballero
                                BoundedShapes bs = (BoundedShapes) ova.getDriver();
964
                                return bs.getShapeBounds(index);
965
                        }
966 10627 caballero
                        return ova.getDriver().getShape(index).getBounds2D();
967 3980 caballero
968
                }
969 10627 caballero
                int num = ((Integer) relations.get(integer)).intValue();
970
                DefaultRowEdited feat;
971
                feat = (DefaultRowEdited) expansionFile.getRow(num);
972
                if (feat.getStatus() == IRowEdited.STATUS_DELETED)
973
                        return null;
974
                IGeometry geom = ((IFeature) feat.getLinkedRow()).getGeometry();
975
                return geom.getBounds2D();// getGeometry();
976 3980 caballero
977
        }
978 5223 fjp
979 10627 caballero
        public int getShapeType(int index) throws ReadDriverException {
980
                return ova.getShapeType();
981 3980 caballero
        }
982 5223 fjp
983 4115 fjp
        /**
984 5223 fjp
         * Usar solo cuando est?s seguro de que puedes gastar memoria. Nosotros lo
985
         * usamos para las b?squedas por ?ndice espacial con el handle. La idea es
986
         * usarlo una vez, guardar las geometr?as que necesitas en ese extent y
987
         * trabajar con ellas hasta el siguiente cambio de extent.
988 5389 caballero
         *
989 4115 fjp
         * @param r
990
         * @param strEPSG
991
         * @return
992 10627 caballero
         * @throws ExpansionFileReadException
993
         * @throws ReadDriverException
994 4115 fjp
         * @throws DriverException
995
         */
996 10627 caballero
        public IRowEdited[] getFeatures(Rectangle2D r, String strEPSG) throws ReadDriverException, ExpansionFileReadException{
997 4115 fjp
                // En esta clase suponemos random access.
998
                // Luego tendremos otra clase que sea VectorialEditableDBAdapter
999
                // que reescribir? este m?todo.
1000 5223 fjp
                Envelope e = FConverter.convertRectangle2DtoEnvelope(r);
1001
                List l = index.query(e);
1002
                IRowEdited[] feats = new IRowEdited[l.size()];
1003 10627 caballero
                for (int index = 0; index < l.size(); index++) {
1004
                        Integer i = (Integer) l.get(index);
1005
                        int inverse = getInversedIndex(i.intValue());
1006
                        feats[index] = getRow(inverse);
1007 10210 caballero
                }
1008 4115 fjp
                return feats;
1009 4085 fjp
        }
1010 5223 fjp
1011 4523 caballero
        public void setSpatialIndex(SpatialIndex spatialIndex) {
1012 5223 fjp
                index = (Quadtree) spatialIndex;
1013 11287 azabala
                QuadtreeJts fmapidx = new QuadtreeJts(index);
1014
                setSpatialIndex(fmapidx);
1015 11468 caballero
1016 4523 caballero
        }
1017 5223 fjp
1018 4523 caballero
        public void setFullExtent(Rectangle2D fullExtent2) {
1019 5223 fjp
                fullExtent = fullExtent2;
1020 4523 caballero
        }
1021 5223 fjp
1022 4727 fjp
        /**
1023
         * DOCUMENT ME!
1024 5389 caballero
         *
1025 4727 fjp
         * @return DOCUMENT ME!
1026
         */
1027
        public Image getSelectionImage() {
1028 5223 fjp
                return selectionImage;
1029 4727 fjp
        }
1030 5223 fjp
1031 4727 fjp
        public Image getHandlersImage() {
1032
                return handlersImage;
1033
        }
1034 5223 fjp
1035 4792 fjp
        /**
1036
         * DOCUMENT ME!
1037 5389 caballero
         *
1038 5223 fjp
         * @param i
1039
         *            DOCUMENT ME!
1040 4792 fjp
         */
1041
        public void setSelectionImage(Image i) {
1042 5223 fjp
                selectionImage = i;
1043 4792 fjp
        }
1044 5223 fjp
1045 4792 fjp
        public void setHandlersImage(BufferedImage handlersImage) {
1046 5223 fjp
                this.handlersImage = handlersImage;
1047 4792 fjp
        }
1048 5389 caballero
1049 11287 azabala
        public IFeatureIterator getFeatureIterator() throws ReadDriverException {
1050
                return new DefaultFeatureIterator(this, projection, null, null);
1051
        }
1052 11468 caballero
1053
1054
        public IFeatureIterator getFeatureIterator(String[] fields, IProjection newProjection)
1055 11287 azabala
        throws ReadDriverException{
1056
                return new DefaultFeatureIterator(this, projection, newProjection, fields);
1057
        }
1058 11468 caballero
1059 11287 azabala
        /**
1060
        * Return a feature iterator from a given sql statement.
1061
        * <br>
1062
        * In this case, the statement will have the "projection" operator
1063
        * (select campo1, campo2, ...etc) and the "selection" operator (where ....)
1064
        * @param sql statement which define a filter
1065
        * @return feature iterator
1066
        * */
1067 11468 caballero
        public IFeatureIterator getFeatureIterator(String sql,
1068 11287 azabala
                                                                IProjection newProjection) throws ReadDriverException{
1069 11468 caballero
1070 11287 azabala
                return new AttrQueryFeatureIterator(this, projection, newProjection, sql);
1071
        }
1072 11468 caballero
1073
1074 11287 azabala
        /**
1075
        * Makes an spatial query returning a feature iterator over the features which intersects
1076
        * or are contained in the rectangle query. Applies a restriction to the alphanumeric fields
1077
        * returned by the iterator.
1078
        * @param rect
1079
        * @param fields
1080
        * @return
1081 11468 caballero
         * @throws ReadDriverException
1082
        */
1083 12300 caballero
        public IFeatureIterator getFeatureIterator(Rectangle2D rect, String[] fields,
1084 11880 azabala
                                                                        IProjection newProjection, boolean fastIteration) throws ReadDriverException{
1085 11287 azabala
                if(fmapSpatialIndex == null){
1086 11880 azabala
                        return new SpatialQueryFeatureIterator(this, projection, newProjection, fields, rect, fastIteration);
1087 11287 azabala
                }else{
1088 11880 azabala
                        return new IndexedSptQueryFeatureIterator(this, projection, newProjection, fields, rect, fmapSpatialIndex, fastIteration);
1089 11287 azabala
                }
1090
        }
1091
1092
        public ISpatialIndex getSpatialIndex() {
1093
                return fmapSpatialIndex;
1094
        }
1095
1096
        public void setSpatialIndex(ISpatialIndex spatialIndex) {
1097
                this.fmapSpatialIndex = spatialIndex;
1098
        }
1099
1100
        public void setProjection(IProjection projection) {
1101
                this.projection = projection;
1102
        }
1103
1104
        public IProjection getProjection() {
1105
                return projection;
1106
        }
1107
1108 11468 caballero
        public void cancelEdition(int sourceType) throws CancelEditingLayerException {
1109
                super.cancelEdition(sourceType);
1110
                index=null;
1111
                setWriter(null);
1112
                System.gc();
1113
        }
1114 11287 azabala
1115 12779 caballero
        /**
1116
         * Inserta las coordenadas de transformaci?n.
1117
         *
1118
         * @param ct Coordenadas de transformaci?n.
1119
         */
1120
        public void setCoordTrans(ICoordTrans ct) {
1121
                this.ct=ct;
1122
        }
1123 5389 caballero
1124 3612 fjp
}