Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / lib3DMap / src / com / iver / ai2 / gvsig3d / map3d / MapContext3D.java @ 18954

History | View | Annotate | Download (39.3 KB)

1
package com.iver.ai2.gvsig3d.map3d;
2

    
3
import java.awt.Component;
4
import java.awt.Dimension;
5
import java.awt.Point;
6
import java.awt.geom.Rectangle2D;
7
import java.io.File;
8
import java.util.ArrayList;
9

    
10
import javax.swing.JOptionPane;
11

    
12
import org.cresques.cts.ICoordTrans;
13
import org.cresques.cts.IProjection;
14
import org.gvsig.cacheservice.TileNum;
15

    
16
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
17
import com.iver.ai2.gvsig3d.cacheservices.FLayerCacheService;
18
import com.iver.ai2.gvsig3d.cacheservices.VectorCacheService;
19
import com.iver.ai2.gvsig3d.map3d.layers.FLayers3D;
20
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
21
import com.iver.andami.PluginServices;
22
import com.iver.cit.gvsig.AddLayer;
23
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
24
import com.iver.cit.gvsig.fmap.MapContext;
25
import com.iver.cit.gvsig.fmap.ViewPort;
26
import com.iver.cit.gvsig.fmap.layers.FBitSet;
27
import com.iver.cit.gvsig.fmap.layers.FLayer;
28
import com.iver.cit.gvsig.fmap.layers.FLayers;
29
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
30
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
31
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
32
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
33
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
34
import com.iver.cit.gvsig.fmap.layers.LayerListener;
35
import com.iver.cit.gvsig.fmap.layers.LegendChangedEvent;
36
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
37
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
38
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
39
import com.iver.cit.gvsig.fmap.layers.XMLException;
40
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
41
import com.iver.cit.gvsig.fmap.rendering.ILegend;
42
import com.iver.cit.gvsig.fmap.rendering.IVectorLegend;
43
import com.iver.cit.gvsig.fmap.rendering.LegendListener;
44
import com.iver.utiles.XMLEntity;
45

    
46
import es.upv.ai2.osgvp.Node;
47
import es.upv.ai2.osgvp.Vec3;
48
import es.upv.ai2.osgvp.planets.Planet;
49
import es.upv.ai2.osgvp.planets.PlanetViewer;
50
import es.upv.ai2.osgvp.planets.RequestLayerListener;
51
import es.upv.ai2.osgvp.planets.TileCreatedListener;
52
import es.upv.ai2.osgvp.planets.TileEvent;
53
import es.upv.ai2.osgvp.viewer.Camera;
54
import es.upv.ai2.osgvp.viewer.IViewerContainer;
55

    
56
public class MapContext3D extends MapContext implements TileCreatedListener,
57
                RequestLayerListener, LayerListener, LegendListener, SelectionListener {
58

    
59
        // JOSG library objects
60
        private Planet m_planet;
61

    
62
        private IViewerContainer m_canvas3d;
63

    
64
        private PlanetViewer planetViewer;
65

    
66
        // separate lists for image, elevation and vector layers
67
        private ArrayList m_layerLists = new ArrayList();
68

    
69
        private IProjection m_viewProjection;
70

    
71
        private float verticalExageration;
72

    
73
        private boolean m_bEmptyView = true;
74

    
75
        private boolean m_bListenToLegend = true;
76

    
77
        private boolean m_bLoading = false;
78

    
79
        private FLayers lyrs;
80

    
81
        // private Rectangle2D extentAux;
82

    
83
        // private ViewPort3D vport;
84

    
85
        public MapContext3D(ViewPort vp) {
86
                super(vp);
87

    
88
                ArrayList textureLayers = new ArrayList();
89
                ArrayList elevationLayers = new ArrayList();
90
                ArrayList vectorLayers = new ArrayList();
91
                m_layerLists.add(textureLayers);
92
                m_layerLists.add(elevationLayers);
93
                m_layerLists.add(vectorLayers);
94

    
95
                // extentAux = new Rectangle2D.Double(-180.0, 90.0, 180.0, -90.0);
96
        }
97

    
98
        public MapContext3D(FLayers fLayers, ViewPort vp) {
99
                super(fLayers, vp);
100

    
101
                ArrayList textureLayers = new ArrayList();
102
                ArrayList elevationLayers = new ArrayList();
103
                ArrayList vectorLayers = new ArrayList();
104
                m_layerLists.add(textureLayers);
105
                m_layerLists.add(elevationLayers);
106
                m_layerLists.add(vectorLayers);
107

    
108
                // extentAux = new Rectangle2D.Double(-180.0, 90.0, 180.0, -90.0);
109
        }
110

    
111
        public void setPlanet(Planet planet) {
112
                if (planet == m_planet)
113
                        return;
114

    
115
                m_planet = planet;
116

    
117
                // add layers to planet
118

    
119
                for (int iType = 0; iType < 3; iType++) {
120
                        ArrayList layerList = (ArrayList) m_layerLists.get(iType);
121
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
122

    
123
                                FLayer layer = (FLayer) layerList.get(iLayer);
124
                                Layer3DProps props = getLayer3DProps(layer);
125
                                props.setPlanetOrder(props.getTocOrder());
126
                                addLayerToPlanet(layer, props.getPlanetOrder(), false);
127

    
128
                                // Layer active or not
129
                                if (props.getType() == Layer3DProps.layer3DImage) {
130
                                        m_planet.setEnabledTextureLayer(props.getPlanetOrder(),
131
                                                        layer.isVisible());
132
                                }
133
                                if (props.getType() == Layer3DProps.layer3DElevation) {
134
                                        m_planet.setEnabledHeightfieldLayer(0, layer.isVisible());
135
                                }
136
                        }
137
                        if (iType == Layer3DProps.layer3DElevation && layerList.size() > 0)
138
                                m_planet.invalidateHeightfieldLayer(0);
139
                }
140
        }
141

    
142
        public Planet getPlanet() {
143
                return m_planet;
144
        }
145

    
146
        public void setViewer(IViewerContainer canvas) {
147
                m_canvas3d = canvas;
148
                this.planetViewer = (PlanetViewer) m_canvas3d.getOSGViewer();
149
        }
150

    
151
        public IProjection getViewProjection() {
152
                return m_viewProjection;
153
        }
154

    
155
        public void setViewProjection(IProjection projection) {
156
                m_viewProjection = projection;
157
        }
