/*******************************************************************************
* Copyright (c) 2008-2009 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;
}
}