/*
* AxisTitlePainterDafault.java of project jchart2d, an IAxisTitlePainter
* that will render titles in a default way while adapting to x or y
* axis use.
* Copyright 2007 - 2011 (C) Achim Westermann, created on 04.08.2007 19:40:52.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA*
* If you modify or optimize the code in a useful way please let me know.
* Achim.Westermann@gmx.de
*
*/
package info.monitorenter.gui.chart.axistitlepainters;
import info.monitorenter.gui.chart.Chart2D;
import info.monitorenter.gui.chart.IAxis;
import info.monitorenter.gui.chart.IAxisTitlePainter;
import info.monitorenter.util.StringUtil;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
/**
* An <code>{@link IAxisTitlePainter}</code> implementation that will render
* titles in a default way while adapting to x or y axis use.
* <p>
* For x axis the title will be displayed centered below the axis. For y axis
* the title will be displayed rotated by 90 degrees centered left of the axis.
* <p>
*
* The y axis rotation will only be performed when the given
* <code>{@link Graphics}</code> Object is of type
* <code>{@link Graphics2D}</code>.
* <p>
*
* @author <a href="mailto:Achim.Westermann@gmx.de">Achim Westermann</a>
* @version $Revision: 1.14 $
*/
public class AxisTitlePainterDefault implements IAxisTitlePainter {
/** Generated <code>serialVersionUID</code>. */
private static final long serialVersionUID = -8076180259242501703L;
/**
* Defcon.
* <p>
*/
public AxisTitlePainterDefault() {
super();
}
/**
* @see info.monitorenter.gui.chart.IAxisTitlePainter#getHeight(info.monitorenter.gui.chart.IAxis,
* java.awt.Graphics)
*/
public int getHeight(final IAxis<?> axis, final Graphics g2d) {
int result = 0;
IAxis.AxisTitle axisTitle = axis.getAxisTitle();
String title = axisTitle.getTitle();
if (!StringUtil.isEmpty(title)) {
Rectangle2D bounds = g2d.getFontMetrics().getStringBounds(title, g2d);
int dimension = axis.getDimension();
switch (dimension) {
case Chart2D.X:
result = (int) bounds.getHeight();
break;
case Chart2D.Y:
boolean supportsRotation = g2d instanceof Graphics2D;
if (supportsRotation) {
// for y it's rotated by 90 degrees:
result = (int) bounds.getWidth();
} else {
result = (int) bounds.getHeight();
}
break;
default:
throw new IllegalArgumentException(
"Given axis.getDimension() is neither Chart2D.X nor Chart2D.Y!");
}
}
return result;
}
/**
* @see info.monitorenter.gui.chart.IAxisTitlePainter#getWidth(info.monitorenter.gui.chart.IAxis,
* java.awt.Graphics)
*/
public int getWidth(final IAxis<?> axis, final Graphics g2d) {
int result = 0;
IAxis.AxisTitle axisTitle = axis.getAxisTitle();
String title = axisTitle.getTitle();
if (!StringUtil.isEmpty(title)) {
// incorporation of our font if there:
Font backUpFont = g2d.getFont();
Font titleFont = axisTitle.getTitleFont();
if (titleFont != null) {
g2d.setFont(titleFont);
}
Rectangle2D bounds = g2d.getFontMetrics().getStringBounds(title, g2d);
int dimension = axis.getDimension();
switch (dimension) {
case Chart2D.X:
result = (int) bounds.getWidth();
break;
case Chart2D.Y:
boolean supportsRotation = g2d instanceof Graphics2D;
if (supportsRotation) {
// for y it's rotated by 90 degrees:
result = (int) bounds.getHeight();
} else {
result = (int) bounds.getWidth();
}
break;
default:
throw new IllegalArgumentException(
"Given axis.getDimension() is neither Chart2D.X nor Chart2D.Y!");
}
// resetting original font if it was changed:
if (titleFont != null) {
g2d.setFont(backUpFont);
}
}
return result;
}
/**
* TODO: This will not work for multiple axis in the same dimension and
* position (overwriting titles)!
*
* @see info.monitorenter.gui.chart.IAxisTitlePainter#paintTitle(info.monitorenter.gui.chart.IAxis,
* java.awt.Graphics)
*/
public void paintTitle(final IAxis<?> axis, final Graphics g) {
IAxis.AxisTitle axisTitle = axis.getAxisTitle();
String title = axisTitle.getTitle();
Rectangle2D bounds;
// manage the title font if there:
Font titleFont = axisTitle.getTitleFont();
Font backUpFont = g.getFont();
Color titleColor = axisTitle.getTitleColor();
Color backUpColor = g.getColor();
if (titleFont != null) {
g.setFont(titleFont);
}
if (titleColor != backUpColor && titleColor != null) {
g.setColor(titleColor);
}
bounds = g.getFontMetrics().getStringBounds(title, g);
Chart2D chart = axis.getAccessor().getChart();
int dimension = axis.getDimension();
int position = axis.getAxisPosition();
switch (dimension) {
case Chart2D.X:
switch (position) {
case Chart2D.CHART_POSITION_BOTTOM: {
int startX = chart.getXChartStart();
int endX = chart.getXChartEnd();
double xspace = bounds.getWidth();
int titleStartX = (int) ((endX - startX) / 2.0 - xspace / 2.0);
g.drawString(title, titleStartX, axis.getPixelYBottom() - 4);
break;
}
case Chart2D.CHART_POSITION_TOP: {
int startX = chart.getXChartStart();
int endX = chart.getXChartEnd();
double xspace = bounds.getWidth();
int titleStartX = (int) ((endX - startX) / 2.0 - xspace / 2.0);
g.drawString(title, titleStartX, axis.getPixelYTop()
+ chart.getFontMetrics(chart.getFont()).getHeight());
break;
}
default: {
// nop
}
}
break;
case Chart2D.Y:
switch (position) {
case (Chart2D.CHART_POSITION_LEFT): {
// check if rotation is available: this is the case for normal
// screen painting, but for printing it is not available!
boolean supportsRotation = g instanceof Graphics2D;
if (supportsRotation) {
Graphics2D g2d = (Graphics2D) g;
int startY = chart.getYChartStart();
int endY = chart.getYChartEnd();
double yspace = bounds.getWidth();
int titleStartY = (int) ((startY - endY) / 2.0 + yspace / 2.0);
if(titleStartY <= 0){
System.err.println("titleStartY below or equal to zero: "+titleStartY);
}
int titleStartX = axis.getPixelXLeft() + chart.getFontMetrics(chart.getFont()).getHeight();
if(titleStartX <= 0){
System.err.println("titleStartX below or equal to zero: "+titleStartX);
}
// store former transform for later restore:
AffineTransform tr = g2d.getTransform();
AffineTransform at = g2d.getDeviceConfiguration().getDefaultTransform();
at.translate(
titleStartX,
titleStartY);
at.rotate(-Math.PI / 2);
g2d.setTransform(at);
g2d.drawString(title, 0, 0);
g2d.setTransform(tr);
} else {
// no rotation: display in vertical middle:
int startY = chart.getYChartStart();
int endY = chart.getYChartEnd();
double yspace = bounds.getWidth();
int titleStartY = (int) ((startY - endY) / 2.0 + yspace / 2.0);
int titleStartX = axis.getPixelXLeft()
+ chart.getFontMetrics(chart.getFont()).getHeight();
g.drawString(title, titleStartX, titleStartY);
}
break;
}
case (Chart2D.CHART_POSITION_RIGHT): {
boolean supportsRotation = g instanceof Graphics2D;
if (supportsRotation) {
Graphics2D g2d = (Graphics2D) g;
int startY = chart.getYChartStart();
int endY = chart.getYChartEnd();
double yspace = bounds.getWidth();
int titleStartY = (int) ((startY - endY) / 2.0 + yspace / 2.0);
int chartLabelFontWidth = chart.getFontMetrics(chart.getFont()).charWidth('0');
int xShiftPosition = chart.getAxisTickPainter().getMajorTickLength();
xShiftPosition += axis.getFormatter().getMaxAmountChars() * chartLabelFontWidth;
AffineTransform tr = g2d.getTransform();
AffineTransform at = g2d.getDeviceConfiguration().getDefaultTransform();
at.translate(chart.getXChartEnd() + xShiftPosition, titleStartY);
at.rotate(-Math.PI / 2);
g2d.setTransform(at);
g2d.drawString(title, 0, 0);
g2d.setTransform(tr);
} else {
int startY = chart.getYChartStart();
int endY = chart.getYChartEnd();
double yspace = bounds.getWidth();
int titleStartY = (int) ((startY - endY) / 2.0 + yspace / 2.0);
int chartLabelFontWidth = chart.getFontMetrics(chart.getFont()).charWidth('0');
int xShiftPosition = chart.getAxisTickPainter().getMajorTickLength();
xShiftPosition += axis.getFormatter().getMaxAmountChars() * chartLabelFontWidth;
int titleStartX = xShiftPosition + chart.getXChartEnd();
g.drawString(title, titleStartX, titleStartY);
}
break;
}
default: {
// nop
}
}
break;
default:
throw new IllegalArgumentException(
"Given axis.getDimension() is neither Chart2D.X nor Chart2D.Y!");
}
// resetting original font if it was changed:
if (titleFont != null) {
g.setFont(backUpFont);
}
if (titleColor != backUpColor && titleColor != null) {
g.setColor(backUpColor);
}
}
}