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.chartData.interfaces.IDataSeries;
037: import org.krysalis.jcharts.imageMap.CircleMapArea;
038: import org.krysalis.jcharts.properties.PointChartProperties;
039: import org.krysalis.jcharts.properties.DataAxisProperties;
040:
041: import java.awt.*;
042: import java.awt.geom.AffineTransform;
043: import java.awt.geom.Rectangle2D;
044:
045: /*************************************************************************************
046: *
047: * @author Nathaniel Auvil
048: * @version $Id: PointChart.java,v 1.1 2003/05/17 16:56:57 nathaniel_auvil Exp $
049: ************************************************************************************/
050: abstract class PointChart {
051:
052: /********************************************************************************************
053: * Draws the chart
054: *
055: * @param axisChart
056: * @param iAxisChartDataSet
057: *********************************************************************************************/
058: static void render(AxisChart axisChart,
059: IAxisChartDataSet iAxisChartDataSet) {
060: Graphics2D g2d = axisChart.getGraphics2D();
061: PointChartProperties pointChartProperties = (PointChartProperties) iAxisChartDataSet
062: .getChartTypeProperties();
063:
064: //---Point Charts can not be horizontal so we know the y-axis is DataAxisProperties
065: DataAxisProperties dataAxisProperties = (DataAxisProperties) axisChart
066: .getAxisProperties().getYAxisProperties();
067: IDataSeries iDataSeries = (IDataSeries) axisChart
068: .getIAxisDataSeries();
069:
070: float xPosition = axisChart.getXAxis().getTickStart();
071: float yPosition;
072:
073: //---when centering the shapes on the points, need x and y offset to do this
074: double[] cornerXOffset = new double[iAxisChartDataSet
075: .getNumberOfDataSets()];
076: double[] cornerYOffset = new double[iAxisChartDataSet
077: .getNumberOfDataSets()];
078:
079: //---get the original transform so can reset it.
080: AffineTransform affineTransform = g2d.getTransform();
081:
082: Rectangle2D rectangle;
083:
084: //LOOP
085: //---pre-compute the dimensions of each Shape so do not do it in loop.
086: for (int i = 0; i < iAxisChartDataSet.getNumberOfDataSets(); i++) {
087: rectangle = pointChartProperties.getShape(i).getBounds2D();
088: cornerXOffset[i] = rectangle.getWidth() / 2;
089: cornerYOffset[i] = rectangle.getHeight() / 2;
090: }
091:
092: g2d.setStroke(PointChartProperties.DEFAULT_POINT_BORDER_STROKE);
093:
094: //LOOP
095: //---for each item in data set...
096: for (int i = 0; i < iAxisChartDataSet.getNumberOfDataItems(); i++) {
097: //LOOP
098: //---for each data set
099: for (int dataSetIndex = 0; dataSetIndex < iAxisChartDataSet
100: .getNumberOfDataSets(); dataSetIndex++) {
101: //---if the value is NaN, do not display a value
102: if (Double.isNaN(iAxisChartDataSet.getValue(
103: dataSetIndex, i))) {
104: continue;
105: }
106:
107: yPosition = axisChart.getYAxis().computeAxisCoordinate(
108: axisChart.getYAxis().getOrigin(),
109: iAxisChartDataSet.getValue(dataSetIndex, i),
110: axisChart.getYAxis().getScaleCalculator()
111: .getMinValue());
112:
113: //---if we are generating an ImageMap, store the image coordinates
114: if (axisChart.getGenerateImageMapFlag()) {
115: String label;
116: if (axisChart.getXAxis().getAxisLabelsGroup() != null) {
117: label = axisChart.getXAxis()
118: .getAxisLabelsGroup().getTextTag(i)
119: .getText();
120: } else {
121: label = null;
122: }
123:
124: axisChart
125: .getImageMap()
126: .addImageMapArea(
127: new CircleMapArea(
128: xPosition,
129: yPosition,
130: iAxisChartDataSet.getValue(
131: dataSetIndex, i),
132: label,
133: iAxisChartDataSet
134: .getLegendLabel(dataSetIndex)));
135: }
136:
137: //---translate the Shape into position.
138: g2d.translate(xPosition - cornerXOffset[dataSetIndex],
139: yPosition - cornerYOffset[dataSetIndex]);
140:
141: g2d.setPaint(iAxisChartDataSet.getPaint(dataSetIndex));
142:
143: //---render the point
144: if (pointChartProperties
145: .getFillPointsFlag(dataSetIndex)) {
146: //---fill the point
147: g2d.fill(pointChartProperties
148: .getShape(dataSetIndex));
149:
150: //---if we are filling the points, see if we should outline the Shape
151: if (pointChartProperties
152: .getPointOutlinePaints(dataSetIndex) != null) {
153: g2d.setPaint(pointChartProperties
154: .getPointOutlinePaints(dataSetIndex));
155: g2d.draw(pointChartProperties
156: .getShape(dataSetIndex));
157: }
158: } else {
159: //---if we are NOT filling the points, use the Paint specified with the DataSet to outline.
160: g2d.draw(pointChartProperties
161: .getShape(dataSetIndex));
162: }
163:
164: g2d.setTransform(affineTransform);
165: }
166:
167: //---move right to the next x-axis scale item
168: xPosition += axisChart.getXAxis().getScalePixelWidth();
169: }
170: }
171: }
|