Revision 10932

View differences:

trunk/libraries/libFMap/src/com/iver/cit/gvsig/fmap/layers/FLayers.java
47 47
import java.awt.image.WritableRaster;
48 48
import java.io.File;
49 49
import java.util.ArrayList;
50
import java.util.Collection;
50 51
import java.util.Collections;
51 52
import java.util.Iterator;
52 53
import java.util.List;
......
75 76
import com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver;
76 77
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
77 78
import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver;
79
import com.iver.cit.gvsig.fmap.layers.layerOperations.ComposedLayer;
78 80
import com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint;
79 81
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
80 82
import com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData;
......
418 420
//        try
419 421
//        {
420 422
        	boolean bNeedRecalculateCache = false;
423

  
424
   			///// CHEMA ComposedLayer
425
		    long tg1 = System.currentTimeMillis();
426
			ComposedLayer group = null;
427
			ArrayList pendingEvents= new ArrayList();        	
428
        	boolean fireAfterDrawEvent = true;
429
   			///// CHEMA ComposedLayer
430

  
431
        	
432
        	
421 433
//    		while (iter.hasNext())
422 434
//    		{
423 435
    		 for (int i=0; i < layers.size(); i++) {
......
425 437
                    break; // M?s que nada porque las capas raster no son interrumpibles por ahora.
426 438
//    			FLayer lyr = (FLayer) iter.next();
427 439
    			FLayer lyr = (FLayer) layers.get(i);
440

  
441

  
442
       			///// CHEMA ComposedLayer    			
443
    			fireAfterDrawEvent = true;
444
    			///// CHEMA ComposedLayer
445
    			
446
    			
428 447
    		/*	if (lyr instanceof FLyrVect && ((FLyrVect)lyr).isBroken()){
429 448
    				continue;
430 449
    			}
......
433 452
    			fmap.fireLayerDrawingEvent(beforeEvent);
434 453
        		if ((lyr.isDirty()) || (lyr.isCachingDrawnLayers() == false))
435 454
        			bNeedRecalculateCache = true;
436

  
455
        		
437 456
    			if (lyr.isVisible()) {
438 457

  
439 458
    			        long t1 = System.currentTimeMillis();
......
460 479
    			        		{
461 480
    			        		//if (bNeedRecalculateCache)
462 481
    			        		// {
482

  
483
       			        			///// CHEMA ComposedLayer
484
    			        			if (group != null) {
485
    			        				//si tenemos un grupo pendiente de pintar, pintamos
486
    			        				// para que la cache sea fiable
487
    			        				group.draw(image, g, viewPort, cancel,scale);
488
    			        				fireLayerDrawingEvents(pendingEvents);
489
    			        				pendingEvents.clear();
490
    			        				group = null;
491
    			        			}
492
       			        			///// CHEMA ComposedLayer
493
       			        			
494

  
463 495
    			        			// Copiamos la imagen actual
464 496
    			        			BufferedImage buff = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
465 497
    			        			WritableRaster w = buff.getRaster();
......
477 509
	    			        			// prepareDrawing de FMap.
478 510
	    			        			if (lyr.isDirty())
479 511
	    			        			{
512
	    			        			
513
	    	   			        			
514
	    	   			        			///// CHEMA ComposedLayer
515
	    			        				// Checks for draw group (ComposedLayer)
516
	        			        			if (group != null) {
517
	        			        				// it's going to load a cache image,
518
	        			        				// the current draw isn't needed
519
	        			        				fireLayerDrawingEvents(pendingEvents);
520
	        			        				pendingEvents.clear();
521
	        			        				group = null;
522
	        			        			}
523
	           			        			///// CHEMA ComposedLayer
524
	           			        			
525

  
480 526
	    			        				g.drawImage(lyr.getCacheImageDrawnLayers(), 0, 0, null);
481 527
	    			        				System.err.println("Pinto con acelerado lo que hab?a antes de " + lyr.getName());
482 528
	    			        			}
......
487 533
    			        	// hay que volver a dibujar.
488 534
   			        		if (lyr.isDirty() || bNeedRecalculateCache)
489 535
   			        		{
490
   			        			lyr.draw(image, g, viewPort, cancel,scale);
536
   			        			///// CHEMA ComposedLayer
537
   			        			//lyr.draw(image, g, viewPort, cancel,scale);
538
								///// CHEMA ComposedLayer
491 539

  
492
   			        			/*
540
   			        			// Checks for draw group (ComposedLayer)
541
   			        			if (group != null) {
542
   			        				//If layer can be added to the group, does it
543
   			        				if (group.canAdd(lyr)) {
544
   			        					group.add(lyr);
545
   			        					pendingEvents.add(new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_AFTER_DRAW));
546
   			        					fireAfterDrawEvent=false;
547
   			        				} else {
548
   			        					// draw the 'pending to draw' layer group
549
   		   			        			group.draw(image, g, viewPort, cancel,scale);
550
    			        				fireLayerDrawingEvents(pendingEvents);
551
    			        				pendingEvents.clear();
552

  
553
   		   			        			// gets a new group instance
554
   		   			        			group = lyr.newComposedLayer();
555
   		   			        			// if layer hasn't group, draws it inmediately 
556
   		   			        			if (group == null) {
557
   		   			        				lyr.draw(image, g, viewPort, cancel,scale);
558
   		   			        			} else {
559
   		   			        				// add the layer to the group
560
   		   			        				group.add(lyr);
561
   	   			        					pendingEvents.add(new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_AFTER_DRAW));
562
   	   			        					fireAfterDrawEvent=false;
563
   		   			        			}
564
   			        				}
565
   			        			} else {
566
	   			        			// gets a new group instance
567
	   			        			group = lyr.newComposedLayer();
568
	   			        			// if layer hasn't group, draws it inmediately 
569
	   			        			if (group == null) {
570
	   			        				lyr.draw(image, g, viewPort, cancel,scale);
571
	   			        			} else {
572
	   			        				// adds the layer to the group
573
	   			        				group.add(lyr);
574
   			        					pendingEvents.add(new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_AFTER_DRAW));
575
   			        					fireAfterDrawEvent=false;
576
	   			        			}
577
   			        			}
578
   			        			///// CHEMA ComposedLayer
579
   			        			
580
   			        			/* 
493 581
   			        			 * (Jaume)
494 582
   			        			 * If the layer is instance of ILabelable then it may have labels.
495 583
   			        			 */
496 584
   			        			if (lyr instanceof ILabelable && ((ILabelable) lyr).isLabeled()) {
585
   			        				
586
   	   			        			///// CHEMA ComposedLayer   			        				
587
    			        			if (group != null) {
588
    			        				//si tenemos un grupo pendiente de pintar, pintamos
589
    			        				// para que se pinten correctamente las etiquetas
590
    			        				group.draw(image, g, viewPort, cancel,scale);
591
    			        				fireLayerDrawingEvents(pendingEvents);
592
    			        				pendingEvents.clear();
593
    			        				group = null;
594
    			        			}
595
       			        			///// CHEMA ComposedLayer
596

  
597
    			        			
497 598
   			        				((ILabelable) lyr).drawLabels(image, g, viewPort, cancel, scale);
498 599
   			        			}
499 600
   			        			bNeedRecalculateCache = true;
......
516 617
    					        + (t2-t1) + " milisecs.");
