/*******************************************************************************
 * 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);
}

}
