001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/graphics/DefaultScaleBar.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2006 by: 006 EXSE, Department of Geography, University of Bonn 007 http://www.giub.uni-bonn.de/deegree/ 008 lat/lon GmbH 009 http://www.lat-lon.de 010 011 This library is free software; you can redistribute it and/or 012 modify it under the terms of the GNU Lesser General Public 013 License as published by the Free Software Foundation; either 014 version 2.1 of the License, or (at your option) any later version. 015 016 This library is distributed in the hope that it will be useful, 017 but WITHOUT ANY WARRANTY; without even the implied warranty of 018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 019 Lesser General Public License for more details. 020 021 You should have received a copy of the GNU Lesser General Public 022 License along with this library; if not, write to the Free Software 023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 024 025 Contact: 026 027 Andreas Poth 028 lat/lon GmbH 029 Aennchenstr. 19 030 53115 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Prof. Dr. Klaus Greve 035 Department of Geography 036 University of Bonn 037 Meckenheimer Allee 166 038 53115 Bonn 039 Germany 040 E-Mail: greve@giub.uni-bonn.de 041 042 043 ---------------------------------------------------------------------------*/ 044 package org.deegree.graphics; 045 046 import java.awt.Color; 047 import java.awt.Font; 048 import java.awt.Graphics; 049 import java.awt.Rectangle; 050 import java.text.DecimalFormat; 051 import java.text.NumberFormat; 052 053 /** 054 * 055 * 056 * 057 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 058 * @author last edited by: $Author: bezema $ 059 * 060 * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $ 061 */ 062 public class DefaultScaleBar implements ScaleBar { 063 private Color barColor; 064 065 private Color labelColor; 066 067 private Color bgColor; 068 069 private Font barFont; 070 071 private String barStyle; 072 073 private String unit; 074 075 private double scale; 076 077 private int bottomLabel; 078 079 private double scaleDenominator; 080 081 private int topLabel; 082 083 private NumberFormat numberFormat; 084 085 /** 086 * Constructor with all Parameters 087 * 088 * @param topLabel 089 * type of the label on top of the scale bar. Chose L_NONE or no label, L_SCALE for 090 * scale on top and L_SCALEDENOMIATOR for scaledenominator on top. 091 * @param bottomLabel 092 * the same as above but below the scalebar. 093 * @param scale 094 * the scale to be displayed. For a value of e.g. 1000 there will be 1:1000 displayed 095 * @param scaleDenominator 096 * the scaledenominator to be displayed 097 * @param units 098 * the units the scaledenominator is in. Possible values are inch, Meter, Mile, 099 * Kilometer... 100 * @param labelColor 101 * the Color the label has to be in (and of course the text below and above) 102 * @param barColor 103 * @param allgColor 104 * not used so far 105 * @param barStyle 106 * the style the bar appears in. Currently just "default" is supported. 107 * @param barFont 108 * the font the text above and below the scale bar appears in. 109 * @param numberFormat 110 * 111 */ 112 public DefaultScaleBar( int topLabel, int bottomLabel, double scale, double scaleDenominator, 113 String units, Color labelColor, Color barColor, Color allgColor, 114 String barStyle, Font barFont, NumberFormat numberFormat ) { 115 setTopLabel( topLabel ); 116 setBottomLabel( bottomLabel ); 117 setScale( scale ); 118 setScaleDenominator( scaleDenominator ); 119 setColor( allgColor ); 120 setBarColor( barColor ); 121 setLabelColor( labelColor ); 122 setStyle( barStyle ); 123 setFont( barFont ); 124 setUnits( units ); 125 setNumberFormat( numberFormat ); 126 } 127 128 /** 129 * 130 * Constructor just using defaults 131 * 132 */ 133 public DefaultScaleBar() { 134 this( L_SCALEDENOMINATOR, L_SCALE, 40000, 100, "Meter", Color.GREEN, Color.BLUE, 135 Color.BLACK, "default", new Font( "default", Font.PLAIN, 12 ), 136 new DecimalFormat( "###,###,###" ) ); 137 } 138 139 /** 140 * will paint the scale bar to the passed graphic context 141 * 142 * @param g 143 * graphic context 144 */ 145 public void paint( Graphics g ) { // throws Exception { 146 147 Rectangle rect = g.getClipBounds(); 148 if ( rect != null && rect.getWidth() > 0 && rect.getHeight() > 0 ) { 149 g.setColor( bgColor ); 150 g.fillRect( 0, 0, (int) rect.getWidth(), (int) rect.getHeight() ); 151 } 152 153 // if ( toplabel + bottomlabel < 1 ) throw Exception 154 g.setColor( barColor ); 155 156 int width = g.getClipBounds().width; 157 int height = g.getClipBounds().height; 158 g.setFont( barFont ); 159 160 int laenge; 161 162 if ( barStyle.equals( "default" ) ) { 163 g.drawLine( 0, ( height / 2 ) + 1, width - 1, ( height / 2 ) + 1 ); 164 g.drawLine( 0, height / 2, width - 1, height / 2 ); 165 g.drawLine( 0, ( height / 2 ) - 1, width - 1, ( height / 2 ) - 1 ); 166 g.drawLine( 0, ( height / 2 ) + 10, 0, ( height / 2 ) - 10 ); 167 g.drawLine( width - 1, ( height / 2 ) + 10, width - 1, ( height / 2 ) - 10 ); 168 } 169 170 String strScale = numberFormat.format( scale ); 171 String strScaleDen = numberFormat.format( scaleDenominator ); 172 173 g.setColor( labelColor ); 174 switch ( topLabel ) { 175 case -1: 176 break; 177 case 0: 178 laenge = g.getFontMetrics().stringWidth( strScale + " " + unit ); 179 g.drawString( strScale + " " + unit, ( width - laenge ) / 2, ( height / 2 ) - 6 ); 180 break; 181 case 1: 182 laenge = g.getFontMetrics().stringWidth( "1 : " + strScaleDen ); 183 g.drawString( "1 : " + strScaleDen, ( width - laenge ) / 2, ( height / 2 ) - 6 ); 184 break; 185 } 186 187 switch ( bottomLabel ) { 188 case -1: 189 break; 190 case 0: 191 laenge = g.getFontMetrics().stringWidth( strScale + " " + unit ); 192 g.drawString( strScale + " " + unit, ( width - laenge ) / 2, ( height / 2 ) + 1 193 + barFont.getSize() ); 194 break; 195 case 1: 196 laenge = g.getFontMetrics().stringWidth( "1 : " + strScaleDen ); 197 g.drawString( "1 : " + strScaleDen, ( width - laenge ) / 2, ( height / 2 ) + 1 198 + barFont.getSize() ); 199 break; 200 } 201 } 202 203 /** 204 * sets the type of the label above the scale bar 205 * 206 * @param labelType 207 * lable type 208 * 209 */ 210 public void setTopLabel( int labelType ) { 211 switch ( labelType ) { 212 case -1: 213 topLabel = -1; 214 break; 215 case 0: 216 topLabel = 0; 217 break; 218 case 1: 219 topLabel = 1; 220 break; 221 } 222 } 223 224 /** 225 * sets the type of the label below the scale bar 226 * 227 * @param labelType 228 * lable type 229 * 230 */ 231 public void setBottomLabel( int labelType ) { 232 switch ( labelType ) { 233 case -1: 234 bottomLabel = -1; 235 break; 236 case 0: 237 bottomLabel = 0; 238 break; 239 case 1: 240 bottomLabel = 1; 241 break; 242 } 243 } 244 245 /** 246 * sets the scale as defined in the OGC WMS 1.1.1 specification. Scale is defined as the 247 * diagonal size of a pixel in the center of a map measured in meter. The setting of the scale 248 * will affect the value of the scale denominator 249 * 250 * @param scale 251 * map scale 252 * 253 */ 254 public void setScale( double scale ) { 255 this.scale = scale; 256 } 257 258 /** 259 * sets the scale denominator for the scale bar. The scale denominator is the scale expression 260 * as we know it for printed maps (e.g. 1:10000 1:5000). The passed value is expressed in 261 * meters. The setting of the scale denominator will affect the value of the scale 262 * 263 * @param scaleDen 264 * scale denominator value 265 * 266 */ 267 public void setScaleDenominator( double scaleDen ) { 268 scaleDenominator = scaleDen; 269 } 270 271 /** 272 * sets the units the scale and the scale denominater will be expressed at. Settings other than 273 * meter will cause that the passed values for scale and scale denominater will be recalculated 274 * for painting. it depends on the implementation what units are supported. 275 * 276 * @param units 277 * name units (meter, miles, feet etc.) 278 */ 279 public void setUnits( String units ) { 280 unit = units; 281 } 282 283 /** 284 * sets the front color of the scale bar 285 * 286 * @param color 287 */ 288 public void setColor( Color color ) { 289 bgColor = color; 290 } 291 292 /** 293 * sets the label color of the scale bar 294 * 295 * @param color 296 * 297 */ 298 public void setLabelColor( Color color ) { 299 labelColor = color; 300 } 301 302 /** 303 * sets the bar color of the scale bar 304 * 305 * @param color 306 * 307 */ 308 public void setBarColor( Color color ) { 309 barColor = color; 310 } 311 312 /** 313 * sets the style of the scale bar. default style is |--------| the list of known styles depends 314 * on the implementation 315 * 316 * @param style 317 * style name 318 */ 319 public void setStyle( String style ) { 320 barStyle = style; 321 } 322 323 /** 324 * sets the font for label rendering 325 * 326 * @param font 327 * awt font object 328 */ 329 public void setFont( Font font ) { 330 barFont = font; 331 } 332 333 /* 334 * (non-Javadoc) 335 * 336 * @see org.deegree.graphics.ScaleBar#setBackgroundColor(java.awt.Color) 337 */ 338 public void setBackgroundColor( Color color ) { 339 this.bgColor = color; 340 341 } 342 343 /** 344 * sets the number format for a scale bar 345 * 346 * @param numberFormat 347 */ 348 public void setNumberFormat( NumberFormat numberFormat ) { 349 this.numberFormat = numberFormat; 350 } 351 } 352 /*************************************************************************************************** 353 * <code> 354 Changes to this class. What the people have been up to: 355 356 $Log$ 357 Revision 1.9 2007/03/06 11:19:04 wanhoff 358 Fixed Javadoc (@param) 359 360 Revision 1.8 2006/08/11 09:59:56 poth 361 number formating added / code formated 362 363 Revision 1.7 2006/08/06 21:03:18 poth 364 bug fix - recognition for background color added 365 366 Revision 1.6 2006/07/12 14:46:18 poth 367 comment footer added 368 369 </code> 370 **************************************************************************************************/