package org.openstreetmap.josm.plugins.contourmerge;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import javax.validation.constraints.NotNull;
import org.apache.commons.lang3.Validate;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
/**
* <p>Manages a set of {@link ContourMergeModel}s for each available data
* layer.</p>
*
* <p>Listens to layer change events and creates new contour merge models
* for newly added layer, or
* removes contour merge models, if a layer is deleted.</p>
*/
public class ContourMergeModelManager implements LayerChangeListener{
static private ContourMergeModelManager instance;
static public ContourMergeModelManager getInstance() {
if (instance == null){
instance = new ContourMergeModelManager();
}
return instance;
}
private final Map<OsmDataLayer, ContourMergeModel> models =
new HashMap<>();
public void wireToJOSM(){
models.clear();
Main.getLayerManager().addLayerChangeListener(this);
}
public void unwireFromJOSM() {
models.clear();
Main.getLayerManager().removeLayerChangeListener(this);
}
/**
* <p>Replies the contour merge model for the data layer {@code layer},
* or null, if no such model exists.</p>
*
* @param layer the data layer. Must not be null.
* @return the model
*/
public Optional<ContourMergeModel> getModel(@NotNull OsmDataLayer layer){
Validate.notNull(layer);
return Optional.ofNullable(models.get(layer));
}
/**
* <p>Replies the contour model for the currently active data layer
* (the "edit layer"), or null, if the currently active layer isn't
* a data layer.</p>
*
* @return the model
*/
public Optional<ContourMergeModel> getActiveModel() {
return Optional.ofNullable(Main.getLayerManager().getEditLayer())
.map(layer -> getModel(layer))
.orElse(Optional.empty());
}
/* --------------------------------------------------------------------- */
/* interface LayerChangeListener */
/* --------------------------------------------------------------------- */
@Override
public void layerAdded(LayerAddEvent event) {
Layer newLayer = event.getAddedLayer();
if (! (newLayer instanceof OsmDataLayer)) return;
OsmDataLayer dl = (OsmDataLayer)newLayer;
ContourMergeModel model = new ContourMergeModel(dl);
dl.data.addDataSetListener(model);
models.put((OsmDataLayer)newLayer, model);
}
@Override
public void layerOrderChanged(LayerOrderChangeEvent event) {
/* ignore */
}
@Override
public void layerRemoving(LayerRemoveEvent event) {
Layer oldLayer = event.getRemovedLayer();
if (! (oldLayer instanceof OsmDataLayer)) return;
OsmDataLayer dl = (OsmDataLayer)oldLayer;
ContourMergeModel model = models.get(dl);
dl.data.removeDataSetListener(model);
models.remove(dl);
}
}