/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.cismap.commons;
import edu.umd.cs.piccolo.PNode;
import org.jdom.Element;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
import de.cismet.cismap.commons.gui.layerwidget.ActiveLayerModel;
import de.cismet.cismap.commons.gui.layerwidget.ActiveLayerModelStore;
import de.cismet.cismap.commons.interaction.CismapBroker;
import de.cismet.cismap.commons.interaction.events.ActiveLayerEvent;
import de.cismet.cismap.commons.rasterservice.MapService;
import de.cismet.cismap.commons.retrieval.RetrievalListener;
/**
* DOCUMENT ME!
*
* @author thorsten
* @version $Revision$, $Date$
*/
public class ModeLayer implements RetrievalServiceLayer, MapService, ActiveLayerModelStore {
//~ Instance fields --------------------------------------------------------
protected HashMap<String, RetrievalServiceLayer> modeLayers = new HashMap<String, RetrievalServiceLayer>();
private String mode = null;
private RetrievalServiceLayer currentModeLayer = null;
private boolean enabled = true;
private int layerPosition = -1;
private float translucency = 0;
private ArrayList<RetrievalListener> retrievalListeners = new ArrayList<RetrievalListener>();
private ArrayList<PropertyChangeListener> pcListeners = new ArrayList<PropertyChangeListener>();
private ActiveLayerModel mappingModel;
private String layerKey = null;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new ModeLayer object.
*/
public ModeLayer() {
}
//~ Methods ----------------------------------------------------------------
@Override
public void setActiveLayerModel(final ActiveLayerModel alm) {
mappingModel = alm;
}
@Override
public ActiveLayerModel getActiveLayerModel() {
return mappingModel;
}
/**
* DOCUMENT ME!
*
* @param mode DOCUMENT ME!
* @param layer DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public RetrievalServiceLayer putModeLayer(final String mode, final RetrievalServiceLayer layer) {
if (layer.getPNode() == null) {
layer.setPNode(new PNode()); // add this PNode to avoid NPEs when the layer
}
return modeLayers.put(mode, layer);
}
/**
* DOCUMENT ME!
*
* @param mode DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public RetrievalServiceLayer getModeLayer(final String mode) {
return modeLayers.get(mode);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Set<String> getModes() {
return modeLayers.keySet();
}
/**
* DOCUMENT ME!
*
* @param mode DOCUMENT ME!
*/
public void forceMode(final String mode) {
setMode(mode, true);
}
/**
* DOCUMENT ME!
*
* @param mode DOCUMENT ME!
*/
public void setMode(final String mode) {
setMode(mode, false);
}
/**
* DOCUMENT ME!
*
* @param b DOCUMENT ME!
*/
public void setVisible(final boolean b) {
for (final RetrievalServiceLayer rsl : modeLayers.values()) {
rsl.getPNode().setVisible(b);
}
}
/**
* DOCUMENT ME!
*
* @param mode DOCUMENT ME!
* @param forced DOCUMENT ME!
*/
public void setMode(final String mode, final boolean forced) {
if ((this.mode == null) || !this.mode.equals(mode) || forced) {
final RetrievalServiceLayer oldLayer = currentModeLayer;
currentModeLayer = modeLayers.get(mode);
if (currentModeLayer != null) {
this.mode = mode;
for (final RetrievalListener rl : retrievalListeners) {
if (oldLayer != null) {
oldLayer.removeRetrievalListener(rl);
setTranslucency(oldLayer.getTranslucency());
}
currentModeLayer.addRetrievalListener(rl);
}
for (final PropertyChangeListener pcl : pcListeners) {
if (oldLayer != null) {
oldLayer.removePropertyChangeListener(pcl);
}
currentModeLayer.addPropertyChangeListener(pcl);
}
final ActiveLayerEvent ale = new ActiveLayerEvent();
if (oldLayer != null) {
ale.setLayer(oldLayer);
CismapBroker.getInstance().fireLayerRemoved(ale);
}
if (mappingModel != null) {
if (oldLayer != null) {
mappingModel.fireMapServiceRemoved((MapService)oldLayer);
}
mappingModel.fireMapServiceAdded((MapService)currentModeLayer);
}
ale.setLayer(currentModeLayer);
CismapBroker.getInstance().fireLayerAdded(ale);
} else {
currentModeLayer = oldLayer;
}
}
}
/**
* DOCUMENT ME!
*
* @throws IllegalStateException DOCUMENT ME!
*/
private void checkCurrentModeLayer() {
if (currentModeLayer == null) {
throw new IllegalStateException(
"A modeLayer without a mode is not a good idea. It should be configured with at least two different modes/layers and initialized with a start mode");
}
}
@Override
public void setErrorObject(final Object error) {
checkCurrentModeLayer();
currentModeLayer.setErrorObject(error);
}
@Override
public Object getErrorObject() {
checkCurrentModeLayer();
return currentModeLayer.getErrorObject();
}
@Override
public boolean hasErrors() {
return currentModeLayer.hasErrors();
}
@Override
public PNode getPNode() {
return currentModeLayer.getPNode();
}
@Override
public void setPNode(final PNode pNode) {
currentModeLayer.setPNode(pNode);
}
@Override
public boolean isEnabled() {
return enabled;
}
@Override
public void setEnabled(final boolean enabled) {
this.enabled = enabled;
for (final RetrievalServiceLayer rsl : modeLayers.values()) {
rsl.setEnabled(enabled);
}
}
@Override
public boolean canBeDisabled() {
return true;
}
@Override
public int getLayerPosition() {
return layerPosition;
}
@Override
public void setLayerPosition(final int layerPosition) {
this.layerPosition = layerPosition;
}
@Override
public float getTranslucency() {
return translucency;
}
@Override
public void setTranslucency(final float translucency) {
this.translucency = translucency;
for (final RetrievalServiceLayer rsl : modeLayers.values()) {
rsl.setTranslucency(translucency);
}
}
@Override
public String getName() {
return currentModeLayer.getName();
}
@Override
public void setName(final String name) {
currentModeLayer.setName(name);
}
@Override
public void addRetrievalListener(final RetrievalListener rl) {
retrievalListeners.add(rl);
currentModeLayer.addRetrievalListener(rl);
}
@Override
public void removeRetrievalListener(final RetrievalListener irl) {
retrievalListeners.remove(irl);
currentModeLayer.removeRetrievalListener(irl);
}
@Override
public void retrieve(final boolean forced) {
currentModeLayer.retrieve(forced);
}
@Override
public void setRefreshNeeded(final boolean refreshNeeded) {
for (final RetrievalServiceLayer rsl : modeLayers.values()) {
rsl.setRefreshNeeded(refreshNeeded);
}
}
/**
* DOCUMENT ME!
*
* @param crs DOCUMENT ME!
*/
public void setCrs(final Crs crs) {
for (final RetrievalServiceLayer rsl : modeLayers.values()) {
CidsLayerFactory.setLayerToCrs(crs, rsl);
}
}
@Override
public boolean isRefreshNeeded() {
return currentModeLayer.isRefreshNeeded();
}
@Override
public void addPropertyChangeListener(final PropertyChangeListener l) {
pcListeners.add(l);
currentModeLayer.addPropertyChangeListener(l);
}
@Override
public void removePropertyChangeListener(final PropertyChangeListener l) {
pcListeners.remove(l);
currentModeLayer.removePropertyChangeListener(l);
}
@Override
public int getProgress() {
return currentModeLayer.getProgress();
}
@Override
public void setProgress(final int progress) {
currentModeLayer.setProgress(progress);
}
@Override
public void setSize(final int height, final int width) {
for (final RetrievalServiceLayer rsl : modeLayers.values()) {
if (rsl instanceof MapService) {
((MapService)rsl).setSize(height, width);
}
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public RetrievalServiceLayer getCurrentLayer() {
return currentModeLayer;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getCurrentMode() {
return mode;
}
@Override
public void setBoundingBox(final BoundingBox bb) {
for (final RetrievalServiceLayer rsl : modeLayers.values()) {
if (rsl instanceof MapService) {
((MapService)rsl).setBoundingBox(bb);
}
}
}
@Override
public boolean isVisible() {
return ((MapService)currentModeLayer).isVisible();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Element toElement() {
final Element element = new Element("ModeLayer"); // NOI18N
element.setAttribute("mode", getCurrentMode()); // NOI18N
element.setAttribute("key", layerKey); // NOI18N
element.setAttribute("translucency", Float.toString(getCurrentLayer().getTranslucency())); // NOI18N
element.setAttribute("enabled", Boolean.toString(getCurrentLayer().isEnabled())); // NOI18N
element.setAttribute("visible", Boolean.toString(getCurrentLayer().getPNode().getVisible())); // NOI18N
for (final String m : getModes()) {
final Element modeElement = new Element("Mode");
modeElement.setAttribute("key", m);
modeElement.addContent(CidsLayerFactory.getElement((MapService)getModeLayer(m)));
element.addContent(modeElement);
}
return element;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getLayerKey() {
return layerKey;
}
/**
* DOCUMENT ME!
*
* @param layerKey DOCUMENT ME!
*/
public void setLayerKey(final String layerKey) {
this.layerKey = layerKey;
}
}