158

    
159
        public IViewerContainer getCanvas3d() {
160
                return m_canvas3d;
161
        }
162

    
163
        // public void setCanvas3d(IViewerContainer m_canvas3d) {
164
        // this.m_canvas3d = m_canvas3d;
165
        //                
166
        // }
167

    
168
        public float getVerticalExageration() {
169
                return verticalExageration;
170
        }
171

    
172
        public void setVerticalExageration(float verticalExageration) {
173
                this.verticalExageration = verticalExageration;
174
        }
175

    
176
        public void setLoading(boolean bLoading) {
177
                m_bLoading = bLoading;
178
        }
179

    
180
        public FLayers getNewGroupLayer(FLayers parent) {
181
                return new FLayers3D(this, parent, getViewPort());
182
        }
183

    
184
        /** * LAYER CHANGES called by FLayers3D ** */
185

    
186
        public void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
187
                        int newPos) {
188

    
189
                if (layer instanceof FLayers) {
190
                        FLayers group = (FLayers) layer;
191
                        if (newPos > oldPos) {
192
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
193
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
194
                                                        oldPos, newPos);
195
                        } else {
196
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
197
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
198
                                                        oldPos, newPos);
199
                        }
200
                        return;
201
                }
202

    
203
                Layer3DProps props3D = getLayer3DProps(layer);
204
                if (props3D.getType() != Layer3DProps.layer3DImage)
205
                        return;
206

    
207
                refreshLayerOrder();
208

    
209
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
210

    
211
                // This will be more complex when we have multiple planets
212
                int currentPlanetOrder = props3D.getPlanetOrder();
213
                int newPlanetOrder = props3D.getTocOrder();
214
                if (currentPlanetOrder != newPlanetOrder) {
215
                        m_planet.reorderTextureLayer(currentPlanetOrder, newPlanetOrder);
216
                        // update planet order for all layers
217
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
218
                                FLayer eachLayer = (FLayer) layerList.get(iLayer);
219
                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
220
                                int currentPlanetOrderI = eachProps3D.getPlanetOrder();
221
                                if (currentPlanetOrder < newPlanetOrder) { // layer moves 'up'
222
                                        if (currentPlanetOrderI > currentPlanetOrder
223
                                                        && currentPlanetOrderI <= newPlanetOrder)
224
                                                eachProps3D.setPlanetOrder(currentPlanetOrderI - 1);
225
                                } else { // layer moves 'down'
226
                                        if (currentPlanetOrderI < currentPlanetOrder
227
                                                        && currentPlanetOrderI >= newPlanetOrder)
228
                                                eachProps3D.setPlanetOrder(currentPlanetOrderI + 1);
229
                                }
230
                        }
231
                        props3D.setPlanetOrder(newPlanetOrder);
232
                }
233

    
234
                // reorder all which may have changed in internal layer list
235
                ArrayList sortedLayers = new ArrayList(layerList.size());
236
                for (int iLayer = 0; iLayer < layerList.size(); iLayer++)
237
                        sortedLayers.add(null);
238

    
239
                for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
240
                        FLayer eachLayer = (FLayer) layerList.get(iLayer);
241
                        Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
242
                        int newOrder = eachProps3D.getTocOrder();
243
                        sortedLayers.set(newOrder, eachLayer);
244
                }
245
                m_layerLists.set(props3D.getType(), sortedLayers);
246

    
247
                PrintDebugLayers();
248
                // REPAINTING VIEWER
249
                if (m_canvas3d != null)
250
                        m_canvas3d.repaint();
251
        }
252

    
253
        public void layerAdded(FLayers3D parent, FLayer layer) {
254

    
255
                // to add group layers to 3D, just add recursively child data layers
256
                if (layer instanceof FLayers) {
257
                        FLayers group = (FLayers) layer;
258
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
259
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
260
                        }
261
                        getLayer3DProps(layer).setHooked(true);
262
                        return;
263
                }
264

    
265
                if (layer instanceof Classifiable) {
266
                        Classifiable legendLyr = (Classifiable) layer;
267
                        legendLyr.addLegendListener((LegendListener) this);
268
                }
269
                layer.addLayerListener((LayerListener) this);
270
                
271
                // listener to manage the selection for the layers
272
                if (layer.getClass().equals(FLyrVect.class)) {
273
                        FLyrVect lyr = (FLyrVect) layer;
274
                        try {
275
                                lyr.getRecordset().getSelectionSupport().addSelectionListener(this);
276
                        } catch (ReadDriverException e) {
277
                                // TODO Auto-generated catch block
278
                                e.printStackTrace();
279
                        }
280
                }
281

    
282
                // LINEAS COMETADAS PARA Q NO PREGUNTE DOS VECES QUE SI QUEREMOS
283
                // REPROYECTAR LA CAPA
284
                // SI SE COMENTA LAS LINEAS CUANDO SE COPIA Y PEGA UNA CAPA NO PREGUNTA
285
                // SI QUEREMOS REPROJECTAR
286
                // if (!m_bLoading)
287
                // checkProjection(layer, getViewPort().getProjection());
288

    
289
                int order = addLayerByType(layer);
290
                if (order == -1) {
291
                        // an error has been generated
292
                        parent.removeLayer(layer);
293
                        return;
294
                }
295

    
296
                if (!m_bLoading)
297
                        addLayerToPlanet(layer, order, true);
298

    
299
                // Only do this the first time to add layer
300
                ArrayList layerListI = (ArrayList) m_layerLists
301
                                .get(Layer3DProps.layer3DImage);
302
                ArrayList layerListV = (ArrayList) m_layerLists
303
                                .get(Layer3DProps.layer3DVector);
304

    
305
                if (m_bEmptyView && !m_bLoading) {
306
                        if (!((layerListI.size() == 1) && (layerListV.size() == 0))
307
                                        || !((layerListI.size() == 0) && (layerListV.size() == 1))) {
308
                                try {
309
                                        zoomToExtent(layer.getFullExtent());
310
                                } catch (ExpansionFileReadException e) {
311
                                        e.printStackTrace();
312
                                } catch (ReadDriverException e) {
313
                                        e.printStackTrace();
314
                                }
315
                                m_bEmptyView = false;
316
                        }
317
                }
318

    
319
                PrintDebugLayers();
320
        }
