Revision 516

View differences:

2.1/trunk/org.gvsig.view3d/org.gvsig.view3d.lib/org.gvsig.view3d.lib.impl/src/main/java/org/gvsig/view3d/lib/impl/properties/DefaultRasterLayerProperties3D.java
1 1
package org.gvsig.view3d.lib.impl.properties;
2 2

  
3
import org.gvsig.fmap.mapcontext.layers.FLayer;
3 4
import org.gvsig.tools.ToolsLocator;
4 5
import org.gvsig.tools.dynobject.DynStruct;
5 6
import org.gvsig.tools.persistence.PersistenceManager;
......
8 9

  
9 10
public class DefaultRasterLayerProperties3D extends BasicLayerProperties3D
10 11
    implements RasterLayerProperties3D {
12
    
13
    public DefaultRasterLayerProperties3D(FLayer theLayer) {
14
        super(theLayer);
15
    }
11 16

  
12 17
    public static void registerPersistence(){
13 18
        // Raster layer 3D properties
2.1/trunk/org.gvsig.view3d/org.gvsig.view3d.lib/org.gvsig.view3d.lib.impl/src/main/java/org/gvsig/view3d/lib/impl/properties/DefaultVectorialLayerProperties3D.java
1 1
package org.gvsig.view3d.lib.impl.properties;
2 2

  
3
import org.gvsig.fmap.mapcontext.layers.FLayer;
3 4
import org.gvsig.tools.ToolsLocator;
4 5
import org.gvsig.tools.dynobject.DynStruct;
5 6
import org.gvsig.tools.persistence.PersistenceManager;
......
8 9
import org.gvsig.view3d.lib.api.properties.LayerProperties3D;
9 10
import org.gvsig.view3d.lib.api.properties.VectorialLayerProperties3D;
10 11

  
12
public class DefaultVectorialLayerProperties3D extends BasicLayerProperties3D
13
    implements VectorialLayerProperties3D {
11 14

  
12
public class DefaultVectorialLayerProperties3D extends BasicLayerProperties3D implements
13
    VectorialLayerProperties3D {
14
    
15 15
    private boolean rasterized = true;
16 16
    private String elevationField;
17 17

  
18
    public DefaultVectorialLayerProperties3D(FLayer theLayer) {
19
        super(theLayer);
20
    }
21

  
18 22
    public String getElevationField() {
19 23
        return elevationField;
20 24
    }
......
25 29

  
26 30
    public void setElevationField(String field) {
27 31
        this.elevationField = field;
32
        fireDrawValueChangedEvent("elevationField");
28 33
    }
29 34

  
30 35
    public void setRasterized(boolean rasterized) {
31 36
        this.rasterized = rasterized;
37
        fireDrawValueChangedEvent("rasterized");
32 38
    }
33
    
34
    public static void registerPersistence(){
39

  
40
    public static void registerPersistence() {
35 41
        // Vectorial layer 3D properties
36 42
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
37
        DynStruct definition = manager.addDefinition(DefaultVectorialLayerProperties3D.class,
38
            VectorialLayerProperties3D.PERSISTENCE_NAME,
39
            "Vectorial layer 3D properties persistence definition", null,
40
            null);
43
        DynStruct definition =
44
            manager.addDefinition(DefaultVectorialLayerProperties3D.class,
45
                VectorialLayerProperties3D.PERSISTENCE_NAME,
46
                "Vectorial layer 3D properties persistence definition", null,
47
                null);
41 48

  
42 49
        definition.extend(manager
43 50
            .getDefinition(LayerProperties3D.PERSISTENCE_NAME));
44 51
        definition.addDynFieldString("elevationField");
45 52
        definition.addDynFieldBoolean("rasterized");
46 53
    }
47
    
54

  
48 55
    @Override
49 56
    public void loadFromState(PersistentState state)
50 57
        throws PersistenceException {
51 58
        super.loadFromState(state);
52
        
59

  
53 60
        setElevationField(state.getString("elevationField"));
54 61
        setRasterized(state.getBoolean("rasterized"));
55 62
    }
56
    
63

  
57 64
    @Override
58 65
    public void saveToState(PersistentState state) throws PersistenceException {
59 66
        super.saveToState(state);
60
        
67

  
61 68
        state.set("elevationField", getElevationField());
62 69
        state.set("rasterized", getRasterized());
63 70
    }
2.1/trunk/org.gvsig.view3d/org.gvsig.view3d.lib/org.gvsig.view3d.lib.impl/src/main/java/org/gvsig/view3d/lib/impl/properties/BasicLayerProperties3D.java
1 1
package org.gvsig.view3d.lib.impl.properties;
2 2

  
3
import org.gvsig.fmap.mapcontext.layers.FLayer;
4
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
5
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
6
import org.gvsig.fmap.mapcontext.layers.LayerListener;
3 7
import org.gvsig.tools.ToolsLocator;
4 8
import org.gvsig.tools.dynobject.DynStruct;
5 9
import org.gvsig.tools.persistence.PersistenceManager;
......
18 22
    private double noDataValue = -99999;
19 23
    private int tileWidth = 512;
20 24
    private int tileHeight = 512;
25
    private FLayer layer;
26
    
27
    public BasicLayerProperties3D(FLayer layer) {
28
        this.layer = layer;
29
    }
21 30

  
22 31
    public boolean getElevation() {
23 32
        return elevation;
......
53 62

  
54 63
    public void setElevation(boolean elevation) {
55 64
        this.elevation = elevation;
65
        fireDrawValueChangedEvent("elevation");
56 66
    }
57 67

  
58 68
    public void setElevationUnits(String elevation) {
59 69
        this.elevationUnits = elevation;
70
        fireDrawValueChangedEvent("elevationUnits");
60 71
    }
61 72

  
62 73
    public void setLevelZeroResolutionMultiplier(double multiplier) {
63 74
        this.levelZeroResolutionMultiplier = multiplier;
75
        fireDrawValueChangedEvent("lezelZeroResolutionMultiPlier");
64 76
    }
65 77

  
66 78
    public void setMaxLevel(int maxLevel) {
67 79
        this.maxLevel = maxLevel;
80
        fireDrawValueChangedEvent("maxLevel");
68 81
    }
69 82

  
70 83
    public void setMinLevel(int minLevel) {
71 84
        this.minLevel = minLevel;
85
        fireDrawValueChangedEvent("minLevel");
72 86
    }
73 87

  
74 88
    public void setNoDataValue(double noDataValue) {
75 89
        this.noDataValue = noDataValue;
90
        fireDrawValueChangedEvent("noDataValue");
76 91

  
77 92
    }
78 93

  
79 94
    public void setTileHeight(int height) {
80 95
        this.tileHeight = height;
96
        fireDrawValueChangedEvent("tileHeight");
81 97

  
82 98
    }
83 99

  
84 100
    public void setTileWidth(int width) {
85 101
        this.tileWidth = width;
102
        fireDrawValueChangedEvent("tileWidth");
86 103
    }
87 104
    
88 105
    public static void registerPersistence(){
......
128 145
        setTileHeight(state.getInt("tileHeight"));
129 146
        setTileWidth(state.getInt("tileWidth"));
130 147
    }
131

  
148
    
149
    protected void fireDrawValueChangedEvent(String property) {
150
        LayerListener[] layerListeners = this.layer.getLayerListeners();
151
        for (int i = 0; i < layerListeners.length; i++) {
152
            layerListeners[i].drawValueChanged(LayerEvent
153
                .createDrawValuesChangedEvent((FLyrDefault) this.layer,
154
                    property));
155
        }
156
    }
132 157
}
2.1/trunk/org.gvsig.view3d/org.gvsig.view3d.lib/org.gvsig.view3d.lib.impl/src/main/java/org/gvsig/view3d/lib/impl/DefaultView3DManger.java
43 43
            LayerProperties3D layerProperties;
44 44
            if(layer instanceof FLyrVect){
45 45
                layerProperties =
46
                    new DefaultVectorialLayerProperties3D();
46
                    new DefaultVectorialLayerProperties3D(layer);
47 47
            } else {
48
                layerProperties = new DefaultRasterLayerProperties3D();
48
                layerProperties = new DefaultRasterLayerProperties3D(layer);
49 49
            }
50 50
            setLayerProperties(layer, layerProperties);
51 51
            return layerProperties;
2.1/trunk/org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.impl/src/main/java/org/gvsig/view3d/swing/impl/DefaultMapControl3D.java
29 29
import gov.nasa.worldwind.Model;
30 30
import gov.nasa.worldwind.WorldWind;
31 31
import gov.nasa.worldwind.avlist.AVKey;
32
import gov.nasa.worldwind.avlist.AVList;
33 32
import gov.nasa.worldwind.avlist.AVListImpl;
34 33
import gov.nasa.worldwind.awt.WorldWindowGLJPanel;
35 34
import gov.nasa.worldwind.globes.Earth;
......
54 53
import java.awt.BorderLayout;
55 54
import java.beans.PropertyChangeEvent;
56 55
import java.beans.PropertyChangeListener;
57
import java.util.ArrayList;
58
import java.util.HashMap;
59 56
import java.util.List;
60
import java.util.Map;
61 57

  
62 58
import javax.swing.JComponent;
63 59
import javax.swing.JPanel;
64 60

  
65 61
import org.gvsig.fmap.dal.exception.DataException;
66 62
import org.gvsig.fmap.mapcontext.MapContext;
67
import org.gvsig.fmap.mapcontext.layers.CancelationException;
68 63
import org.gvsig.fmap.mapcontext.layers.ExtendedPropertiesSupport;
69 64
import org.gvsig.fmap.mapcontext.layers.FLayer;
70 65
import org.gvsig.fmap.mapcontext.layers.FLayers;
71
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
72
import org.gvsig.fmap.mapcontext.layers.LayerCollectionEvent;
73
import org.gvsig.fmap.mapcontext.layers.LayerCollectionListener;
74
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
75
import org.gvsig.fmap.mapcontext.layers.LayerListener;
76
import org.gvsig.fmap.mapcontext.layers.LayerPositionEvent;
77 66
import org.gvsig.fmap.mapcontext.layers.operations.LayersVisitor;
78 67
import org.gvsig.tools.exception.BaseException;
79 68
import org.gvsig.tools.observer.BaseNotification;
......
94 83
import org.gvsig.view3d.swing.api.properties.GeneralProperties3D;
95 84
import org.gvsig.view3d.swing.api.properties.MapControlProperties3D;
96 85
import org.gvsig.view3d.swing.impl.data.DefaultLayerConverter;
97
import org.gvsig.view3d.swing.impl.data.DefaultTiledImageLayer;
98 86
import org.gvsig.view3d.swing.impl.data.LayerConverter;
99 87
import org.slf4j.Logger;
100 88
import org.slf4j.LoggerFactory;
......
112 100
    private static final Logger LOG = LoggerFactory
113 101
        .getLogger(DefaultMapControl3D.class);
114 102

  
115
    private Map<FLayer, Long> drawLayerStatus;
103
    private DefaultSynchronizer synchronizer;
116 104

  
117 105
    private ObservableHelper observableHelper;
118 106

  
......
163 151
        this.type = type;
164 152
        this.cancellable = getCancellable();
165 153
        this.observableHelper = new ObservableHelper();
166
        this.drawLayerStatus = new HashMap<FLayer, Long>();
154
        this.synchronizer =
155
            new DefaultSynchronizer(this, this.mapContext, getWwd().getModel());
167 156
        this.viewProperties = viewProperties;
168 157

  
169 158
        // Set mode before instantiation
......
183 172
            LOG.info("Can't add MapControl layers", e);
184 173
        }
185 174

  
186
        addLayerCollectionListener(mapContext.getLayers());
187
        addLayerListener(mapContext.getLayers());
188

  
189 175
        setGeneral3DProperties();
190 176

  
191 177
        View3DSwingManager swingManager = View3DSwingLocator.getManager();
192
        this.properties = swingManager.getMapControl3DProperties(viewProperties);
178
        this.properties =
179
            swingManager.getMapControl3DProperties(viewProperties);
193 180
        addChangePropertyListener(this.properties);
194 181
        setMapControl3DProperties();
195
        
182

  
196 183
        addVerticalExaggerationChangeProperyListener();
197 184
    }
198 185

  
......
247 234

  
248 235
    }
249 236

  
250
    private void addLayerCollectionListener(FLayers layers) {
251

  
252
        if (layers == null) {
253
            return;
254
        }
255

  
256
        layers.addLayerCollectionListener(new LayerCollectionListener() {
257

  
258
            public void visibilityChanged(LayerCollectionEvent e)
259
                throws CancelationException {
260
            }
261

  
262
            public void layerRemoving(LayerCollectionEvent e)
263
                throws CancelationException {
264
            }
265

  
266
            public void layerRemoved(LayerCollectionEvent e) {
267
                if(properties.getAutoLayerSynchronize()){
268
                    synchronizeLayers();
269
                }
270
            }
271

  
272
            public void layerMoving(LayerPositionEvent e)
273
                throws CancelationException {
274
            }
275

  
276
            public void layerMoved(LayerPositionEvent e) {
277
                int oldPos = e.getOldPos();
278
                int newPos = e.getNewPos();
279
                FLayer layer = e.getAffectedLayer();
280

  
281
                LayerList layers = getWwd().getModel().getLayers();
282
                Layer tileImageLayer = getTileImageLayer(layer);
283
                int tiledIndex = layers.indexOf(tileImageLayer);
284

  
285
                layers.remove(tiledIndex);
286
                layers.add(tiledIndex + (newPos - oldPos), tileImageLayer);
287
            }
288

  
289
            public void layerAdding(LayerCollectionEvent e)
290
                throws CancelationException {
291
            }
292

  
293
            public void layerAdded(LayerCollectionEvent e) {
294
                FLayer affectedLayer = e.getAffectedLayer();
295
                affectedLayer.addLayerListener(getLayerListener());
296
                if(properties.getAutoLayerSynchronize()){
297
                    synchronizeLayers();
298
                }
299
            }
300
        });
301
    }
302

  
303
    private void addLayerListener(FLayer layer) {
304
        if (layer == null) {
305
            return;
306
        }
307
        layer.addLayerListener(getLayerListener());
308
    }
309

  
310
    private LayerListener getLayerListener() {
311
        return new LayerListener() {
312

  
313
            public void visibilityChanged(LayerEvent e) {
314
                if(properties.getAutoLayerSynchronize()){
315
                    FLayer layer = e.getSource();
316
                    Layer tiledImageLayer = getTileImageLayer(layer);
317
                    if (tiledImageLayer != null) {
318
                        tiledImageLayer.setEnabled(layer.isVisible());
319
                    }
320
                }
321
            }
322

  
323
            public void nameChanged(LayerEvent e) {
324
            }
325

  
326
            public void editionChanged(LayerEvent e) {
327
            }
328

  
329
            public void drawValueChanged(LayerEvent e) {
330
                MapControlProperties3D properties = getProperties();
331
                if (properties.getAutoLayerSynchronize()) {
332
                    FLayer layer = e.getSource();
333
                    if (layer.isAvailable()) {
334
                        synchronizeLayers();
335
                    }
336
                }
337
            }
338

  
339
            public void activationChanged(LayerEvent e) {
340
            }
341
        };
342
    }
343

  
344
    private void addGvSIGLayer(FLayer layer) throws DataException {
237
    protected void addGvSIGLayer(FLayer layer) throws DataException {
345 238
        LayerList layers = getWwd().getModel().getLayers();
346 239
        addGvSIGLayer(layer, layers.size());
347 240
    }
348 241

  
349
    private void addGvSIGLayer(FLayer layer, int index) throws DataException {
242
    protected void addGvSIGLayer(FLayer layer, int index) throws DataException {
350 243
        LayerConverter converter = new DefaultLayerConverter();
351 244

  
352 245
        View3DManager manager = View3DLocator.getManager();
......
361 254
                Layer rasterTiledLayer = converter.convertToLayer(this, layer);
362 255
                rasterTiledLayer.setEnabled(layer.isVisible());
363 256
                getWwd().getModel().getLayers().add(index, rasterTiledLayer);
364
                drawLayerStatus.put(layer, layer.getDrawVersion());
365

  
257
                LOG.debug("/////////////////////////////");
258
                LOG.debug("Layers {}", getWwd().getModel().getLayers().toString());
259
                LOG.debug("Layer {} added like tileImageLayer", layer.getName());
260
                LOG.debug("/////////////////////////////");
366 261
            } else {
367
                return; // TODO Convert to 3D vectorial layer
262
                return; //TODO Convert to 3D vectorial layer
368 263
            }
369 264
        } else {
370 265
            ElevationModel elevationModel =
......
373 268
                (CompoundElevationModel) getWwd().getModel().getGlobe()
374 269
                    .getElevationModel();
375 270
            cem.addElevationModel(elevationModel);
271
            LOG.debug("Layer {} added like elevation model", layer.getName());
376 272
        }
377 273
    }
378 274

  
......
399 295

  
400 296
        getWwd().redraw();
401 297
    }
402
    
298

  
403 299
    private void setBlueMarbelLayerVisibility(boolean visibility) {
404
        
405
        if(visibility == getBlueMarbleLayerVisibility()){
300

  
301
        if (visibility == getBlueMarbleLayerVisibility()) {
406 302
            return;
407 303
        }
408
        
304

  
409 305
        setWWLayerVisibility("Blue Marble May 2004", visibility);
410 306
        getProperties().setBlueMarbleLayerVisibility(visibility);
411 307
    }
412
    
413
    private boolean getBlueMarbleLayerVisibility(){
308

  
309
    private boolean getBlueMarbleLayerVisibility() {
414 310
        return isWWLayerVisible("Blue Marble May 2004");
415 311
    }
416 312

  
417 313
    protected void setDefaultElevationVisibility(boolean visibility) {
418
        
314

  
419 315
        ElevationModel elevationModel =
420 316
            getWwd().getModel().getGlobe().getElevationModel();
421 317
        CompoundElevationModel compoundElevationModel =
422 318
            (CompoundElevationModel) elevationModel;
423 319
        List<ElevationModel> elevationModels =
424 320
            compoundElevationModel.getElevationModels();
425
        
426
        if(visibility == getDefaultElevationModelVisiblility()){
321

  
322
        if (visibility == getDefaultElevationModelVisiblility()) {
427 323
            return;
428 324
        }
429 325

  
......
431 327
            for (ElevationModel eModel : elevationModels) {
432 328
                if (eModel instanceof ZeroElevationModel) {
433 329
                    compoundElevationModel.removeElevationModel(eModel);
434
                    compoundElevationModel
435
                        .addElevationModel(0,getDefaultElevationModel());
330
                    compoundElevationModel.addElevationModel(0,
331
                        getDefaultElevationModel());
436 332
                    return;
437 333
                }
438 334
            }
......
449 345
        }
450 346
        getProperties().setDefaultElevationVisibility(visibility);
451 347
    }
452
    
453
    private boolean getDefaultElevationModelVisiblility(){
348

  
349
    private boolean getDefaultElevationModelVisiblility() {
454 350
        ElevationModel elevationModel =
455 351
            getWwd().getModel().getGlobe().getElevationModel();
456 352
        CompoundElevationModel compoundElevationModel =
......
464 360
        }
465 361
        return false;
466 362
    }
467
    
468
    private ElevationModel getDefaultElevationModel(){
363

  
364
    private ElevationModel getDefaultElevationModel() {
469 365
        Factory elevationFactory =
470
            (Factory) WorldWind.createConfigurationComponent(AVKey.ELEVATION_MODEL_FACTORY);
471
        String defaultModelFile = Configuration.getStringValue(AVKey.EARTH_ELEVATION_MODEL_CONFIG_FILE);
472
        
473
        CompoundElevationModel elevationModel = (CompoundElevationModel) elevationFactory.createFromConfigSource(
474
            defaultModelFile, new AVListImpl());
475
        
366
            (Factory) WorldWind
367
                .createConfigurationComponent(AVKey.ELEVATION_MODEL_FACTORY);
368
        String defaultModelFile =
369
            Configuration
370
                .getStringValue(AVKey.EARTH_ELEVATION_MODEL_CONFIG_FILE);
371

  
372
        CompoundElevationModel elevationModel =
373
            (CompoundElevationModel) elevationFactory.createFromConfigSource(
374
                defaultModelFile, new AVListImpl());
375

  
476 376
        return elevationModel.getElevationModels().get(0);
477 377
    }
478 378

  
479 379
    private void setNasaLandsatLayerVisibility(boolean visibility) {
480
        
481
        if(visibility == getNasaLandsatLayerVisibility()){
380

  
381
        if (visibility == getNasaLandsatLayerVisibility()) {
482 382
            return;
483 383
        }
484
        
384

  
485 385
        setWWLayerVisibility("i-cubed Landsat", visibility);
486 386
        getProperties().setNasaLandsatVisibility(visibility);
487 387
    }
488
    
489
    private boolean getNasaLandsatLayerVisibility(){
388

  
389
    private boolean getNasaLandsatLayerVisibility() {
490 390
        return isWWLayerVisible("i-cubed Landsat");
491 391
    }
492 392

  
......
599 499
        return statusBar;
600 500
    }
601 501

  
602
    private Layer getTileImageLayer(FLayer layer) {
603
        List<Layer> layers =
604
            getWwd().getModel().getLayers()
605
                .getLayersByClass(DefaultTiledImageLayer.class);
606
        for (Layer tiledLayer : layers) {
607
            AVList constructionParams =
608
                (AVList) tiledLayer.getValue(AVKey.CONSTRUCTION_PARAMETERS);
609
            if (constructionParams != null) {
610
                FLayer likedLayer =
611
                    (FLayer) constructionParams.getValue(GVSIG_LAYER);
612
                if (layer.equals(likedLayer)) {
613
                    return tiledLayer;
614
                }
615
            }
616
        }
617
        return null;
618
    }
619

  
620 502
    public TYPE getType() {
621 503
        return this.type;
622 504
    }
......
725 607
    }
726 608

  
727 609
    public void setVerticalExaggeration(double verticalExaggeration) {
728
        
610

  
729 611
        if (getVerticalExaggeration() == verticalExaggeration) {
730 612
            return;
731 613
        }
732 614

  
733 615
        getWwd().getSceneController().setVerticalExaggeration(
734 616
            verticalExaggeration);
735
        
617

  
736 618
        if (getType() == TYPE.SPHERE) {
737 619
            getProperties().setSphereVerticalExaggeration(verticalExaggeration);
738 620
        } else if (getType() == TYPE.FLAT) {
......
740 622
        }
741 623
    }
742 624

  
743
    public synchronized void synchronizeLayers() {
744
        
745
        FLayers layers = this.mapContext.getLayers();
746
        
747
        // Remove old layers
748
        List<FLayer> layersRemoved = new ArrayList<FLayer>();
749
        for (FLayer layer : drawLayerStatus.keySet()) {
750
            if (layers.getLayer(layer.getName()) == null) {
751
                int index = removeGvSIGLayer(layer);
752
                if(index >= 0){
753
                    layersRemoved.add(layer);
754
                }
755
            }
756
        }
757
        for (FLayer fLayer : layersRemoved) {
758
            drawLayerStatus.remove(fLayer);
759
        }
760
        
761
        
762
        // Add new layers
763
        try {
764
            layers.accept(new LayersVisitor() {
765

  
766
                public void visit(Object obj) throws VisitCanceledException,
767
                    BaseException {
768
                    throw new UnsupportedOperationException();
769
                }
770

  
771
                public void visit(FLayer layer) throws BaseException {
772
                    
773
                    if(!drawLayerStatus.containsKey(layer)){
774
                        drawLayerStatus.put(layer, layer.getDrawVersion());
775
                        addGvSIGLayer(layer);
776
                    }
777
                }
778
            });
779
        } catch (BaseException e) {
780
            LOG.error("Can't synchronize layers. Can't visit layers of {}",
781
                mapContext.toString(), e);
782
        }
783
        
784
        // Update registered layers
785
        for (FLayer layer : drawLayerStatus.keySet()) {
786
            if (layer instanceof FLyrDefault) {
787
                FLyrDefault defaultLayer = (FLyrDefault) layer;
788

  
789
                if (defaultLayer.hasChangedForDrawing(drawLayerStatus
790
                    .get(layer))) {
791
                    replaceGvSIGLayer(defaultLayer);
792
                }
793
            }
794
        }
625
    public void synchronizeLayers() {
626
        this.synchronizer.synchronizeLayers();
795 627
    }
796 628

  
797
    private int removeGvSIGLayer(FLayer layer) {
798
        List<Layer> loadedLayers = getWwd().getModel().getLayers();
799
        Layer tiledImageLayer = getTileImageLayer(layer);
800

  
801
        if (tiledImageLayer == null) {
802
            return -1;
803
        }
804

  
805
        int layerIndex = loadedLayers.indexOf(tiledImageLayer);
806
        getWwd().getModel().getLayers().remove(tiledImageLayer);
807
        return layerIndex;
808
    }
809

  
810
    private void replaceGvSIGLayer(FLayer layer) {
811
        // Remove layer without update drawLayerStatus map.
812
        List<Layer> loadedLayers = getWwd().getModel().getLayers();
813
        Layer tiledImageLayer = getTileImageLayer(layer);
814

  
815
        if (tiledImageLayer == null) {
816
            return;
817
        }
818

  
819
        int layerIndex = loadedLayers.indexOf(tiledImageLayer);
820
        getWwd().getModel().getLayers().remove(tiledImageLayer);
821

  
822
        // Add new layer at the same index
823
        if (layerIndex >= 0) {
824
            try {
825
                addGvSIGLayer(layer, layerIndex);
826
            } catch (DataException e) {
827
                LOG.error("Can't add {} at {}", new Object[] { layer.getName(),
828
                    layerIndex }, e);
829
            }
830
        }
831
    }
832

  
833 629
    public void synchronizeViewPorts() {
834
        // TODO
835
        throw new UnsupportedOperationException();
630
        this.synchronizer.synchronizeViewPorts();
836 631
    }
837 632

  
838 633
    public void addObserver(Observer o) {
......
899 694
        }
900 695
        return false;
901 696
    }
902
    
697

  
903 698
    private boolean isWWLayerVisible(String name) {
904 699
        Layer layer = getWwd().getModel().getLayers().getLayerByName(name);
905
        if(layer != null){
700
        if (layer != null) {
906 701
            return layer.isEnabled();
907 702
        }
908 703
        return false;
......
911 706
    public MapControlProperties3D getProperties() {
912 707
        return properties;
913 708
    }
914
    
709

  
915 710
    private void addVerticalExaggerationChangeProperyListener() {
916
        getWwd().getSceneController().addPropertyChangeListener(new PropertyChangeListener() {
917
            
918
            public void propertyChange(PropertyChangeEvent evt) {
919
                String propertyName = evt.getPropertyName();
920
                if(propertyName.equals(AVKey.VERTICAL_EXAGGERATION)){
921
                    Double value = (Double) evt.getNewValue();
922
                    if(getType() == TYPE.SPHERE){
923
                        getProperties().setSphereVerticalExaggeration(value);
924
                    } else if(getType() == TYPE.FLAT){
925
                        getProperties().setFlatVerticalExaggeration(value);
711
        getWwd().getSceneController().addPropertyChangeListener(
712
            new PropertyChangeListener() {
713

  
714
                public void propertyChange(PropertyChangeEvent evt) {
715
                    String propertyName = evt.getPropertyName();
716
                    if (propertyName.equals(AVKey.VERTICAL_EXAGGERATION)) {
717
                        Double value = (Double) evt.getNewValue();
718
                        if (getType() == TYPE.SPHERE) {
719
                            getProperties()
720
                                .setSphereVerticalExaggeration(value);
721
                        } else if (getType() == TYPE.FLAT) {
722
                            getProperties().setFlatVerticalExaggeration(value);
723
                        }
926 724
                    }
927 725
                }
928
            }
929
        });
726
            });
930 727
    }
931 728
}
2.1/trunk/org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.impl/src/main/java/org/gvsig/view3d/swing/impl/DefaultSynchronizer.java
1
package org.gvsig.view3d.swing.impl;
2

  
3
import gov.nasa.worldwind.Model;
4
import gov.nasa.worldwind.avlist.AVKey;
5
import gov.nasa.worldwind.avlist.AVList;
6
import gov.nasa.worldwind.globes.ElevationModel;
7
import gov.nasa.worldwind.layers.Layer;
8
import gov.nasa.worldwind.terrain.CompoundElevationModel;
9

  
10
import java.util.ArrayList;
11
import java.util.HashMap;
12
import java.util.List;
13
import java.util.Map;
14
import java.util.Map.Entry;
15

  
16
import org.gvsig.fmap.dal.exception.DataException;
17
import org.gvsig.fmap.mapcontext.MapContext;
18
import org.gvsig.fmap.mapcontext.layers.CancelationException;
19
import org.gvsig.fmap.mapcontext.layers.FLayer;
20
import org.gvsig.fmap.mapcontext.layers.FLayers;
21
import org.gvsig.fmap.mapcontext.layers.LayerCollectionEvent;
22
import org.gvsig.fmap.mapcontext.layers.LayerCollectionListener;
23
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
24
import org.gvsig.fmap.mapcontext.layers.LayerListener;
25
import org.gvsig.fmap.mapcontext.layers.LayerPositionEvent;
26
import org.gvsig.fmap.mapcontext.layers.operations.LayersVisitor;
27
import org.gvsig.tools.exception.BaseException;
28
import org.gvsig.tools.visitor.VisitCanceledException;
29
import org.gvsig.view3d.lib.api.View3DLocator;
30
import org.gvsig.view3d.lib.api.View3DManager;
31
import org.gvsig.view3d.lib.api.properties.LayerProperties3D;
32
import org.gvsig.view3d.swing.api.properties.MapControlProperties3D;
33
import org.gvsig.view3d.swing.impl.data.DefaultTiledImageLayer;
34
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36

  
37
public class DefaultSynchronizer {
38

  
39
    private static final Logger LOG = LoggerFactory
40
        .getLogger(DefaultSynchronizer.class);
41

  
42
    private Map<FLayer, LAYER_SYNCHRONIZE_STATUS> tiledlayerRegister =
43
        new HashMap<FLayer, LAYER_SYNCHRONIZE_STATUS>();
44

  
45
    private Map<FLayer, LAYER_SYNCHRONIZE_STATUS> elevationModelLayerRegister =
46
        new HashMap<FLayer, LAYER_SYNCHRONIZE_STATUS>();
47

  
48
    private DefaultMapControl3D mapControl3D;
49
    private MapContext mapContext;
50
    private Model modelWW;
51

  
52
    protected DefaultSynchronizer(DefaultMapControl3D theMapControl3D,
53
        MapContext theMapContext, Model theModelWW) {
54

  
55
        this.mapControl3D = theMapControl3D;
56
        this.mapContext = theMapContext;
57
        this.modelWW = theModelWW;
58

  
59
        intializeRegisters();
60

  
61
        addLayerCollectionListener(mapContext.getLayers());
62
        addLayerListener(mapContext.getLayers());
63
    }
64

  
65
    private void intializeRegisters() {
66

  
67
        FLayers layers = mapContext.getLayers();
68

  
69
        try {
70
            layers.accept(new LayersVisitor() {
71

  
72
                public void visit(Object obj) throws VisitCanceledException,
73
                    BaseException {
74
                    throw new UnsupportedOperationException();
75

  
76
                }
77

  
78
                public void visit(FLayer layer) throws BaseException {
79

  
80
                    View3DManager manager = View3DLocator.getManager();
81
                    LayerProperties3D layerProperties =
82
                        manager.getLayerProperties(layer);
83

  
84
                    if (layerProperties.getElevation() == true) {
85
                        elevationModelLayerRegister.put(layer,
86
                            LAYER_SYNCHRONIZE_STATUS.CLEAN);
87
                    } else {
88
                        tiledlayerRegister.put(layer,
89
                            LAYER_SYNCHRONIZE_STATUS.CLEAN);
90
                    }
91
                }
92
            });
93
        } catch (BaseException e) {
94
            LOG.error(
95
                "Can't initialize register of layers to auto synchronize.", e);
96
            mapControl3D.getProperties().setAutoLayerSynchronize(false);
97
        }
98
    }
99

  
100
    private void addLayerListener(FLayer layer) {
101
        if (layer == null) {
102
            return;
103
        }
104
        layer.addLayerListener(getLayerListener());
105
    }
106

  
107
    private void addLayerCollectionListener(FLayers layers) {
108

  
109
        if (layers == null) {
110
            return;
111
        }
112

  
113
        layers.addLayerCollectionListener(new LayerCollectionListener() {
114

  
115
            public void layerAdded(LayerCollectionEvent e) {
116
                FLayer affectedLayer = e.getAffectedLayer();
117
                affectedLayer.addLayerListener(getLayerListener());
118
                updateLayerState(affectedLayer, LAYER_SYNCHRONIZE_STATUS.ADD);
119
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
120
                    synchronizeLayers();
121
                }
122
            }
123

  
124
            public void layerAdding(LayerCollectionEvent e)
125
                throws CancelationException {
126
            }
127

  
128
            public void layerMoved(LayerPositionEvent e) {
129
                FLayer affectedLayer = e.getAffectedLayer();
130
                moveLayer(affectedLayer);
131
            }
132

  
133
            public void layerMoving(LayerPositionEvent e)
134
                throws CancelationException {
135
            }
136

  
137
            public void layerRemoved(LayerCollectionEvent e) {
138
                FLayer affectedLayer = e.getAffectedLayer();
139
                updateLayerState(affectedLayer, LAYER_SYNCHRONIZE_STATUS.REMOVE);
140
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
141
                    synchronizeLayers();
142
                }
143
            }
144

  
145
            public void layerRemoving(LayerCollectionEvent e)
146
                throws CancelationException {
147
            }
148

  
149
            public void visibilityChanged(LayerCollectionEvent e)
150
                throws CancelationException {
151
            }
152
        });
153
    }
154

  
155
    private LayerListener getLayerListener() {
156
        return new LayerListener() {
157

  
158
            public void activationChanged(LayerEvent e) {
159
            }
160

  
161
            public void drawValueChanged(LayerEvent e) {
162
                FLayer layer = e.getSource();
163
                updateLayerState(layer, LAYER_SYNCHRONIZE_STATUS.DIRTY);
164

  
165
                MapControlProperties3D properties =
166
                    mapControl3D.getProperties();
167
                if (properties.getAutoLayerSynchronize()) {
168
                    synchronizeLayers();
169
                }
170
            }
171

  
172
            public void editionChanged(LayerEvent e) {
173
            }
174

  
175
            public void nameChanged(LayerEvent e) {
176
            }
177

  
178
            public void visibilityChanged(LayerEvent e) {
179
                FLayer layer = e.getSource();
180

  
181
                updateLayerState(layer, LAYER_SYNCHRONIZE_STATUS.DIRTY);
182
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
183
                    synchronizeLayers();
184
                }
185
            }
186
        };
187
    }
188

  
189
    private Layer getTileImageLayer(FLayer layer) {
190
        List<Layer> layers =
191
            modelWW.getLayers().getLayersByClass(DefaultTiledImageLayer.class);
192
        for (Layer tiledLayer : layers) {
193
            AVList constructionParams =
194
                (AVList) tiledLayer.getValue(AVKey.CONSTRUCTION_PARAMETERS);
195
            if (constructionParams != null) {
196
                FLayer likedLayer =
197
                    (FLayer) constructionParams
198
                        .getValue(DefaultMapControl3D.GVSIG_LAYER);
199
                if (layer.equals(likedLayer)) {
200
                    return tiledLayer;
201
                }
202
            }
203
        }
204
        return null;
205
    }
206

  
207
    private ElevationModel getElevationModel(FLayer layer) {
208
        ElevationModel elevationModel = modelWW.getGlobe().getElevationModel();
209

  
210
        if (elevationModel instanceof CompoundElevationModel) {
211
            CompoundElevationModel compoundModel =
212
                (CompoundElevationModel) elevationModel;
213
            List<ElevationModel> elevationModels =
214
                compoundModel.getElevationModels();
215

  
216
            for (ElevationModel eModel : elevationModels) {
217
                if (eModel.getName().equals(layer.getName())) {
218
                    return eModel;
219
                }
220
            }
221
            return null;
222
        }
223

  
224
        if (elevationModel.getName().equals(layer.getName())) {
225
            return elevationModel;
226
        }
227
        return null;
228
    }
229

  
230
    private void updateLayerState(FLayer layer, LAYER_SYNCHRONIZE_STATUS status) {
231

  
232
        View3DManager manager = View3DLocator.getManager();
233
        LayerProperties3D layerProperties = manager.getLayerProperties(layer);
234

  
235
        if (layerProperties.getElevation() == true) {
236

  
237
            if (tiledlayerRegister.containsKey(layer)) {
238
                tiledlayerRegister.remove(layer);
239
            }
240

  
241
            elevationModelLayerRegister.put(layer, status);
242
        } else {
243

  
244
            if (elevationModelLayerRegister.containsKey(layer)) {
245
                elevationModelLayerRegister.remove(layer);
246
            }
247

  
248
            tiledlayerRegister.put(layer, status);
249
        }
250
    }
251

  
252
    protected void synchronizeLayers() {
253

  
254
        List<FLayer> removedLayers = new ArrayList<FLayer>();
255

  
256
        synchronized (tiledlayerRegister) {
257

  
258
            // Synchronize tiledImageLayers
259
            for (Entry<FLayer, LAYER_SYNCHRONIZE_STATUS> entry : tiledlayerRegister
260
                .entrySet()) {
261

  
262
                FLayer tiledLayer = entry.getKey();
263
                LAYER_SYNCHRONIZE_STATUS status =
264
                    tiledlayerRegister.get(tiledLayer);
265

  
266
                switch (status) {
267
                case ADD:
268
                    addLayer(tiledLayer);
269
                    entry.setValue(LAYER_SYNCHRONIZE_STATUS.CLEAN);
270
                    break;
271
                case REMOVE:
272
                    removeLayer(tiledLayer);
273
                    removedLayers.add(tiledLayer);
274
                    break;
275
                case DIRTY:
276
                    updateLayer(tiledLayer);
277
                    entry.setValue(LAYER_SYNCHRONIZE_STATUS.CLEAN);
278
                    break;
279
                case CLEAN:
280
                    break;
281
                }
282
            }
283
        }
284

  
285
        synchronized (elevationModelLayerRegister) {
286
            // Synchronize elevationModelLayerRegister
287
            for (Entry<FLayer, LAYER_SYNCHRONIZE_STATUS> entry : elevationModelLayerRegister
288
                .entrySet()) {
289

  
290
                FLayer eModelLayer = entry.getKey();
291
                LAYER_SYNCHRONIZE_STATUS status =
292
                    elevationModelLayerRegister.get(eModelLayer);
293

  
294
                switch (status) {
295
                case ADD:
296
                    addLayer(eModelLayer);
297
                    entry.setValue(LAYER_SYNCHRONIZE_STATUS.CLEAN);
298
                    break;
299
                case REMOVE:
300
                    removeLayer(eModelLayer);
301
                    removedLayers.add(eModelLayer);
302
                    break;
303
                case DIRTY:
304
                    updateLayer(eModelLayer);
305
                    entry.setValue(LAYER_SYNCHRONIZE_STATUS.CLEAN);
306
                    break;
307
                case CLEAN:
308
                    break;
309
                }
310
            }
311
        }
312

  
313
        for (FLayer fLayer : removedLayers) {
314
            if (tiledlayerRegister.containsKey(fLayer)) {
315
                tiledlayerRegister.remove(fLayer);
316
                break;
317
            } else if (elevationModelLayerRegister.containsKey(fLayer)) {
318
                elevationModelLayerRegister.remove(fLayer);
319
                break;
320
            }
321
        }
322
    }
323

  
324
    protected void synchronizeViewPorts() {
325
        throw new UnsupportedOperationException();
326
    }
327

  
328
    private void updateLayer(FLayer layer) {
329
        int pos = getPosInTOC(layer);
330
        removeLayer(layer);
331

  
332
        addLayer(layer, pos);
333
    }
334

  
335
    private int getPosInTOC(FLayer layer) {
336
        // Determinates the position of updated layer.
337
        FLayers layers = this.mapContext.getLayers();
338
        // We have to take into account default layers
339
        // added to determinate what position is the
340
        // correct.
341
        int indexDefaultLayers =
342
            this.modelWW.getLayers().size() - layers.getLayersCount();
343

  
344
        for (int i = 0; i < layers.getLayersCount(); i++) {
345
            if (layers.getLayer(i).equals(layer)) {
346
                return i + indexDefaultLayers;
347
            }
348
        }
349

  
350
        return indexDefaultLayers;
351
    }
352

  
353
    private void addLayer(FLayer layer) {
354
        try {
355
            this.mapControl3D.addGvSIGLayer(layer);
356
        } catch (DataException e) {
357
            LOG.error("Can't add {} to MapControl3D", layer.getName());
358
        }
359
    }
360

  
361
    private void addLayer(FLayer layer, int pos) {
362
        try {
363
            this.mapControl3D.addGvSIGLayer(layer, pos);
364
        } catch (DataException e) {
365
            LOG.error("Can't add {} to MapControl3D", layer.getName());
366
        }
367
    }
368

  
369
    private void removeLayer(FLayer layer) {
370

  
371
        ElevationModel eModel = getElevationModel(layer);
372
        Layer tiledImageLayer = getTileImageLayer(layer);
373

  
374
        if (eModel != null) {
375
            CompoundElevationModel compoundEModel =
376
                (CompoundElevationModel) modelWW.getGlobe().getElevationModel();
377
            compoundEModel.removeElevationModel(eModel);
378
        } else if (tiledImageLayer != null) {
379
            modelWW.getLayers().remove(tiledImageLayer);
380
        }
381
    }
382

  
383
    private void moveLayer(FLayer layer) {
384
        int tiledIndex = getPosInTOC(layer);
385
        removeLayer(layer);
386
        addLayer(layer, tiledIndex);
387
    }
388
}
389

  
390
enum LAYER_SYNCHRONIZE_STATUS {
391
    ADD, CLEAN, DIRTY, REMOVE
392
};

Also available in: Unified diff