001/* =========================================================== 002 * JFreeChart : a free chart library for the Java(tm) platform 003 * =========================================================== 004 * 005 * (C) Copyright 2000-2013, 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 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. 025 * Other names may be trademarks of their respective owners.] 026 * 027 * ----------------- 028 * NumberAxis3D.java 029 * ----------------- 030 * (C) Copyright 2001-2009, by Serge V. Grachov and Contributors. 031 * 032 * Original Author: Serge V. Grachov; 033 * Contributor(s): David Gilbert (for Object Refinery Limited); 034 * Jonathan Nash; 035 * Richard Atkinson; 036 * Tin Luu; 037 * 038 * Changes 039 * ------- 040 * 31-Oct-2001 : Version 1 contributed by Serge V. Grachov (DG); 041 * 23-Nov-2001 : Overhauled auto tick unit code for all axes (DG); 042 * 12-Dec-2001 : Minor change due to grid lines bug fix (DG); 043 * 08-Jan-2002 : Added flag allowing the axis to be 'inverted'. That is, run 044 * from positive to negative. Added default values to 045 * constructors (DG); 046 * 16-Jan-2002 : Added an optional crosshair, based on the implementation by 047 * Jonathan Nash (DG); 048 * 25-Feb-2002 : Updated constructors for new autoRangeStickyZero flag (DG); 049 * 19-Apr-2002 : drawVerticalString() is now drawRotatedString() in 050 * RefineryUtilities (DG); 051 * 25-Jun-2002 : Removed redundant import (DG); 052 * 25-Jul-2002 : Changed order of parameters in ValueAxis constructor (DG); 053 * 06-Aug-2002 : Modified draw method to not draw axis label if label is empty 054 * String (RA); 055 * 05-Sep-2002 : Updated constructor for changes in the Axis class, and changed 056 * draw method to observe tickMarkPaint (DG); 057 * 22-Sep-2002 : Fixed errors reported by Checkstyle (DG); 058 * 08-Nov-2002 : Moved to new package com.jrefinery.chart.axis (DG); 059 * 20-Jan-2003 : Removed unnecessary constructors (DG); 060 * 26-Mar-2003 : Implemented Serializable (DG); 061 * 13-May-2003 : Merged HorizontalNumberAxis3D and VerticalNumberAxis3D (DG); 062 * 21-Aug-2003 : Updated draw() method signature (DG); 063 * 07-Nov-2003 : Modified refreshTicks method signature (DG); 064 * ------------- JFREECHART 1.0.x --------------------------------------------- 065 * 18-Jan-2006 : Fixed bug 1408904 (axis assumes CategoryPlot) (DG): 066 * 16-Apr-2009 : Changed axis line visibility default (DG); 067 * 01-Aug-2013 : Added attributedLabel override to support superscripts, 068 * subscripts and more (DG); * 069 */ 070 071package org.jfree.chart.axis; 072 073import java.awt.Graphics2D; 074import java.awt.geom.Rectangle2D; 075import java.io.Serializable; 076import java.util.List; 077 078import org.jfree.chart.Effect3D; 079import org.jfree.chart.plot.CategoryPlot; 080import org.jfree.chart.plot.Plot; 081import org.jfree.chart.plot.PlotRenderingInfo; 082import org.jfree.chart.renderer.category.CategoryItemRenderer; 083import org.jfree.ui.RectangleEdge; 084 085/** 086 * A standard linear value axis with a 3D effect corresponding to the 087 * offset specified by some renderers. 088 */ 089public class NumberAxis3D extends NumberAxis implements Serializable { 090 091 /** For serialization. */ 092 private static final long serialVersionUID = -1790205852569123512L; 093 094 /** 095 * Default constructor. 096 */ 097 public NumberAxis3D() { 098 this(null); 099 } 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 } 109 110 /** 111 * Draws the axis on a Java 2D graphics device (such as the screen or a 112 * printer). 113 * 114 * @param g2 the graphics device. 115 * @param cursor the cursor. 116 * @param plotArea the area for drawing the axes and data. 117 * @param dataArea the area for drawing the data (a subset of the 118 * plotArea). 119 * @param edge the axis location. 120 * @param plotState collects information about the plot (<code>null</code> 121 * permitted). 122 * 123 * @return The updated cursor value. 124 */ 125 @Override 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 if (getAttributedLabel() != null) { 173 info = drawAttributedLabel(getAttributedLabel(), g2, plotArea, 174 dataArea, edge, info); 175 } else { 176 info = drawLabel(getLabel(), g2, plotArea, dataArea, edge, info); 177 } 178 return info; 179 180 } 181 182}