321

    
322
        public void layerRemoved(FLayers3D parent, FLayer layer) {
323

    
324
                // to remove group layers to 3D, just remove recursively child data
325
                // layers
326
                if (layer instanceof FLayers) {
327
                        FLayers group = (FLayers) layer;
328
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
329
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
330
                        }
331
                        getLayer3DProps(layer).setHooked(false);
332
                        return;
333
                }
334

    
335
                if (layer instanceof Classifiable) {
336
                        Classifiable legendLyr = (Classifiable) layer;
337
                        legendLyr.removeLegendListener((LegendListener) this);
338
                }
339
                layer.removeLayerListener((LayerListener) this);
340

    
341
                int order = removeLayerByType(layer);
342
                if (order == -1)
343
                        return;
344

    
345
                Layer3DProps props3D = getLayer3DProps(layer);
346

    
347
                if (props3D.getType() == Layer3DProps.layer3DVector) {
348
                        DeleteVectors(layer, props3D);
349
                } else if (props3D.getType() == Layer3DProps.layer3DImage) {
350
                        m_planet.removeTextureLayer(props3D.getPlanetOrder());
351
                        ArrayList layerList = (ArrayList) m_layerLists.get(props3D
352
                                        .getType());
353

    
354
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
355
                                FLayer eachLayer = (FLayer) layerList.get(iLayer);
356
                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
357
                                if (eachProps3D.getPlanetOrder() > props3D.getPlanetOrder())
358
                                        eachProps3D
359
                                                        .setPlanetOrder(eachProps3D.getPlanetOrder() - 1);
360
                        }
361
                        props3D.setPlanetOrder(-1);
362
                } else if (props3D.getType() == Layer3DProps.layer3DElevation) {
363
                        m_planet.removeHeightfieldLayer(order);
364
                }
365

    
366
                // REPAINTING VIEWER
367
                if (m_canvas3d != null)
368
                        m_canvas3d.repaint();
369

    
370
                ArrayList layerListI = (ArrayList) m_layerLists
371
                                .get(Layer3DProps.layer3DImage);
372
                ArrayList layerListV = (ArrayList) m_layerLists
373
                                .get(Layer3DProps.layer3DVector);
374
                // All layers are removed
375
                if ((layerListI.size() == 0) && (layerListV.size() == 0)) {
376
                        m_bEmptyView = true;
377
                }
378

    
379
                PrintDebugLayers();
380
        }
381

    
382
        /**
383
         * DOCUMENT ME!
384
         * 
385
         * @param e
386
         *            DOCUMENT ME!
387
         */
388
        public void legendChanged(LegendChangedEvent e) {
389

    
390
                if (!m_bListenToLegend)
391
                        return;
392

    
393
                IVectorLegend newLegend = (IVectorLegend) e.getNewLegend();
394
                // find layer whose legend changed
395
                FLayer found = null;
396
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
397
                while (lyrIterator.hasNext()) {
398
                        FLayer lyr = lyrIterator.next();
399
                        if (lyr instanceof Classifiable) {
400
                                Classifiable classLyr = (Classifiable) lyr;
401
                                ILegend legend = classLyr.getLegend();
402
                                if (legend instanceof IVectorLegend) {
403
                                        if ((IVectorLegend) legend == newLegend) {
404
                                                found = lyr;
405
                                                break;
406
                                        }
407
                                }
408
                        }
409
                }
410

    
411
                if (found != null) {
412
                        Layer3DProps props3D = getLayer3DProps(found);
413
                        refreshLayerInPlanet(props3D, true);
414
                        m_bListenToLegend = false;
415
                        props3D.VerifyLegend(m_planet);
416
                        m_bListenToLegend = true;
417
                        // REPAINTING VIWER
418
                        if (m_canvas3d != null)
419
                                m_canvas3d.repaint();
420
                }
421
        }
422

    
423
        public void visibilityChanged(LayerEvent e) {
424
                FLayer lyr = e.getSource();
425

    
426
                Layer3DProps props3D = getLayer3DProps(lyr);
427

    
428
                if (props3D.getType() == Layer3DProps.layer3DVector) {
429
                        refreshLayerVectorsVisibility(lyr);
430
                } else {
431
                        refreshLayerVisibility(lyr);
432
                }
433
                m_canvas3d.repaint();
434
        }
435

    
436
        private void refreshLayerVisibility(FLayer layer) {
437

    
438
                Layer3DProps props3D = getLayer3DProps(layer);
439
                if (props3D.getType() == Layer3DProps.layer3DImage) {
440
                        m_planet.setEnabledTextureLayer(props3D.getPlanetOrder(), layer
441
                                        .isVisible());
442
                }
443
                if (props3D.getType() == Layer3DProps.layer3DElevation) {
444
                        m_planet.setEnabledHeightfieldLayer(0, layer.isVisible());
445
                }
446
                // REPAINTING VIEWER
447
                if (m_canvas3d != null)
448
                        m_canvas3d.repaint();
449
        }
450

    
451
        private void refreshLayerVectorsVisibility(FLayer lyr) {
452
                if (m_planet == null || m_viewProjection == null)
453
                        return;
454

    
455
                Layer3DProps props3D = getLayer3DProps(lyr);
456

    
457
                VectorCacheService cacheService = (VectorCacheService) props3D
458
                                .getCacheService();
459
                if (cacheService != null) {
460
                        // use VectorCacheService to add features to planet
461
                        cacheService.refreshFeaturesToPlanet(lyr.isVisible());
462
                }
463

    
464
        }
465

    
466
        public void activationChanged(LayerEvent e) {
467
                // TODO Implement this method
468
        }
469

    
470
        public void nameChanged(LayerEvent e) {
471
                // TODO Implement this method
472
        }
473

    
474
        public void editionChanged(LayerEvent e) {
475
                // TODO Implement this method
476
                
477
                
478
                
479
        }
