/*******************************************************************************
 * Copyright (c) 2000, 2013 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * 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:</p>
 * <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>
 * <p>
 * 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);
}

}
