/*******************************************************************************
 * Copyright (c) 2005 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.examples.undo;


import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;

/**
 * 2D Box that can move itself, hit-test, and draw.
 */
public class Box  {
	
	/*
	 * The location of the box.
	 */
	public int x1, y1, x2, y2;
	
	/*
	 * Constructs a box, defined by any two diametrically 
	 * opposing corners.
	 */
	public Box(int x1, int y1, int x2, int y2) {
		super();
		set(x1, y1, x2, y2);
	}
	
	/*
	 * Move the box to a new origin.
	 */
	public void move(Point origin) {
		set(origin.x, origin.y, origin.x + getWidth(), origin.y + getHeight());
	}
	
	/*
	 * Draw the box with the specified gc.
	 */
	public void draw(GC gc) {
		gc.drawRectangle(x1, y1, x2-x1, y2-y1);
	}
	
	/*
	 * Set the position of the box
	 */
	private void set(int x1, int y1, int x2, int y2) {
		this.x1 = Math.min(x1, x2);
		this.y1 = Math.min(y1, y2);
		this.x2 = Math.max(x1, x2);
		this.y2 = Math.max(y1, y2);
	}
	
	/*
	 * Return true if this box contains the point specified by
	 * the x and y.
	 */
	public boolean contains(int x, int y) {
		return x >= x1 && 
			x <= x2 && 
			y >= y1 && 
			y <= y2;
	}
	
	/*
	 * Answer the width of the box
	 */
	public int getWidth() {
		return x2 - x1;
	}
	
	/*
	 * Answer the height of the box
	 */
	public int getHeight() {
		return y2 - y1;
	}
}
