001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/graphics/sld/Font.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree, http://deegree.org/
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 and
007 lat/lon GmbH
008
009 This library is free software; you can redistribute it and/or modify it under
010 the terms of the GNU Lesser General Public License as published by the Free
011 Software Foundation; either version 2.1 of the License, or (at your option)
012 any later version.
013 This library is distributed in the hope that it will be useful, but WITHOUT
014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016 details.
017 You should have received a copy of the GNU Lesser General Public License
018 along with this library; if not, write to the Free Software Foundation, Inc.,
019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020
021 Contact information:
022
023 lat/lon GmbH
024 Aennchenstr. 19, 53177 Bonn
025 Germany
026 http://lat-lon.de/
027
028 Department of Geography, University of Bonn
029 Prof. Dr. Klaus Greve
030 Postfach 1147, 53001 Bonn
031 Germany
032 http://www.geographie.uni-bonn.de/deegree/
033
034 e-mail: info@deegree.org
035 ----------------------------------------------------------------------------*/
036 package org.deegree.graphics.sld;
037
038 import java.awt.Color;
039 import java.util.Iterator;
040 import java.util.Map;
041
042 import org.deegree.framework.util.ColorUtils;
043 import org.deegree.framework.xml.Marshallable;
044 import org.deegree.model.feature.Feature;
045 import org.deegree.model.filterencoding.FilterEvaluationException;
046
047 /**
048 * The Font element identifies a font of a certain family, style, weight, size and color.
049 * <p>
050 * The supported CSS-Parameter names are:
051 * <ul>
052 * <li>font-family
053 * <li>font-style
054 * <li>font-weight
055 * <li>font-size
056 * <li>font-color
057 * <p>
058 *
059 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
060 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider</a>
061 * @version $Revision: 18195 $ $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
062 */
063 public class Font implements Marshallable {
064
065 /**
066 * java.awt.Font.PLAIN
067 */
068 public static final int STYLE_NORMAL = java.awt.Font.PLAIN;
069
070 /**
071 * java.awt.Font.ITALIC
072 */
073 public static final int STYLE_ITALIC = java.awt.Font.ITALIC;
074
075 /**
076 * java.awt.Font.ITALIC
077 */
078 public static final int STYLE_OBLIQUE = java.awt.Font.ITALIC;
079
080 /**
081 * java.awt.Font.PLAIN
082 */
083 public static final int WEIGHT_NORMAL = java.awt.Font.PLAIN;
084
085 /**
086 * java.awt.Font.BOLD
087 */
088 public static final int WEIGHT_BOLD = java.awt.Font.BOLD;
089
090 /**
091 * Default character size initialized with 10.
092 */
093 public static final int SIZE_DEFAULT = 10;
094
095 /**
096 * Default color is 127,127,127 (white)
097 */
098 public static final Color COLOR_DEFAULT = new Color( 127, 127, 127 );
099
100 private Map<String, CssParameter> cssParams = null;
101
102 /**
103 * Constructs a new <tt>Font<tt>.
104 * <p>
105 * @param cssParams keys are <tt>Strings<tt> (see above), values are
106 * <tt>CssParameters</tt>
107 */
108 public Font( Map<String, CssParameter> cssParams ) {
109 this.cssParams = cssParams;
110 }
111
112 /**
113 * returns the Map of the CssParameters describing a Font
114 *
115 * @return the Map of the CssParameters describing a Font
116 */
117 public Map<String, CssParameter> getCssParameters() {
118 return cssParams;
119 }
120
121 /**
122 * Returns the (evaluated) value of the font's CssParameter 'font-family'.
123 * <p>
124 *
125 * @param feature
126 * specifies the <tt>Feature</tt> to be used for evaluation of the underlying
127 * 'sld:ParameterValueType'
128 * @return the (evaluated) <tt>String</tt> value of the parameter
129 * @throws FilterEvaluationException
130 * if the evaluation fails
131 */
132 public String getFamily( Feature feature )
133 throws FilterEvaluationException {
134 CssParameter cssParam = cssParams.get( "font-family" );
135
136 if ( cssParam == null ) {
137 return null;
138 }
139
140 return cssParam.getValue( feature ).trim();
141 }
142
143 /**
144 * Sets the value of the font's CssParameter 'font-family'.
145 * <p>
146 *
147 * @param family
148 * font family to be set
149 */
150 public void setFamily( String family ) {
151 CssParameter fontFamily = StyleFactory.createCssParameter( "font-family", "" + family );
152 cssParams.put( "font-family", fontFamily );
153 }
154
155 /**
156 * Returns the (evaluated) value of the font's CssParameter 'font-style'.
157 * <p>
158 *
159 * @param feature
160 * specifies the <tt>Feature</tt> to be used for evaluation of the underlying
161 * 'sld:ParameterValueType'
162 * @return the (evaluated) value of the parameter
163 * @throws FilterEvaluationException
164 * if the evaluation fails or the specified style is not one of the following:
165 * 'normal', 'italic' and 'oblique'
166 */
167 public int getStyle( Feature feature )
168 throws FilterEvaluationException {
169 CssParameter cssParam = cssParams.get( "font-style" );
170
171 if ( cssParam == null ) {
172 return STYLE_NORMAL;
173 }
174
175 String s = cssParam.getValue( feature ).trim();
176
177 if ( s.equals( "normal" ) ) {
178 return STYLE_NORMAL;
179 } else if ( s.equals( "italic" ) ) {
180 return STYLE_ITALIC;
181 } else if ( s.equals( "oblique" ) ) {
182 return STYLE_OBLIQUE;
183 }
184
185 throw new FilterEvaluationException( "Given value ('" + s + "') for CssParameter 'font-style' is "
186 + "invalid: allowed values are 'normal', 'italic' and 'oblique'." );
187 }
188
189 /**
190 * Sets the value of the font's CssParameter 'font-style'.
191 * <p>
192 *
193 * @param style
194 * font-style to be set
195 */
196 public void setStyle( int style ) {
197 CssParameter fontStyle = StyleFactory.createCssParameter( "font-style", "" + style );
198 cssParams.put( "font-style", fontStyle );
199 }
200
201 /**
202 * Returns the (evaluated) value of the font's CssParameter 'font-weight' as a
203 * <tt>ParameterValueType</tt>.
204 * <p>
205 *
206 * @param feature
207 * specifies the <tt>Feature</tt> to be used for evaluation of the underlying
208 * 'sld:ParameterValueType'
209 * @return the (evaluated) value of the parameter
210 * @throws FilterEvaluationException
211 * if the evaluation fails or the specified weight is not one of the following:
212 * 'normal' and 'bold'
213 */
214 public int getWeight( Feature feature )
215 throws FilterEvaluationException {
216 CssParameter cssParam = cssParams.get( "font-weight" );
217
218 if ( cssParam == null ) {
219 return WEIGHT_NORMAL;
220 }
221
222 String s = cssParam.getValue( feature ).trim();
223
224 if ( s.equals( "normal" ) ) {
225 return WEIGHT_NORMAL;
226 } else if ( s.equals( "bold" ) ) {
227 return WEIGHT_BOLD;
228 }
229
230 throw new FilterEvaluationException( "Given value ('" + s + "') for CssParameter 'font-weight' is "
231 + "invalid: allowed values are 'normal' and 'bold'." );
232 }
233
234 /**
235 * Sets the value of the font's CssParameter 'font-weight'.
236 * <p>
237 *
238 * @param weight
239 * font-weight to be set
240 */
241 public void setWeight( int weight ) {
242 CssParameter fontWeight = StyleFactory.createCssParameter( "font-weight", "" + weight );
243 cssParams.put( "font-weight", fontWeight );
244 }
245
246 /**
247 * Returns the (evaluated) value of the font's CssParameter 'font-size'.
248 * <p>
249 *
250 * @param feature
251 * specifies the <tt>Feature</tt> to be used for evaluation of the underlying
252 * 'sld:ParameterValueType'
253 * @return the (evaluated) value of the parameter
254 * @throws FilterEvaluationException
255 * if the evaluation fails or the value does not denote a valid number or the number
256 * is not greater or equal zero
257 */
258 public int getSize( Feature feature )
259 throws FilterEvaluationException {
260 CssParameter cssParam = cssParams.get( "font-size" );
261 int sizeInt = SIZE_DEFAULT;
262
263 if ( cssParam != null ) {
264 String s = cssParam.getValue( feature ).trim();
265
266 try {
267 sizeInt = (int) Double.parseDouble( s );
268 } catch ( NumberFormatException e ) {
269 throw new FilterEvaluationException( "Given value ('" + s + "') for CssParameter 'font-size' is "
270 + "not a valid number." );
271 }
272
273 if ( sizeInt <= 0 ) {
274 throw new FilterEvaluationException( "Value of CssParameter 'font-size' must be greater or "
275 + "equal zero." );
276 }
277 }
278
279 return sizeInt;
280 }
281
282 /**
283 * Returns the (evaluated) value of the font's CssParameter 'font-size'.
284 * <p>
285 *
286 * @param size
287 * font-size to be set
288 */
289 public void setSize( int size ) {
290 CssParameter fontSize = StyleFactory.createCssParameter( "font-size", "" + size );
291 cssParams.put( "font-size", fontSize );
292 }
293
294 /**
295 * Returns the (evaluated) value of the font's CssParameter 'font-color'.
296 * <p>
297 *
298 * @param feature
299 * specifies the <tt>Feature</tt> to be used for evaluation of the underlying
300 * 'sld:ParameterValueType'
301 * @return the (evaluated) value of the parameter
302 * @throws FilterEvaluationException
303 * if the evaluation fails
304 */
305 public Color getColor( Feature feature )
306 throws FilterEvaluationException {
307 CssParameter cssParam = cssParams.get( "font-color" );
308 Color awtColor = COLOR_DEFAULT;
309
310 if ( cssParam != null ) {
311 String s = cssParam.getValue( feature ).trim();
312
313 try {
314 awtColor = Color.decode( s );
315 } catch ( NumberFormatException e ) {
316 throw new FilterEvaluationException( "Given value ('" + s + "') for CSS-Parameter 'font-color' "
317 + "does not denote a valid color!" );
318 }
319 }
320
321 return awtColor;
322 }
323
324 /**
325 * Sets the value of the font's CssParameter 'font-color'.
326 * <p>
327 *
328 * @param color
329 * the font-color to be set
330 */
331 public void setColor( Color color ) {
332 String hex = ColorUtils.toHexCode( "#", color );
333 CssParameter fontColor = StyleFactory.createCssParameter( "font-color", hex );
334 cssParams.put( "font-color", fontColor );
335 }
336
337 /**
338 * exports the content of the Font as XML formated String
339 *
340 * @return xml representation of the Font
341 */
342 public String exportAsXML() {
343
344 StringBuffer sb = new StringBuffer( 1000 );
345 sb.append( "<Font>" );
346 Iterator<CssParameter> iterator = cssParams.values().iterator();
347 while ( iterator.hasNext() ) {
348 sb.append( ( (Marshallable) iterator.next() ).exportAsXML() );
349 }
350
351 sb.append( "</Font>" );
352
353 return sb.toString();
354 }
355
356 }