/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.internal.gestures;

import java.util.Arrays;

import org.eclipse.ui.internal.util.Util;

public final class CaptureEvent implements Comparable {

	private final static int HASH_FACTOR = 89;
	private final static int HASH_INITIAL =
		CaptureEvent.class.getName().hashCode();

	public static CaptureEvent create(int data, int pen, Point[] points) {
		return new CaptureEvent(data, pen, points);
	}

	private int data;
	private int pen;
	private Point[] points;

	private CaptureEvent(int data, int pen, Point[] points) {
		super();
		this.data = data;
		this.pen = pen;

		if (points == null)
			throw new NullPointerException();

		points = (Point[]) points.clone();

		for (int i = 0; i < points.length; i++)
			if (points[i] == null)
				throw new IllegalArgumentException();

		this.points = points;
	}

	public int compareTo(Object object) {
		CaptureEvent castedObject = (CaptureEvent) object;
		int compareTo = data - castedObject.data;

		if (compareTo == 0) {
			compareTo = pen - castedObject.pen;

			if (compareTo == 0)
				compareTo = Util.compare(points, castedObject.points);
		}

		return compareTo;
	}

	public boolean equals(Object object) {
		if (!(object instanceof CaptureEvent))
			return false;

		CaptureEvent castedObject = (CaptureEvent) object;
		return data == castedObject.data
			&& pen == castedObject.pen
			&& Arrays.equals(points, castedObject.points);
	}

	public int getData() {
		return data;
	}

	public int getPen() {
		return pen;
	}

	public Point[] getPoints() {
		return (Point[]) points.clone();
	}

	public int hashCode() {
		int result = HASH_INITIAL;
		result = result * HASH_FACTOR + data;
		result = result * HASH_FACTOR + pen;

		for (int i = 0; i < points.length; i++)
			result = result * HASH_FACTOR + points[i].hashCode();

		return result;
	}
}
