/*******************************************************************************
 * Copyright (c) 2000, 2011 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.swt.dnd;

import org.eclipse.swt.events.TypedEvent;
import org.eclipse.swt.widgets.Widget;

/**
 * The DropTargetEvent contains the event information passed in the methods of the DropTargetListener.
 *
 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
 */
public class DropTargetEvent extends TypedEvent {
	/**
	 * The x-cordinate of the cursor relative to the <code>Display</code>
	 */
	public int x;

	/**
	 * The y-cordinate of the cursor relative to the <code>Display</code>
	 */
	public int y;

	/**
	 * The operation being performed.
	 * @see DND#DROP_NONE
	 * @see DND#DROP_MOVE
	 * @see DND#DROP_COPY
	 * @see DND#DROP_LINK
	 * @see DND#DROP_DEFAULT
	 */
	public int detail;

	/**
	 * A bitwise OR'ing of the operations that the DragSource can support
	 * (e.g. DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK).
	 * The detail value must be a member of this list or DND.DROP_NONE.
	 * @see DND#DROP_NONE
	 * @see DND#DROP_MOVE
	 * @see DND#DROP_COPY
	 * @see DND#DROP_LINK
	 * @see DND#DROP_DEFAULT
	 */
	public int operations;

	/**
	 * A bitwise OR'ing of the drag under effect feedback to be displayed to the user
	 * (e.g. DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND).
	 * <p>A value of DND.FEEDBACK_NONE indicates that no drag under effect will be displayed.</p>
	 * <p>Feedback effects will only be applied if they are applicable.</p>
	 * <p>The default value is DND.FEEDBACK_SELECT.</p>
	 * @see DND#FEEDBACK_NONE
	 * @see DND#FEEDBACK_SELECT
	 * @see DND#FEEDBACK_INSERT_BEFORE
	 * @see DND#FEEDBACK_INSERT_AFTER
	 * @see DND#FEEDBACK_SCROLL
	 * @see DND#FEEDBACK_EXPAND
	 */
	public int feedback;

	/**
	 * If the associated control is a table or tree, this field contains the item located
	 * at the cursor coordinates.
	 */
	public Widget item;

	/**
	 * The type of data that will be dropped.
	 */
	public TransferData currentDataType;

	/**
	 * A list of the types of data that the DragSource is capable of providing.
	 * The currentDataType must be a member of this list.
	 */
	public TransferData[] dataTypes;

	static final long serialVersionUID = 3256727264573338678L;

/**
 * Constructs a new instance of this class based on the
 * information in the given untyped event.
 *
 * @param e the untyped event containing the information
 */
public DropTargetEvent(DNDEvent e) {
	super(e);
	this.data = e.data;
	this.x = e.x;
	this.y = e.y;
	this.detail = e.detail;
	this.currentDataType = e.dataType;
	this.dataTypes = e.dataTypes;
	this.operations = e.operations;
	this.feedback = e.feedback;
	this.item = e.item;
}
void updateEvent(DNDEvent e) {
	e.widget = this.widget;
	e.time = this.time;
	e.data = this.data;
	e.x = this.x;
	e.y = this.y;
	e.detail = this.detail;
	e.dataType = this.currentDataType;
	e.dataTypes = this.dataTypes;
	e.operations = this.operations;
	e.feedback = this.feedback;
	e.item = this.item;
}
/**
 * Returns a string containing a concise, human-readable
 * description of the receiver.
 *
 * @return a string representation of the event
 */
@Override
public String toString() {
	String string = super.toString ();
	StringBuffer sb = new StringBuffer();
	sb.append(string.substring (0, string.length() - 1)); // remove trailing '}'
	sb.append(" x="); sb.append(x);
	sb.append(" y="); sb.append(y);
	sb.append(" item="); sb.append(item);
	sb.append(" operations="); sb.append(operations);
	sb.append(" operation="); sb.append(detail);
	sb.append(" feedback="); sb.append(feedback);
	sb.append(" dataTypes={ ");
	if (dataTypes != null) {
		for (int i = 0; i < dataTypes.length; i++) {
			sb.append(dataTypes[i].type); sb.append(' ');
		}
	}
	sb.append('}');
	sb.append(" currentDataType="); sb.append(currentDataType != null ? currentDataType.type : '0');
	sb.append('}');
	return sb.toString();
}
}
