Revision 1556

View differences:

branches/pilotoDWG/libraries/libFMap/src/com/iver/cit/gvsig/fmap/core/v02/FGraphicUtilities.java
682 682
		for (int i = 0; i < handlers.length; i++) {
683 683
			Point2D point = handlers[i].getPoint();
684 684
			at.transform(point, point);
685
			g.fillRect((int) (point.getX() - 3), (int) (point.getY() - 3), 6, 6);
685
			g.fillRect((int) (point.getX() - 5), (int) (point.getY() - 5), 10, 10);
686 686
		}
687 687
	}
688 688
}
branches/pilotoDWG/libraries/libFMap/src/com/iver/cit/gvsig/fmap/edition/ExpansionFile.java
8 8

  
9 9

  
10 10
/**
11
 * Maneja el fichero de extensi?n en el que se almacenan las modificacionesy adici?nes
12
 * durante la edici?n. Los ?ndices que devuelve esta clase en sus m?todos
13
 * addGeometry y modifyGeometry son invariables, es decir, que si se invoca un
14
 * m?todo addGeometry que retorna un 8, independientemente de las operaciones
15
 * que se realicen posteriormente, una llamada a getGeometry(8) retornar?
16
 * dicha geometr?a. Si esta geometr?a es eliminada posteriormente, se retornar? un
17
 * null. Esto ?ltimo se cumple mientras no se invoque el m?todo compact, mediante
18
 * el que se reorganizan las geometr?as dejando en el fichero s?lo las que tienen
19
 * validez en el momento de realizar la invocaci?n.
11
 * Maneja el fichero de extensi?n en el que se almacenan las modificacionesy
12
 * adici?nes durante la edici?n. Los ?ndices que devuelve esta clase en sus
13
 * m?todos addGeometry y modifyGeometry son invariables, es decir, que si se
14
 * invoca un m?todo addGeometry que retorna un 8, independientemente de las
15
 * operaciones que se realicen posteriormente, una llamada a getGeometry(8)
16
 * retornar? dicha geometr?a. Si esta geometr?a es eliminada posteriormente,
17
 * se retornar? un null. Esto ?ltimo se cumple mientras no se invoque el
18
 * m?todo compact, mediante el que se reorganizan las geometr?as dejando en el
19
 * fichero s?lo las que tienen validez en el momento de realizar la
20
 * invocaci?n.
20 21
 */
21 22
public interface ExpansionFile {
22 23
	/**
......
76 77
	 * @return n?mero de geometr?as.
77 78
	 */
78 79
	int getGeometryCount();
80

  
81
	/**
82
	 * Mueve el puntero de escritura de manera que las siguientes escrituras machacar?n la ?ltima
83
	 * geometr?a 
84
	 */
85
	void deleteLastGeometry();
79 86
}
branches/pilotoDWG/libraries/libFMap/src/com/iver/cit/gvsig/fmap/edition/EditableFeatureSource.java
7 7

  
8 8
import java.awt.Image;
9 9
import java.awt.geom.Rectangle2D;
10

  
10 11
import java.io.IOException;
11 12

  
12 13

  
......
74 75
	void addGeometry(IGeometry g) throws DriverIOException, IOException;
75 76

  
76 77
	/**
78
	 * Deshace la ?ltima acci?n realizada. Si no hay m?s acciones no realiza
79
	 * ninguna acci?n
80
	 *
81
	 * @throws DriverIOException Si se produce un error accediendo a las
82
	 * 		   geometr?as originales
83
	 * @throws IOException Si se produce un error con el fichero de expansi?n
84
	 */
85
	void undo() throws DriverIOException, IOException;
86

  
87
	/**
88
	 * Rehace la ?ltima acci?n deshecha. Si no hay m?s acciones no hace nada
89
	 *
90
	 * @throws DriverIOException Si se produce un error accediendo a las
91
	 * 		   geometr?as originales
92
	 * @throws IOException Si se produce un error con el fichero de expansi?n
93
	 */
94
	void redo() throws DriverIOException, IOException;
