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

/**
 * Class DND contains all the constants used in defining a
 * DragSource or a DropTarget.
 *
 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
 */
public class DND {

	/**
	 * The transfer mechanism for data that is being cut
	 * and then pasted or copied and then pasted (value is 1).
	 *
	 * @see Clipboard
	 *
	 * @since 3.1
	 */
	public final static int CLIPBOARD = 1 << 0;

	/**
	 * The transfer mechanism for clients that use the selection
	 * mechanism (value is 2).
	 *
	 * @see Clipboard
	 *
	 * @since 3.1
	 */
	public final static int SELECTION_CLIPBOARD = 1 << 1;

	/**
	 * Drag and Drop Operation: no drag/drop operation performed
	 * (value is 0).
	 */
	public final static int DROP_NONE = 0;

	/**
	 * Drag and Drop Operation: a copy of the data in the drag source is
	 * added to the drop target (value is 1 &lt;&lt; 0).
	 */
	public final static int DROP_COPY = 1 << 0;

	/**
	 * Drag and Drop Operation: a copy of the data is added to the drop target and
	 * the drag source removes the original data and any references to the data,
	 * and updates its display (value is 1 &lt;&lt; 1).
	 * <p>
	 * <b>Warning:</b> Some applications (most notably Firefox, Thunderbird, and Safari) return
	 * {@link DND#DROP_MOVE} even if they just open a dropped file and don't copy
	 * anything, see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=30543">bug 30543</a>.
	 * </p>
	 * <p>
	 * <b>To avoid data loss</b>, you may want to not remove the original data
	 * when you handle a {@link DND#DragEnd} for a {@link FileTransfer} whose
	 * {@link org.eclipse.swt.widgets.Event#detail} is {@link #DROP_MOVE}.
	 * </p>
	 */
	public final static int DROP_MOVE = 1 << 1;

	/**
	 * Drag and Drop Operation: the drop target makes a link to the data in
	 * the drag source (value is 1 &lt;&lt; 2).
	 */
	public final static int DROP_LINK = 1 << 2;

	/**
	 * Drag and Drop Operation: the drop target moves the data and the drag source removes
	 * any references to the data and updates its display.  This is not available on all platforms
	 * and is only used when a non-SWT application is the drop target.  In this case, the SWT
	 * drag source is informed in the dragFinished event that the drop target has moved the data.
	 * (value is 1 &lt;&lt; 3).
	 *
	 * @see DragSourceListener#dragFinished
	 */
	public final static int DROP_TARGET_MOVE = 1 << 3;

	/**
	 * Drag and Drop Operation: During a dragEnter event or a dragOperationChanged, if no modifier keys
	 * are pressed, the operation is set to DROP_DEFAULT.  The application can choose what the default
	 * operation should be by setting a new value in the operation field.  If no value is choosen, the
	 * default operation for the platform will be selected (value is 1 &lt;&lt; 4).
	 *
	 * @see DropTargetListener#dragEnter
	 * @see DropTargetListener#dragOperationChanged
	 * @since 2.0
	 */
	public final static int DROP_DEFAULT = 1 << 4;

	/**
	 * DragSource Event: the drop has successfully completed or has been terminated (such as hitting
	 * the ESC key); perform cleanup such as removing data on a move operation (value is 2000).
	 */
	public static final int DragEnd		= 2000;

	/**
	 * DragSource Event: the data to be dropped is required from the drag source (value is 2001).
	 */
	public static final int DragSetData = 2001;

	/**
	 * DropTarget Event: the cursor has entered the drop target boundaries (value is 2002).
	 */
	public static final int DragEnter	= 2002;

	/**
	 * DropTarget Event: the cursor has left the drop target boundaries OR the drop
	 * operation has been cancelled (such as by hitting ECS) OR the drop is about to
	 * happen (user has released the mouse button over this target) (value is 2003).
	 */
	public static final int DragLeave	= 2003;

	/**
	 * DropTarget Event: the cursor is over the drop target (value is 2004).
	 */
	public static final int	DragOver	= 2004;

	/**
	 * DropTarget Event: the operation being performed has changed usually due to the user
	 * changing the selected modifier keys while dragging (value is 2005).
	 */
	public static final int DragOperationChanged = 2005;

	/**
	 * DropTarget Event: the data has been dropped (value is 2006).
	 */
	public static final int	Drop = 2006;

	/**
	 * DropTarget Event: the drop target is given a last chance to modify the drop (value is 2007).
	 */
	public static final int	DropAccept	= 2007;

	/**
	 * DragSource Event: a drag is about to begin (value is 2008).
	 */
	public static final int	DragStart = 2008;

	/**
	 * DropTarget drag under effect: No effect is shown (value is 0).
	 */
	public static final int FEEDBACK_NONE = 0;

	/**
	 * DropTarget drag under effect: The item under the cursor is selected; applies to tables
	 * and trees (value is 1).
	 */
	public static final int FEEDBACK_SELECT = 1;

	/**
	 * DropTarget drag under effect: An insertion mark is shown before the item under the cursor; applies to
	 * tables and trees (value is 2).
	 */
	public static final int FEEDBACK_INSERT_BEFORE = 2;

