/*
 * Copyright (c) 2002-2008 LWJGL Project
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the name of 'LWJGL' nor the names of
 *   its contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.lwjgl.input;

/**
 * An event occuring on a controller.
 *
 * @author Kevin Glass
 */
class ControllerEvent {
	/** Indicates the event was caused by a button */
	public static final int BUTTON = 1;
	/** Indicates the event was caused by a axis */
	public static final int AXIS = 2;
	/** Indicates the event was caused by a pov X */
	public static final int POVX = 3;
	/** Indicates the event was caused by a pov Y */
	public static final int POVY = 4;

	/** The controller generating the event */
	private Controller source;
	/** The index of the input (axis or button) that generated the event */
	private int index;
	/** Type of control that generated the event */
	private int type;
	/** True when a button is pressed, if this event was caused by the button */
	private boolean buttonState;
	/** True if this event was caused by the x axis */
	private boolean xaxis;
	/** True if this event was caused by the y axis */
	private boolean yaxis;
	/** The time stamp of this event */
	private long timeStamp;
	/** The value on a specified axis, if this event was caused by the x-axis */
	private float xaxisValue;
	/** The value on a specified axis, if this event was caused by the y-axis */
	private float yaxisValue;

	/**
	 * Create a new event
	 *
	 * @param source The source of the event
	 * @param timeStamp The time stamp given for this event
	 * @param type The type of control generating this event
	 * @param index The index of the input that generated the event
	 * @param xaxis True if this event was caused by the x-axis
	 * @param yaxis True if this event was caused by the y-axis
	 */
	ControllerEvent(Controller source,long timeStamp, int type,int index,boolean xaxis,boolean yaxis) {
		this(source, timeStamp, type, index, false, xaxis, yaxis, 0, 0);
	}

	/**
	 * Create a new event
	 *
	 * @param source The source of the event
	 * @param timeStamp The time stamp given for this event
	 * @param type The type of control generating this event
	 * @param index The index of the input that generated the event
	 * @param buttonState True when a button is pressed, if this event was caused by the button
	 * @param xaxis True if this event was caused by the x-axis
	 * @param yaxis True if this event was caused by the y-axis
	 * @param xaxisValue The value on a specified axis, if this event was caused by the x-axis
	 * @param yaxisValue The value on a specified axis, if this event was caused by the y-axis
	 */
	ControllerEvent(Controller source,long timeStamp, int type,int index,boolean buttonState,boolean xaxis,boolean yaxis,float xaxisValue,float yaxisValue) {
		this.source = source;
		this.timeStamp = timeStamp;
		this.type = type;
		this.index = index;
		this.buttonState = buttonState;
		this.xaxis = xaxis;
		this.yaxis = yaxis;
		this.xaxisValue = xaxisValue;
		this.yaxisValue = yaxisValue;
	}

	/**
	 * Get the time stamp given for this event. As with nanoTime()
	 * this value means nothing other than giving ordering
	 *
	 * @return The time stamp given for this event
	 */
	public long getTimeStamp() {
		return timeStamp;
	}

	/**
	 * Get the controller that generated this event
	 *
	 * @return The controller that generated this event
	 */
	public Controller getSource() {
		return source;
	}

	/**
	 * Get the index of the control generating this event
	 *
	 * @return The index of the control generating this event
	 */
	public int getControlIndex() {
		return index;
	}

	/**
	 * Check if this event was generated by a button
	 *
	 * @return True if this event was generated by a button
	 */
	public boolean isButton() {
		return type == BUTTON;
	}

	/**
	 * Check the button is pressed or not, when this event was caused
	 *  
	 * @return True when a button is pressed, if this event was caused by the button
	 */
	public boolean getButtonState() {
		return buttonState;
	}

	/**
	 * Check if this event was generated by a axis
	 *
	 * @return True if this event was generated by a axis
	 */
	public boolean isAxis() {
		return type == AXIS;
	}

	/**
	 * Check if this event was generated by a pov
	 *
	 * @return True if this event was generated by a pov
	 */
	public boolean isPovY() {
		return type == POVY;
	}
	/**
	 *
	 * Check if this event was generated by a pov
	 *
	 * @return True if this event was generated by a pov
	 */
	public boolean isPovX() {
		return type == POVX;
	}

	/**
	 * Check if this event was caused by the X axis
	 *
	 * @return True if this event was caused by the X axis
	 */
	public boolean isXAxis() {
		return xaxis;
	}

	/**
	 * Check if this event was caused by the Y axis
	 *
	 * @return True if this event was caused by the Y axis
	 */
	public boolean isYAxis() {
		return yaxis;
	}
	
	/**
	 * Get the value on an X axis when this event was caused
	 *  
	 * @return The value on a specified axis, if this event was caused by the x-axis
	 */
	public float getXAxisValue() {
		return xaxisValue;
	}

	/**
	 * Get the value on an Y axis when this event was caused
	 *  
	 * @return The value on a specified axis, if this event was caused by the y-axis
	 */
	public float getYAxisValue() {
		return yaxisValue;
	}

	/*
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return "["+source+" type="+type+" xaxis="+xaxis+" yaxis="+yaxis+"]";
	}
}