480

    
481
        public void refreshLayerInPlanet(Layer3DProps props, boolean bRemoveCache) {
482
                if (props == null)
483
                        return;
484

    
485
                if (m_planet == null)
486
                        return; // view not opened yet
487

    
488
                // clear cache
489

    
490
                if (bRemoveCache) {
491
                        String layerCacheDir = Layer3DProps.m_cacheDir + "/"
492
                                        + m_planet.getPlanetName() + "/" + props.getCacheName();
493
                        removeCache(layerCacheDir);
494
                }
495

    
496
                // refresh layer in planet
497

    
498
                int type = props.getType();
499
                if (type == Layer3DProps.layer3DImage) {
500
                        int order = props.getPlanetOrder();
501
                        // m_planet.refreshTextureInfo(order);
502
                        m_planet.invalidateTextureLayer(order);
503
                } else if (type == Layer3DProps.layer3DElevation) {
504
                        m_planet.invalidateHeightfieldLayer(0);
505
                } else if (type == Layer3DProps.layer3DVector) {
506
                        invalidateVectorLayer(props);
507
                }
508

    
509
                // REPAINTING VIEWER
510
                if (m_canvas3d != null)
511
                        m_canvas3d.repaint();
512
        }
513

    
514
        private void invalidateVectorLayer(Layer3DProps props) {
515
                // TODO Auto-generated method stub
516
                if (m_planet == null || m_viewProjection == null)
517
                        return;
518

    
519
                VectorCacheService cacheService = (VectorCacheService) props
520
                                .getCacheService();
521
                if (cacheService != null) {
522
                        // use VectorCacheService to add features to planet
523
                        cacheService.RefreshFeaturesToPlanet();
524
                }
525
        }
526

    
527
        private boolean removeCache(String folder) {
528
                File dir = new File(folder);
529
                if (dir.isDirectory()) {
530
                        String[] children = dir.list();
531
                        for (int i = 0; i < children.length; i++) {
532
                                boolean success = removeCache(folder + "/" + children[i]);
533
                                // Do not interrupt if it can't delete one file
534
                                // if (!success) {
535
                                // return false;
536
                                // }
537
                        }
538
                }
539

    
540
                // The directory is now empty so delete it
541
                return dir.delete();
542
        }
543

    
544
        protected Layer3DProps getLayer3DProps(FLayer layer) {
545
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
546
                if (props3D == null) {
547
                        props3D = new Layer3DProps();
548
                        props3D.setLayer(layer);
549
                        props3D.initCacheName(m_planet.getCoordinateSystemType(),
550
                                        m_viewProjection);
551
                        FLyrDefault baseLayer = (FLyrDefault) layer;
552
                        baseLayer.setProperty("3DLayerExtension", props3D);
553
                        props3D.setVerticalEx(this.getVerticalExageration());
554
                } else {
555
                        if (m_bLoading)
556
                                props3D.setChooseType(false);
557
                        props3D.setLayer(layer);
558
                }
559

    
560
                return props3D;
561
        }
562

    
563
        private void addLayerToPlanet(FLayer layer, int order, boolean bVerifyLegend) {
564
                Layer3DProps props3D = getLayer3DProps(layer);
565
                if (props3D.getType() == Layer3DProps.layer3DVector)
566
                        CreateVectors(layer, props3D); // special case for now without
567
                // disk cache
568
                else {
569
                        Rectangle2D layerExtent = null;
570
                        try {
571
                                layerExtent = layer.getFullExtent();
572
                        } catch (ExpansionFileReadException e) {
573
                                e.printStackTrace();
574
                        } catch (ReadDriverException e) {
575
                                e.printStackTrace();
576
                        }
577
                        if (layerExtent == null) { // hack for missing extents
578
                                if (m_planet.getCoordinateSystemType() == Planet.CoordinateSystemType.GEOCENTRIC)
579
                                        layerExtent = new Rectangle2D.Double(-180.0, -90.0, 360.0,
580
                                                        180.0);
581
                                else
582
                                        layerExtent = new Rectangle2D.Double(-20000000.0,
583
                                                        -10000000.0, 40000000.0, 20000000.0);
584
                                // TODO toggle comment because this code use WCS extension. When
585
                                // WCS extension runs correctly uncoment!!!
586

    
587
                                if (layer instanceof FLyrWCS)
588
                                        ((FLyrWCS) layer).setFullExtent(layerExtent);
589
                                /**/
590
                        }
591
                        if (props3D.getType() == Layer3DProps.layer3DElevation)
592
                                m_planet.addHeightfieldLayer(layerExtent, 3);
593
                        else if (props3D.getType() == Layer3DProps.layer3DImage) {
594
                                m_planet.addTextureLayer(layerExtent, 0);
595
                                ArrayList imageList = (ArrayList) m_layerLists
596
                                                .get(Layer3DProps.layer3DImage);
597
                                int currentOrder = imageList.size() - 1;
598
                                if (currentOrder != order) { // had to be added to non-last
599
                                        // position
600
                                        m_planet.reorderTextureLayer(currentOrder, order);
601
                                        for (int iLayer = 0; iLayer < imageList.size(); iLayer++) {
602
                                                FLayer eachLayer = (FLayer) imageList.get(iLayer);
603
                                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
604
                                                if (eachProps3D.getPlanetOrder() >= order)
605
                                                        eachProps3D.setPlanetOrder(eachProps3D
606
                                                                        .getPlanetOrder() + 1);
607
                                        }
608
                                }
609
                                props3D.setPlanetOrder(order);
610
                        }
611
                        // REPAINTING VIEWER
612
                        if (m_canvas3d != null)
613
                                m_canvas3d.repaint();
614

    
615
                        if (bVerifyLegend) {
616
                                m_bListenToLegend = false;
617
                                props3D.VerifyLegend(m_planet);
618
                                m_bListenToLegend = true;
619
                        }
620
                }
621
        }
622

    
623
        private void refreshLayerOrder() {
624
                int typeOrder[] = new int[3];
625
                typeOrder[Layer3DProps.layer3DImage] = 0;
626
                typeOrder[Layer3DProps.layer3DElevation] = 0;
627
                typeOrder[Layer3DProps.layer3DVector] = 0;
628

    
629
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
630
                while (lyrIterator.hasNext()) {
631
                        FLayer lyr = lyrIterator.next();
632
                        Layer3DProps props3D = getLayer3DProps(lyr);
633
                        int type = props3D.getType();
634
                        // stores new order in properties 3D, but doesn't reorder internal
635
                        // layer lists
636
                        props3D.setTocOrder(typeOrder[type]);
637
                        typeOrder[type] += 1;
638
                }
639
        }
