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

import org.eclipse.swt.*;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

/**
 * This adapter class provides a default drag under effect (eg. select and scroll)
 * when a drag occurs over a <code>StyledText</code>.
 *
 * <p>Classes that wish to provide their own drag under effect for a <code>StyledText</code>
 * can extend this class, override the <code>StyledTextDropTargetEffect.dragOver</code>
 * method and override any other applicable methods in <code>StyledTextDropTargetEffect</code> to
 * display their own drag under effect.</p>
 *
 * Subclasses that override any methods of this class should call the corresponding
 * <code>super</code> method to get the default drag under effect implementation.
 *
 * <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_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 StyledTextDropTargetEffect extends DropTargetEffect {
	static final int CARET_WIDTH = 2;
	static final int SCROLL_HYSTERESIS = 100; // milli seconds
	static final int SCROLL_TOLERANCE = 20; // pixels

	int currentOffset = -1;
	long scrollBeginTime;
	int scrollX = -1, scrollY = -1;
	Listener paintListener;

	/**
	 * Creates a new <code>StyledTextDropTargetEffect</code> to handle the drag under effect on the specified
	 * <code>StyledText</code>.
	 *
	 * @param styledText the <code>StyledText</code> over which the user positions the cursor to drop the data
	 */
	public StyledTextDropTargetEffect(StyledText styledText) {
		super(styledText);
		paintListener = event -> {
			if (currentOffset != -1) {
				StyledText text = (StyledText) getControl();
				Point position = text.getLocationAtOffset(currentOffset);
				int height = text.getLineHeight(currentOffset);
				event.gc.setBackground(event.display.getSystemColor (SWT.COLOR_BLACK));
				event.gc.fillRectangle(position.x, position.y, CARET_WIDTH, height);
			}
		};
	}

	/**
	 * This implementation of <code>dragEnter</code> provides a default drag under effect
	 * for the feedback specified in <code>event.feedback</code>.
	 *
	 * For additional information see <code>DropTargetAdapter.dragEnter</code>.
	 *
	 * Subclasses that override this method should call <code>super.dragEnter(event)</code>
	 * to get the default drag under effect implementation.
	 *
	 * @param event  the information associated with the drag start event
	 *
	 * @see DropTargetAdapter
	 * @see DropTargetEvent
	 */
	@Override
	public void dragEnter(DropTargetEvent event) {
		currentOffset = -1;
		scrollBeginTime = 0;
		scrollX = -1;
		scrollY = -1;
		getControl().removeListener(SWT.Paint, paintListener);
		getControl().addListener (SWT.Paint, paintListener);
	}

	/**
	 * This implementation of <code>dragLeave</code> provides a default drag under effect
	 * for the feedback specified in <code>event.feedback</code>.
	 *
	 * For additional information see <code>DropTargetAdapter.dragLeave</code>.
	 *
	 * Subclasses that override this method should call <code>super.dragLeave(event)</code>
	 * to get the default drag under effect implementation.
	 *
	 * @param event  the information associated with the drag leave event
	 *
	 * @see DropTargetAdapter
	 * @see DropTargetEvent
	 */
	@Override
	public void dragLeave(DropTargetEvent event) {
		StyledText text = (StyledText) getControl();
		if (currentOffset != -1) {
			refreshCaret(text, currentOffset, -1);
		}
		text.removeListener(SWT.Paint, paintListener);
		scrollBeginTime = 0;
		scrollX = -1;
		scrollY = -1;
	}

	/**
	 * This implementation of <code>dragOver</code> provides a default drag under effect
	 * for the feedback specified in <code>event.feedback</code>.
	 *
	 * For additional information see <code>DropTargetAdapter.dragOver</code>.
	 *
	 * Subclasses that override this method should call <code>super.dragOver(event)</code>
	 * to get the default drag under effect implementation.
	 *
	 * @param event  the information associated with the drag over event
	 *
	 * @see DropTargetAdapter
	 * @see DropTargetEvent
	 * @see DND#FEEDBACK_SELECT
	 * @see DND#FEEDBACK_SCROLL
	 */
	@Override
	public void dragOver(DropTargetEvent event) {
		int effect = event.feedback;
		StyledText text = (StyledText) getControl();

		Point pt = text.getDisplay().map(null, text, event.x, event.y);
		if ((effect & DND.FEEDBACK_SCROLL) == 0) {
			scrollBeginTime = 0;
			scrollX = scrollY = -1;
		} else {
			if (text.getCharCount() == 0) {
				scrollBeginTime = 0;
				scrollX = scrollY = -1;
			} else {
				if (scrollX != -1 && scrollY != -1 && scrollBeginTime != 0 &&
					(pt.x >= scrollX && pt.x <= (scrollX + SCROLL_TOLERANCE) ||
					 pt.y >= scrollY && pt.y <= (scrollY + SCROLL_TOLERANCE))) {
					if (System.currentTimeMillis() >= scrollBeginTime) {
						Rectangle area = text.getClientArea();
						GC gc = new GC(text);
						FontMetrics fm = gc.getFontMetrics();
						gc.dispose();
						double charWidth = fm.getAverageCharacterWidth();
						int scrollAmount = (int) (10*charWidth);
						if (pt.x < area.x + 3*charWidth) {
							int leftPixel = text.getHorizontalPixel();
							text.setHorizontalPixel(leftPixel - scrollAmount);
						}
						if (pt.x > area.width - 3*charWidth) {
							int leftPixel = text.getHorizontalPixel();
							text.setHorizontalPixel(leftPixel + scrollAmount);
						}
						int lineHeight = text.getLineHeight();
						if (pt.y < area.y + lineHeight) {
							int topPixel = text.getTopPixel();
							text.setTopPixel(topPixel - lineHeight);
						}
						if (pt.y > area.height - lineHeight) {
							int topPixel = text.getTopPixel();
							text.setTopPixel(topPixel + lineHeight);
						}
						scrollBeginTime = 0;
						scrollX = scrollY = -1;
					}
				} else {
					scrollBeginTime = System.currentTimeMillis() + SCROLL_HYSTERESIS;
					scrollX = pt.x;
					scrollY = pt.y;
				}
			}
		}

		if ((effect & DND.FEEDBACK_SELECT) != 0) {
			int[] trailing = new int [1];
			int newOffset = text.getOffsetAtPoint(pt.x, pt.y, trailing, false);
			newOffset += trailing [0];
			if (newOffset != currentOffset) {
				refreshCaret(text, currentOffset, newOffset);
				currentOffset = newOffset;
			}
		}
	}

	void refreshCaret(StyledText text, int oldOffset, int newOffset) {
		if (oldOffset != newOffset) {
			if (oldOffset != -1) {
				Point oldPos = text.getLocationAtOffset(oldOffset);
				int oldHeight = text.getLineHeight(oldOffset);
				text.redraw (oldPos.x, oldPos.y, CARET_WIDTH, oldHeight, false);
			}
			if (newOffset != -1) {
				Point newPos = text.getLocationAtOffset(newOffset);
				int newHeight = text.getLineHeight(newOffset);
				text.redraw (newPos.x, newPos.y, CARET_WIDTH, newHeight, false);
			}
		}
	}

	/**
	 * This implementation of <code>dropAccept</code> provides a default drag under effect
	 * for the feedback specified in <code>event.feedback</code>.
	 *
	 * For additional information see <code>DropTargetAdapter.dropAccept</code>.
	 *
	 * Subclasses that override this method should call <code>super.dropAccept(event)</code>
	 * to get the default drag under effect implementation.
	 *
	 * @param event  the information associated with the drop accept event
	 *
	 * @see DropTargetAdapter
	 * @see DropTargetEvent
	 */
	@Override
	public void dropAccept(DropTargetEvent event) {
		if (currentOffset != -1) {
			StyledText text = (StyledText) getControl();
			text.setSelection(currentOffset);
			currentOffset = -1;
		}
	}
}