517 618
    					lyr.setDirty(false);
518 619
    			}
519
    			LayerDrawEvent afterEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_AFTER_DRAW);
520
    			fmap.fireLayerDrawingEvent(afterEvent);
620
    			///// CHEMA ComposedLayer
621
    			if (fireAfterDrawEvent) {
622
    			///// CHEMA ComposedLayer
623
    				LayerDrawEvent afterEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_AFTER_DRAW);
624
    				fmap.fireLayerDrawingEvent(afterEvent);
625
    			///// CHEMA ComposedLayer	
626
    			}
627
    			///// CHEMA ComposedLayer
628
    		 }
629
    		 
630
    		///// CHEMA ComposedLayer 
631
    		if (group != null) {
632
 				//si tenemos un grupo pendiente de pintar, pintamos    			 
633
 				group.draw(image, g, viewPort, cancel,scale);
634
				fireLayerDrawingEvents(pendingEvents);
521 635

  
522
    		}
636
 			}
637
			///// CHEMA ComposedLayer
523 638
    		if (getVirtualLayers() != null) {
524 639
    			getVirtualLayers().draw(image, g, viewPort, cancel,scale);
525 640
    		}
......
528 643
//        {
529 644
//            System.err.println(e.getMessage());
530 645
//        }
646
			long tg2 = System.currentTimeMillis();
647
			
648
			System.out.println("Draw all layer "
649
			        + (tg2-tg1) + " milisecs.");
650
			
531 651
	}
