package com.revolsys.swing.map.layer.ogc.wms; import java.awt.Graphics2D; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import com.revolsys.collection.map.MapEx; import com.revolsys.geometry.model.BoundingBox; import com.revolsys.raster.GeoreferencedImage; import com.revolsys.swing.map.Viewport2D; import com.revolsys.swing.map.layer.AbstractLayerRenderer; import com.revolsys.swing.map.layer.raster.GeoreferencedImageLayerRenderer; import com.revolsys.swing.parallel.Invoke; import com.revolsys.util.Cancellable; import com.revolsys.util.Property; public class OgcWmsImageLayerRenderer extends AbstractLayerRenderer<OgcWmsImageLayer> implements PropertyChangeListener { public static final String TILES_LOADED = "loading"; private GeoreferencedImage image; private OgcWmsImageLayerSwingWorker worker; public OgcWmsImageLayerRenderer(final OgcWmsImageLayer layer) { super("ogcWmsLayerRenderer", layer); Property.addListener(layer, this); } @Override public void propertyChange(final PropertyChangeEvent event) { } @Override public void render(final Viewport2D viewport, final Cancellable cancellable, final OgcWmsImageLayer layer) { final double scaleForVisible = viewport.getScaleForVisible(); if (layer.isVisible(scaleForVisible)) { if (!layer.isEditable()) { final BoundingBox viewportBoundingBox = viewport.getBoundingBox(); final BoundingBox queryBoundingBox = viewportBoundingBox .intersection(layer.getWmsLayerDefinition().getLatLonBoundingBox()); boolean reload = false; if (this.image == null) { reload = true; } else if (!queryBoundingBox.equals(this.image.getBoundingBox())) { reload = true; } if (reload) { if (this.worker != null) { if (!this.worker.equalsBoundingBox(queryBoundingBox)) { reload = false; } } } if (reload) { final int imageWidth = viewport.getViewWidthPixels(); final int imageHeight = viewport.getViewHeightPixels(); final OgcWmsImageLayerSwingWorker worker = new OgcWmsImageLayerSwingWorker(this, cancellable, queryBoundingBox, imageWidth, imageHeight); synchronized (this) { if (this.worker != null) { this.worker.cancel(true); } this.worker = worker; } Invoke.worker(worker); } else if (this.image != null) { final Graphics2D graphics = viewport.getGraphics(); if (graphics != null) { GeoreferencedImageLayerRenderer.render(viewport, graphics, this.image, false); } } } } } protected void setImage(final OgcWmsImageLayerSwingWorker worker, final GeoreferencedImage image) { synchronized (this) { if (worker == this.worker) { this.worker = null; } else { return; } } this.image = image; final OgcWmsImageLayer layer = getLayer(); if (layer != null) { layer.firePropertyChange("imageLoaded", false, true); } } @Override public MapEx toMap() { return MapEx.EMPTY; } }