001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.mappaint;
003
004 import java.util.Collection;
005 import java.util.HashMap;
006 import java.util.Map;
007 import java.util.Map.Entry;
008
009 import org.openstreetmap.josm.tools.CheckParameterUtil;
010
011 /**
012 * Several layers / cascades, e.g. one for the main Line and one for each overlay.
013 * The range is (0,Infinity) at first and it shrinks in the process when
014 * StyleSources apply zoom level dependent properties.
015 */
016 public class MultiCascade implements StyleKeys {
017
018 private Map<String, Cascade> layers;
019 public Range range;
020
021 public MultiCascade() {
022 layers = new HashMap<String, Cascade>();
023 range = new Range();
024 }
025
026 /**
027 * Return the cascade with the given name. If it doesn't exist, create
028 * a new layer with that name and return it. The new layer will be
029 * a clone of the "*" layer, if it exists.
030 */
031 public Cascade getOrCreateCascade(String layer) {
032 CheckParameterUtil.ensureParameterNotNull(layer);
033 Cascade c = layers.get(layer);
034 if (c == null) {
035 if (layers.containsKey("*")) {
036 c = layers.get("*").clone();
037 } else {
038 c = new Cascade();
039 // Everything that is not on the default layer is assumed to
040 // be a modifier. Can be overridden in style definition.
041 if (!layer.equals("default") && !layer.equals("*")) {
042 c.put(MODIFIER, true);
043 }
044 }
045 layers.put(layer, c);
046 }
047 return c;
048 }
049
050 /**
051 * Read-only version of getOrCreateCascade. For convenience, it returns an
052 * empty cascade for non-existing layers. However this empty (read-only) cascade
053 * is not added to this MultiCascade object.
054 */
055 public Cascade getCascade(String layer) {
056 if (layer == null) {
057 layer = "default";
058 }
059 Cascade c = layers.get(layer);
060 if (c == null) {
061 c = new Cascade();
062 if (!layer.equals("default") && !layer.equals("*")) {
063 c.put(MODIFIER, true);
064 }
065 }
066 return c;
067 }
068
069 public Collection<Entry<String, Cascade>> getLayers() {
070 return layers.entrySet();
071 }
072
073 public boolean hasLayer(String layer) {
074 return layers.containsKey(layer);
075 }
076 }