Source for org.jfree.chart.axis.NumberAxis3D

   1: /* ===========================================================
   2:  * JFreeChart : a free chart library for the Java(tm) platform
   3:  * ===========================================================
   4:  *
   5:  * (C) Copyright 2000-2006, by Object Refinery Limited and Contributors.
   6:  *
   7:  * Project Info:  http://www.jfree.org/jfreechart/index.html
   8:  *
   9:  * This library is free software; you can redistribute it and/or modify it 
  10:  * under the terms of the GNU Lesser General Public License as published by 
  11:  * the Free Software Foundation; either version 2.1 of the License, or 
  12:  * (at your option) any later version.
  13:  *
  14:  * This library is distributed in the hope that it will be useful, but 
  15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  16:  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
  17:  * License for more details.
  18:  *
  19:  * You should have received a copy of the GNU Lesser General Public
  20:  * License along with this library; if not, write to the Free Software
  21:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
  22:  * USA.  
  23:  *
  24:  * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
  25:  * in the United States and other countries.]
  26:  *
  27:  * -----------------
  28:  * NumberAxis3D.java
  29:  * -----------------
  30:  * (C) Copyright 2001-2006, by Serge V. Grachov and Contributors.
  31:  *
  32:  * Original Author:  Serge V. Grachov;
  33:  * Contributor(s):   David Gilbert (for Object Refinery Limited);
  34:  *                   Jonathan Nash;
  35:  *                   Richard Atkinson;
  36:  *                   Tin Luu;
  37:  *
  38:  * $Id: NumberAxis3D.java,v 1.5.2.3 2006/12/07 15:34:16 mungady Exp $
  39:  *
  40:  * Changes
  41:  * -------
  42:  * 31-Oct-2001 : Version 1 contributed by Serge V. Grachov (DG);
  43:  * 23-Nov-2001 : Overhauled auto tick unit code for all axes (DG);
  44:  * 12-Dec-2001 : Minor change due to grid lines bug fix (DG);
  45:  * 08-Jan-2002 : Added flag allowing the axis to be 'inverted'.  That is, run 
  46:  *               from positive to negative.  Added default values to 
  47:  *               constructors (DG);
  48:  * 16-Jan-2002 : Added an optional crosshair, based on the implementation by 
  49:  *               Jonathan Nash (DG);
  50:  * 25-Feb-2002 : Updated constructors for new autoRangeStickyZero flag (DG);
  51:  * 19-Apr-2002 : drawVerticalString() is now drawRotatedString() in 
  52:  *               RefineryUtilities (DG);
  53:  * 25-Jun-2002 : Removed redundant import (DG);
  54:  * 25-Jul-2002 : Changed order of parameters in ValueAxis constructor (DG);
  55:  * 06-Aug-2002 : Modified draw method to not draw axis label if label is empty 
  56:  *               String (RA);
  57:  * 05-Sep-2002 : Updated constructor for changes in the Axis class, and changed
  58:  *               draw method to observe tickMarkPaint (DG);
  59:  * 22-Sep-2002 : Fixed errors reported by Checkstyle (DG);
  60:  * 08-Nov-2002 : Moved to new package com.jrefinery.chart.axis (DG);
  61:  * 20-Jan-2003 : Removed unnecessary constructors (DG);
  62:  * 26-Mar-2003 : Implemented Serializable (DG);
  63:  * 13-May-2003 : Merged HorizontalNumberAxis3D and VerticalNumberAxis3D (DG);
  64:  * 21-Aug-2003 : Updated draw() method signature (DG);
  65:  * 07-Nov-2003 : Modified refreshTicks method signature (DG);
  66:  * ------------- JFREECHART 1.0.x ---------------------------------------------
  67:  * 18-Jan-2006 : Fixed bug 1408904 (axis assumes CategoryPlot) (DG):
  68:  *
  69:  */
  70: 
  71: package org.jfree.chart.axis;
  72: 
  73: import java.awt.Graphics2D;
  74: import java.awt.geom.Rectangle2D;
  75: import java.io.Serializable;
  76: import java.util.List;
  77: 
  78: import org.jfree.chart.Effect3D;
  79: import org.jfree.chart.plot.CategoryPlot;
  80: import org.jfree.chart.plot.Plot;
  81: import org.jfree.chart.plot.PlotRenderingInfo;
  82: import org.jfree.chart.renderer.category.CategoryItemRenderer;
  83: import org.jfree.ui.RectangleEdge;
  84: 
  85: /**
  86:  * A standard linear value axis with a 3D effect corresponding to the
  87:  * offset specified by some renderers.
  88:  */
  89: public class NumberAxis3D extends NumberAxis implements Serializable {
  90: 
  91:     /** For serialization. */
  92:     private static final long serialVersionUID = -1790205852569123512L;
  93:     
  94:     /**
  95:      * Default constructor.
  96:      */
  97:     public NumberAxis3D() {
  98:         this(null);    
  99:     }
 100:     
 101:     /**
 102:      * Constructs a new axis.
 103:      *
 104:      * @param label  the axis label (<code>null</code> permitted).
 105:      */
 106:     public NumberAxis3D(String label) {
 107:         super(label);
 108:         setAxisLineVisible(false);
 109:     }
 110: 
 111:     /**
 112:      * Draws the axis on a Java 2D graphics device (such as the screen or a 
 113:      * printer).
 114:      *
 115:      * @param g2  the graphics device.
 116:      * @param cursor  the cursor.
 117:      * @param plotArea  the area for drawing the axes and data.
 118:      * @param dataArea  the area for drawing the data (a subset of the 
 119:      *                  plotArea).
 120:      * @param edge  the axis location.
 121:      * @param plotState  collects information about the plot (<code>null</code>
 122:      *                   permitted).
 123:      * 
 124:      * @return The updated cursor value.
 125:      */
 126:     public AxisState draw(Graphics2D g2, double cursor, Rectangle2D plotArea, 
 127:             Rectangle2D dataArea, RectangleEdge edge, 
 128:             PlotRenderingInfo plotState) {
 129: 
 130:         // if the axis is not visible, don't draw it...
 131:         if (!isVisible()) {
 132:             AxisState state = new AxisState(cursor);
 133:             // even though the axis is not visible, we need ticks for the 
 134:             // gridlines...
 135:             List ticks = refreshTicks(g2, state, dataArea, edge); 
 136:             state.setTicks(ticks);
 137:             return state;
 138:         }
 139: 
 140:         // calculate the adjusted data area taking into account the 3D effect...
 141:         double xOffset = 0.0;
 142:         double yOffset = 0.0;
 143:         Plot plot = getPlot();
 144:         if (plot instanceof CategoryPlot) {
 145:             CategoryPlot cp = (CategoryPlot) plot;
 146:             CategoryItemRenderer r = cp.getRenderer();
 147:             if (r instanceof Effect3D) {
 148:                 Effect3D e3D = (Effect3D) r;
 149:                 xOffset = e3D.getXOffset();
 150:                 yOffset = e3D.getYOffset();
 151:             }
 152:         }
 153: 
 154:         double adjustedX = dataArea.getMinX();
 155:         double adjustedY = dataArea.getMinY();
 156:         double adjustedW = dataArea.getWidth() - xOffset;
 157:         double adjustedH = dataArea.getHeight() - yOffset;
 158: 
 159:         if (edge == RectangleEdge.LEFT || edge == RectangleEdge.BOTTOM) {
 160:             adjustedY += yOffset;
 161:         }
 162:         else if (edge == RectangleEdge.RIGHT || edge == RectangleEdge.TOP) {
 163:             adjustedX += xOffset;
 164:         }
 165:         Rectangle2D adjustedDataArea = new Rectangle2D.Double(adjustedX, 
 166:                 adjustedY, adjustedW, adjustedH);
 167: 
 168:         // draw the tick marks and labels...
 169:         AxisState info = drawTickMarksAndLabels(g2, cursor, plotArea, 
 170:                 adjustedDataArea, edge);
 171:        
 172:         // draw the axis label...
 173:         info = drawLabel(getLabel(), g2, plotArea, dataArea, edge, info);
 174: 
 175:         return info;
 176:         
 177:     }
 178: 
 179: }