532

  
652
	
653
	private void fireLayerDrawingEvents(Collection events) {
654
		Iterator iter = events.iterator();
655
		LayerDrawEvent afterEvent;
656
		while (iter.hasNext()) {
657
			afterEvent =(LayerDrawEvent)iter.next();
658
			System.out.println("+++ evento " + afterEvent.getLayer().getName());
659
			fmap.fireLayerDrawingEvent(afterEvent);
660
		}
661
	}
662
	
533 663
	/**
534 664
	 * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
535 665
	 * 		com.iver.cit.gvsig.fmap.ViewPort,
trunk/libraries/libFMap/src/com/iver/cit/gvsig/fmap/layers/FLayer.java
60 60
import com.iver.cit.gvsig.exceptions.layers.StartEditionLayerException;
61 61
import com.iver.cit.gvsig.fmap.MapContext;
62 62
import com.iver.cit.gvsig.fmap.ViewPort;
63
import com.iver.cit.gvsig.fmap.layers.layerOperations.ComposedLayer;
63 64
import com.iver.utiles.XMLEntity;
64 65
import com.iver.utiles.swing.threads.Cancellable;
65 66

  
......
424 425

  
425 426
	public Map getExtendedProperties();
426 427

  
428
	/**
429
	 * Return a new instance of ComposedLayer. 
430
	 * This allow make a single draw for a group
431
	 * of layers with the same source.
432
	 * 
433
	 * If this operation is not aplicable for this 
434
	 * kind of layer this method returns null.
435
	 * 
436
	 * @see com.iver.cit.gvsig.fmap.layers.layerOperations.ComposedLayer
437
	 * @return ComposedLayer instance or null
438
	 */
439
	public ComposedLayer  newComposedLayer();
440
	
427 441

  
428 442
}
trunk/libraries/libFMap/src/com/iver/cit/gvsig/fmap/layers/layerOperations/ComposedLayer.java
1
package com.iver.cit.gvsig.fmap.layers.layerOperations;
2

  
3
import java.awt.Graphics2D;
4
import java.awt.image.BufferedImage;
5

  
6
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
7
import com.iver.cit.gvsig.fmap.ViewPort;
8
import com.iver.cit.gvsig.fmap.layers.FLayer;
9
import com.iver.utiles.swing.threads.Cancellable;
10

  
11
/**
12
 * Interface for the classes that make able 
13
 * a single draw for a layers group
14
 *  
15
 * @see  com.iver.cit.gvsig.fmap.layers.FLayer#newComposedLayer()
16
 */
17
public interface ComposedLayer {
18

  
19
	/**
20
	 * Checks if the layer can be added to this group
21
	 * 
22
	 * @param layer
23
	 * @return layer can be added or not
24
	 */
25
	public boolean canAdd(FLayer layer);
26
	
27
	/**
28
	 * Adds the layer to the draw group
29
	 * @see com.iver.cit.gvsig.fmap.layers.layerOperations.ComposedLayer#canAdd(FLayer)
30
	 * 
31
	 * @param layer
32
	 * @throws Exception 
33
	 */
34
	public void add(FLayer layer) throws Exception;
35
	
36
	/**
37
	 * Draws all the group in one pass
38
	 * 
39
	 *
40
	 * @see  com.iver.cit.gvsig.fmap.layers.FLayer#draw(BufferedImage, Graphics2D, ViewPort, Cancellable, double)
41
	 */
42
    public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
43
			Cancellable cancel,double scale) throws ReadDriverException;
44

  
45
	
46
}
0 47

  
trunk/libraries/libFMap/src/com/iver/cit/gvsig/fmap/layers/FLyrDefault.java
62 62
import com.iver.cit.gvsig.fmap.MapContext;
63 63
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
64 64
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
65
import com.iver.cit.gvsig.fmap.layers.layerOperations.ComposedLayer;
65 66
import com.iver.cit.gvsig.fmap.operations.strategies.Strategy;
66 67
import com.iver.utiles.IPersistance;
67 68
import com.iver.utiles.XMLEntity;
......
729 730
		return this;
730 731
	}
731 732

  
733
	/* By default this operation is not suported
734
	 * 
735
	 * @see com.iver.cit.gvsig.fmap.layers.FLayer#newComposedLayer()
736
	 */
737
	public ComposedLayer newComposedLayer() {		
738
		return null;
739
	}
732 740

  
741

  
733 742
}

Also available in: Unified diff