640

    
641
        private int addLayerByType(FLayer layer) {
642
                int resultOrder = -1;
643

    
644
                int typeOrder[] = new int[3];
645
                typeOrder[Layer3DProps.layer3DImage] = 0;
646
                typeOrder[Layer3DProps.layer3DElevation] = 0;
647
                typeOrder[Layer3DProps.layer3DVector] = 0;
648

    
649
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
650
                while (lyrIterator.hasNext()) {
651
                        FLayer lyr = lyrIterator.next();
652
                        Layer3DProps props3D = getLayer3DProps(lyr);
653
                        int type = props3D.getType();
654
                        // in pilot, limit to 1 the number of elevation layers
655
                        if (type == Layer3DProps.layer3DElevation && typeOrder[type] == 1) {
656
                                JOptionPane.showMessageDialog((Component) PluginServices
657
                                                .getMainFrame(), PluginServices.getText(this,
658
                                                "Only_one_elevation_messg"), PluginServices.getText(
659
                                                this, "Only_one_elevation_title"),
660
                                                JOptionPane.INFORMATION_MESSAGE);
661
                                return -1; // error value
662
                        }
663

    
664
                        // stores new order in properties 3D, but doesn't reorder internal
665
                        // layer lists
666
                        props3D.setTocOrder(typeOrder[type]);
667
                        typeOrder[type] += 1;
668

    
669
                        if (layer == lyr) {
670
                                resultOrder = props3D.getTocOrder();
671
                                ArrayList layerList = (ArrayList) m_layerLists.get(type);
672
                                if (resultOrder == layerList.size()
673
                                                || layerList.get(resultOrder) != layer)
674
                                        layerList.add(resultOrder, layer);
675
                        }
676
                }
677

    
678
                return resultOrder;
679
        }
680

    
681
        private int removeLayerByType(FLayer layer) {
682

    
683
                Layer3DProps props3D = getLayer3DProps(layer);
684
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
685
                int currentOrder = props3D.getTocOrder();
686
                if (currentOrder == -1)
687
                        return -1;
688

    
689
                layerList.remove(currentOrder);
690

    
691
                for (int i = currentOrder; i < layerList.size(); i++) {
692
                        FLayer lyrAux = (FLayer) layerList.get(i);
693
                        Layer3DProps props3DAux = getLayer3DProps(lyrAux);
694
                        props3DAux.setTocOrder(i);
695
                }
696
                return currentOrder;
697
        }
698

    
699
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
700
                if (m_planet == null || m_viewProjection == null)
701
                        return;
702

    
703
                VectorCacheService cacheService = (VectorCacheService) props3D
704
                                .getCacheService();
705
                if (cacheService == null) {
706
                        cacheService = new VectorCacheService(m_canvas3d, m_planet, props3D
707
                                        .getCacheName(), layer, m_viewProjection);
708
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
709
                        props3D.setCacheService(cacheService);
710
                }
711

    
712
                // use VectorCacheService to add features to planet
713
                cacheService.AddFeaturesToPlanet();
714
        }
715

    
716
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
717
                if (m_planet == null || m_viewProjection == null)
718
                        return;
719

    
720
                VectorCacheService cacheService = (VectorCacheService) props3D
721
                                .getCacheService();
722
                if (cacheService != null) {
723
                        // use VectorCacheService to delete features to planet
724
                        cacheService.DeleteFeaturesToPlanet();
725
                }
726
        }
727

    
728
        /**
729
         * Sets the given zoom extent to the view
730
         * 
731
         * @param extent
732
         *            The extent to zoom to.
733
         */
734
        public void zoomToExtent(Rectangle2D geoExtent) {
735
                double maxHeight = 0.0;
736

    
737
                // Getting extent positions
738
                double minLat = geoExtent.getMinY();
739
                double maxLat = geoExtent.getMaxY();
740
                double cenLon = geoExtent.getCenterX();
741
                double cenLat = geoExtent.getCenterY();
742

    
743
                double elevation = 0;
744

    
745
                // calculate altitude
746
                double avLat = 0;
747
                if (minLat > 0.0 || maxLat < 0.0)
748
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
749
                double avLon = Math.min(180.0, geoExtent.getWidth());
750

    
751
                double planetRadius = m_planet.getRadiusEquatorial();
752
                double radiusLat = planetRadius * Math.cos(Math.toRadians(avLat));
753
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
754
                                * (1 - Math.cos(Math.toRadians(avLon))));
755
                double deltaLat = Math.sqrt(2 * planetRadius * planetRadius
756
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
757

    
758
                double zoomFactor = 1.5;
759
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
760

    
761
                // Calculate XYZ positions for camera.
762

    
763
                int planetType = this.m_planet.getCoordinateSystemType();
764

    
765
                Vec3 eye = new Vec3();
766
                Vec3 center = new Vec3();
767
                Vec3 up = new Vec3();
768
                // Calculate positions for PLAIN MODE.
769
                if (planetType == Planet.CoordinateSystemType.PROJECTED) {
770

    
771
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
772
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
773
                        double height;
774

    
775
                        height = Math.sqrt(difx * difx + dify * dify);
776

    
777
                        // EYE
778
                        eye.setX(cenLon);
779
                        eye.setY(cenLat);
780
                        eye.setZ(height);
781
                        // eye.setZ(5000000 * 4.6);
782
                        // CENTER
783
                        center.setX(cenLon);
784
                        center.setY(cenLat);
785
                        center.setZ(0.0);
786
                        // UP
787
                        up.setX(0.0);
788
                        up.setY(1.0);
789
                        up.setZ(0.0);
790
                } else
791
                // Calculate positions for SPHERICAL MODE.
792
                if (planetType == Planet.CoordinateSystemType.GEOCENTRIC) {
793
                        // EYE
794
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
795
                        eye = m_planet.convertLatLongHeightToXYZ(aux);
796
                        // CENTER
797
                        center.setX(0.0);
798
                        center.setY(0.0);
799
                        center.setZ(0.0);
800
                        // UP
801
                        up.setX(0.0);
802
                        up.setY(0.0);
803
                        up.setZ(1.0);
804
                }
805
                Camera cam = new Camera();
806
                cam.setViewByLookAt(eye, center, up);
807

    
808
                // UtilCoord.imprimeCamara(cam);
809

    
810
                planetViewer.setCamera(cam);
811
                // REPAINTING VIEWER
812
                if (m_canvas3d != null)
813
                        m_canvas3d.repaint();
814

    
815
        }
816

    
817
        // Makes sure layer's projection is the same as MapContext's
