001 /* =========================================================== 002 * JFreeChart : a free chart library for the Java(tm) platform 003 * =========================================================== 004 * 005 * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. 006 * 007 * Project Info: http://www.jfree.org/jfreechart/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 025 * in the United States and other countries.] 026 * 027 * ---------------------- 028 * YIntervalRenderer.java 029 * ---------------------- 030 * (C) Copyright 2002-2007, by Object Refinery Limited. 031 * 032 * Original Author: David Gilbert (for Object Refinery Limited); 033 * Contributor(s): -; 034 * 035 * Changes 036 * ------- 037 * 05-Nov-2002 : Version 1 (DG); 038 * 25-Mar-2003 : Implemented Serializable (DG); 039 * 01-May-2003 : Modified drawItem() method signature (DG); 040 * 20-Aug-2003 : Implemented Cloneable and PublicCloneable (DG); 041 * 16-Sep-2003 : Changed ChartRenderingInfo --> PlotRenderingInfo (DG); 042 * 25-Feb-2004 : Replaced CrosshairInfo with CrosshairState (DG); 043 * 27-Sep-2004 : Access double values from dataset (DG); 044 * 11-Nov-2004 : Now uses ShapeUtilities to translate shapes (DG); 045 * 046 */ 047 048 package org.jfree.chart.renderer.xy; 049 050 import java.awt.Graphics2D; 051 import java.awt.Paint; 052 import java.awt.Shape; 053 import java.awt.Stroke; 054 import java.awt.geom.Line2D; 055 import java.awt.geom.Rectangle2D; 056 import java.io.Serializable; 057 058 import org.jfree.chart.axis.ValueAxis; 059 import org.jfree.chart.entity.EntityCollection; 060 import org.jfree.chart.entity.XYItemEntity; 061 import org.jfree.chart.labels.XYToolTipGenerator; 062 import org.jfree.chart.plot.CrosshairState; 063 import org.jfree.chart.plot.PlotOrientation; 064 import org.jfree.chart.plot.PlotRenderingInfo; 065 import org.jfree.chart.plot.XYPlot; 066 import org.jfree.data.xy.IntervalXYDataset; 067 import org.jfree.data.xy.XYDataset; 068 import org.jfree.ui.RectangleEdge; 069 import org.jfree.util.PublicCloneable; 070 import org.jfree.util.ShapeUtilities; 071 072 /** 073 * A renderer that draws a line connecting the start and end Y values for an 074 * {@link XYPlot}. 075 */ 076 public class YIntervalRenderer extends AbstractXYItemRenderer 077 implements XYItemRenderer, 078 Cloneable, 079 PublicCloneable, 080 Serializable { 081 082 /** For serialization. */ 083 private static final long serialVersionUID = -2951586537224143260L; 084 085 /** 086 * The default constructor. 087 */ 088 public YIntervalRenderer() { 089 super(); 090 } 091 092 /** 093 * Draws the visual representation of a single data item. 094 * 095 * @param g2 the graphics device. 096 * @param state the renderer state. 097 * @param dataArea the area within which the plot is being drawn. 098 * @param info collects information about the drawing. 099 * @param plot the plot (can be used to obtain standard color 100 * information etc). 101 * @param domainAxis the domain axis. 102 * @param rangeAxis the range axis. 103 * @param dataset the dataset. 104 * @param series the series index (zero-based). 105 * @param item the item index (zero-based). 106 * @param crosshairState crosshair information for the plot 107 * (<code>null</code> permitted). 108 * @param pass the pass index (ignored here). 109 */ 110 public void drawItem(Graphics2D g2, 111 XYItemRendererState state, 112 Rectangle2D dataArea, 113 PlotRenderingInfo info, 114 XYPlot plot, 115 ValueAxis domainAxis, 116 ValueAxis rangeAxis, 117 XYDataset dataset, 118 int series, 119 int item, 120 CrosshairState crosshairState, 121 int pass) { 122 123 // setup for collecting optional entity info... 124 Shape entityArea = null; 125 EntityCollection entities = null; 126 if (info != null) { 127 entities = info.getOwner().getEntityCollection(); 128 } 129 130 IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; 131 132 double x = intervalDataset.getXValue(series, item); 133 double yLow = intervalDataset.getStartYValue(series, item); 134 double yHigh = intervalDataset.getEndYValue(series, item); 135 136 RectangleEdge xAxisLocation = plot.getDomainAxisEdge(); 137 RectangleEdge yAxisLocation = plot.getRangeAxisEdge(); 138 139 double xx = domainAxis.valueToJava2D(x, dataArea, xAxisLocation); 140 double yyLow = rangeAxis.valueToJava2D(yLow, dataArea, yAxisLocation); 141 double yyHigh = rangeAxis.valueToJava2D(yHigh, dataArea, yAxisLocation); 142 143 Paint p = getItemPaint(series, item); 144 Stroke s = getItemStroke(series, item); 145 146 Line2D line = null; 147 Shape shape = getItemShape(series, item); 148 Shape top = null; 149 Shape bottom = null; 150 PlotOrientation orientation = plot.getOrientation(); 151 if (orientation == PlotOrientation.HORIZONTAL) { 152 line = new Line2D.Double(yyLow, xx, yyHigh, xx); 153 top = ShapeUtilities.createTranslatedShape(shape, yyHigh, xx); 154 bottom = ShapeUtilities.createTranslatedShape(shape, yyLow, xx); 155 } 156 else if (orientation == PlotOrientation.VERTICAL) { 157 line = new Line2D.Double(xx, yyLow, xx, yyHigh); 158 top = ShapeUtilities.createTranslatedShape(shape, xx, yyHigh); 159 bottom = ShapeUtilities.createTranslatedShape(shape, xx, yyLow); 160 } 161 g2.setPaint(p); 162 g2.setStroke(s); 163 g2.draw(line); 164 165 g2.fill(top); 166 g2.fill(bottom); 167 168 // add an entity for the item... 169 if (entities != null) { 170 if (entityArea == null) { 171 entityArea = line.getBounds(); 172 } 173 String tip = null; 174 XYToolTipGenerator generator = getToolTipGenerator(series, item); 175 if (generator != null) { 176 tip = generator.generateToolTip(dataset, series, item); 177 } 178 String url = null; 179 if (getURLGenerator() != null) { 180 url = getURLGenerator().generateURL(dataset, series, item); 181 } 182 XYItemEntity entity = new XYItemEntity(entityArea, dataset, series, 183 item, tip, url); 184 entities.add(entity); 185 } 186 187 } 188 189 /** 190 * Returns a clone of the renderer. 191 * 192 * @return A clone. 193 * 194 * @throws CloneNotSupportedException if the renderer cannot be cloned. 195 */ 196 public Object clone() throws CloneNotSupportedException { 197 return super.clone(); 198 } 199 200 }