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
048package org.jfree.chart.renderer.xy;
049
050import java.awt.Graphics2D;
051import java.awt.Paint;
052import java.awt.Shape;
053import java.awt.Stroke;
054import java.awt.geom.Line2D;
055import java.awt.geom.Rectangle2D;
056import java.io.Serializable;
057
058import org.jfree.chart.axis.ValueAxis;
059import org.jfree.chart.entity.EntityCollection;
060import org.jfree.chart.entity.XYItemEntity;
061import org.jfree.chart.labels.XYToolTipGenerator;
062import org.jfree.chart.plot.CrosshairState;
063import org.jfree.chart.plot.PlotOrientation;
064import org.jfree.chart.plot.PlotRenderingInfo;
065import org.jfree.chart.plot.XYPlot;
066import org.jfree.data.xy.IntervalXYDataset;
067import org.jfree.data.xy.XYDataset;
068import org.jfree.ui.RectangleEdge;
069import org.jfree.util.PublicCloneable;
070import 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 */
076public 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}