95

  
96
	/**
97
	 * Devuelve true si se puede deshacer un comando invocando undo
98
	 * o si por el contrario se ha llegado al principio de la lista
99
	 * de comandos y ya no se pueden deshacer m?s comandos
100
	 *
101
	 * @return boolean
102
	 */
103
	boolean moreUndoCommands();
104

  
105
	/**
106
	 * Devuelve true si se puede rehacer un comando invocando redo
107
	 * o si por el contrario se est? al final de la lista de comandos
108
	 * y ya no se pueden deshacer m?s comandos
109
	 *
110
	 * @return boolean
111
	 */
112
	boolean moreRedoCommands();
113

  
114
	/**
77 115
	 * Elimina una geometria. Si es una geometr?a original de la capa en
78 116
	 * edici?n se marca como eliminada (haya sido modificada o no). Si es una
79 117
	 * geometr?a a?adida posteriormente se invalida en el fichero de
......
128 166
	 * ...) que use el ?ndice de la geometr?a se ver? afectado por ?ste m?todo
129 167
	 */
130 168
	void compact();
131
	
169

  
170
	/**
171
	 * DOCUMENT ME!
172
	 *
173
	 * @param i DOCUMENT ME!
174
	 */
132 175
	void setImage(Image i);
176

  
177
	/**
178
	 * DOCUMENT ME!
179
	 *
180
	 * @return DOCUMENT ME!
181
	 */
133 182
	Image getImage();
183

  
184
	/**
185
	 * DOCUMENT ME!
186
	 *
187
	 * @return DOCUMENT ME!
188
	 */
134 189
	public CommandRecord getCommandRecord();
135 190
}
branches/pilotoDWG/libraries/libFMap/src/com/iver/cit/gvsig/fmap/edition/DefaultEditableFeatureSource.java
2 2

  
3 3
import com.iver.cit.gvsig.fmap.core.IGeometry;
4 4
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
5

  
5 6
import com.vividsolutions.jts.geom.Envelope;
6 7
import com.vividsolutions.jts.index.quadtree.Quadtree;
7 8

  
8 9
import java.awt.Image;
9 10
import java.awt.geom.Rectangle2D;
11

  
10 12
import java.io.IOException;
11 13

  
12 14
import java.util.ArrayList;
......
26 28
	private OriginalFeatureAdapter ofa;
27 29
	private BitSet delgeometries = new BitSet();
28 30
	private HashMap relations = new HashMap();
29
	private int numAdd=0;
30

  
31
	private int numAdd = 0;
31 32
	private Quadtree index;
32 33
	private Image selectionImage;
33
	
34

  
34 35
	/**
35 36
	 * Crea un nuevo AbstractEditableFeatureSource.
36 37
	 *
......
47 48
	 * M?todo invocado cuando se comienza la edici?n, para poner en marcha las
48 49
	 * estructuras de datos necesarias para la misma, notificar al servidor en
49 50
	 * protocolos en los que sea necesario, ...
51
	 *
50 52
	 * @throws EditionException
51 53
	 */
52 54
	public void startEdition() throws EditionException {
53 55
		ofa.startEdition();
54
		
56

  
55 57
		index = new Quadtree();
56
		
58

  
57 59
		try {
58
			for (int i = 0; i < getGeometryCount(); i++){
60
			for (int i = 0; i < getGeometryCount(); i++) {
59 61
				IGeometry g = getGeometry(i);
60 62
				Rectangle2D r = g.getBounds2D();
61
				Envelope e = new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(), r.getY() + r.getHeight());
63
				Envelope e = new Envelope(r.getX(), r.getX() + r.getWidth(),
64
						r.getY(), r.getY() + r.getHeight());
62 65
				index.insert(e, new Integer(i));
63 66
			}
64 67
		} catch (DriverIOException e) {
......
66 69
		} catch (IOException e) {
67 70
			e.printStackTrace();
68 71
		}
69
		
72

  
73
		System.err.println("Se han metido en el ?ndice " +
74
			index.queryAll().size() + " geometr?as");
70 75
	}
71 76

  
72 77
	/**
73 78
	 * Invocado cuando termina la edici?n. En funci?n de la clase concreta que
74 79
	 * implemente este m?todo se generar? el fichero con los resultados de la
75 80
	 * edici?n, se realizar? una transacci?n a la base de datos, etc.
81
	 *
76 82
	 * @throws EditionException
77 83
	 */
