1 39 40 41 package org.krysalis.jcharts.axisChart.customRenderers.axisValue.renderers; 42 43 44 import org.krysalis.jcharts.axisChart.AxisChart; 45 import org.krysalis.jcharts.axisChart.customRenderers.axisValue.AxisValueRenderEvent; 46 import org.krysalis.jcharts.axisChart.customRenderers.axisValue.PostAxisValueRenderListener; 47 import org.krysalis.jcharts.chartData.interfaces.IAxisChartDataSet; 48 import org.krysalis.jcharts.chartText.NumericTagGroup; 49 import org.krysalis.jcharts.chartText.TextTag; 50 import org.krysalis.jcharts.properties.util.ChartFont; 51 52 import java.awt.*; 53 import java.text.NumberFormat ; 54 55 56 public class ValueLabelRenderer implements PostAxisValueRenderListener 57 { 58 59 private NumberFormat numberFormat; 60 61 private ChartFont valueChartFont = ChartFont.DEFAULT_AXIS_VALUE; 62 63 private Font derivedFont; 65 66 private boolean isLabelVertical = false; 68 69 private ValueLabelPosition valueLabelPosition = ValueLabelPosition.ON_TOP; 70 71 private int pixelValuePadding = 4; 72 73 74 81 public ValueLabelRenderer( boolean isCurrency, boolean showGrouping, int roundingPowerOfTen ) 82 { 83 this.numberFormat = NumericTagGroup.getNumberFormatInstance( isCurrency, false, showGrouping, roundingPowerOfTen ); 84 } 85 86 87 94 public ValueLabelRenderer( boolean isCurrency, boolean isPercent, boolean showGrouping, int roundingPowerOfTen ) 95 { 96 this.numberFormat = NumericTagGroup.getNumberFormatInstance( isCurrency, isPercent, showGrouping, roundingPowerOfTen ); 97 } 98 99 100 105 public void setValueLabelPosition( ValueLabelPosition valueLabelPosition ) 106 { 107 this.valueLabelPosition = valueLabelPosition; 108 } 109 110 111 115 public void setValueChartFont( ChartFont valueChartFont ) 116 { 117 this.valueChartFont = valueChartFont; 118 } 119 120 121 125 public void useVerticalLabels( boolean useVerticalLabels ) 126 { 127 this.isLabelVertical = useVerticalLabels; 128 129 if( this.isLabelVertical ) 131 { 132 this.derivedFont = this.valueChartFont.deriveFont(); 133 } 134 } 135 136 137 142 public void setPixelValuePadding( int pixelValuePadding ) 143 { 144 this.pixelValuePadding = pixelValuePadding; 145 } 146 147 148 152 public void postRender( AxisValueRenderEvent axisValueRenderEvent ) 153 { 154 AxisChart axisChart = (AxisChart) axisValueRenderEvent.getSource(); 155 TextTag valueTag; 156 float x; 157 float y; 158 159 160 if( axisValueRenderEvent.getiAxisPlotDataSet() instanceof IAxisChartDataSet ) 161 { 162 IAxisChartDataSet iAxisChartDataSet = (IAxisChartDataSet) axisValueRenderEvent.getiAxisPlotDataSet(); 163 double value = iAxisChartDataSet.getValue( axisValueRenderEvent.getDataSetIndex(), axisValueRenderEvent.getValueIndex() ); 164 165 valueTag = new TextTag( this.numberFormat.format( value ), 166 this.valueChartFont.getFont(), 167 this.derivedFont, 168 axisValueRenderEvent.getFontRenderContext() ); 169 170 if( axisChart.getAxisProperties().isPlotHorizontal() ) 171 { 172 x = this.calculateXHorizontalPlot( axisValueRenderEvent, valueTag, (value < 0) ); 173 y = this.calculateYHorizontalPlot( axisValueRenderEvent, valueTag ); 174 } 175 else 176 { 177 x = this.calculateXVerticalPlot( axisValueRenderEvent, valueTag ); 178 y = this.calculateYVerticalPlot( axisValueRenderEvent, valueTag, (value < 0) ); 179 } 180 } 181 else 182 { 183 valueTag = null; 185 x = 100; 186 y = 100; 187 188 throw new RuntimeException ( "Axis Values not yet implemented for this type of chart." ); 189 } 190 191 192 196 197 valueTag.setXPosition( x ); 198 valueTag.setYPosition( y ); 199 valueTag.render( axisValueRenderEvent.getGraphics2D(), this.valueChartFont.getPaint() ); 200 } 201 202 203 210 private float calculateXVerticalPlot( AxisValueRenderEvent axisValueRenderEvent, TextTag formattedTextTag ) 211 { 212 float x = axisValueRenderEvent.getValueX(); 213 214 if( this.isLabelVertical ) 215 { 216 x += formattedTextTag.getFontDescent(); 217 } 218 else 219 { 220 x -= (formattedTextTag.getWidth() / 2); 221 } 222 223 return x; 224 } 225 226 227 233 private float calculateYHorizontalPlot( AxisValueRenderEvent axisValueRenderEvent, 234 TextTag formattedTextTag ) 235 { 236 float y = axisValueRenderEvent.getValueY(); 237 238 if( this.isLabelVertical ) 239 { 240 y += (formattedTextTag.getWidth() / 2); 241 } 242 else 243 { 244 y += formattedTextTag.getFontDescent(); 245 } 246 247 return y; 248 } 249 250 251 257 private float calculateXHorizontalPlot( AxisValueRenderEvent axisValueRenderEvent, 258 TextTag formattedTextTag, 259 boolean isNegative ) 260 { 261 float x = axisValueRenderEvent.getValueX(); 262 263 if( this.valueLabelPosition.equals( ValueLabelPosition.ON_TOP ) ) 264 { 265 if( isNegative ) 267 { 268 x -= (this.isLabelVertical) ? 0 : formattedTextTag.getWidth(); 269 x -= this.pixelValuePadding; 270 } 271 else 272 { 273 x += (this.isLabelVertical) ? formattedTextTag.getFontAscent() : 0; 274 x += this.pixelValuePadding; 275 } 276 } 277 else if( this.valueLabelPosition.equals( ValueLabelPosition.AT_TOP ) ) 278 { 279 if( isNegative ) 280 { 281 x += (this.isLabelVertical) ? formattedTextTag.getFontAscent() : 0; 282 x += this.pixelValuePadding; 283 } 284 else 285 { 286 x -= (this.isLabelVertical) ? formattedTextTag.getFontDescent() : formattedTextTag.getWidth(); 287 x -= this.pixelValuePadding; 288 } 289 } 290 else if( this.valueLabelPosition.equals( ValueLabelPosition.ABOVE_ZERO_LINE ) ) 291 { 292 x = axisValueRenderEvent.getZeroLineCoordinate(); 293 294 if( isNegative ) 295 { 296 x += (this.isLabelVertical) ? formattedTextTag.getFontAscent() : 0; 297 x += this.pixelValuePadding; 298 } 299 else 300 { 301 x -= (this.isLabelVertical) ? formattedTextTag.getFontDescent() : formattedTextTag.getWidth(); 302 x -= this.pixelValuePadding; 303 } 304 } 305 306 307 else if( this.valueLabelPosition.equals( ValueLabelPosition.AXIS_TOP ) ) 308 { 309 x = axisValueRenderEvent.getTotalItemAxisArea().x + axisValueRenderEvent.getTotalItemAxisArea().width; 310 311 x -= (this.isLabelVertical) ? 0 : formattedTextTag.getWidth(); 312 x -= this.pixelValuePadding; 313 } 314 else if( this.valueLabelPosition.equals( ValueLabelPosition.AXIS_BOTTOM ) ) 315 { 316 x = axisValueRenderEvent.getTotalItemAxisArea().x; 317 x += (this.isLabelVertical) ? formattedTextTag.getFontAscent() : 0; 318 x += this.pixelValuePadding; 319 } 320 321 322 if( (x + formattedTextTag.getWidth()) 326 > (axisValueRenderEvent.getTotalItemAxisArea().x + axisValueRenderEvent.getTotalItemAxisArea().width) ) 327 { 328 x = axisValueRenderEvent.getTotalItemAxisArea().x + axisValueRenderEvent.getTotalItemAxisArea().width; 329 x -= formattedTextTag.getWidth(); 330 x -= this.pixelValuePadding; 331 } 332 else if( x < axisValueRenderEvent.getTotalItemAxisArea().x ) 334 { 335 x = axisValueRenderEvent.getTotalItemAxisArea().x; 336 x += this.pixelValuePadding; 337 } 338 339 return x; 340 } 341 342 343 349 private float calculateYVerticalPlot( AxisValueRenderEvent axisValueRenderEvent, 350 TextTag formattedTextTag, 351 boolean isNegative ) 352 { 353 float y = axisValueRenderEvent.getValueY(); 354 355 if( this.valueLabelPosition.equals( ValueLabelPosition.ON_TOP ) ) 356 { 357 if( isNegative ) 359 { 360 y += (this.isLabelVertical) ? formattedTextTag.getWidth() : formattedTextTag.getHeight(); 361 y += this.pixelValuePadding; 362 } 363 else 364 { 365 y -= this.pixelValuePadding; 366 } 367 } 368 else if( this.valueLabelPosition.equals( ValueLabelPosition.AT_TOP ) ) 369 { 370 if( isNegative ) 372 { 373 y -= this.pixelValuePadding; 374 } 375 else 376 { 377 y += (this.isLabelVertical) ? formattedTextTag.getWidth() : formattedTextTag.getHeight(); 378 y += this.pixelValuePadding; 379 } 380 } 381 else if( this.valueLabelPosition.equals( ValueLabelPosition.ABOVE_ZERO_LINE ) ) 382 { 383 y = axisValueRenderEvent.getZeroLineCoordinate(); 384 385 if( isNegative ) 387 { 388 y -= this.pixelValuePadding; 389 } 390 else 391 { 392 y += (this.isLabelVertical) ? formattedTextTag.getWidth() : formattedTextTag.getHeight(); 393 y += this.pixelValuePadding; 394 } 395 } 396 397 else if( this.valueLabelPosition.equals( ValueLabelPosition.AXIS_TOP ) ) 398 { 399 y = axisValueRenderEvent.getTotalItemAxisArea().y; 400 y += (this.isLabelVertical) ? formattedTextTag.getWidth() : formattedTextTag.getHeight(); 401 y += this.pixelValuePadding; 402 } 403 else if( this.valueLabelPosition.equals( ValueLabelPosition.AXIS_BOTTOM ) ) 404 { 405 y = axisValueRenderEvent.getTotalItemAxisArea().y + axisValueRenderEvent.getTotalItemAxisArea().height; 406 y -= this.pixelValuePadding; 407 } 408 409 410 411 if( isLabelVertical ) 413 { 414 if( ( y - formattedTextTag.getWidth() ) < axisValueRenderEvent.getTotalItemAxisArea().y ) 416 { 417 y = axisValueRenderEvent.getTotalItemAxisArea().y; 418 y += formattedTextTag.getWidth(); 419 y += this.pixelValuePadding; 420 } 421 else if( y > axisValueRenderEvent.getTotalItemAxisArea().y + axisValueRenderEvent.getTotalItemAxisArea().height ) 423 { 424 y = axisValueRenderEvent.getTotalItemAxisArea().y + axisValueRenderEvent.getTotalItemAxisArea().height; 425 y -= this.pixelValuePadding; 426 } 427 } 428 else 429 { 430 if( ( y - formattedTextTag.getHeight() ) < axisValueRenderEvent.getTotalItemAxisArea().y ) 432 { 433 y = axisValueRenderEvent.getTotalItemAxisArea().y; 434 y += formattedTextTag.getHeight(); 435 y += this.pixelValuePadding; 436 } 437 else if( y > axisValueRenderEvent.getTotalItemAxisArea().y + axisValueRenderEvent.getTotalItemAxisArea().height ) 439 { 440 y = axisValueRenderEvent.getTotalItemAxisArea().y + axisValueRenderEvent.getTotalItemAxisArea().height; 441 y -= this.pixelValuePadding; 442 } 443 } 444 445 return y; 446 } 447 } 448 | Popular Tags |