001: /***********************************************************************************************
002: * Copyright 2002 (C) Nathaniel G. Auvil. All Rights Reserved.
003: *
004: * Redistribution and use of this software and associated documentation ("Software"), with or
005: * without modification, are permitted provided that the following conditions are met:
006: *
007: * 1. Redistributions of source code must retain copyright statements and notices.
008: * Redistributions must also contain a copy of this document.
009: *
010: * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
011: * conditions and the following disclaimer in the documentation and/or other materials
012: * provided with the distribution.
013: *
014: * 3. The name "jCharts" or "Nathaniel G. Auvil" must not be used to endorse or promote
015: * products derived from this Software without prior written permission of Nathaniel G.
016: * Auvil. For written permission, please contact nathaniel_auvil@users.sourceforge.net
017: *
018: * 4. Products derived from this Software may not be called "jCharts" nor may "jCharts" appear
019: * in their names without prior written permission of Nathaniel G. Auvil. jCharts is a
020: * registered trademark of Nathaniel G. Auvil.
021: *
022: * 5. Due credit should be given to the jCharts Project (http://jcharts.sourceforge.net/).
023: *
024: * THIS SOFTWARE IS PROVIDED BY Nathaniel G. Auvil AND CONTRIBUTORS ``AS IS'' AND ANY
025: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
026: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
027: * jCharts OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
028: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
029: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
030: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,STRICT LIABILITY, OR TORT
031: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
032: * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
033: ************************************************************************************************/package org.krysalis.jcharts.axisChart;
034:
035: import org.krysalis.jcharts.chartData.interfaces.IAxisChartDataSet;
036: import org.krysalis.jcharts.imageMap.ImageMapNotSupportedException;
037:
038: import java.awt.*;
039: import java.awt.geom.Area;
040: import java.awt.geom.GeneralPath;
041:
042: /*************************************************************************************
043: *
044: * @author Nathaniel Auvil
045: * @version $Id: AreaChart.java,v 1.3 2004/05/31 15:39:53 nathaniel_auvil Exp $
046: ************************************************************************************/
047: abstract class AreaChart {
048:
049: /********************************************************************************************
050: * Draws the chart
051: *
052: * @param axisChart
053: * @param iAxisChartDataSet
054: *********************************************************************************************/
055: static void render(AxisChart axisChart,
056: IAxisChartDataSet iAxisChartDataSet) {
057: //---hopefully eliminate support requests asking about this...
058: if (axisChart.getImageMap() != null) {
059: //todo should we do a point image map?
060: throw new ImageMapNotSupportedException(
061: "HTML client-side image maps are not supported on Area Charts.");
062: }
063:
064: //AreaChartProperties areaChartProperties=(AreaChartProperties) iAxisChartDataSet.getChartTypeProperties();
065: float xPosition = axisChart.getXAxis().getTickStart();
066:
067: GeneralPath generalPaths[] = new GeneralPath[iAxisChartDataSet
068: .getNumberOfDataSets()];
069:
070: //---AreaCharts can not be drawn on a horizontal axis so y-axis will always be the data axis
071: //DataAxisProperties dataAxisProperties= (DataAxisProperties) axisChart.getAxisProperties().getYAxisProperties();
072:
073: //LOOP
074: //---initial postion of each line must be set with call to moveTo()
075: //---Do this here so every point does not have to check....if( i == 0 )... in loop
076: for (int i = 0; i < generalPaths.length; i++) {
077: generalPaths[i] = new GeneralPath();
078: generalPaths[i].moveTo(xPosition, axisChart.getYAxis()
079: .getZeroLineCoordinate());
080: generalPaths[i].lineTo(xPosition, axisChart.getYAxis()
081: .computeAxisCoordinate(
082: axisChart.getYAxis().getOrigin(),
083: iAxisChartDataSet.getValue(i, 0),
084: axisChart.getYAxis().getScaleCalculator()
085: .getMinValue()));
086: }
087:
088: //LOOP
089: for (int j = 1; j < iAxisChartDataSet.getNumberOfDataItems(); j++) {
090: xPosition += axisChart.getXAxis().getScalePixelWidth();
091:
092: //LOOP
093: for (int i = 0; i < generalPaths.length; i++) {
094: generalPaths[i].lineTo(xPosition, axisChart.getYAxis()
095: .computeAxisCoordinate(
096: axisChart.getYAxis().getOrigin(),
097: iAxisChartDataSet.getValue(i, j),
098: axisChart.getYAxis()
099: .getScaleCalculator()
100: .getMinValue()));
101: }
102: }
103:
104: Area[] areas = new Area[generalPaths.length];
105:
106: //LOOP
107: //---close the path. Do this here so do not have to check if last every pass through above loop.
108: for (int i = 0; i < generalPaths.length; i++) {
109: generalPaths[i].lineTo(xPosition, axisChart.getYAxis()
110: .getZeroLineCoordinate());
111: generalPaths[i].closePath();
112:
113: areas[i] = new Area(generalPaths[i]);
114: }
115:
116: Graphics2D g2d = axisChart.getGraphics2D();
117:
118: //LOOP
119: //---draw each path to the image
120: for (int i = 0; i < areas.length; i++) {
121: g2d.setPaint(iAxisChartDataSet.getPaint(i));
122: g2d.fill(areas[i]);
123: }
124: }
125:
126: }
|