/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.libraries.libsparklines; import java.awt.*; import java.awt.geom.Rectangle2D; public class PieGraphDrawable { private static final Color DEFAULT_MEDIUM_COLOR = Color.YELLOW; private static final Color DEFAULT_HIGH_COLOR = Color.RED; private static final Color DEFAULT_LOW_COLOR = Color.GREEN; private static final Double DEFAULT_LOW_SLICE = new Double( 0.30 ); private static final Double DEFAULT_MEDIUM_SLICE = new Double( 0.70 ); private static final Double DEFAULT_HIGH_SLICE = new Double( 1 ); private Color color; private Color background; private Color mediumColor; private Color highColor; private Color lowColor; private Number mediumSlice; private Number highSlice; private Number lowSlice; private boolean counterClockWise = false; private int startAngle = 0; private Number value; public PieGraphDrawable() { color = Color.LIGHT_GRAY; mediumColor = DEFAULT_MEDIUM_COLOR; lowColor = DEFAULT_LOW_COLOR; highColor = DEFAULT_HIGH_COLOR; mediumSlice = DEFAULT_MEDIUM_SLICE; lowSlice = DEFAULT_LOW_SLICE; highSlice = DEFAULT_HIGH_SLICE; } public void draw( final Graphics2D graphics, final Rectangle2D drawArea ) { // compute the centred square area inside the drawArea final double adjustX = drawArea.getWidth() < drawArea.getHeight() ? 0 : ( drawArea.getHeight() - drawArea.getWidth() ) / 2.0; final double adjustY = drawArea.getHeight() < drawArea.getWidth() ? 0 : ( drawArea.getWidth() - drawArea.getHeight() ) / 2.0; final Graphics2D g = (Graphics2D) graphics.create(); // draw background if ( background != null ) { g.setBackground( background ); g.clearRect( 0, 0, (int) drawArea.getWidth(), (int) drawArea.getHeight() ); } g.translate( drawArea.getX() - adjustX, drawArea.getY() - adjustY ); final int radius = (int) ( drawArea.getWidth() < drawArea.getHeight() ? drawArea.getWidth() : drawArea.getHeight() ); // draw a filled circle form its center to its edge with the background color g.setPaint( color ); g.fillOval( 0, 0, radius, radius ); // draw the value arc final int endArc = (int) ( value.doubleValue() * 360 ); //find the color g.setBackground( Color.BLUE ); //init some debug color if ( value.doubleValue() <= lowSlice.doubleValue() ) { g.setPaint( lowColor ); } else if ( value.doubleValue() <= mediumSlice.doubleValue() ) { g.setPaint( mediumColor ); } else if ( value.doubleValue() <= highSlice.doubleValue() ) { g.setPaint( highColor ); } final int counterClockWise = this.counterClockWise ? 1 : -1; g.fillArc( 0, 0, radius, radius, -startAngle + 90, counterClockWise * endArc ); g.dispose(); } public Color getColor() { return color; } public void setColor( final Color color ) { this.color = color; } public Color getMediumColor() { return mediumColor; } public void setMediumColor( final Color mediumColor ) { this.mediumColor = mediumColor; } public Color getHighColor() { return highColor; } public void setHighColor( final Color highColor ) { this.highColor = highColor; } public Color getLowColor() { return lowColor; } public void setLowColor( final Color lowColor ) { this.lowColor = lowColor; } public Number getMediumSlice() { return mediumSlice; } public void setMediumSlice( final Number mediumSlice ) { this.mediumSlice = mediumSlice; } public Number getHighSlice() { return highSlice; } public void setHighSlice( final Number highSlice ) { this.highSlice = highSlice; } public Number getLowSlice() { return lowSlice; } public void setLowSlice( final Number lowSlice ) { this.lowSlice = lowSlice; } public Number getValue() { return value; } public void setValue( final Number value ) { this.value = value; } public boolean isCounterClockWise() { return counterClockWise; } public void setCounterClockWise( final boolean counterClockWise ) { this.counterClockWise = counterClockWise; } public int getStartAngle() { return startAngle; } public void setStartAngle( final int startAngle ) { this.startAngle = startAngle; } public Color getBackground() { return background; } public void setBackground( final Color background ) { this.background = background; } }