Revision 693 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

View differences:

DefaultSynchronizer.java
31 31
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
32 32
import org.gvsig.fmap.mapcontext.layers.LayerListener;
33 33
import org.gvsig.fmap.mapcontext.layers.LayerPositionEvent;
34
import org.gvsig.fmap.mapcontext.layers.operations.LayersVisitor;
35
import org.gvsig.raster.fmap.layers.FLyrRaster;
36
import org.gvsig.tools.dispose.Disposable;
37
import org.gvsig.tools.exception.BaseException;
38
import org.gvsig.tools.visitor.VisitCanceledException;
34 39
import org.gvsig.view3d.lib.api.View3DLocator;
35 40
import org.gvsig.view3d.lib.api.properties.LayerProperties3D;
36 41
import org.gvsig.view3d.swing.api.View3DSwingLocator;
......
48 53
 * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
49 54
 *
50 55
 */
51
public class DefaultSynchronizer {
56
public class DefaultSynchronizer implements Disposable{
52 57

  
53 58
    private static final Logger LOG = LoggerFactory.getLogger(DefaultSynchronizer.class);
54 59

  
......
57 62
    private DefaultMapControl3D mapControl3D;
58 63
    private MapContext mapContext;
59 64
    private WorldWindow wwd;
65
    
66
    private LayerListener layerLister = null;
67
    private LayerCollectionListener layerCollectionListener = null;
68
    private ViewPortListener viewportListener = null;
60 69

  
61 70
    protected DefaultSynchronizer(DefaultMapControl3D theMapControl3D, MapContext theMapContext,
62 71
        WorldWindow wwd) {
......
78 87
    }
79 88

  
80 89
    private void addLayerCollectionListener(FLayers layers) {
81

  
82 90
        if (layers == null) {
83 91
            return;
84 92
        }
93
        layers.addLayerCollectionListener(getLayerCollectionListener());
94
    }
85 95

  
86
        layers.addLayerCollectionListener(new LayerCollectionListener() {
96
    private LayerCollectionListener getLayerCollectionListener() {
97
        if(this.layerCollectionListener == null){
98
            this.layerCollectionListener = new LayerCollectionListener() {
87 99

  
88
            public void layerAdded(LayerCollectionEvent e) {
100
                public void layerAdded(LayerCollectionEvent e) {
89 101

  
90
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
91
                    FLayer affectedLayer = e.getAffectedLayer();
92
                    try {
93
                        addLayer(affectedLayer);
94
                        // Add layer listener to new layer
95
                        addLayerListener(affectedLayer);
96
                    } catch (ConversionLayerException e1) {
97
                        LOG.error("Synchronizer can not add {} layer to 3D view",
98
                            affectedLayer.getName());
99
                        return;
102
                    if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
103
                        FLayer affectedLayer = e.getAffectedLayer();
104
                        try {
105
                            addLayer(affectedLayer);
106
                            // Add layer listener to new layer
107
                            addLayerListener(affectedLayer);
108
                        } catch (ConversionLayerException e1) {
109
                            LOG.error("Synchronizer can not add {} layer to 3D view",
110
                                affectedLayer.getName());
111
                            return;
112
                        }
100 113
                    }
101 114
                }
102
            }
103 115

  
104
            public void layerAdding(LayerCollectionEvent e) throws CancelationException {
105
            }
116
                public void layerAdding(LayerCollectionEvent e) throws CancelationException {
117
                }
106 118

  
107
            public void layerMoved(LayerPositionEvent e) {
119
                public void layerMoved(LayerPositionEvent e) {
108 120

  
109
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
110
                    FLayer affectedLayer = e.getAffectedLayer();
111
                    int oldPos = e.getOldPos();
112
                    int newPos = e.getNewPos();
121
                    if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
122
                        FLayer affectedLayer = e.getAffectedLayer();
123
                        int oldPos = e.getOldPos();
124
                        int newPos = e.getNewPos();
113 125

  
114
                    // Only move layer is layer has changed position.
115
                    if (oldPos != newPos) {
116
                        try {
117
                            moveLayer(affectedLayer, oldPos, newPos);
118
                        } catch (ConversionLayerException e1) {
119
                            LOG.error("Synchronizer can not move {} layer", affectedLayer.getName());
120
                            return;
126
                        // Only move layer is layer has changed position.
127
                        if (oldPos != newPos) {
128
                            try {
129
                                moveLayer(affectedLayer, oldPos, newPos);
130
                            } catch (ConversionLayerException e1) {
131
                                LOG.error("Synchronizer can not move {} layer", affectedLayer.getName());
132
                                return;
133
                            }
121 134
                        }
122 135
                    }
123 136
                }
124
            }
125 137

  
126
            public void layerMoving(LayerPositionEvent e) throws CancelationException {
127
            }
138
                public void layerMoving(LayerPositionEvent e) throws CancelationException {
139
                }
128 140

  
129
            public void layerRemoved(LayerCollectionEvent e) {
130
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
131
                    FLayer affectedLayer = e.getAffectedLayer();
132
                    removeLayer(affectedLayer);
141
                public void layerRemoved(LayerCollectionEvent e) {
142
                    if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
143
                        FLayer affectedLayer = e.getAffectedLayer();
144
                        removeLayer(affectedLayer);
145
                    }
133 146
                }
134
            }
135 147

  
136
            public void layerRemoving(LayerCollectionEvent e) throws CancelationException {
137
            }
148
                public void layerRemoving(LayerCollectionEvent e) throws CancelationException {
149
                }
138 150

  
139
            public void visibilityChanged(LayerCollectionEvent e) throws CancelationException {
151
                public void visibilityChanged(LayerCollectionEvent e) throws CancelationException {
140 152

  
141
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
142
                    FLayer affectedLayer = e.getAffectedLayer();
153
                    if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
154
                        FLayer affectedLayer = e.getAffectedLayer();
143 155

  
144
                    if (getTileImageLayer(affectedLayer) != null) {
145
                        getTileImageLayer(affectedLayer).setEnabled(affectedLayer.isVisible());
156
                        if (getTileImageLayer(affectedLayer) != null) {
157
                            getTileImageLayer(affectedLayer).setEnabled(affectedLayer.isVisible());
158
                        }
146 159
                    }
147 160
                }
148
            }
149
        });
161
            };
162
        }
163
        return layerCollectionListener;
150 164
    }
151 165

  
152 166
    private LayerListener getLayerListener() {
153
        return new LayerListener() {
167
        if (this.layerLister == null) {
168
            this.layerLister = new LayerListener() {
154 169

  
155
            public void activationChanged(LayerEvent e) {
156
            }
170
                public void activationChanged(LayerEvent e) {
171
                }
157 172

  
158
            public void drawValueChanged(LayerEvent e) {
173
                public void drawValueChanged(LayerEvent e) {
159 174

  
160
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
161
                    FLayer layer = e.getSource();
162
                    LayerProperties3D layerProperties = View3DLocator.getManager().getLayerProperties(layer);
163
                    
164
                    // If load mode change reload layer. FIXME: Change this when there are more load modes.
165
                    if (layerProperties.getElevation() == false && getElevationModel(layer) != null){
166
                        reloadLayer(layer, wwd.getModel().getLayers().size());
167
                        return;
168
                    } else if( layerProperties.getElevation() == true && getTileImageLayer(layer) != null) {
169
                        CompoundElevationModel compoundElevation =
170
                            (CompoundElevationModel) wwd.getModel().getGlobe().getElevationModel();
171
                        reloadLayer(layer, compoundElevation.getElevationModels().size());
172
                        return;
175
                    if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
176
                        FLayer layer = e.getSource();
177
                        LayerProperties3D layerProperties =
178
                            View3DLocator.getManager().getLayerProperties(layer);
179

  
180
                        // If load mode change reload layer. FIXME: Change this
181
                        // when there are more load modes.
182
                        if (layerProperties.getElevation() == false
183
                            && getElevationModel(layer) != null) {
184
                            reloadLayer(layer, wwd.getModel().getLayers().size());
185
                            return;
186
                        } else if (layerProperties.getElevation() == true
187
                            && getTileImageLayer(layer) != null) {
188
                            CompoundElevationModel compoundElevation =
189
                                (CompoundElevationModel) wwd.getModel().getGlobe()
190
                                    .getElevationModel();
191
                            reloadLayer(layer, compoundElevation.getElevationModels().size());
192
                            return;
193
                        }
194

  
195
                        // Set expire time to invalidate tile cache layer.
196
                        if (getTileImageLayer(layer) != null) {
197
                            getTileImageLayer(layer).setExpiryTime(System.currentTimeMillis());
198
                        } else if (getElevationModel(layer) != null) {
199
                            getElevationModel(layer).setExpiryTime(System.currentTimeMillis());
200
                        }
173 201
                    }
174
                    
175
                    // Set expire time to invalidate tile cache layer.
176
                    if (getTileImageLayer(layer) != null) {
177
                        getTileImageLayer(layer).setExpiryTime(System.currentTimeMillis());
178
                    } else if (getElevationModel(layer) != null) {
179
                        getElevationModel(layer).setExpiryTime(System.currentTimeMillis());
180
                    }
181 202
                }
182
            }
183 203

  
184
            public void editionChanged(LayerEvent e) {
185
                // After edition finish it is necessary to reopen store to
186
                // refresh layer
187
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
188
                    FLayer layer = e.getSource();
189
                    if (!layer.isEditing()) {
190
                        reloadLayer(layer);
204
                public void editionChanged(LayerEvent e) {
205
                    // After edition finish it is necessary to reopen store to
206
                    // refresh layer
207
                    if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
208
                        FLayer layer = e.getSource();
209
                        if (!layer.isEditing()) {
210
                            reloadLayer(layer);
211
                        }
191 212
                    }
192 213
                }
193
            }
194 214

  
195
            public void nameChanged(LayerEvent e) {
196
            }
215
                public void nameChanged(LayerEvent e) {
216
                }
197 217

  
198
            public void visibilityChanged(LayerEvent e) {
199
                if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
200
                    FLayer affectedLayer = e.getSource();
218
                public void visibilityChanged(LayerEvent e) {
219
                    if (mapControl3D.getProperties().getAutoLayerSynchronize()) {
220
                        FLayer affectedLayer = e.getSource();
201 221

  
202
                    if (getTileImageLayer(affectedLayer) != null) {
203
                        getTileImageLayer(affectedLayer).setEnabled(affectedLayer.isVisible());
222
                        if (getTileImageLayer(affectedLayer) != null) {
223
                            getTileImageLayer(affectedLayer).setEnabled(affectedLayer.isVisible());
224
                        }
204 225
                    }
205 226
                }
206
            }
207
        };
227
            };
228
        }
229
        return layerLister;
208 230
    }
209 231
    
210 232
    private void reloadLayer(FLayer layer){
......
223 245
    }
224 246

  
225 247
    private void addViewPortListener(ViewPort viewPort) {
248
        viewPort.addViewPortListener(getViewPortListener());
249
    }
226 250

  
227
        viewPort.addViewPortListener(new ViewPortListener() {
251
    private ViewPortListener getViewPortListener() {
252
        if (this.viewportListener == null) {
253
            this.viewportListener = new ViewPortListener() {
228 254

  
229
            public void projectionChanged(ProjectionEvent e) {
230
            }
255
                public void projectionChanged(ProjectionEvent e) {
256
                }
231 257

  
232
            public void extentChanged(ExtentEvent e) {
233
                MapControlProperties3D properties = mapControl3D.getProperties();
234
                boolean autoViewSynchronize = properties.getAutoViewPortSynchronize();
235
                if (autoViewSynchronize) {
236
                    synchronizeViewPorts();
258
                public void extentChanged(ExtentEvent e) {
259
                    MapControlProperties3D properties = mapControl3D.getProperties();
260
                    boolean autoViewSynchronize = properties.getAutoViewPortSynchronize();
261
                    if (autoViewSynchronize) {
262
                        synchronizeViewPorts();
263
                    }
237 264
                }
238
            }
239 265

  
240
            public void backColorChanged(ColorEvent e) {
241
            }
242
        });
266
                public void backColorChanged(ColorEvent e) {
267
                }
268
            };
269
        }
270
        return this.viewportListener;
243 271
    }
244 272

  
245 273
    private Layer getTileImageLayer(FLayer layer) {
......
304 332
        }
305 333
    }
306 334

  
307
    void setViewPortEnvelope(Envelope envelope) {
308
        
309
        // Convert envelope to WorldWind sector
310
        Sector sector = getSector(envelope);
311
        
312
        // Create a bounding box for the specified sector in order to estimate
313
        // its size in model coordinates.
314
        Box extent = Sector.computeBoundingBox(wwd.getModel().getGlobe(),
315
            mapControl3D.getVerticalExaggeration(), sector);
316
        
317
        // Estimate the distance between the center position and the eye
318
        // position that is necessary to cause the sector to
319
        // fill a viewport with the specified field of view. Note that we change
320
        // the distance between the center and eye
321
        // position here, and leave the field of view constant.
322
        Angle fov = wwd.getView().getFieldOfView();
323
        double zoom = extent.getRadius() / fov.cosHalfAngle() / fov.tanHalfAngle();
324
        
325
        View3DSwingManager swingManager = View3DSwingLocator.getManager();
326
        GeneralProperties3D general3dProperties = swingManager.getGeneral3DProperties();
327
        
328
        if(general3dProperties.getViewPortAnimation()){
329
            wwd.getView().goTo(new Position(sector.getCentroid(), 0d), zoom);
330
        } else {
331
            ((OrbitView) wwd.getView()).setCenterPosition(new Position(sector
332
                .getCentroid(), 0d));
333
            ((OrbitView) wwd.getView()).setZoom(zoom);
334
            wwd.redraw();
335
        }
336
    }
337

  
338 335
    private Sector getSector(Envelope envelope) {
339 336

  
340 337
        Point2D p1 = null;
......
436 433
    protected void registerLayer(FLayer layer, Object wwLayer) {
437 434
        register.put(layer, wwLayer);
438 435
    }
436

  
437
    @Override
438
    public void dispose() {
439
        this.mapContext.getLayers().removeLayerCollectionListener(getLayerCollectionListener());
440
        try {
441
            this.mapContext.getLayers().accept(new LayersVisitor() {
442
                
443
                @Override
444
                public void visit(Object obj) throws VisitCanceledException, BaseException {
445
                    // Do nothing
446
                }
447
                
448
                @Override
449
                public void visit(FLayer layer) throws BaseException {
450
                    if(layer != null){
451
                        if(layer instanceof FLyrRaster){
452
                            FLyrRaster rasterLayer = (FLyrRaster) layer;
453
                            boolean wasRemoveRasterFlag = false;
454
                            if(rasterLayer.isRemoveRasterFlag()){
455
                                wasRemoveRasterFlag = true; 
456
                                rasterLayer.setRemoveRasterFlag(false); // Disable raster flag to avoid remove layer
457
                            }
458
                            layer.removeLayerListener(getLayerListener());
459
                            if(wasRemoveRasterFlag){ // Restore remove raster flag
460
                                rasterLayer.setRemoveRasterFlag(true);
461
                            }
462
                        } else {
463
                            layer.removeLayerListener(getLayerListener());
464
                        }
465
                    }
466
                }
467
            });
468
        } catch (BaseException e) {
469
            LOG.warn("Can not remove layer listener from some layer in mapcontext", e);
470
        }
471
        
472
        this.mapContext.getViewPort().removeViewPortListener(getViewPortListener());
473
        this.mapControl3D = null;
474
        this.mapContext = null;
475
        this.wwd = null;
476
    }
439 477
}

Also available in: Unified diff