/******************************************************************************* * Copyright (c) 2013 Luigi Sgro. All rights reserved. This * program and the accompanying materials are made available under the terms of * the Eclipse Public License v1.0 which accompanies this distribution, and is * available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Luigi Sgro - initial API and implementation ******************************************************************************/ package com.quantcomponents.chart.series; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Date; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Display; import com.quantcomponents.chart.IAxis; import com.quantcomponents.chart.IChartMetrics; import com.quantcomponents.chart.IDrawable; import com.quantcomponents.chart.IMark; /** * Vertical ruler for double charts indexed by {@link java.util.Date} */ public class DoubleRulerY implements IDrawable<Date, Double> { private static final Color DEFAULT_COLOR = Display.getDefault().getSystemColor(SWT.COLOR_YELLOW); private static final Color DEFAULT_GRID_COLOR = Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY); private static final int DEFAULT_GRID_STYLE = SWT.LINE_SOLID; private static final int DEFAULT_LABEL_PADDING = 5; private final NumberFormat nf = new DecimalFormat(); private volatile Color color = DEFAULT_COLOR; private volatile Color gridColor = DEFAULT_GRID_COLOR; private volatile int gridStyle = DEFAULT_GRID_STYLE; private volatile int labelLeftPadding = DEFAULT_LABEL_PADDING; @Override public void draw(IChartMetrics<Date, Double> metrics, GC gc) { if (metrics == null) { return; } IAxis<Date> xAxis = metrics.xAxis(); IAxis<Double> yAxis = metrics.yAxis(); int yPixelLow = yAxis.getPixelLow(); int yPixelHigh = yAxis.getPixelHigh(); int xPixelLow = xAxis.getPixelLow(); int xPixelHigh = xAxis.getPixelHigh(); int halfHeight = gc.getFontMetrics().getHeight() / 2; nf.setMinimumFractionDigits((int) Math.ceil(-Math.log10(yAxis.baseMarkScale().getStepSize()))); for (IMark<Double> mark : yAxis.baseMarks()) { gc.setForeground(color); double value = mark.getValue(); int y = yAxis.calculatePixel(value); gc.drawString(nf.format(value), xPixelHigh + labelLeftPadding, y - halfHeight); gc.setForeground(gridColor); gc.setLineStyle(gridStyle); gc.drawLine(xPixelLow, y, xPixelHigh, y); } gc.drawLine(xPixelHigh, yPixelLow, xPixelHigh, yPixelHigh); } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } public Color getGridColor() { return gridColor; } public void setGridColor(Color gridColor) { this.gridColor = gridColor; } public int getGridStyle() { return gridStyle; } public void setGridStyle(int gridStyle) { this.gridStyle = gridStyle; } public int getLabelLeftPadding() { return labelLeftPadding; } public void setLabelLeftPadding(int labelLeftPadding) { this.labelLeftPadding = labelLeftPadding; } }