From: <mu...@us...> - 2008-06-16 18:42:10
|
Revision: 1157 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=1157&view=rev Author: mungady Date: 2008-06-16 11:42:08 -0700 (Mon, 16 Jun 2008) Log Message: ----------- 2006-06-16 David Gilbert <dav...@ob...> * source/org/jfree/chart/renderer/xy/YIntervalRenderer.java (additionalItemLabelGenerator): New field, (YIntervalRenderer): Initialise new field, (getAdditionalItemLabelGenerator): New method, (setAdditionalItemLabelGenerator): Likewise, (drawItem): Added additional item label support, (drawAdditionalItemLabel): New method, (equals): Include new field. Modified Paths: -------------- trunk/ChangeLog trunk/source/org/jfree/chart/renderer/xy/YIntervalRenderer.java trunk/tests/org/jfree/chart/renderer/xy/junit/YIntervalRendererTests.java Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2008-06-16 18:38:59 UTC (rev 1156) +++ trunk/ChangeLog 2008-06-16 18:42:08 UTC (rev 1157) @@ -1,5 +1,16 @@ 2006-06-16 David Gilbert <dav...@ob...> + * source/org/jfree/chart/renderer/xy/YIntervalRenderer.java + (additionalItemLabelGenerator): New field, + (YIntervalRenderer): Initialise new field, + (getAdditionalItemLabelGenerator): New method, + (setAdditionalItemLabelGenerator): Likewise, + (drawItem): Added additional item label support, + (drawAdditionalItemLabel): New method, + (equals): Include new field. + +2006-06-16 David Gilbert <dav...@ob...> + * source/org/jfree/chart/renderer/xy/HighLowRenderer.java (tickLength): New field, (HighLowRenderer): Initialise tickLength, Modified: trunk/source/org/jfree/chart/renderer/xy/YIntervalRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/xy/YIntervalRenderer.java 2008-06-16 18:38:59 UTC (rev 1156) +++ trunk/source/org/jfree/chart/renderer/xy/YIntervalRenderer.java 2008-06-16 18:42:08 UTC (rev 1157) @@ -51,21 +51,28 @@ package org.jfree.chart.renderer.xy; +import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; import java.awt.Stroke; import java.awt.geom.Line2D; +import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.Serializable; import org.jfree.chart.LegendItem; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.entity.EntityCollection; +import org.jfree.chart.event.RendererChangeEvent; +import org.jfree.chart.labels.ItemLabelPosition; +import org.jfree.chart.labels.XYItemLabelGenerator; import org.jfree.chart.plot.CrosshairState; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.PlotRenderingInfo; import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.text.TextUtilities; +import org.jfree.chart.util.ObjectUtilities; import org.jfree.chart.util.PublicCloneable; import org.jfree.chart.util.RectangleEdge; import org.jfree.chart.util.ShapeUtilities; @@ -79,22 +86,61 @@ * {@link XYPlot}. */ public class YIntervalRenderer extends AbstractXYItemRenderer - implements XYItemRenderer, - Cloneable, - PublicCloneable, - Serializable { + implements XYItemRenderer, Cloneable, PublicCloneable, Serializable { /** For serialization. */ private static final long serialVersionUID = -2951586537224143260L; /** + * An additional item label generator. If this is non-null, the item + * label generated will be displayed near the lower y-value at the + * position given by getNegativeItemLabelPosition(). + * + * @since 1.0.10 + */ + private XYItemLabelGenerator additionalItemLabelGenerator; + + /** * The default constructor. */ public YIntervalRenderer() { super(); + this.additionalItemLabelGenerator = null; } /** + * Returns the generator for the item labels that appear near the lower + * y-value. + * + * @return The generator (possibly <code>null</code>). + * + * @see #setAdditionalItemLabelGenerator(XYItemLabelGenerator) + * + * @since 1.0.10 + */ + public XYItemLabelGenerator getAdditionalItemLabelGenerator() { + return this.additionalItemLabelGenerator; + } + + /** + * Sets the generator for the item labels that appear near the lower + * y-value and sends a {@link RendererChangeEvent} to all registered + * listeners. If this is set to <code>null</code>, no item labels will be + * drawn. + * + * @param generator the generator (<code>null</code> permitted). + * + * @see #getAdditionalItemLabelGenerator() + * + * @since 1.0.10 + */ + public void setAdditionalItemLabelGenerator( + XYItemLabelGenerator generator) { + this.additionalItemLabelGenerator = generator; + fireChangeEvent(); + } + + /** * Returns the range of values the renderer requires to display all the * items from the specified dataset. * @@ -187,6 +233,17 @@ g2.fill(top); g2.fill(bottom); + // for item labels, we have a special case because there is the + // possibility to draw (a) the regular item label near to just the + // upper y-value, or (b) the regular item label near the upper y-value + // PLUS an additional item label near the lower y-value. + if (isItemLabelVisible(series, item)) { + drawItemLabel(g2, orientation, dataset, series, item, xx, yyHigh, + false); + drawAdditionalItemLabel(g2, orientation, dataset, series, item, + xx, yyLow); + } + // add an entity for the item... if (entities != null) { addEntity(entities, line.getBounds(), dataset, series, item, 0.0, @@ -196,6 +253,65 @@ } /** + * Draws an item label. + * + * @param g2 the graphics device. + * @param orientation the orientation. + * @param dataset the dataset. + * @param series the series index (zero-based). + * @param item the item index (zero-based). + * @param x the x coordinate (in Java2D space). + * @param y the y coordinate (in Java2D space). + * @param negative indicates a negative value (which affects the item + * label position). + */ + private void drawAdditionalItemLabel(Graphics2D g2, + PlotOrientation orientation, XYDataset dataset, int series, + int item, double x, double y) { + + if (this.additionalItemLabelGenerator == null) { + return; + } + + Font labelFont = getItemLabelFont(series, item); + Paint paint = getItemLabelPaint(series, item); + g2.setFont(labelFont); + g2.setPaint(paint); + String label = this.additionalItemLabelGenerator.generateLabel(dataset, + series, item); + + ItemLabelPosition position = getNegativeItemLabelPosition(series, item); + Point2D anchorPoint = calculateLabelAnchorPoint( + position.getItemLabelAnchor(), x, y, orientation); + TextUtilities.drawRotatedString(label, g2, + (float) anchorPoint.getX(), (float) anchorPoint.getY(), + position.getTextAnchor(), position.getAngle(), + position.getRotationAnchor()); + } + + /** + * Tests this renderer for equality with an arbitrary object. + * + * @param obj the object (<code>null</code> permitted). + * + * @return A boolean. + */ + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof YIntervalRenderer)) { + return false; + } + YIntervalRenderer that = (YIntervalRenderer) obj; + if (!ObjectUtilities.equal(this.additionalItemLabelGenerator, + that.additionalItemLabelGenerator)) { + return false; + } + return super.equals(obj); + } + + /** * Returns a default legend item for the specified series. Subclasses * should override this method to generate customised items. * Modified: trunk/tests/org/jfree/chart/renderer/xy/junit/YIntervalRendererTests.java =================================================================== --- trunk/tests/org/jfree/chart/renderer/xy/junit/YIntervalRendererTests.java 2008-06-16 18:38:59 UTC (rev 1156) +++ trunk/tests/org/jfree/chart/renderer/xy/junit/YIntervalRendererTests.java 2008-06-16 18:42:08 UTC (rev 1157) @@ -37,6 +37,8 @@ * 25-Mar-2003 : Version 1 (DG); * 20-Feb-2007 : Extended the testEquals() checks (DG); * 17-May-2007 : Added testGetLegendItemSeriesIndex() (DG); + * 22-Apr-2008 : Added testPublicCloneable() (DG); + * 26-May-2008 : Extended testEquals() (DG); * */ @@ -57,6 +59,7 @@ import org.jfree.chart.LegendItem; import org.jfree.chart.annotations.XYTextAnnotation; import org.jfree.chart.axis.NumberAxis; +import org.jfree.chart.labels.IntervalXYItemLabelGenerator; import org.jfree.chart.labels.StandardXYItemLabelGenerator; import org.jfree.chart.labels.StandardXYSeriesLabelGenerator; import org.jfree.chart.labels.StandardXYToolTipGenerator; @@ -64,6 +67,7 @@ import org.jfree.chart.renderer.xy.YIntervalRenderer; import org.jfree.chart.urls.StandardXYURLGenerator; import org.jfree.chart.util.Layer; +import org.jfree.chart.util.PublicCloneable; import org.jfree.data.xy.YIntervalSeries; import org.jfree.data.xy.YIntervalSeriesCollection; @@ -160,6 +164,12 @@ assertFalse(r1.equals(r2)); r2.setLegendItemURLGenerator(new StandardXYSeriesLabelGenerator()); assertTrue(r1.equals(r2)); + + r1.setAdditionalItemLabelGenerator(new IntervalXYItemLabelGenerator()); + assertFalse(r1.equals(r2)); + r2.setAdditionalItemLabelGenerator(new IntervalXYItemLabelGenerator()); + assertTrue(r1.equals(r2)); + } /** @@ -218,6 +228,14 @@ } /** + * Verify that this class implements {@link PublicCloneable}. + */ + public void testPublicCloneable() { + YIntervalRenderer r1 = new YIntervalRenderer(); + assertTrue(r1 instanceof PublicCloneable); + } + + /** * Serialize an instance, restore it, and check for equality. */ public void testSerialization() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |