/*******************************************************************************
 * Copyright (c) 2007, 2008 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.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;


/**
 * This class provides a default drag under effect during a drag and drop.
 * The current implementation does not provide any visual feedback.
 *
 * <p>The drop target effect has the same API as the
 * <code>DropTargetAdapter</code> so that it can provide custom visual
 * feedback when a <code>DropTargetEvent</code> occurs.
 * </p>
 *
 * <p>Classes that wish to provide their own drag under effect
 * can extend the <code>DropTargetEffect</code> and override any applicable methods
 * in <code>DropTargetAdapter</code> to display their own drag under effect.</p>
 *
 * <p>The feedback value is either one of the FEEDBACK constants defined in
 * class <code>DND</code> which is applicable to instances of this class,
 * or it must be built by <em>bitwise OR</em>'ing together
 * (that is, using the <code>int</code> "|" operator) two or more
 * of those <code>DND</code> effect constants.
 * </p>
 * <p>
 * <dl>
 * <dt><b>Feedback:</b></dt>
 * <dd>FEEDBACK_EXPAND, FEEDBACK_INSERT_AFTER, FEEDBACK_INSERT_BEFORE,
 * FEEDBACK_NONE, FEEDBACK_SELECT, FEEDBACK_SCROLL</dd>
 * </dl>
 * </p>
 *
 * @see DropTargetAdapter
 * @see DropTargetEvent
 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
 *
 * @since 3.3
 */
public class DropTargetEffect extends DropTargetAdapter {
	Control control;

	/**
	 * Creates a new <code>DropTargetEffect</code> to handle the drag under effect on the specified
	 * <code>Control</code>.
	 *
	 * @param control the <code>Control</code> over which the user positions the cursor to drop the data
	 *
	 * @exception IllegalArgumentException <ul>
	 *    <li>ERROR_NULL_ARGUMENT - if the control is null</li>
	 * </ul>
	 */
	public DropTargetEffect(Control control) {
		if (control == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
		this.control = control;
	}

	/**
	 * Returns the Control which is registered for this DropTargetEffect.  This is the control over which the
	 * user positions the cursor to drop the data.
	 *
	 * @return the Control which is registered for this DropTargetEffect
	 */
	public Control getControl() {
		return control;
	}

	/**
	 * Returns the item at the given x-y coordinate in the receiver
	 * or null if no such item exists. The x-y coordinate is in the
	 * display relative coordinates.
	 *
	 * @param x the x coordinate used to locate the item
	 * @param y the y coordinate used to locate the item
	 * @return the item at the given x-y coordinate, or null if the coordinate is not in a selectable item
	 */
	public Widget getItem(int x, int y) {
		if (control instanceof Table) {
			return getItem((Table) control, x, y);
		}
		if (control instanceof Tree) {
			return getItem((Tree) control, x, y);
		}
		return null;
	}

	Widget getItem(Table table, int x, int y) {
		Point coordinates = new Point(x, y);
		coordinates = table.toControl(coordinates);
		TableItem item = table.getItem(coordinates);
		if (item != null) return item;
		Rectangle area = table.getClientArea();
		int tableBottom = area.y + area.height;
		int itemCount = table.getItemCount();
		for (int i=table.getTopIndex(); i<itemCount; i++) {
			item = table.getItem(i);
			Rectangle rect = item.getBounds();
			rect.x = area.x;
			rect.width = area.width;
			if (rect.contains(coordinates)) return item;
			if (rect.y > tableBottom) break;
		}
		return null;
	}

	Widget getItem(Tree tree, int x, int y) {
		Point point = new Point(x, y);
		point = tree.toControl(point);
		TreeItem item = tree.getItem(point);
		if (item == null) {
			Rectangle area = tree.getClientArea();
			if (area.contains(point)) {
				int treeBottom = area.y + area.height;
				item = tree.getTopItem();
				while (item != null) {
					Rectangle rect = item.getBounds();
					int itemBottom = rect.y + rect.height;
					if (rect.y <= point.y && point.y < itemBottom) return item;
					if (itemBottom > treeBottom) break;
					item = nextItem(tree, item);
				}
				return null;
			}
		}
		return item;
	}

	TreeItem nextItem(Tree tree, TreeItem item) {
		if (item == null) return null;
		if (item.getExpanded() && item.getItemCount() > 0) return item.getItem(0);
		TreeItem childItem = item;
		TreeItem parentItem = childItem.getParentItem();
		int index = parentItem == null ? tree.indexOf(childItem) : parentItem.indexOf(childItem);
		int count = parentItem == null ? tree.getItemCount() : parentItem.getItemCount();
		while (true) {
			if (index + 1 < count) return parentItem == null ? tree.getItem(index + 1) : parentItem.getItem(index + 1);
			if (parentItem == null) return null;
			childItem = parentItem;
			parentItem = childItem.getParentItem();
			index = parentItem == null ? tree.indexOf(childItem) : parentItem.indexOf(childItem);
			count = parentItem == null ? tree.getItemCount() : parentItem.getItemCount();
		}
	}

	TreeItem previousItem(Tree tree, TreeItem item) {
		if (item == null) return null;
		TreeItem childItem = item;
		TreeItem parentItem = childItem.getParentItem();
		int index = parentItem == null ? tree.indexOf(childItem) : parentItem.indexOf(childItem);
		if (index == 0) return parentItem;
		TreeItem nextItem = parentItem == null ? tree.getItem(index-1) : parentItem.getItem(index-1);
		int count = nextItem.getItemCount();
		while (count > 0 && nextItem.getExpanded()) {
			nextItem = nextItem.getItem(count - 1);
			count = nextItem.getItemCount();
		}
		return nextItem;
	}
}
