// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.mappaint; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.openstreetmap.josm.tools.CheckParameterUtil; /** * Several layers / cascades, e.g. one for the main Line and one for each overlay. * The range is (0,Infinity) at first and it shrinks in the process when * StyleSources apply zoom level dependent properties. */ public class MultiCascade implements StyleKeys { private final Map<String, Cascade> layers; public Range range; /** * Constructs a new {@code MultiCascade}. */ public MultiCascade() { layers = new HashMap<>(); range = Range.ZERO_TO_INFINITY; } /** * Return the cascade with the given name. If it doesn't exist, create * a new layer with that name and return it. The new layer will be * a clone of the "*" layer, if it exists. * @param layer layer * @return cascade */ public Cascade getOrCreateCascade(String layer) { CheckParameterUtil.ensureParameterNotNull(layer); Cascade c = layers.get(layer); if (c == null) { if (layers.containsKey("*")) { c = new Cascade(layers.get("*")); } else { c = new Cascade(); // Everything that is not on the default layer is assumed to // be a modifier. Can be overridden in style definition. if (!"default".equals(layer) && !"*".equals(layer)) { c.put(MODIFIER, Boolean.TRUE); } } layers.put(layer, c); } return c; } /** * Read-only version of {@link #getOrCreateCascade}. For convenience, it returns an * empty cascade for non-existing layers. However this empty (read-only) cascade * is not added to this MultiCascade object. * @param layer layer * @return cascade */ public Cascade getCascade(String layer) { if (layer == null) { layer = "default"; } Cascade c = layers.get(layer); if (c == null) { c = new Cascade(); if (!"default".equals(layer) && !"*".equals(layer)) { c.put(MODIFIER, Boolean.TRUE); } } return c; } public Collection<Entry<String, Cascade>> getLayers() { return layers.entrySet(); } public boolean hasLayer(String layer) { return layers.containsKey(layer); } }