/** * * The MIT License * * Copyright (c) 2011 the original author or authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.googlecode.charts4j; import static com.googlecode.charts4j.collect.Preconditions.checkArgument; import static com.googlecode.charts4j.collect.Preconditions.checkNotNull; /** * Type for specifying axis styles. * * @author Julien Chastang (julien.c.chastang at gmail dot com) * @see AxisLabels * @see AxisLabelsFactory */ public final class AxisStyle implements Kloneable<AxisStyle> { /** Axis text color. */ private final Color textColor; /** Axis text font size. */ private final int fontSize; /** Axis text alignment relative to tick mark. */ private final AxisTextAlignment alignment; /** Are the tick marks drawn. */ private Boolean areTickMarksDrawn; /** The tick mark length. Can be negative. */ private Integer tickMarkLength; /** The tick mark color. */ private Color tickMarkColor; /** * @see #newAxisStyle(Color, int, AxisTextAlignment) */ AxisStyle(final Color textColor, final int fontSize, final AxisTextAlignment alignment) { this.textColor = textColor; this.fontSize = fontSize; this.alignment = alignment; } /** * Copy constructor. * * @param axisStyle * the axis style * * @return the axis style */ private AxisStyle (final AxisStyle axisStyle) { this(axisStyle.textColor, axisStyle.fontSize, axisStyle.alignment); this.areTickMarksDrawn = axisStyle.areTickMarksDrawn; this.tickMarkColor = axisStyle.tickMarkColor; this.tickMarkLength = axisStyle.tickMarkLength; } /** * {@inheritDoc} */ public AxisStyle klone() { return new AxisStyle(this); } /** * Get the text color. * * @return the text color */ public Color getTextColor() { return textColor; } /** * Get the text font size. * * @return the text fontSize */ public int getFontSize() { return fontSize; } /** * Get the text alignment with respect to the tick mark. * * @return the alignment */ public AxisTextAlignment getAlignment() { return alignment; } /** * Are the tick marks drawn? * * @return are the tick marks displayed? Can be null if it was never set. */ public Boolean drawTickMarks() { return areTickMarksDrawn; } /** * The developer can override default tick mark behavior with this method. * * @param drawTickMarks * Are the tick marks displayed? */ public void setDrawTickMarks(final boolean drawTickMarks) { this.areTickMarksDrawn = drawTickMarks; } /** * Get the tick mark length. Can be negative. * * @return the tickMarkLength */ public Integer getTickMarkLength() { return tickMarkLength; } /** * Set the tick mark length. Can be negative. Will also implicitly call * {@link #setDrawTickMarks(boolean)} with true. * * @param tickMarkLength * the tickMarkLength to set */ public void setTickMarkLength(final int tickMarkLength) { setDrawTickMarks(true); this.tickMarkLength = tickMarkLength; } /** * Get the tick mark color. * * @return the tickMarkColor */ public Color getTickMarkColor() { return tickMarkColor; } /** * Set the tick mark color. Will also implicitly call * {@link #setDrawTickMarks(boolean)} with true. * * @param tickMarkColor * the tickMarkColor to set */ public void setTickMarkColor(final Color tickMarkColor) { if (tickMarkColor != null) { setDrawTickMarks(true); this.tickMarkColor = tickMarkColor; } } /** * Define an axis style. * * @param textColor * color of text displayed along the axis. Cannot be null. * @param fontSize * font size of text displayed along the axis. Must be > 0. * @param alignment * alignment of text along the axis with respect to the axis tick * marks. Only works for horizontal axes. Cannot be null. * @return the new constructed axis style */ public static AxisStyle newAxisStyle(final Color textColor, final int fontSize, final AxisTextAlignment alignment) { checkNotNull(textColor, "color must not be null"); checkArgument(fontSize > 0, "fontsize must be > 0"); checkNotNull(alignment, "alignment must not be null"); return new AxisStyle(textColor, fontSize, alignment); } /** * Here is the deal with this very strange copy constructor. There is * currently a bug in the Google Chart API where the alignment is reversed * with respect to what is specified in the documentation: * http://code.google.com/apis/chart/labels.html#axis_styles. This method * simply swaps right and left axis text alignment. Note also that the * alignments are *correct* for the radar chart's concentric axis labels, so * there is no need for this adjustment with radar charts. For more * information, see the discussion here: * * http://groups.google.com/group/google-chart-api/browse_thread/thread/c70760a4437cf945/810fa2ef6dbddd1d?show_docid=810fa2ef6dbddd1d * * @param axisStyle * the axis style * * @return the axis style */ static AxisStyle correctAxisStyle(final AxisStyle axisStyle) { if (axisStyle == null) { return null; } final AxisStyle as; switch (axisStyle.alignment) { case RIGHT: as = newAxisStyle(axisStyle.textColor, axisStyle.fontSize, AxisTextAlignment.LEFT); break; case LEFT: as = newAxisStyle(axisStyle.textColor, axisStyle.fontSize, AxisTextAlignment.RIGHT); break; default: as = axisStyle.klone(); break; } as.areTickMarksDrawn = axisStyle.areTickMarksDrawn; as.tickMarkColor = axisStyle.tickMarkColor; as.tickMarkLength = axisStyle.tickMarkLength; return as; } }