/******************************************************************************* * 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.series; import java.text.DecimalFormat; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Display; import org.swtchart.ISeriesLabel; import org.swtchart.internal.Util; /** * A series label. */ public class SeriesLabel implements ISeriesLabel { /** the visibility state of series label */ private boolean isVisible; /** the series label font */ protected Font font; /** the series label color */ protected Color color; /** the format for series label */ private String format; /** the formats for series labels */ private String[] formats; /** the default label color */ private static final int DEFAULT_COLOR = SWT.COLOR_BLACK; /** the default font */ private static final Font DEFAULT_FONT = Display.getDefault() .getSystemFont(); /** the default label format */ private static final String DEFAULT_FORMAT = "#.###########"; /** * Constructor. */ public SeriesLabel() { font = DEFAULT_FONT; color = Display.getDefault().getSystemColor(DEFAULT_COLOR); isVisible = false; format = DEFAULT_FORMAT; } /* * @see ISeriesLabel#getFormat() */ public String getFormat() { return format; } /* * @see ISeriesLabel#setFormat(String) */ public void setFormat(String format) { if (format == null) { this.format = DEFAULT_FORMAT; } else { this.format = format; } } /* * @see ISeriesLabel#getFormats() */ public String[] getFormats() { if (formats == null) { return null; } String[] copiedFormats = new String[formats.length]; System.arraycopy(formats, 0, copiedFormats, 0, formats.length); return copiedFormats; } /* * @see ISeriesLabel#setFormats(String[]) */ public void setFormats(String[] formats) { if (formats == null) { this.formats = null; return; } this.formats = new String[formats.length]; System.arraycopy(formats, 0, this.formats, 0, formats.length); } /* * @see ISeriesLabel#getForeground() */ public Color getForeground() { return color; } /* * @see ISeriesLabel#setForeground(Color) */ public void setForeground(Color color) { if (color != null && color.isDisposed()) { SWT.error(SWT.ERROR_INVALID_ARGUMENT); } if (color == null) { this.color = Display.getDefault().getSystemColor(DEFAULT_COLOR); } else { this.color = color; } } /* * @see ISeriesLabel#getFont() */ public Font getFont() { if (font.isDisposed()) { font = DEFAULT_FONT; } return font; } /* * @see ISeriesLabel#setFont(Font) */ public void setFont(Font font) { if (font != null && font.isDisposed()) { SWT.error(SWT.ERROR_INVALID_ARGUMENT); } if (font == null) { this.font = DEFAULT_FONT; } else { this.font = font; } } /* * @see ISeriesLabel#isVisible() */ public boolean isVisible() { return isVisible; } /* * @see ISeriesLabel#setVisible(boolean) */ public void setVisible(boolean visible) { this.isVisible = visible; } /** * Draws series label. * * @param gc * the GC object * @param h * the horizontal coordinate to draw label * @param v * the vertical coordinate to draw label * @param ySeriesValue * the Y series value * @param seriesIndex * the series index * @param alignment * the alignment of label position (SWT.CENTER or SWT.BOTTOM) */ protected void draw(GC gc, int h, int v, double ySeriesValue, int seriesIndex, int alignment) { if (!isVisible) { return; } gc.setForeground(color); gc.setFont(getFont()); // get format String format1 = format; if (formats != null && formats.length > seriesIndex) { format1 = formats[seriesIndex]; } if (format1 == null || format1.equals("")) { return; } // get text String text; if (isDecimalFormat(format1)) { text = new DecimalFormat(format1).format(ySeriesValue); } else { text = format1.replaceAll("'", ""); } // draw label if (alignment == SWT.CENTER) { Point p = Util.getExtentInGC(font, text); gc.drawString(text, (int) (h - p.x / 2d), (int) (v - p.y / 2d), true); } else if (alignment == SWT.BOTTOM) { gc.drawString(text, h, v, true); } } /** * Gets the state indicating if decimal format is given. * * @param text * the text to be checked * @return true if decimal format is given */ private boolean isDecimalFormat(String text) { StringBuilder nonEscapedPart = new StringBuilder(); String[] elements = text.split("'"); if (elements != null) { for (int i = 0; i < elements.length; i += 2) { nonEscapedPart.append(elements[i]); } } if (nonEscapedPart.indexOf("#") == -1 && nonEscapedPart.indexOf("0") == -1) { return false; } return true; } }