/******************************************************************************* * Copyright (c) 2008-2011 SWTChart project. All rights reserved. * * This code is distributed under the terms of the Eclipse Public License v1.0 * which is available at http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.swtchart.internal.axis; import java.text.Format; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Rectangle; import org.swtchart.Chart; import org.swtchart.IAxisTick; import org.swtchart.IAxis.Position; /** * An axis tick. */ public class AxisTick implements IAxisTick { /** the chart */ private Chart chart; /** the axis */ private Axis axis; /** the axis tick labels */ private AxisTickLabels axisTickLabels; /** the axis tick marks */ private AxisTickMarks axisTickMarks; /** true if tick is visible */ private boolean isVisible; /** the tick mark step hint */ private int tickMarkStepHint; /** the tick label angle in degree */ private int tickLabelAngle; /** the default tick mark step hint */ private static final int DEFAULT_TICK_MARK_STEP_HINT = 64; /** * Constructor. * * @param chart * the chart * @param axis * the axis */ protected AxisTick(Chart chart, Axis axis) { this.chart = chart; this.axis = axis; axisTickLabels = new AxisTickLabels(chart, axis); axisTickMarks = new AxisTickMarks(chart, axis); isVisible = true; tickLabelAngle = 0; tickMarkStepHint = DEFAULT_TICK_MARK_STEP_HINT; } /** * Gets the axis tick marks. * * @return the axis tick marks */ public AxisTickMarks getAxisTickMarks() { return axisTickMarks; } /** * Gets the axis tick labels. * * @return the axis tick labels */ public AxisTickLabels getAxisTickLabels() { return axisTickLabels; } /* * @see IAxisTick#setForeground(Color) */ public void setForeground(Color color) { if (color != null && color.isDisposed()) { SWT.error(SWT.ERROR_INVALID_ARGUMENT); } axisTickMarks.setForeground(color); axisTickLabels.setForeground(color); } /* * @see IAxisTick#getForeground() */ public Color getForeground() { return axisTickMarks.getForeground(); } /* * @see IAxisTick#setFont(Font) */ public void setFont(Font font) { if (font != null && font.isDisposed()) { SWT.error(SWT.ERROR_INVALID_ARGUMENT); } axisTickLabels.setFont(font); chart.updateLayout(); } /* * @see IAxisTick#getFont() */ public Font getFont() { return axisTickLabels.getFont(); } /* * @see IAxisTick#isVisible() */ public boolean isVisible() { return isVisible; } /* * @see IAxisTick#setVisible(boolean) */ public void setVisible(boolean isVisible) { this.isVisible = isVisible; chart.updateLayout(); } /* * @see IAxisTick#getTickMarkStepHint() */ public int getTickMarkStepHint() { return tickMarkStepHint; } /* * @see IAxisTick#setTickMarkStepHint(int) */ public void setTickMarkStepHint(int tickMarkStepHint) { if (tickMarkStepHint < MIN_GRID_STEP_HINT) { this.tickMarkStepHint = DEFAULT_TICK_MARK_STEP_HINT; } else { this.tickMarkStepHint = tickMarkStepHint; } chart.updateLayout(); } /* * @see IAxisTick#getTickLabelAngle() */ public int getTickLabelAngle() { return tickLabelAngle; } /* * @see IAxisTick#setTickLabelAngle(int) */ public void setTickLabelAngle(int angle) { if (angle < 0 || 90 < angle) { SWT.error(SWT.ERROR_INVALID_ARGUMENT); } if (tickLabelAngle != angle) { tickLabelAngle = angle; chart.updateLayout(); } } /* * @see IAxisTick#setFormat(Format) */ public void setFormat(Format format) { axisTickLabels.setFormat(format); chart.updateLayout(); } /* * @see IAxisTick#getFormat() */ public Format getFormat() { return axisTickLabels.getFormat(); } /* * @see IAxisTick#getBounds() */ public Rectangle getBounds() { Rectangle r1 = axisTickMarks.getBounds(); Rectangle r2 = axisTickLabels.getBounds(); Position position = axis.getPosition(); if (position == Position.Primary && axis.isHorizontalAxis()) { return new Rectangle(r1.x, r1.y, r1.width, r1.height + r2.height); } else if (position == Position.Secondary && axis.isHorizontalAxis()) { return new Rectangle(r1.x, r2.y, r1.width, r1.height + r2.height); } else if (position == Position.Primary && !axis.isHorizontalAxis()) { return new Rectangle(r2.x, r1.y, r1.width + r2.width, r1.height); } else if (position == Position.Secondary && !axis.isHorizontalAxis()) { return new Rectangle(r1.x, r1.y, r1.width + r2.width, r1.height); } else { throw new IllegalStateException("unknown axis position"); } } /** * Updates the tick around per 64 pixel. * * @param length * the axis length */ protected void updateTick(int length) { if (length <= 0) { axisTickLabels.update(1); } else { axisTickLabels.update(length); } } /** * Updates the tick layout. */ protected void updateLayoutData() { axisTickLabels.updateLayoutData(); axisTickMarks.updateLayoutData(); } }