78 84
	public void stopEdition() throws EditionException {
......
83 89
	 * Devuelve el n?mero de geometrias que hay actualmente en edici?n.
84 90
	 *
85 91
	 * @return N?mero de geometr?as.
92
	 *
86 93
	 * @throws DriverIOException
87 94
	 */
88 95
	public int getGeometryCount() throws DriverIOException {
89
		return ofa.getGeometryCount() + numAdd;//expansionFile.getGeometryCount() - relations.size();
96
		return ofa.getGeometryCount() + numAdd; //expansionFile.getGeometryCount() - relations.size();
90 97
	}
91 98

  
92 99
	/**
......
133 140
		int pos = expansionFile.addGeometry(g);
134 141
		relations.put(new Integer(virtualIndex), new Integer(pos));
135 142
		numAdd++;
136
		
143

  
137 144
		Rectangle2D r = g.getBounds2D();
138
		index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(), r.getY() + r.getHeight()), new Integer(virtualIndex));
139
//		System.err.println(this.index.size());
145
		index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(),
146
				r.getY() + r.getHeight()), new Integer(virtualIndex));
147

  
148
		//		System.err.println(this.index.size());
140 149
	}
141 150

  
142 151
	/**
......
146 155
	 * expansi?n, para que una futura compactaci?n termine con ella.
147 156
	 *
148 157
	 * @param index ?ndice de la geometr?a.
158
	 *
149 159
	 * @throws DriverIOException
150 160
	 * @throws IOException
151 161
	 */
......
153 163
		Integer integer = new Integer(index);
154 164

  
155 165
		IGeometry g = null;
166

  
156 167
		if (!relations.containsKey(integer)) {
157 168
			delgeometries.set(index, true);
158 169
			g = ofa.getGeometry(index);
......
161 172
			g = expansionFile.getGeometry(num);
162 173
			expansionFile.invalidateGeometry(num);
163 174
		}
164
		
175

  
165 176
		Rectangle2D r = g.getBounds2D();
166
		this.index.remove(new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(), r.getY() + r.getHeight()), new Integer(index));
167
//		System.err.println(this.index.size());
177
		this.index.remove(new Envelope(r.getX(), r.getX() + r.getWidth(),
178
				r.getY(), r.getY() + r.getHeight()), new Integer(index));
179

  
180
		//		System.err.println(this.index.size());
168 181
	}
169 182

  
170 183
	/**
......
186 199
		Integer integer = new Integer(index);
187 200

  
188 201
		IGeometry gAnt = null;
202

  
189 203
		if (!relations.containsKey(integer)) {
190 204
			int expansionIndex = expansionFile.addGeometry(g);
191 205
			relations.put(integer, new Integer(expansionIndex));
206

  
207
			//Se actualiza el ?ndice espacial
192 208
			gAnt = ofa.getGeometry(index);
209

  
193 210
			Rectangle2D rAnt = gAnt.getBounds2D();
194 211
			Rectangle2D r = g.getBounds2D();
195
			this.index.remove(new Envelope(rAnt.getX(), rAnt.getX() + rAnt.getWidth(), rAnt.getY(), rAnt.getY() + rAnt.getHeight()), new Integer(index));
196
			this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(), r.getY() + r.getHeight()), new Integer(index));
212
			this.index.remove(new Envelope(rAnt.getX(),
213
					rAnt.getX() + rAnt.getWidth(), rAnt.getY(),
214
					rAnt.getY() + rAnt.getHeight()), new Integer(index));
215
			this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(),
216
					r.getY(), r.getY() + r.getHeight()), new Integer(index));
197 217
		} else {
198 218
			int num = ((Integer) relations.get(integer)).intValue();
199 219
			gAnt = expansionFile.getGeometry(num);
200 220
			num = expansionFile.modifyGeometry(num, g);
201 221
			relations.put(integer, new Integer(num));
222

  
223
			//Se modifica el ?ndice espacial
202 224
			Rectangle2D rAnt = gAnt.getBounds2D();
203 225
			Rectangle2D r = g.getBounds2D();
204
    		this.index.remove(new Envelope(rAnt.getX(), rAnt.getX() + rAnt.getWidth(), rAnt.getY(), rAnt.getY() + rAnt.getHeight()), new Integer(index));
205
			this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(), r.getY() + r.getHeight()), new Integer(index));
226
			this.index.remove(new Envelope(rAnt.getX(),
227
					rAnt.getX() + rAnt.getWidth(), rAnt.getY(),
228
					rAnt.getY() + rAnt.getHeight()), new Integer(index));
229
			this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(),
230
					r.getY(), r.getY() + r.getHeight()), new Integer(index));
206 231
		}
207 232

  
208
		
209
//		System.err.println(this.index.size());
210
		
211
		
233
		//		System.err.println(this.index.size());
212 234
	}
213 235

  
214 236
	/**
......
231 253
	 * @see com.iver.cit.gvsig.fmap.edition.EditableFeatureSource#getGeometriesIndexes(com.vividsolutions.jts.geom.Envelope)
232 254
	 */
