001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui.mappaint; 003 004 import org.openstreetmap.josm.data.osm.OsmPrimitive; 005 import org.openstreetmap.josm.data.osm.Relation; 006 import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context; 007 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.LinkSelector; 008 import org.openstreetmap.josm.tools.CheckParameterUtil; 009 010 public class Environment { 011 012 public OsmPrimitive osm; 013 014 public MultiCascade mc; 015 public String layer; 016 public StyleSource source; 017 private Context context = Context.PRIMITIVE; 018 019 /** 020 * If not null, this is the matching parent object if an condition or an expression 021 * is evaluated in a {@link LinkSelector} (within a child selector) 022 */ 023 public OsmPrimitive parent; 024 /** 025 * The same for parent selector. Only one of the 2 fields (parent or child) is not null in any environment. 026 */ 027 public OsmPrimitive child; 028 029 /** 030 * index of node in parent way or member in parent relation. Must be != null in LINK context. 031 */ 032 public Integer index = null; 033 034 /** 035 * Creates a new uninitialized environment 036 */ 037 public Environment() {} 038 039 public Environment(OsmPrimitive osm, MultiCascade mc, String layer, StyleSource source) { 040 this.osm = osm; 041 this.mc = mc; 042 this.layer = layer; 043 this.source = source; 044 } 045 046 /** 047 * Creates a clone of the environment {@code other} 048 * 049 * @param other the other environment. Must not be null. 050 */ 051 public Environment(Environment other) throws IllegalArgumentException{ 052 CheckParameterUtil.ensureParameterNotNull(other); 053 this.osm = other.osm; 054 this.mc = other.mc; 055 this.layer = other.layer; 056 this.parent = other.parent; 057 this.child = other.child; 058 this.source = other.source; 059 this.index = other.index; 060 this.context = other.getContext(); 061 } 062 063 public Environment withPrimitive(OsmPrimitive osm) { 064 Environment e = new Environment(this); 065 e.osm = osm; 066 return e; 067 } 068 069 public Environment withParent(OsmPrimitive parent) { 070 Environment e = new Environment(this); 071 e.parent = parent; 072 return e; 073 } 074 075 public Environment withChild(OsmPrimitive child) { 076 Environment e = new Environment(this); 077 e.child = child; 078 return e; 079 } 080 081 public Environment withIndex(int index) { 082 Environment e = new Environment(this); 083 e.index = index; 084 return e; 085 } 086 087 public Environment withContext(Context context) { 088 Environment e = new Environment(this); 089 e.context = context == null ? Context.PRIMITIVE : context; 090 return e; 091 } 092 093 public Environment withLinkContext() { 094 Environment e = new Environment(this); 095 e.context = Context.LINK; 096 return e; 097 } 098 099 public boolean isLinkContext() { 100 return Context.LINK.equals(context); 101 } 102 103 public boolean hasParentRelation() { 104 return parent != null && parent instanceof Relation; 105 } 106 107 /** 108 * Replies the current context. 109 * 110 * @return the current context 111 */ 112 public Context getContext() { 113 return context == null ? Context.PRIMITIVE : context; 114 } 115 116 public String getRole() { 117 if (getContext().equals(Context.PRIMITIVE)) 118 return null; 119 120 if (parent != null && parent instanceof Relation) 121 return ((Relation) parent).getMember(index).getRole(); 122 if (child != null && osm instanceof Relation) 123 return ((Relation) osm).getMember(index).getRole(); 124 return null; 125 } 126 127 public void clearSelectorMatchingInformation() { 128 parent = null; 129 child = null; 130 index = null; 131 } 132 }