818

    
819
        private void checkProjection(FLayer lyr, IProjection viewProj) {
820
                if (lyr instanceof FLyrVect) {
821
                        FLyrVect lyrVect = (FLyrVect) lyr;
822
                        IProjection proj = lyr.getProjection();
823
                        // Make sure projection is the same than the view
824
                        if (proj == null) {
825
                                // 
826
                                lyrVect.setProjection(viewProj);
827
                                return;
828
                        }
829
                        if (lyr instanceof FLyrVect) {
830
                                // Comprobar que la projecci�n es la misma que la vista
831
                                if (proj == null) {
832
                                        // SUPONEMOS que la capa est� en la proyecci�n que
833
                                        // estamos pidiendo (que ya es mucho suponer, ya).
834
                                        lyrVect.setProjection(getViewPort().getProjection());
835
                                        return;
836
                                }
837
                                int option = JOptionPane.YES_OPTION;
838
                                if (proj != getViewPort().getProjection()) {
839
                                        option = JOptionPane.showConfirmDialog(
840
                                                        (Component) PluginServices.getMainFrame(),
841
                                                        PluginServices.getText(AddLayer.class,
842
                                                                        "reproyectar_aviso")
843
                                                                        + "\n"
844
                                                                        + PluginServices.getText(AddLayer.class,
845
                                                                                        "Capa") + ": " + lyrVect.getName(),
846
                                                        PluginServices.getText(AddLayer.class,
847
                                                                        "reproyectar_pregunta"),
848
                                                        JOptionPane.YES_NO_OPTION);
849

    
850
                                        if (option != JOptionPane.OK_OPTION) {
851
                                                return;
852
                                        }
853

    
854
                                        ICoordTrans ct = proj.getCT(getViewPort().getProjection());
855
                                        lyrVect.setCoordTrans(ct);
856
                                        System.err.println("coordTrans = " + proj.getAbrev() + " "
857
                                                        + getViewPort().getProjection().getAbrev());
858
                                }
859
                        }
860

    
861
                        /*******************************************************************
862
                         * Version compatible con 1.0.2 y no con el HEAD
863
                         */
864

    
865
                        // if (proj != viewProj) {
866
                        // int option = JOptionPane.YES_OPTION;
867
                        // if (!CRSFactory.doesRigurousTransformations()) {
868
                        // option = JOptionPane.showConfirmDialog(null, PluginServices
869
                        // .getText(this, "reproyectar_aviso"), PluginServices
870
                        // .getText(this, "reproyectar_pregunta"),
871
                        // JOptionPane.YES_NO_OPTION);
872
                        // }
873
                        //
874
                        // if (option == JOptionPane.NO_OPTION) {
875
                        // return;
876
                        // } else {
877
                        // ICoordTrans ct = proj.getCT(viewProj);
878
                        // lyrVect.setCoordTrans(ct);
879
                        // System.err.println("coordTrans = " + proj.getAbrev() + " "
880
                        // + viewProj.getAbrev());
881
                        // }
882
                        // }
883
                }
884
        }
885

    
886
        /** * CALLBACKS for Tiles ** */
887

    
888
        public void tileCreated(TileEvent evt) {
889
                int textureStage = 0;
890
                int MDTStage = 0;
891

    
892
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
893
                while (lyrIterator.hasNext()) {
894
                        FLayer lyr = lyrIterator.next();
895

    
896
                        Layer3DProps props3D = getLayer3DProps(lyr);
897
                        int dataType = props3D.getType();
898

    
899
                        if (lyr.isVisible()) { // if (true) {
900
                                if (dataType == Layer3DProps.layer3DVector)
901
                                        continue; // get/create cache service
902
                                FLayerCacheService cacheService = (FLayerCacheService) props3D
903
                                                .getCacheService();
904
                                if (cacheService == null) {
905
                                        cacheService = new FLayerCacheService(m_planet, props3D
906
                                                        .getCacheName(), lyr, m_viewProjection);
907
                                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
908
                                        props3D.setCacheService(cacheService);
909
                                }
910

    
911
                                Point tileIndices = new Point(evt.getX(), evt.getY());
912
                                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
913
                                String tileFileName;
914

    
915
                                double minX = evt.getMinX();
916
                                double minY = evt.getMinY();
917
                                double width = evt.getMaxX() - evt.getMinX();
918
                                double height = evt.getMaxY() - evt.getMinY();
919

    
920
                                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width,
921
                                                height);
922
                                if (cacheService.intersectsLayer(extent)) { // extent test                                
923
                                // if (cacheService.intersectsLayer(extent)) { // extent test
924
//                                        System.out.println("Extent del evento del tilenum "
925
//                                                        + tileNum + minX + " " + minY + " " + width + " "
926
//                                                        + height);
927
                                        try {
928
                                                //tileFileName = cacheService.getTileAsFName(tileNum);
929
                                                 tileFileName = cacheService.getTileAsFName(tileNum,extent);
930
                                                //System.err.println("tile num " + tileNum);
931
                                                //System.err.println("nombre fichero " + tileFileName);
932
                                        } catch (Exception e) {
933
                                                return;
934
                                        }
935

    
936
                                        if (dataType == Layer3DProps.layer3DImage) {
937
                                                // float opacity = 1.0f;
938
                                                String fileExtension = "png";
939
                                                m_planet.setTexture(evt.getTilePagedLod(),
940
                                                                tileFileName, textureStage);
941
                                                m_planet.setTextureOpacityLayer(textureStage, props3D
942
                                                                .getOpacity());
943
                                                textureStage++;
944
                                        } else if (dataType == Layer3DProps.layer3DElevation) {
945
                                                String fileExtension = "tif";
946
                                                m_planet.setHeightfield(evt.getTilePagedLod(),
947
                                                                tileFileName, MDTStage);
948
                                                m_planet.setVerticalExaggerationLayer(MDTStage, props3D
949
                                                                .getVerticalEx());
950
                                                MDTStage++;
951
                                        }
952
                                } else { // no intersection
953
                                        if (dataType == Layer3DProps.layer3DImage) {
954
                                                m_planet.setTexture(evt.getTilePagedLod(), "",
955
                                                                textureStage++);
956
                                        }
957
                                        if (dataType == Layer3DProps.layer3DElevation) {
958
                                                m_planet.setHeightfield(evt.getTilePagedLod(), "",
959
                                                                MDTStage);
960
                                        }
961
                                }
962
                        } else {
963
                                if (dataType == Layer3DProps.layer3DImage) {
964
                                        textureStage++;
965
                                }
966
                                if (dataType == Layer3DProps.layer3DElevation) {
967
                                        MDTStage++;
968
                                }
969
                        } // REPAINTING VIEWER
970
                        if (m_canvas3d != null)
971
                                m_canvas3d.repaint();
972
                }
