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 }