001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/graphics/DefaultScaleBar.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2008 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: apoth $ 059 * 060 * @version $Revision: 9340 $, $Date: 2007-12-27 13:32:12 +0100 (Do, 27 Dez 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, String units, 113 Color labelColor, Color barColor, Color allgColor, String barStyle, Font barFont, 114 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, Color.BLACK, "default", 135 new Font( "default", Font.PLAIN, 12 ), new DecimalFormat( "###,###,###" ) ); 136 } 137 138 /** 139 * will paint the scale bar to the passed graphic context 140 * 141 * @param g 142 * graphic context 143 */ 144 public void paint( Graphics g ) { // throws Exception { 145 146 Rectangle rect = g.getClipBounds(); 147 if ( rect != null && rect.getWidth() > 0 && rect.getHeight() > 0 ) { 148 g.setColor( bgColor ); 149 g.fillRect( 0, 0, (int) rect.getWidth(), (int) rect.getHeight() ); 150 } 151 152 // if ( toplabel + bottomlabel < 1 ) throw Exception 153 g.setColor( barColor ); 154 155 int width = g.getClipBounds().width; 156 int height = g.getClipBounds().height; 157 g.setFont( barFont ); 158 159 int laenge; 160 161 if ( barStyle.equals( "default" ) ) { 162 g.drawLine( 0, ( height / 2 ) + 1, width - 1, ( height / 2 ) + 1 ); 163 g.drawLine( 0, height / 2, width - 1, height / 2 ); 164 g.drawLine( 0, ( height / 2 ) - 1, width - 1, ( height / 2 ) - 1 ); 165 g.drawLine( 0, ( height / 2 ) + 10, 0, ( height / 2 ) - 10 ); 166 g.drawLine( width - 1, ( height / 2 ) + 10, width - 1, ( height / 2 ) - 10 ); 167 } 168 169 String strScale = numberFormat.format( scale ); 170 String strScaleDen = numberFormat.format( scaleDenominator ); 171 172 g.setColor( labelColor ); 173 switch ( topLabel ) { 174 case -1: 175 break; 176 case 0: 177 laenge = g.getFontMetrics().stringWidth( strScale + " " + unit ); 178 g.drawString( strScale + " " + unit, ( width - laenge ) / 2, ( height / 2 ) - 6 ); 179 break; 180 case 1: 181 laenge = g.getFontMetrics().stringWidth( "1 : " + strScaleDen ); 182 g.drawString( "1 : " + strScaleDen, ( width - laenge ) / 2, ( height / 2 ) - 6 ); 183 break; 184 } 185 186 switch ( bottomLabel ) { 187 case -1: 188 break; 189 case 0: 190 laenge = g.getFontMetrics().stringWidth( strScale + " " + unit ); 191 g.drawString( strScale + " " + unit, ( width - laenge ) / 2, ( height / 2 ) + 1 + barFont.getSize() ); 192 break; 193 case 1: 194 laenge = g.getFontMetrics().stringWidth( "1 : " + strScaleDen ); 195 g.drawString( "1 : " + strScaleDen, ( width - laenge ) / 2, ( height / 2 ) + 1 + barFont.getSize() ); 196 break; 197 } 198 } 199 200 /** 201 * sets the type of the label above the scale bar 202 * 203 * @param labelType 204 * lable type 205 * 206 */ 207 public void setTopLabel( int labelType ) { 208 switch ( labelType ) { 209 case -1: 210 topLabel = -1; 211 break; 212 case 0: 213 topLabel = 0; 214 break; 215 case 1: 216 topLabel = 1; 217 break; 218 } 219 } 220 221 /** 222 * sets the type of the label below the scale bar 223 * 224 * @param labelType 225 * lable type 226 * 227 */ 228 public void setBottomLabel( int labelType ) { 229 switch ( labelType ) { 230 case -1: 231 bottomLabel = -1; 232 break; 233 case 0: 234 bottomLabel = 0; 235 break; 236 case 1: 237 bottomLabel = 1; 238 break; 239 } 240 } 241 242 /** 243 * sets the scale as defined in the OGC WMS 1.1.1 specification. Scale is defined as the 244 * diagonal size of a pixel in the center of a map measured in meter. The setting of the scale 245 * will affect the value of the scale denominator 246 * 247 * @param scale 248 * map scale 249 * 250 */ 251 public void setScale( double scale ) { 252 this.scale = scale; 253 } 254 255 /** 256 * sets the scale denominator for the scale bar. The scale denominator is the scale expression 257 * as we know it for printed maps (e.g. 1:10000 1:5000). The passed value is expressed in 258 * meters. The setting of the scale denominator will affect the value of the scale 259 * 260 * @param scaleDen 261 * scale denominator value 262 * 263 */ 264 public void setScaleDenominator( double scaleDen ) { 265 scaleDenominator = scaleDen; 266 } 267 268 /** 269 * sets the units the scale and the scale denominater will be expressed at. Settings other than 270 * meter will cause that the passed values for scale and scale denominater will be recalculated 271 * for painting. it depends on the implementation what units are supported. 272 * 273 * @param units 274 * name units (meter, miles, feet etc.) 275 */ 276 public void setUnits( String units ) { 277 unit = units; 278 } 279 280 /** 281 * sets the front color of the scale bar 282 * 283 * @param color 284 */ 285 public void setColor( Color color ) { 286 bgColor = color; 287 } 288 289 /** 290 * sets the label color of the scale bar 291 * 292 * @param color 293 * 294 */ 295 public void setLabelColor( Color color ) { 296 labelColor = color; 297 } 298 299 /** 300 * sets the bar color of the scale bar 301 * 302 * @param color 303 * 304 */ 305 public void setBarColor( Color color ) { 306 barColor = color; 307 } 308 309 /** 310 * sets the style of the scale bar. default style is |--------| the list of known styles depends 311 * on the implementation 312 * 313 * @param style 314 * style name 315 */ 316 public void setStyle( String style ) { 317 barStyle = style; 318 } 319 320 /** 321 * sets the font for label rendering 322 * 323 * @param font 324 * awt font object 325 */ 326 public void setFont( Font font ) { 327 barFont = font; 328 } 329 330 /* 331 * (non-Javadoc) 332 * 333 * @see org.deegree.graphics.ScaleBar#setBackgroundColor(java.awt.Color) 334 */ 335 public void setBackgroundColor( Color color ) { 336 this.bgColor = color; 337 338 } 339 340 /** 341 * sets the number format for a scale bar 342 * 343 * @param numberFormat 344 */ 345 public void setNumberFormat( NumberFormat numberFormat ) { 346 this.numberFormat = numberFormat; 347 } 348 }