	/**
	 * DropTarget drag under effect: An insertion mark is shown after the item under the cursor; applies to
	 * tables and trees (value is 4).
	 */
	public static final int FEEDBACK_INSERT_AFTER = 4;

	/**
	 * DropTarget drag under effect: The widget is scrolled up or down to allow the user to drop on items that
	 * are not currently visible; applies to tables and trees (value is 8).
	 */
	public static final int FEEDBACK_SCROLL = 8;

	/**
	 * DropTarget drag under effect: The item currently under the cursor is expanded to allow the user to
	 * select a drop target from a sub item; applies to trees (value is 16).
	 */
	public static final int FEEDBACK_EXPAND = 16;

	/**
	 * Error code: drag source can not be initialized (value is 2000).
	 */
	public static final int ERROR_CANNOT_INIT_DRAG = 2000;

	/**
	 * Error code: drop target cannot be initialized (value is 2001).
	 */
	public static final int ERROR_CANNOT_INIT_DROP = 2001;

	/**
	 * Error code: Data can not be set on system clipboard (value is 2002).
	 */
	public static final int ERROR_CANNOT_SET_CLIPBOARD = 2002;

	/**
	 * Error code: Data does not have correct format for type (value is 2003).
	 * @since 3.1
	 */
	public static final int ERROR_INVALID_DATA = 2003;

	/**
	 * DropTarget Key: The string constant for looking up the drop target
	 * for a control using <code>getData(String)</code>. When a drop target
	 * is created for a control, it is stored as a property in the control
	 * using <code>setData(String, Object)</code>.
	 *
	 * @since 3.4
	 */
	public static final String DROP_TARGET_KEY = "DropTarget"; //$NON-NLS-1$

	/**
	 * DragSource Key: The string constant for looking up the drag source
	 * for a control using <code>getData(String)</code>. When a drag source
	 * is created for a control, it is stored as a property in the control
	 * using <code>setData(String, Object)</code>.
	 *
	 * @since 3.4
	 */
	public static final String DRAG_SOURCE_KEY = "DragSource"; //$NON-NLS-1$

	static final String INIT_DRAG_MESSAGE = "Cannot initialize Drag"; //$NON-NLS-1$
	static final String INIT_DROP_MESSAGE = "Cannot initialize Drop"; //$NON-NLS-1$
	static final String CANNOT_SET_CLIPBOARD_MESSAGE = "Cannot set data in clipboard"; //$NON-NLS-1$
	static final String INVALID_DATA_MESSAGE = "Data does not have correct format for type"; //$NON-NLS-1$

/**
 * Throws an appropriate exception based on the passed in error code.
 *
 * @param code the DND error code
 */
public static void error (int code) {
	error (code, 0);
}

/**
 * Throws an appropriate exception based on the passed in error code.
 * The <code>hresult</code> argument should be either 0, or the
 * platform specific error code.
 * <p>
 * In DND, errors are reported by throwing one of three exceptions:
 * <dl>
 * <dd>java.lang.IllegalArgumentException</dd>
 * <dt>thrown whenever one of the API methods is invoked with an illegal argument</dt>
 * <dd>org.eclipse.swt.SWTException (extends java.lang.RuntimeException)</dd>
 * <dt>thrown whenever a recoverable error happens internally in SWT</dt>
 * <dd>org.eclipse.swt.SWTError (extends java.lang.Error)</dd>
 * <dt>thrown whenever a <b>non-recoverable</b> error happens internally in SWT</dt>
 * </dl>
 * This method provides the logic which maps between error codes
 * and one of the above exceptions.
 * </p>
 *
 * @param code the DND error code.
 * @param hresult the platform specific error code.
 *
 * @see SWTError
 * @see SWTException
 * @see IllegalArgumentException
 */
public static void error (int code, int hresult) {
	switch (code) {
		/* OS Failure/Limit (fatal, may occur only on some platforms) */
		case DND.ERROR_CANNOT_INIT_DRAG:{
			String msg = DND.INIT_DRAG_MESSAGE;
			if (hresult != 0) msg += " result = "+hresult; //$NON-NLS-1$
			throw new SWTError (code, msg);
		}
		case DND.ERROR_CANNOT_INIT_DROP:{
			String msg = DND.INIT_DROP_MESSAGE;
			if (hresult != 0) msg += " result = "+hresult; //$NON-NLS-1$
			throw new SWTError (code, msg);
		}
		case DND.ERROR_CANNOT_SET_CLIPBOARD:{
			String msg = DND.CANNOT_SET_CLIPBOARD_MESSAGE;
			if (hresult != 0) msg += " result = "+hresult; //$NON-NLS-1$
			throw new SWTError (code, msg);
		}
		case DND.ERROR_INVALID_DATA:{
			String msg = DND.INVALID_DATA_MESSAGE;
			if (hresult != 0) msg += " result = "+hresult; //$NON-NLS-1$
			throw new SWTException (code, msg);
		}
	}

	/* Unknown/Undefined Error */
	SWT.error(code);
}

}
