/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.gwt.client.map.layer;
import org.geomajas.annotation.Api;
import org.geomajas.configuration.client.ClientRasterLayerInfo;
import org.geomajas.gwt.client.gfx.PainterVisitor;
import org.geomajas.gwt.client.map.MapModel;
import org.geomajas.gwt.client.map.cache.tile.RasterTile;
import org.geomajas.gwt.client.map.cache.tile.TileFunction;
import org.geomajas.gwt.client.map.event.LayerStyleChangeEvent;
import org.geomajas.gwt.client.map.store.DefaultRasterLayerStore;
import org.geomajas.gwt.client.map.store.RasterLayerStore;
import org.geomajas.gwt.client.spatial.Bbox;
/**
* <p>
* The client side representation of a raster layer.
* </p>
*
* @author Jan De Moerloose
* @since 1.6.0
*/
@Api
public class RasterLayer extends AbstractLayer<ClientRasterLayerInfo> {
protected RasterLayerStore store;
/**
* The only constructor! Set the MapModel and the layer info.
*
* @param mapModel The model of layers and features behind a map. This layer will be a part of this model.
*/
public RasterLayer(MapModel mapModel, ClientRasterLayerInfo layerInfo) {
super(mapModel, layerInfo);
store = new DefaultRasterLayerStore(this);
}
@Override
public void accept(final PainterVisitor visitor, final Object group, final Bbox bounds, boolean recursive) {
visitor.visit(this, group);
// When visible, take care of fetching through an applyAndSync:
if (recursive && isShowing()) {
TileFunction<RasterTile> onDelete = new TileFunction<RasterTile>() {
public void execute(RasterTile tile) {
visitor.remove(tile, group);
}
};
TileFunction<RasterTile> onUpdate = new TileFunction<RasterTile>() {
// Updating a tile, re-rendering it:
public void execute(RasterTile tile) {
tile.accept(visitor, group, bounds, true);
}
};
store.applyAndSync(bounds, onDelete, onUpdate);
}
}
public RasterLayerStore getStore() {
return store;
}
/**
* Apply a new opacity on the entire raster layer.
*
* @param opacity The new opacity value. Must be a value between 0 and 1, where 0 means invisible and 1 is totally
* visible.
* @since 1.8.0
*/
public void setOpacity(double opacity) {
getLayerInfo().setStyle(Double.toString(opacity));
handlerManager.fireEvent(new LayerStyleChangeEvent(this));
}
@Override
public double getOpacity() {
String raw = getLayerInfo().getStyle();
double opacity = 1d;
if (raw != null && !"".equals(raw)) {
try {
opacity = Double.parseDouble(raw);
} catch (NumberFormatException e) {
// ignore
}
}
return opacity;
}
@Override
public void updateStyle() {
handlerManager.fireEvent(new LayerStyleChangeEvent(this));
}
}