233 255
	public int[] getGeometriesIndexes(Rectangle2D r) {
234
		Envelope e = new Envelope(r.getX(), r.getX() + r.getWidth(),
235
				r.getY(), r.getY()+r.getHeight());
256
		Envelope e = new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(),
257
				r.getY() + r.getHeight());
236 258
		List l = index.query(e);
237 259
		int[] indexes = new int[l.size()];
238
		
239
		for (int index = 0; index < l.size(); index++){
260

  
261
		for (int index = 0; index < l.size(); index++) {
240 262
			Integer i = (Integer) l.get(index);
241 263
			indexes[index] = i.intValue();
242 264
		}
243
		
265

  
244 266
		return indexes;
245 267
	}
246 268

  
......
264 286
	public CommandRecord getCommandRecord() {
265 287
		return null;
266 288
	}
289

  
290
	/**
291
	 * Se elimina del final del fichero de expansi?n poniendo el puntero de
292
	 * escritura apuntando al final de la pen?ltima geometr?a. Deber? quitar
293
	 * la relaci?n del mapa de relaciones
294
	 *
295
	 * @param index ?ndice de la geometr?a que se a?adi?
296
	 */
297
	public void undoAddGeometry(int index) {
298
		//TODO implementar
299
	}
300

  
301
	/**
302
	 * Se desmarca como invalidada en el fichero de expansion o como eliminada
303
	 * en el fichero original
304
	 *
305
	 * @param index DOCUMENT ME!
306
	 */
307
	public void undoRemoveGeometry(int index) {
308
		//TODO implementar
309
	}
310

  
311
	/**
312
	 * Actualiza en el mapa de ?ndices, la posici?n en la que estaba la
313
	 * geometr?a antes de ser modificada. Se marca como v?lida, en caso de que
314
	 * fuera una modificaci?n de una geometr?a que estuviese en el fichero de
315
	 * expansi?n antes de ser modificada y se pone el puntero de escritura del
316
	 * expansion file a justo despues de la penultima geometr?a
317
	 *
318
	 * @param geometryIndex ?ndice de la geometr?a que se quiere deshacer su
319
	 * 		  movimiento
320
	 * @param previousExpansionFileIndex ?ndice que ten?a antes la geometr?a en
321
	 * 		  el expansionFile. Si vale -1 quiere decir que es una
322
	 * 		  modificaci?n de una geometr?a original y por tanto no hay que
323
	 * 		  actualizar el mapa de indices sino eliminar su entrada.
324
	 */
325
	public void undoModifyGeometry(int geometryIndex,
326
		int previousExpansionFileIndex) {
327
		//TODO implementar
328
	}
329

  
330
	/**
331
	 * A?ade una geometria al fichero de expansi?n y guarda la correspondencia
332
	 * en una tabla asociada.
333
	 *
334
	 * @param g geometr?a a guardar.
335
	 *
336
	 * @throws DriverIOException
337
	 * @throws IOException
338
	 */
