    001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/graphics/sld/Halo.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 org.deegree.framework.xml.Marshallable;
    039    import org.deegree.model.feature.Feature;
    040    import org.deegree.model.filterencoding.FilterEvaluationException;
    041
    042    /**
    043     * Incarnation of a sld:Halo-element. A Halo is a type of Fill that is applied to the backgrounds of
    044     * font glyphs. The use of halos greatly improves the readability of text labels.
    045     * <p>
    046     *
    047     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
    048     * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
    049     * @version $Revision: 18195 $ $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
    050     */
    051
    052    public class Halo implements Marshallable {
    053
    054        private Fill fill = null;
    055
    056        private ParameterValueType radius = null;
    057
    058        private Stroke stroke = null;
    059
    060        /**
    061         * Create a new <tt>Halo</tt> -instance.
    062         * <p>
    063         *
    064         * @param radius
    065         *            radius to be used for the halo, use null for a rectangle styled halo
    066         * @param fill
    067         *            defines the fill style, use null for default style
    068         * @param stroke
    069         *            defines the stroke style, use null for default style
    070         */
    071        Halo( ParameterValueType radius, Fill fill, Stroke stroke ) {
    072            setRadius( radius );
    073            setFill( fill );
    074            setStroke( stroke );
    075        }
    076
    077        /**
    078         * A Fill allows area geometries to be filled. There are two types of fills: solid-color and
    079         * repeated GraphicFill. In general, if a Fill element is omitted in its containing element, no
    080         * fill will be rendered. The default is a solid 50%-gray (color "#808080") opaque fill.
    081         * <p>
    082         *
    083         * @return the underlying <tt>Fill</tt> -object or null
    084         *
    085         */
    086        public Fill getFill() {
    087            return fill;
    088        }
    089
    090        /**
    091         * Sets the underlying <tt>Fill</tt> -instance.
    092         * <p>
    093         *
    094         * @param fill
    095         *            defines the fill color and pattern
    096         *
    097         */
    098        public void setFill( Fill fill ) {
    099            this.fill = fill;
    100        }
    101
    102        /**
    103         * The Radius element gives the absolute size of a halo radius in pixels encoded as a
    104         * floating-point number. The radius is taken from the outside edge of a font glyph to extend
    105         * the area of coverage of the glyph (and the inside edge of holes in the glyphs). The halo of a
    106         * text label is considered to be a single shape. The default radius is one pixel. Negative
    107         * values are not allowed.
    108         * <p>
    109         *
    110         * @return the radius definition as <tt>ParameterValueType</tt>, or null if it has not been
    111         *         specified
    112         *
    113         */
    114        public ParameterValueType getRadius() {
    115            return radius;
    116        }
    117
    118        /**
    119         * Sets the value for the radius of the halo.
    120         * <p>
    121         *
    122         * @param radius
    123         *            radius to be used for the halo, use null for a rectangle styled halo
    124         *
    125         */
    126        public void setRadius( ParameterValueType radius ) {
    127            this.radius = radius;
    128        }
    129
    130        /**
    131         * The Radius element gives the absolute size of a halo radius in pixels encoded as a
    132         * floating-point number. The radius is taken from the outside edge of a font glyph to extend
    133         * the area of coverage of the glyph (and the inside edge of holes in the glyphs). The halo of a
    134         * text label is considered to be a single shape. The default radius is one pixel. Negative
    135         * values are not allowed.
    136         * <p>
    137         *
    138         * @param feature
    139         *            specifies the <tt>Feature</tt> to be used for evaluation of the underlying
    140         *            'sld:ParameterValueType'
    141         * @return the radius value, or -1 if it has not been specified
    142         * @throws FilterEvaluationException
    143         *             if the evaluation fails
    144         */
    145        public double getRadius( Feature feature )
    146                                throws FilterEvaluationException {
    147            if ( radius == null ) {
    148                return -1.0;
    149            }
    150
    151            String stringValue = null;
    152            double radiusVal;
    153
    154            try {
    155                stringValue = radius.evaluate( feature );
    156                radiusVal = Double.parseDouble( stringValue );
    157            } catch ( NumberFormatException e ) {
    158                throw new FilterEvaluationException( "Given value ('" + stringValue
    159                                                     + "') for radius of Halo does not denote a number." );
    160            }
    161
    162            return radiusVal;
    163        }
    164
    165        /**
    166         * @see org.deegree.graphics.sld.Halo#getRadius(Feature)
    167         *      <p>
    168         * @param radius
    169         *            radius to be set for the halo
    170         */
    171        public void setRadius( double radius ) {
    172            ParameterValueType pvt = null;
    173            if ( radius > 0 ) {
    174                pvt = StyleFactory.createParameterValueType( "" + radius );
    175                this.radius = pvt;
    176            }
    177        }
    178
    179        /**
    180         * Returns the underlying <tt>Stroke</tt> -instance.
    181         * <p>
    182         *
    183         * @return the underlying <tt>Stroke</tt> -object or null
    184         *
    185         */
    186        public Stroke getStroke() {
    187            return stroke;
    188        }
    189
    190        /**
    191         * Sets the underlying <tt>Stroke</tt> -instance.
    192         * <p>
    193         *
    194         * @param stroke
    195         *            defines the stroke color and pattern
    196         */
    197        public void setStroke( Stroke stroke ) {
    198            this.stroke = stroke;
    199        }
    200
    201        /**
    202         * exports the content of the Halo as XML formated String
    203         *
    204         * @return xml representation of the Halo
    205         */
    206        public String exportAsXML() {
    207
    208            StringBuffer sb = new StringBuffer( 1000 );
    209            sb.append( "<Halo>" );
    210            if ( radius != null ) {
    211                sb.append( "<Radius>" );
    212                sb.append( ( (Marshallable) radius ).exportAsXML() );
    213                sb.append( "</Radius>" );
    214            }
    215            if ( fill != null ) {
    216                sb.append( ( (Marshallable) fill ).exportAsXML() );
    217            }
    218            if ( stroke != null ) {
    219                sb.append( ( (Marshallable) stroke ).exportAsXML() );
    220            }
    221            sb.append( "</Halo>" );
    222
    223            return sb.toString();
    224        }
    225
    226    }