973
        }
974

    
975
        public void requestMDTLayer(TileEvent evt) {
976

    
977
                // TODO : All this method are not tested
978
                // ignore for now
979

    
980
                /* ********** UNCOMENT FOR TEST IT *************************** */
981
                int order = evt.getRequestedLayer();
982
                ArrayList imageLayers = (ArrayList) m_layerLists
983
                                .get(Layer3DProps.layer3DElevation);
984
                FLayer layer = (FLayer) imageLayers.get(order);
985
                if ((layer == null) || (!layer.isVisible()))
986
                        return;
987

    
988
                Layer3DProps props3D = getLayer3DProps(layer);
989
                // get/create cache service
990
                FLayerCacheService cacheService = (FLayerCacheService) props3D
991
                                .getCacheService();
992
                if (cacheService == null) {
993
                        cacheService = new FLayerCacheService(m_planet, props3D
994
                                        .getCacheName(), layer, m_viewProjection);
995
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
996
                        props3D.setCacheService(cacheService);
997
                }
998

    
999
                int dataType = props3D.getType();
1000
                Point tileIndices = new Point(evt.getX(), evt.getY());
1001
                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
1002

    
1003
                String tileFileName;
1004
                double minX = evt.getMinX();
1005
                double minY = evt.getMinY();
1006
                double width = evt.getMaxX() - evt.getMinX();
1007
                double height = evt.getMaxY() - evt.getMinY();
1008

    
1009
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1010
                if (cacheService.intersectsLayer(extent)) { // extent test
1011
                // if (cacheService.intersectsLayer(extent)) {
1012
//                        System.out.println("Extetn del evento " + minX + " " + minY + " "
1013
//                                        + width + " " + height);
1014
                        try {
1015
                                // tileFileName = cacheService.getTileAsFName(tileNum,extent);
1016
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1017
                        } catch (Exception e) {
1018
                                return;
1019
                        }
1020

    
1021
                        if (dataType == Layer3DProps.layer3DElevation) {
1022
                                String fileExtension = "tif";
1023
                                // evt.getTilePagedLod().setHeightField(tileFileName,
1024
                                // fileExtension, order);
1025
                                m_planet.setHeightfield(evt.getTilePagedLod(), tileFileName,
1026
                                                order);
1027
                                // m_planet.setVerticalExaggeration(order,
1028
                                // ((ProjectView3D) this.m_viewProjection)
1029
                                // .getVerticalExaggeration());
1030
                                m_planet.setVerticalExaggerationLayer(order, props3D
1031
                                                .getVerticalEx());
1032

    
1033
                        }
1034
                } else { // no intersection for elevation layer
1035
                        // This code are not correctly for elevation layer
1036
                        if (dataType == Layer3DProps.layer3DImage) {
1037
                                m_planet.setHeightfield(evt.getTilePagedLod(), "", order);
1038
                                // evt.getTilePagedLod().setHeightField("", "", order);
1039
                        }
1040
                }
1041

    
1042
                // REPAINTING VIEWWER
1043
                if (m_canvas3d != null)
1044
                        m_canvas3d.repaint();
1045

    
1046
        }
1047

    
1048
        public void requestTextureLayer(TileEvent evt) {
1049

    
1050
                int order = evt.getRequestedLayer();
1051
                ArrayList imageLayers = (ArrayList) m_layerLists
1052
                                .get(Layer3DProps.layer3DImage);
1053

    
1054
                // if there are not one layer return
1055
                if (imageLayers.size() == 0)
1056
                        return;
1057
                FLayer layer = (FLayer) imageLayers.get(order);
1058
                if ((layer == null) || (!layer.isVisible()))
1059
                        return;
1060

    
1061
                Layer3DProps props3D = getLayer3DProps(layer);
1062
                // get/create cache service
1063
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1064
                                .getCacheService();
1065
                if (cacheService == null) {
1066
                        cacheService = new FLayerCacheService(m_planet, props3D
1067
                                        .getCacheName(), layer, m_viewProjection);
1068
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1069
                        props3D.setCacheService(cacheService);
1070
                }
1071

    
1072
                int dataType = props3D.getType();
1073
                Point tileIndices = new Point(evt.getX(), evt.getY());
1074
                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
1075

    
1076
                String tileFileName;
1077
                double minX  = evt.getMinX();
1078
                double minY = evt.getMinY();
1079
                double width = evt.getMaxX() - evt.getMinX();
1080
                double height = evt.getMaxY() - evt.getMinY();
1081

    
1082
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1083
                if (cacheService.intersectsLayer(extent)) { // extent test
1084
                // if (cacheService.intersectsLayer(extent)) {
1085
                        try {
1086
                                 tileFileName = cacheService.getTileAsFName(tileNum,extent);
1087
                                //tileFileName = cacheService.getTileAsFName(tileNum);
1088
                                // System.err.println("tile num " + tileNum);
1089
                                // System.err.println("nombre fichero " + tileFileName);
1090
                        } catch (Exception e) {
1091
                                return;
1092
                        }
1093

    
1094
                        if (dataType == Layer3DProps.layer3DImage) {
1095
                                // float opacity = 1.0f;
1096
                                String fileExtension = "png";
1097
                                // @TODO:aplicar texturas al planeta
1098
                                // evt.getTilePagedLod().setTexture(tileFileName, fileExtension,
1099
                                // order);
1100
                                m_planet.setTexture(evt.getTilePagedLod(), tileFileName, order);
1101
                                m_planet.setTextureOpacityLayer(order, props3D.getOpacity());
1102
                        }
1103
                        /*
1104
                         * else { String fileExtension = "tif";
1105
                         * evt.getTilePagedLod().setHeightField(tileFileName,
1106
                         * fileExtension); }
1107
                         */
1108
                } else { // no intersection
1109
                        if (dataType == Layer3DProps.layer3DImage) {
1110
                                m_planet.setTexture(evt.getTilePagedLod(), "", order);
1111
                                // evt.getTilePagedLod().setTexture("", "", order);
1112
                        }
1113
                }
1114

    
1115
                // REPAINTING VIEWWER
1116
                if (m_canvas3d != null)
1117
                        m_canvas3d.repaint();
1118
        }
