001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/graphics/DefaultScaleBar.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;
037    
038    import java.awt.Color;
039    import java.awt.Font;
040    import java.awt.Graphics;
041    import java.awt.Rectangle;
042    import java.text.DecimalFormat;
043    import java.text.NumberFormat;
044    
045    /**
046     *
047     *
048     *
049     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
050     * @author last edited by: $Author: mschneider $
051     *
052     * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
053     */
054    public class DefaultScaleBar implements ScaleBar {
055        private Color barColor;
056    
057        private Color labelColor;
058    
059        private Color bgColor;
060    
061        private Font barFont;
062    
063        private String barStyle;
064    
065        private String unit;
066    
067        private double scale;
068    
069        private int bottomLabel;
070    
071        private double scaleDenominator;
072    
073        private int topLabel;
074    
075        private NumberFormat numberFormat;
076    
077        /**
078         * Constructor with all Parameters
079         *
080         * @param topLabel
081         *            type of the label on top of the scale bar. Chose L_NONE or no label, L_SCALE for
082         *            scale on top and L_SCALEDENOMIATOR for scaledenominator on top.
083         * @param bottomLabel
084         *            the same as above but below the scalebar.
085         * @param scale
086         *            the scale to be displayed. For a value of e.g. 1000 there will be 1:1000 displayed
087         * @param scaleDenominator
088         *            the scaledenominator to be displayed
089         * @param units
090         *            the units the scaledenominator is in. Possible values are inch, Meter, Mile,
091         *            Kilometer...
092         * @param labelColor
093         *            the Color the label has to be in (and of course the text below and above)
094         * @param barColor
095         * @param allgColor
096         *            not used so far
097         * @param barStyle
098         *            the style the bar appears in. Currently just "default" is supported.
099         * @param barFont
100         *            the font the text above and below the scale bar appears in.
101         * @param numberFormat
102         *
103         */
104        public DefaultScaleBar( int topLabel, int bottomLabel, double scale, double scaleDenominator, String units,
105                                Color labelColor, Color barColor, Color allgColor, String barStyle, Font barFont,
106                                NumberFormat numberFormat ) {
107            setTopLabel( topLabel );
108            setBottomLabel( bottomLabel );
109            setScale( scale );
110            setScaleDenominator( scaleDenominator );
111            setColor( allgColor );
112            setBarColor( barColor );
113            setLabelColor( labelColor );
114            setStyle( barStyle );
115            setFont( barFont );
116            setUnits( units );
117            setNumberFormat( numberFormat );
118        }
119    
120        /**
121         *
122         * Constructor just using defaults
123         *
124         */
125        public DefaultScaleBar() {
126            this( L_SCALEDENOMINATOR, L_SCALE, 40000, 100, "Meter", Color.GREEN, Color.BLUE, Color.BLACK, "default",
127                  new Font( "default", Font.PLAIN, 12 ), new DecimalFormat( "###,###,###" ) );
128        }
129    
130        /**
131         * will paint the scale bar to the passed graphic context
132         *
133         * @param g
134         *            graphic context
135         */
136        public void paint( Graphics g ) { // throws Exception {
137    
138            Rectangle rect = g.getClipBounds();
139            if ( rect != null && rect.getWidth() > 0 && rect.getHeight() > 0 ) {
140                g.setColor( bgColor );
141                g.fillRect( 0, 0, (int) rect.getWidth(), (int) rect.getHeight() );
142            }
143    
144            // if ( toplabel + bottomlabel < 1 ) throw Exception
145            g.setColor( barColor );
146    
147            int width = g.getClipBounds().width;
148            int height = g.getClipBounds().height;
149            g.setFont( barFont );
150    
151            int laenge;
152    
153            if ( barStyle.equals( "default" ) ) {
154                g.drawLine( 0, ( height / 2 ) + 1, width - 1, ( height / 2 ) + 1 );
155                g.drawLine( 0, height / 2, width - 1, height / 2 );
156                g.drawLine( 0, ( height / 2 ) - 1, width - 1, ( height / 2 ) - 1 );
157                g.drawLine( 0, ( height / 2 ) + 10, 0, ( height / 2 ) - 10 );
158                g.drawLine( width - 1, ( height / 2 ) + 10, width - 1, ( height / 2 ) - 10 );
159            }
160    
161            String strScale = numberFormat.format( scale );
162            String strScaleDen = numberFormat.format( scaleDenominator );
163    
164            g.setColor( labelColor );
165            switch ( topLabel ) {
166            case -1:
167                break;
168            case 0:
169                laenge = g.getFontMetrics().stringWidth( strScale + " " + unit );
170                g.drawString( strScale + " " + unit, ( width - laenge ) / 2, ( height / 2 ) - 6 );
171                break;
172            case 1:
173                laenge = g.getFontMetrics().stringWidth( "1 : " + strScaleDen );
174                g.drawString( "1 : " + strScaleDen, ( width - laenge ) / 2, ( height / 2 ) - 6 );
175                break;
176            }
177    
178            switch ( bottomLabel ) {
179            case -1:
180                break;
181            case 0:
182                laenge = g.getFontMetrics().stringWidth( strScale + " " + unit );
183                g.drawString( strScale + " " + unit, ( width - laenge ) / 2, ( height / 2 ) + 1 + barFont.getSize() );
184                break;
185            case 1:
186                laenge = g.getFontMetrics().stringWidth( "1 : " + strScaleDen );
187                g.drawString( "1 : " + strScaleDen, ( width - laenge ) / 2, ( height / 2 ) + 1 + barFont.getSize() );
188                break;
189            }
190        }
191    
192        /**
193         * sets the type of the label above the scale bar
194         *
195         * @param labelType
196         *            lable type
197         *
198         */
199        public void setTopLabel( int labelType ) {
200            switch ( labelType ) {
201            case -1:
202                topLabel = -1;
203                break;
204            case 0:
205                topLabel = 0;
206                break;
207            case 1:
208                topLabel = 1;
209                break;
210            }
211        }
212    
213        /**
214         * sets the type of the label below the scale bar
215         *
216         * @param labelType
217         *            lable type
218         *
219         */
220        public void setBottomLabel( int labelType ) {
221            switch ( labelType ) {
222            case -1:
223                bottomLabel = -1;
224                break;
225            case 0:
226                bottomLabel = 0;
227                break;
228            case 1:
229                bottomLabel = 1;
230                break;
231            }
232        }
233    
234        /**
235         * sets the scale as defined in the OGC WMS 1.1.1 specification. Scale is defined as the
236         * diagonal size of a pixel in the center of a map measured in meter. The setting of the scale
237         * will affect the value of the scale denominator
238         *
239         * @param scale
240         *            map scale
241         *
242         */
243        public void setScale( double scale ) {
244            this.scale = scale;
245        }
246    
247        /**
248         * sets the scale denominator for the scale bar. The scale denominator is the scale expression
249         * as we know it for printed maps (e.g. 1:10000 1:5000). The passed value is expressed in
250         * meters. The setting of the scale denominator will affect the value of the scale
251         *
252         * @param scaleDen
253         *            scale denominator value
254         *
255         */
256        public void setScaleDenominator( double scaleDen ) {
257            scaleDenominator = scaleDen;
258        }
259    
260        /**
261         * sets the units the scale and the scale denominater will be expressed at. Settings other than
262         * meter will cause that the passed values for scale and scale denominater will be recalculated
263         * for painting. it depends on the implementation what units are supported.
264         *
265         * @param units
266         *            name units (meter, miles, feet etc.)
267         */
268        public void setUnits( String units ) {
269            unit = units;
270        }
271    
272        /**
273         * sets the front color of the scale bar
274         *
275         * @param color
276         */
277        public void setColor( Color color ) {
278            bgColor = color;
279        }
280    
281        /**
282         * sets the label color of the scale bar
283         *
284         * @param color
285         *
286         */
287        public void setLabelColor( Color color ) {
288            labelColor = color;
289        }
290    
291        /**
292         * sets the bar color of the scale bar
293         *
294         * @param color
295         *
296         */
297        public void setBarColor( Color color ) {
298            barColor = color;
299        }
300    
301        /**
302         * sets the style of the scale bar. default style is |--------| the list of known styles depends
303         * on the implementation
304         *
305         * @param style
306         *            style name
307         */
308        public void setStyle( String style ) {
309            barStyle = style;
310        }
311    
312        /**
313         * sets the font for label rendering
314         *
315         * @param font
316         *            awt font object
317         */
318        public void setFont( Font font ) {
319            barFont = font;
320        }
321    
322        /*
323         * (non-Javadoc)
324         *
325         * @see org.deegree.graphics.ScaleBar#setBackgroundColor(java.awt.Color)
326         */
327        public void setBackgroundColor( Color color ) {
328            this.bgColor = color;
329    
330        }
331    
332        /**
333         * sets the number format for a scale bar
334         *
335         * @param numberFormat
336         */
337        public void setNumberFormat( NumberFormat numberFormat ) {
338            this.numberFormat = numberFormat;
339        }
340    }