source: josm/trunk/src/org/openstreetmap/josm/gui/mappaint/TextElement.java@ 7402

Last change on this file since 7402 was 7402, checked in by Don-vip, 10 years ago

fix some Sonar issues

  • Property svn:eol-style set to native
File size: 8.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.mappaint;
3
4import java.awt.Color;
5import java.awt.Font;
6import java.util.Objects;
7
8import org.openstreetmap.josm.data.osm.OsmPrimitive;
9import org.openstreetmap.josm.gui.mappaint.LabelCompositionStrategy.DeriveLabelFromNameTagsCompositionStrategy;
10import org.openstreetmap.josm.gui.mappaint.LabelCompositionStrategy.StaticLabelCompositionStrategy;
11import org.openstreetmap.josm.gui.mappaint.LabelCompositionStrategy.TagLookupCompositionStrategy;
12import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.TagKeyReference;
13import org.openstreetmap.josm.tools.CheckParameterUtil;
14import org.openstreetmap.josm.tools.Utils;
15
16/**
17 * Represents the rendering style for a textual label placed somewhere on the map.
18 * @since 3880
19 */
20public class TextElement implements StyleKeys {
21 public static final LabelCompositionStrategy AUTO_LABEL_COMPOSITION_STRATEGY = new DeriveLabelFromNameTagsCompositionStrategy();
22
23 /** the strategy for building the actual label value for a given a {@link OsmPrimitive}.
24 * Check for null before accessing.
25 */
26 public LabelCompositionStrategy labelCompositionStrategy;
27 /** the font to be used when rendering*/
28 public Font font;
29 public int xOffset;
30 public int yOffset;
31 public Color color;
32 public Float haloRadius;
33 public Color haloColor;
34
35 /**
36 * Creates a new text element
37 *
38 * @param strategy the strategy indicating how the text is composed for a specific {@link OsmPrimitive} to be rendered.
39 * If null, no label is rendered.
40 * @param font the font to be used. Must not be null.
41 * @param xOffset
42 * @param yOffset
43 * @param color the color to be used. Must not be null
44 * @param haloRadius
45 * @param haloColor
46 */
47 public TextElement(LabelCompositionStrategy strategy, Font font, int xOffset, int yOffset, Color color, Float haloRadius, Color haloColor) {
48 CheckParameterUtil.ensureParameterNotNull(font);
49 CheckParameterUtil.ensureParameterNotNull(color);
50 labelCompositionStrategy = strategy;
51 this.font = font;
52 this.xOffset = xOffset;
53 this.yOffset = yOffset;
54 this.color = color;
55 this.haloRadius = haloRadius;
56 this.haloColor = haloColor;
57 }
58
59 /**
60 * Copy constructor
61 *
62 * @param other the other element.
63 */
64 public TextElement(TextElement other) {
65 this.labelCompositionStrategy = other.labelCompositionStrategy;
66 this.font = other.font;
67 this.xOffset = other.xOffset;
68 this.yOffset = other.yOffset;
69 this.color = other.color;
70 this.haloColor = other.haloColor;
71 this.haloRadius = other.haloRadius;
72 }
73
74 /**
75 * Derives a suitable label composition strategy from the style properties in {@code c}.
76 *
77 * @param c the style properties
78 * @return the label composition strategy
79 */
80 protected static LabelCompositionStrategy buildLabelCompositionStrategy(Cascade c, boolean defaultAnnotate){
81 /*
82 * If the cascade includes a TagKeyReference we will lookup the rendered label
83 * from a tag value.
84 */
85 TagKeyReference tkr = c.get(TEXT, null, TagKeyReference.class, true);
86 if (tkr != null)
87 return new TagLookupCompositionStrategy(tkr.key);
88
89 /*
90 * Check whether the label composition strategy is given by a keyword
91 */
92 Keyword keyword = c.get(TEXT, null, Keyword.class, true);
93 if (Keyword.AUTO.equals(keyword))
94 return AUTO_LABEL_COMPOSITION_STRATEGY;
95
96 /*
97 * Do we have a static text label?
98 */
99 String text = c.get(TEXT, null, String.class, true);
100 if (text != null)
101 return new StaticLabelCompositionStrategy(text);
102 return defaultAnnotate ? AUTO_LABEL_COMPOSITION_STRATEGY : null;
103 }
104
105 /**
106 * Builds a text element from style properties in {@code c} and the
107 * default text color {@code defaultTextColor}
108 *
109 * @param env the environment
110 * @param defaultTextColor the default text color. Must not be null.
111 * @param defaultAnnotate true, if a text label shall be rendered by default, even if the style sheet
112 * doesn't include respective style declarations
113 * @return the text element or null, if the style properties don't include
114 * properties for text rendering
115 * @throws IllegalArgumentException thrown if {@code defaultTextColor} is null
116 */
117 public static TextElement create(Environment env, Color defaultTextColor, boolean defaultAnnotate) throws IllegalArgumentException{
118 CheckParameterUtil.ensureParameterNotNull(defaultTextColor);
119 Cascade c = env.mc.getCascade(env.layer);
120
121 LabelCompositionStrategy strategy = buildLabelCompositionStrategy(c, defaultAnnotate);
122 if (strategy == null) return null;
123 String s = strategy.compose(env.osm);
124 if (s == null) return null;
125 Font font = ElemStyle.getFont(c, s);
126
127 float xOffset = 0;
128 float yOffset = 0;
129 float[] offset = c.get("text-offset", null, float[].class);
130 if (offset != null) {
131 if (offset.length == 1) {
132 yOffset = offset[0];
133 } else if (offset.length >= 2) {
134 xOffset = offset[0];
135 yOffset = offset[1];
136 }
137 }
138 xOffset = c.get("text-offset-x", xOffset, Float.class);
139 yOffset = c.get("text-offset-y", yOffset, Float.class);
140
141 Color color = c.get("text-color", defaultTextColor, Color.class);
142 float alpha = c.get("text-opacity", 1f, Float.class);
143 color = new Color(color.getRed(), color.getGreen(),
144 color.getBlue(), Utils.color_float2int(alpha));
145
146 Float haloRadius = c.get("text-halo-radius", null, Float.class);
147 if (haloRadius != null && haloRadius <= 0) {
148 haloRadius = null;
149 }
150 Color haloColor = null;
151 if (haloRadius != null) {
152 haloColor = c.get("text-halo-color", Utils.complement(color), Color.class);
153 float haloAlpha = c.get("text-halo-opacity", 1f, Float.class);
154 haloColor = new Color(haloColor.getRed(), haloColor.getGreen(),
155 haloColor.getBlue(), Utils.color_float2int(haloAlpha));
156 }
157
158 return new TextElement(strategy, font, (int) xOffset, - (int) yOffset, color, haloRadius, haloColor);
159 }
160
161 /**
162 * Replies the label to be rendered for the primitive {@code osm}.
163 *
164 * @param osm the OSM object
165 * @return the label, or null, if {@code osm} is null or if no label can be
166 * derived for {@code osm}
167 */
168 public String getString(OsmPrimitive osm) {
169 if (labelCompositionStrategy == null) return null;
170 return labelCompositionStrategy.compose(osm);
171 }
172
173 @Override
174 public String toString() {
175 return "TextElement{" + toStringImpl() + '}';
176 }
177
178 protected String toStringImpl() {
179 StringBuilder sb = new StringBuilder();
180 sb.append("labelCompositionStrategy=" + labelCompositionStrategy);
181 sb.append(" font=" + font);
182 if (xOffset != 0) {
183 sb.append(" xOffset=" + xOffset);
184 }
185 if (yOffset != 0) {
186 sb.append(" yOffset=" + yOffset);
187 }
188 sb.append(" color=" + Utils.toString(color));
189 if (haloRadius != null) {
190 sb.append(" haloRadius=" + haloRadius);
191 sb.append(" haloColor=" + haloColor);
192 }
193 return sb.toString();
194 }
195
196 @Override
197 public int hashCode() {
198 int hash = 3;
199 hash = 79 * hash + (labelCompositionStrategy != null ? labelCompositionStrategy.hashCode() : 0);
200 hash = 79 * hash + font.hashCode();
201 hash = 79 * hash + xOffset;
202 hash = 79 * hash + yOffset;
203 hash = 79 * hash + color.hashCode();
204 hash = 79 * hash + (haloRadius != null ? Float.floatToIntBits(haloRadius) : 0);
205 hash = 79 * hash + (haloColor != null ? haloColor.hashCode() : 0);
206 return hash;
207 }
208
209 @Override
210 public boolean equals(Object obj) {
211 if (obj == null || getClass() != obj.getClass())
212 return false;
213 final TextElement other = (TextElement) obj;
214 return Objects.equals(labelCompositionStrategy, other.labelCompositionStrategy) &&
215 Objects.equals(font, other.font) &&
216 xOffset == other.xOffset &&
217 yOffset == other.yOffset &&
218 Objects.equals(color, other.color) &&
219 Objects.equals(haloRadius, other.haloRadius) &&
220 Objects.equals(haloColor, other.haloColor);
221 }
222}
Note: See TracBrowser for help on using the repository browser.