/*******************************************************************************
* 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;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Display;
import org.swtchart.IGrid;
import org.swtchart.LineStyle;
import org.swtchart.internal.axis.Axis;
/**
* A grid.
*/
public class Grid implements IGrid
{
/** the axis */
private Axis axis;
/** the grid color */
private Color color;
/** the visibility state */
private boolean isVisible;
/** the line style */
private LineStyle lineStyle;
/** the line width */
private final static int LINE_WIDTH = 1;
/** the default style */
private final static LineStyle DEFAULT_STYLE = LineStyle.DOT;
/** the default color */
private final static int DEFAULT_FOREGROUND = SWT.COLOR_GRAY;
/**
* Constructor.
*
* @param axis
* the axis
*/
public Grid ( Axis axis )
{
this.axis = axis;
color = Display.getDefault ().getSystemColor ( DEFAULT_FOREGROUND );
lineStyle = DEFAULT_STYLE;
isVisible = true;
}
/*
* @see IGrid#getForeground()
*/
public Color getForeground ()
{
if ( color.isDisposed () )
{
color = Display.getDefault ().getSystemColor ( DEFAULT_FOREGROUND );
}
return color;
}
/*
* @see IGrid#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_FOREGROUND );
}
else
{
this.color = color;
}
}
/*
* @see IGrid#getStyle()
*/
public LineStyle getStyle ()
{
return lineStyle;
}
/*
* @see IGrid#setStyle(LineStyle)
*/
public void setStyle ( LineStyle style )
{
if ( style == null )
{
this.lineStyle = DEFAULT_STYLE;
}
else
{
this.lineStyle = style;
}
}
/**
* Draws grid.
*
* @param gc
* the graphics context
* @param width
* the width to draw grid
* @param height
* the height to draw grid
*/
protected void draw ( GC gc, int width, int height )
{
if ( !isVisible || lineStyle.equals ( LineStyle.NONE ) )
{
return;
}
int xWidth;
if ( axis.isHorizontalAxis () )
{
xWidth = width;
}
else
{
xWidth = height;
}
gc.setForeground ( getForeground () );
ArrayList<Integer> tickLabelPosition = axis.getTick ().getAxisTickLabels ().getTickLabelPositions ();
gc.setLineStyle ( Util.getIndexDefinedInSWT ( lineStyle ) );
if ( axis.isValidCategoryAxis () )
{
int step = 0;
if ( tickLabelPosition.size () > 1 )
{
step = tickLabelPosition.get ( 1 ).intValue () - tickLabelPosition.get ( 0 ).intValue ();
}
else
{
step = xWidth;
}
int x = (int) ( tickLabelPosition.get ( 0 ).intValue () - step / 2d );
for ( int i = 0; i < tickLabelPosition.size () + 1; i++ )
{
x += step;
if ( x >= xWidth )
{
continue;
}
if ( axis.isHorizontalAxis () )
{
gc.drawLine ( x, LINE_WIDTH, x, height - LINE_WIDTH );
}
else
{
gc.drawLine ( LINE_WIDTH, x, width - LINE_WIDTH, x );
}
}
}
else
{
for ( int i = 0; i < tickLabelPosition.size (); i++ )
{
int x = tickLabelPosition.get ( i ).intValue ();
if ( x >= xWidth )
{
continue;
}
if ( axis.isHorizontalAxis () )
{
gc.drawLine ( x, LINE_WIDTH, x, height - LINE_WIDTH );
}
else
{
gc.drawLine ( LINE_WIDTH, height - 1 - x, width - LINE_WIDTH, height - 1 - x );
}
}
}
}
}