339
	public void doAddGeometry(IGeometry g) throws DriverIOException, IOException {
340
		int virtualIndex = ofa.getGeometryCount() + numAdd;
341
		int pos = expansionFile.addGeometry(g);
342
		relations.put(new Integer(virtualIndex), new Integer(pos));
343
		numAdd++;
344
	
345
		Rectangle2D r = g.getBounds2D();
346
		index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(),
347
				r.getY() + r.getHeight()), new Integer(virtualIndex));
348
	
349
		//		System.err.println(this.index.size());
350
	}
351

  
352
	/**
353
	 * Elimina una geometria. Si es una geometr?a original de la capa en
354
	 * edici?n se marca como eliminada (haya sido modificada o no). Si es una
355
	 * geometr?a a?adida posteriormente se invalida en el fichero de
356
	 * expansi?n, para que una futura compactaci?n termine con ella.
357
	 *
358
	 * @param index ?ndice de la geometr?a.
359
	 *
360
	 * @throws DriverIOException
361
	 * @throws IOException
362
	 */
363
	public void doRemoveGeometry(int index) throws DriverIOException, IOException {
364
		Integer integer = new Integer(index);
365
	
366
		IGeometry g = null;
367
	
368
		if (!relations.containsKey(integer)) {
369
			delgeometries.set(index, true);
370
			g = ofa.getGeometry(index);
371
		} else {
372
			int num = ((Integer) relations.get(integer)).intValue();
373
			g = expansionFile.getGeometry(num);
374
			expansionFile.invalidateGeometry(num);
375
		}
376
	
377
		Rectangle2D r = g.getBounds2D();
378
		this.index.remove(new Envelope(r.getX(), r.getX() + r.getWidth(),
379
				r.getY(), r.getY() + r.getHeight()), new Integer(index));
380
	
381
		//		System.err.println(this.index.size());
382
	}
383

  
384
	/**
385
	 * Si se intenta modificar una geometr?a original de la capa en edici?n se
386
	 * a?ade al fichero de expansi?n y se registra la posici?n en la que se
387
	 * a?adi?. Si se intenta modificar una geometria que se encuentra en el
388
	 * fichero de expansi?n (por ser nueva o original pero modificada) se
389
	 * invoca el m?todo modifyGeometry y se actualiza el ?ndice de la
390
	 * geometria en el fichero.
391
	 *
392
	 * @param index DOCUMENT ME!
393
	 * @param g DOCUMENT ME!
394
	 *
395
	 * @throws IOException
396
	 * @throws DriverIOException
397
	 */
398
	public void doModifyGeometry(int index, IGeometry g)
399
		throws IOException, DriverIOException {
400
		Integer integer = new Integer(index);
401
	
402
		IGeometry gAnt = null;
403
	
404
		if (!relations.containsKey(integer)) {
405
			int expansionIndex = expansionFile.addGeometry(g);
406
			relations.put(integer, new Integer(expansionIndex));
407
	
408
			//Se actualiza el ?ndice espacial
409
			gAnt = ofa.getGeometry(index);
410
	
411
			Rectangle2D rAnt = gAnt.getBounds2D();
412
			Rectangle2D r = g.getBounds2D();
413
			this.index.remove(new Envelope(rAnt.getX(),
414
					rAnt.getX() + rAnt.getWidth(), rAnt.getY(),
415
					rAnt.getY() + rAnt.getHeight()), new Integer(index));
416
			this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(),
417
					r.getY(), r.getY() + r.getHeight()), new Integer(index));
418
		} else {
419
			int num = ((Integer) relations.get(integer)).intValue();
420
			gAnt = expansionFile.getGeometry(num);
421
			num = expansionFile.modifyGeometry(num, g);
422
			relations.put(integer, new Integer(num));
423
	
424
			//Se modifica el ?ndice espacial
425
			Rectangle2D rAnt = gAnt.getBounds2D();
426
			Rectangle2D r = g.getBounds2D();
427
			this.index.remove(new Envelope(rAnt.getX(),
428
					rAnt.getX() + rAnt.getWidth(), rAnt.getY(),
429
					rAnt.getY() + rAnt.getHeight()), new Integer(index));
430
			this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(),
431
					r.getY(), r.getY() + r.getHeight()), new Integer(index));
432
		}
433
	
434
		//		System.err.println(this.index.size());
435
	}
267 436
}

Also available in: Unified diff