/*******************************************************************************
* 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;
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);
}
}
}
}
}