1119

    
1120
        private void PrintDebugLayers() {
1121
                System.out.println("===========================");
1122
                for (int iList = 0; iList < 3; iList++) {
1123
                        ArrayList layerList = (ArrayList) m_layerLists.get(iList);
1124
                        System.out.println("===== List " + iList + "=====");
1125
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
1126
                                FLayer layer = (FLayer) layerList.get(iLayer);
1127
                                System.out.println("  Layer " + layer.getName());
1128
                                Layer3DProps props3D = getLayer3DProps(layer);
1129
                                System.out.println("    Type " + props3D.getType());
1130
                                System.out.println("    TOC Order " + props3D.getTocOrder());
1131
                                System.out.println("    Planet Order "
1132
                                                + props3D.getPlanetOrder());
1133
                        }
1134
                }
1135
        }
1136

    
1137
        /**
1138
         * Crea un nuevo MapContext(3D) a partir del XMLEntity.
1139
         * 
1140
         * @param xml
1141
         *            XMLEntity
1142
         * 
1143
         * @return Nuevo MapContext3D.
1144
         * 
1145
         * @throws XMLException
1146
         */
1147
        public static MapContext createFromXML(XMLEntity xml) throws XMLException {
1148
                ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
1149

    
1150
                FLayers layers = new FLayers3D(null, null, vp);
1151
                layers.setXMLEntity(xml.getChild(1));
1152

    
1153
                MapContext fmap = layers.getMapContext();
1154

    
1155
                return fmap;
1156
        }
1157

    
1158
        public static MapContext createFromXML03(XMLEntity xml) throws XMLException {
1159
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
1160

    
1161
                FLayers layers = new FLayers3D(null, null, vp);
1162
                layers.setXMLEntity03(xml.getChild(1));
1163

    
1164
                MapContext fmap = layers.getMapContext();
1165

    
1166
                return fmap;
1167
        }
1168

    
1169
        public GraphicLayer getGraphicsLayer() {
1170
                GraphicLayer3D gra3D = new GraphicLayer3D(this.planetViewer,
1171
                                getPlanet());
1172
                return gra3D;
1173
        }
1174

    
1175
        public Node getSpecialNode() {
1176
                return planetViewer.getSpecialNode(0);
1177
        }
1178

    
1179
        public ViewPort getViewPort() {
1180

    
1181
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1182

    
1183
                if (m_canvas3d != null)
1184
                        vp.setImageSize(new Dimension(planetViewer.getWidth(), planetViewer
1185
                                        .getHeight()));
1186
                vp.setPlanet(this.getPlanet());
1187
                vp.setViewer(this.m_canvas3d);
1188

    
1189
                return vp;
1190
        }
1191

    
1192
        /**
1193
         * M�todo de conveniencia que se usa provisionalmente para solicitar un
1194
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar�
1195
         * un evento de cambio de orden de capas que obligar� a redibujar todo lo
1196
         * que depende de FMap (TOC, MapControl, FFrameView, etc).
1197
         */
1198
        public void invalidate() {
1199
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1200
                if (vp.getDirty()) {
1201
                        vp.setDirty(false);
1202
                        // extentAux = vport.getExtent();
1203
                        
1204
                        //Comento el zoom pq no kiero q me lo haga y me cambie la vista cuando repinto
1205
                        
1206
                        //this.zoomToExtent(vp.getExtent());
1207
                        // System.out.println("extend seleccionado: \n Centro: "
1208
                        // + extentAux.getCenterX() + "\n Alto: " + extentAux.getHeight()
1209
                        // + "\n Ancho: " + extentAux.getWidth());
1210

    
1211
                        // TEST
1212

    
1213
                        // Updating all the layers. This operation synchronize the
1214
                        // transparency layer with layer transparency planet layer.
1215
                        // Getting all selected Extent
1216

    
1217
                }
1218
                FLayer[] selectedExtent = getLayers().getActives();
1219
                
1220
                if (selectedExtent.length > 0) {
1221
                        for (int i = 0; i < selectedExtent.length; i++) {
1222
                                if (selectedExtent[0].isAvailable()) {
1223
                                        
1224
                                        FLayer lyr3D = selectedExtent[i];
1225
                                        Layer3DProps layer3DProps = Layer3DProps
1226
                                        .getLayer3DProps(lyr3D);
1227
                                        
1228
                                        int order = layer3DProps.getPlanetOrder();
1229
                                        // float opacity = layer3DProps.getOpacity();
1230
                                        float opacity = (((FLyrDefault) lyr3D)
1231
                                                        .getTransparency())
1232
                                                        / (float) 255;
1233
                                        // Notify the opacity to planet
1234
                                        this.m_planet.setTextureOpacityLayer(order, opacity);
1235
                                }
1236
                        }
1237
                        
1238
                }
1239
                // super.invalidate();
1240

    
1241
                m_canvas3d.repaint();
1242
        }
1243

    
1244
        public void selectionChanged(SelectionEvent e) {
1245
                // TODO Auto-generated method stub
1246
                for (int iType = 0; iType < 3; iType++) {
1247
                        ArrayList layerList = (ArrayList) m_layerLists.get(iType);
1248
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
1249

    
1250
                                FLayer layer = (FLayer) layerList.get(iLayer);
1251
                                if (layer.getClass().equals(FLyrVect.class)) {
1252
                                        FLyrVect lyr = (FLyrVect) layer;
1253
                                        
1254
                                                FBitSet selection = null;
1255
                                                try {
1256
                                                        selection = lyr.getRecordset().getSelectionSupport().getSelection();
1257
                                                } catch (ReadDriverException e1) {
1258
                                                        // TODO Auto-generated catch block
1259
                                                        e1.printStackTrace();
1260
                                                }
1261
                                                
1262
//                                                if (!(selection.isEmpty())){
1263
                                                if ((selection.cardinality() == 0) || (!(selection.isEmpty())) ){                                                        
1264
                                                        Layer3DProps props = Layer3DProps.getLayer3DProps(layer);
1265
                                                        refreshLayerInPlanet(props, true);
1266
                                                }
1267
                                }
1268
                                
1269
                        }
1270
                }
1271
                m_canvas3d.repaint();
1272
                
1273
        }
1274
}