package com.ibm.nmon.gui.chart.builder; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Stroke; import java.awt.geom.RectangularShape; import org.jfree.chart.renderer.AbstractRenderer; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.chart.renderer.xy.XYBarRenderer; import org.jfree.chart.renderer.category.StandardBarPainter; import org.jfree.chart.renderer.xy.StandardXYBarPainter; import org.jfree.ui.RectangleEdge; /** * Draws bars with a simple gradient that gets 25% darker across the bar to provide a simple 3d * shade effect. */ final class GradientPainters { static final class GradientBarPainter extends StandardBarPainter { private static final long serialVersionUID = -5663235468496023390L; @Override public void paintBar(Graphics2D g2, BarRenderer renderer, int row, int column, RectangularShape bar, RectangleEdge base) { GradientPainters.paintBar(g2, renderer, row, column, bar, base, renderer.isDrawBarOutline()); } } static final class GradientXYBarPainter extends StandardXYBarPainter { private static final long serialVersionUID = 7910681188097939458L; @Override public void paintBar(Graphics2D g2, XYBarRenderer renderer, int row, int column, RectangularShape bar, RectangleEdge base) { GradientPainters.paintBar(g2, renderer, row, column, bar, base, renderer.isDrawBarOutline()); } } private static void paintBar(Graphics2D g2, AbstractRenderer renderer, int row, int column, RectangularShape bar, RectangleEdge base, boolean drawBarOutline) { Paint itemPaint = renderer.getItemPaint(row, column); Color c0, c1; if (itemPaint instanceof Color) { c0 = (Color) itemPaint; // 1/4 darker c1 = new Color(Math.max((int) (c0.getRed() * .75f), 0), Math.max((int) (c0.getGreen() * .75f), 0), Math.max((int) (c0.getBlue() * .75f), 0)); } else if (itemPaint instanceof GradientPaint) { GradientPaint gp = (GradientPaint) itemPaint; c0 = gp.getColor1(); c1 = gp.getColor2(); } else { c0 = Color.BLUE; c1 = c0.darker(); } // if the bar color has alpha == 0, do not draw anything if (c0.getAlpha() == 0) { return; } GradientPaint gp = null; if (base == RectangleEdge.TOP || base == RectangleEdge.BOTTOM) { // gradient left to right - right edge darker gp = new GradientPaint((float) bar.getMinX(), 0, c0, (float) bar.getMaxX(), 0, c1); } else if (base == RectangleEdge.LEFT || base == RectangleEdge.RIGHT) { // gradient top to bottom - bottom edge darker gp = new GradientPaint(0, (float) bar.getMinY(), c0, 0, (float) bar.getMaxY(), c1); } g2.setPaint(gp); g2.fill(bar); if (drawBarOutline) { Stroke stroke = renderer.getItemOutlineStroke(row, column); Paint paint = renderer.getItemOutlinePaint(row, column); if (stroke != null && paint != null) { g2.setStroke(stroke); g2.setPaint(paint); g2.draw(bar); } } } private GradientPainters() {} }