/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2005, 2010 SAP AG.
 * 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:
 *    SAP AG - initial API, implementation and documentation
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.graphiti.internal.datatypes.impl;

import org.eclipse.graphiti.datatypes.IAdvancedDimension;
import org.eclipse.graphiti.datatypes.IAdvancedLocation;
import org.eclipse.graphiti.datatypes.IDimension;
import org.eclipse.graphiti.datatypes.ILocation;
import org.eclipse.graphiti.datatypes.IRectangle;

/**
 * @noinstantiate This class is not intended to be instantiated by clients.
 * @noextend This class is not intended to be subclassed by clients.
 */
public class RectangleImpl implements IRectangle {

	private IAdvancedDimension dimension = new DimensionImpl(0, 0);
	private IAdvancedLocation location = new LocationImpl(0, 0);

	public RectangleImpl(int width, int height) {
		this(0, 0, width, height);
	}

	public RectangleImpl(int x, int y, int width, int height) {
		setX(x);
		setY(y);
		setWidth(width);
		setHeight(height);
	}

	public RectangleImpl(IRectangle other) {
		this(other.getX(), other.getY(), other.getWidth(), other.getHeight());
	}

	public int getHeight() {
		return getDimension().getHeight();
	}

	public int getWidth() {
		return getDimension().getWidth();
	}

	public void setHeight(int height) {
		getDimension().setHeight(height);
	}

	public void setWidth(int width) {
		getDimension().setWidth(width);
	}

	public int getX() {
		return getLocation().getX();
	}

	public int getY() {
		return getLocation().getY();
	}

	public void setX(int x) {
		getLocation().setX(x);
	}

	public void setY(int y) {
		getLocation().setY(y);
	}

	private IAdvancedDimension getDimension() {
		return dimension;
	}

	private IAdvancedLocation getLocation() {
		return location;
	}

	@Override
	public int hashCode() {
		return (getX() + getHeight() + 1) * (getY() + getWidth() + 1) ^ getX() ^ getY();
	}

	@Override
	public boolean equals(Object o) {
		if (this == o)
			return true;
		if (o instanceof RectangleImpl) {
			RectangleImpl r = (RectangleImpl) o;
			return (getX() == r.getX()) && (getY() == r.getY()) && (getWidth() == r.getWidth()) && (getHeight() == r.getHeight());
		}
		return false;
	}

	@Override
	public String toString() {
		return "Rectangle(" + getX() + ", " + getY() + ", " + getWidth() + ", " + getHeight() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
	}

	public IDimension expand(int dw, int dh) {
		return getDimension().expand(dw, dh);
	}

	public IDimension getDimensionCopy() {
		return getDimension().getDimensionCopy();
	}

	public void scale(double amount) {
		getDimension().scale(amount);
		getLocation().scale(amount);
	}

	public IDimension setDimension(int width, int height) {
		return getDimension().setDimension(width, height);
	}

	public IDimension setDimension(IDimension dimension) {
		return getDimension().setDimension(dimension);
	}

	public ILocation getLocationCopy() {
		return getLocation().getLocationCopy();
	}

	public ILocation setLocation(int x, int y) {
		return getLocation().setLocation(x, y);
	}

	public ILocation setLocation(ILocation location) {
		return getLocation().setLocation(location);
	}

	public ILocation translate(int dx, int dy) {
		return getLocation().translate(dx, dy);
	}

	public IRectangle getRectangleCopy() {
		return new RectangleImpl(this);
	}

	public void setRectangle(int x, int y, int width, int height) {
		setX(x);
		setY(y);
		setWidth(width);
		setHeight(height);
	}

	public void setRectangle(IRectangle rectangle) {
		setRectangle(rectangle.getX(), rectangle.getY(), rectangle.getWidth(), rectangle.getHeight());
	}

	public boolean contains(int x, int y) {
		return y >= getY() && y < getY() + getHeight() && x >= getX() && x < getX() + getWidth();
	}

	public boolean contains(ILocation location) {
		return contains(location.getX(), location.getY());
	}
}
