/*******************************************************************************
 * Copyright (c) 2012 Laurent CARON. 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: 
 * Waldimiro Rossi - addRoundRectangle and addCircle methods
 * Laurent CARON (laurent.caron at gmail dot com) - initial API and implementation
 *******************************************************************************/
package org.mihalis.opal.utils;

import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Path;

/**
 * AdvancedPath, a Path object that contains extra paths.
 *
 * @see Path
 */
public class AdvancedPath extends Path {

	/**
	 * Contructor.
	 *
	 * @param device the device
	 */
	public AdvancedPath(final Device device) {
		super(device);
	}

	/**
	 * Adds to the receiver the circle specified by x, y, radius.
	 *
	 * @param x the x coordinate of the rectangle to add
	 * @param y the y coordinate of the rectangle to add
	 * @param radius the width of the radius
	 * @exception SWTException <ul>
	 *                <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been
	 *                disposed</li>
	 *                </ul>
	 */
	public void addCircle(final float x, final float y, final float radius) {
		if (this.isDisposed()) {
			SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
		}
		this.addArc(x, y, radius, radius, 0, 360);
	}

	/**
	 * Adds to the receiver the round-cornered rectangle specified by x, y, width and height.
	 * 
	 * @param x the x coordinate of the rectangle to add
	 * @param y the y coordinate of the rectangle to add
	 * @param width the width of the rectangle to add
	 * @param height the height of the rectangle to add
	 * @param arcWidth the width of the arc
	 * @param arcHeight the height of the arc
	 * @exception SWTException
	 * <ul>
	 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
	 * </ul>
	 */
	public void addRoundRectangle(final float x, final float y, final float width, final float height, final float arcWidth, final float arcHeight) {
		if (this.isDisposed()) {
			SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
		}

		// Top left corner
		this.cubicTo(x, y, x, y, x, y + arcHeight);
		this.cubicTo(x, y, x, y, x + arcWidth, y);

		// Top right corner
		this.cubicTo(x + width, y, x + width, y, x + width - arcWidth, y);
		this.cubicTo(x + width, y, x + width, y, x + width, y + arcHeight);

		// Bottom right corner
		this.cubicTo(x + width, y + height, x + width, y + height, x + width, y + height - arcHeight);
		this.cubicTo(x + width, y + height, x + width, y + height, x + width - arcWidth, y + height);

		// Bottom left corner
		this.cubicTo(x, y + height, x, y + height, x + arcWidth, y + height);
		this.cubicTo(x, y + height, x, y + height, x, y + height - arcHeight);
	}

	/**
	 * Adds to the receiver the rectangle specified by x, y, width and height.<br/>
	 * This rectangle is round-cornered on the left, and straight on the right.
	 * 
	 * @param x the x coordinate of the rectangle to add
	 * @param y the y coordinate of the rectangle to add
	 * @param width the width of the rectangle to add
	 * @param height the height of the rectangle to add
	 * @param arcWidth the width of the arc
	 * @param arcHeight the height of the arc
	 * @exception SWTException
	 * <ul>
	 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
	 * </ul>
	 */
	public void addRoundRectangleStraightRight(final float x, final float y, final float width, final float height, final float arcWidth, final float arcHeight) {
		if (this.isDisposed()) {
			SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
		}

		// Top left corner
		this.cubicTo(x, y, x, y, x, y + arcHeight);
		this.cubicTo(x, y, x, y, x + arcWidth, y);

		// Top right corner
		this.lineTo(x + width, y);

		// Bottom right corner
		this.lineTo(x + width, y + height);

		// Bottom left corner
		this.cubicTo(x, y + height, x, y + height, x + arcWidth, y + height);
		this.cubicTo(x, y + height, x, y + height, x, y + height - arcHeight);
	}

	/**
	 * Adds to the receiver the rectangle specified by x, y, width and height.<br/>
	 * This rectangle is round-cornered on the right, and straight on the left.
	 * 
	 * @param x the x coordinate of the rectangle to add
	 * @param y the y coordinate of the rectangle to add
	 * @param width the width of the rectangle to add
	 * @param height the height of the rectangle to add
	 * @param arcWidth the width of the arc
	 * @param arcHeight the height of the arc
	 * @exception SWTException
	 * <ul>
	 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
	 * </ul>
	 */
	public void addRoundRectangleStraightLeft(final float x, final float y, final float width, final float height, final float arcWidth, final float arcHeight) {
		if (this.isDisposed()) {
			SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
		}

		// Top left corner
		moveTo(x, y);
		lineTo(x + width - arcWidth, y);

		// Top right corner
		this.cubicTo(x + width, y, x + width, y, x + width - arcWidth, y);
		this.cubicTo(x + width, y, x + width, y, x + width, y + arcHeight);

		// Bottom right corner
		this.cubicTo(x + width, y + height, x + width, y + height, x + width, y + height - arcHeight);
		this.cubicTo(x + width, y + height, x + width, y + height, x + width - arcWidth, y + height);

		// Bottom left corner
		lineTo(x, y + height);
		lineTo(x, y);
	}
}