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