    001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/graphics/sld/TextSymbolizer.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.filterencoding.Expression;
    040
    041    /**
    042     * Used to render a text label, according to the parameters. A missing Geometry, Label, Font, or
    043     * LabelPlacement element selects the default value or behavior for the element. The default Label,
    044     * Font, and LabelPlacement are system- dependent. Multiple Font elements may be used to specify
    045     * alternate fonts in order of preference in case a map server does not support the first
    046     * preference. A missing Halo or Fill element means that no halo or fill will be plotted,
    047     * respectively. The Fill is rendered over top of the Halo, and the Halo includes the interiors of
    048     * the font glyphs.
    049     * <p>
    050     *
    051     * @author <a href="mailto:k.lupp@web.de">Katharina Lupp</a>
    052     * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider</a>
    053     * @version $Revision: 18405 $ $Date: 2009-07-09 10:31:42 +0200 (Do, 09. Jul 2009) $
    054     */
    055
    056    public class TextSymbolizer extends AbstractSymbolizer implements Marshallable {
    057
    058        private Fill fill = null;
    059
    060        private Font font = null;
    061
    062        private Halo halo = null;
    063
    064        private LabelPlacement labelPlacement = null;
    065
    066        private ParameterValueType label = null;
    067
    068        private ParameterValueType[] bbox;
    069
    070        /**
    071         * constructor initializing the class with the <code>TextSymbolizer</code>
    072         * @param geometry
    073         * @param label
    074         * @param font
    075         * @param labelPlacement
    076         * @param halo
    077         * @param fill
    078         * @param min
    079         * @param max
    080         */
    081        TextSymbolizer( Geometry geometry, ParameterValueType label, Font font, LabelPlacement labelPlacement, Halo halo,
    082                        Fill fill, double min, double max ) {
    083            super( geometry, "org.deegree.graphics.displayelements.LabelDisplayElement" );
    084            setLabel( label );
    085            setFont( font );
    086            setLabelPlacement( labelPlacement );
    087            setHalo( halo );
    088            setFill( fill );
    089            setMinScaleDenominator( min );
    090            setMaxScaleDenominator( max );
    091        }
    092
    093        /**
    094         * constructor initializing the class with the <code>TextSymbolizer</code>
    095         * @param geometry
    096         * @param responsibleClass
    097         * @param label
    098         * @param font
    099         * @param labelPlacement
    100         * @param halo
    101         * @param fill
    102         * @param min
    103         * @param max
    104         */
    105        TextSymbolizer( Geometry geometry, String responsibleClass, ParameterValueType label, Font font,
    106                        LabelPlacement labelPlacement, Halo halo, Fill fill, double min, double max ) {
    107            super( geometry, responsibleClass );
    108            setLabel( label );
    109            setFont( font );
    110            setLabelPlacement( labelPlacement );
    111            setHalo( halo );
    112            setFill( fill );
    113            setMinScaleDenominator( min );
    114            setMaxScaleDenominator( max );
    115        }
    116
    117        /**
    118         * Initializing with bounding box.
    119         *
    120         * @param geometry
    121         * @param text
    122         * @param font
    123         * @param halo
    124         * @param minx
    125         * @param miny
    126         * @param maxx
    127         * @param maxy
    128         */
    129        public TextSymbolizer( Geometry geometry, ParameterValueType text, Font font, Halo halo, ParameterValueType minx,
    130                               ParameterValueType miny, ParameterValueType maxx, ParameterValueType maxy ) {
    131            super( geometry, "org.deegree.graphics.displayelements.LabelDisplayElement" );
    132            setLabel( text );
    133            setFont( font );
    134            setHalo( halo );
    135            bbox = new ParameterValueType[] { minx, miny, maxx, maxy };
    136            setLabelPlacement( new LabelPlacement( (LinePlacement) null ) );
    137        }
    138
    139        /**
    140         * @return the bounding box, or null, if not set (minx, miny, maxx, maxy)
    141         */
    142        public ParameterValueType[] getBoundingBox() {
    143            return bbox;
    144        }
    145
    146        /**
    147         * returns the Label as a <tt>ParameterValueType</tt> to be renderd
    148         *
    149         * @return the label
    150         *
    151         */
    152        public ParameterValueType getLabel() {
    153            return label;
    154        }
    155
    156        /**
    157         * returns the label as a String to be renderd
    158         *
    159         * @return the label or null, if the label is not set or not an expression
    160         *
    161         */
    162        public String getLabelAsString() {
    163            Object[] o = label.getComponents();
    164            for ( int i = 0; i < o.length; i++ ) {
    165                if ( o[i] instanceof Expression ) {
    166                    return o[i].toString().trim();
    167                }
    168            }
    169            return null;
    170        }
    171
    172        /**
    173         * sets the <Label>
    174         *
    175         * @param label
    176         *            the label
    177         *
    178         */
    179        public void setLabel( ParameterValueType label ) {
    180            this.label = label;
    181        }
    182
    183        /**
    184         * Identifies a Font of a certain family, style, and size.
    185         *
    186         * @return the font
    187         *
    188         */
    189        public Font getFont() {
    190            return font;
    191        }
    192
    193        /**
    194         * Sets a Font of a certain family, style, and size.
    195         *
    196         * @param font
    197         *            the font
    198         *
    199         */
    200        public void setFont( Font font ) {
    201            this.font = font;
    202        }
    203
    204        /**
    205         * Used to position a label relative to a point or a line string. For a point, you can specify
    206         * the anchor point of the label and a linear displacement from the point (so that you can also
    207         * plot a graphic symbol at the point). For a line-string placement, you can specify a
    208         * perpendicular offset (so you can draw a stroke on the line).
    209         * <p>
    210         * </p>
    211         * MORE PARAMETERS ARE PROBABLY NEEDED HERE.
    212         *
    213         * @return the labelPlacement
    214         *
    215         */
    216        public LabelPlacement getLabelPlacement() {
    217            return labelPlacement;
    218        }
    219
    220        /**
    221         * sets the <LabelPlacement>
    222         *
    223         * @param labelPlacement
    224         *            the labelPlacement
    225         *
    226         */
    227        public void setLabelPlacement( LabelPlacement labelPlacement ) {
    228            this.labelPlacement = labelPlacement;
    229        }
    230
    231        /**
    232         * A Halo is an extension (sub-type) of a Fill and is applied to the backgrounds of font glyphs.
    233         * Either a Radius or a Block halo type can be used. The radius is computed from the outside
    234         * edge of the font glyph (or inside of "holes"). The default is a Radius of 1.0 (pixels) but if
    235         * no Halo is selected in a containing structure, no halo will be rendered. The default is a
    236         * solid white (Color "#FFFFFF") opaque halo.
    237         *
    238         * @return the halo
    239         *
    240         */
    241        public Halo getHalo() {
    242            return halo;
    243        }
    244
    245        /**
    246         * sets <Halo>
    247         *
    248         * @param halo
    249         *            the halo
    250         *
    251         */
    252        public void setHalo( Halo halo ) {
    253            this.halo = halo;
    254        }
    255
    256        /**
    257         * A Fill allows area geometries to be filled. There are two types of fills: solid-color and
    258         * repeated GraphicFill. In general, if a Fill element is omitted in its containing element, no
    259         * fill will be rendered. The default is a solid 50%-gray (color "#808080") opaque fill.
    260         *
    261         * @return the fill
    262         *
    263         */
    264        public Fill getFill() {
    265            return fill;
    266        }
    267
    268        /**
    269         * sets the <Fill>
    270         *
    271         * @param fill
    272         *            the fill
    273         *
    274         */
    275        public void setFill( Fill fill ) {
    276            this.fill = fill;
    277        }
    278
    279        /**
    280         * exports the content of the TextSymbolizer as XML formated String
    281         *
    282         * @return xml representation of the TextSymbolizer
    283         */
    284        public String exportAsXML() {
    285
    286            StringBuffer sb = new StringBuffer( 1000 );
    287            sb.append( "<TextSymbolizer>" );
    288            if ( geometry != null ) {
    289                sb.append( ( (Marshallable) geometry ).exportAsXML() );
    290            }
    291            if ( label != null ) {
    292                sb.append( "<Label>" );
    293                sb.append( ( (Marshallable) label ).exportAsXML() );
    294                sb.append( "</Label>" );
    295            }
    296            if ( font != null ) {
    297                sb.append( ( (Marshallable) font ).exportAsXML() );
    298            }
    299            if ( labelPlacement != null ) {
    300                sb.append( ( (Marshallable) labelPlacement ).exportAsXML() );
    301            }
    302            if ( halo != null ) {
    303                sb.append( ( (Marshallable) halo ).exportAsXML() );
    304            }
    305            if ( fill != null ) {
    306                sb.append( ( (Marshallable) fill ).exportAsXML() );
    307            }
    308            sb.append( "</TextSymbolizer>" );
    309
    310            return sb.toString();
    311        }
    312    }