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

/*
 * Drag text selection within a StyledText widget
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 * 
 * @since 3.3
 */ 
import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Snippet257 {

	static String string1 = "A drag source is the provider of data in a Drag and Drop data transfer as well as "+
                           "the originator of the Drag and Drop operation. The data provided by the drag source "+
                           "may be transferred to another location in the same widget, to a different widget "+
                           "within the same application, or to a different application altogether. For example, "+
                           "you can drag text from your application and drop it on an email application, or you "+
                           "could drag an item in a tree and drop it below a different node in the same tree.";

	static String DRAG_START_DATA = "DRAG_START_DATA";
	
public static void main (String [] args) {
	final Display display = new Display ();
	Shell shell = new Shell (display);
	shell.setLayout(new FillLayout());
	shell.setSize(100, 300);
	int style = SWT.MULTI | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER;
	final StyledText text = new StyledText(shell, style);
	text.setText(string1);
	final DragSource source = new DragSource(text, DND.DROP_COPY | DND.DROP_MOVE);
	source.setDragSourceEffect(new DragSourceEffect(text) {
		@Override
		public void dragStart(DragSourceEvent event) {
			event.image = display.getSystemImage(SWT.ICON_WARNING);
		}
	});
	source.setTransfer(TextTransfer.getInstance());
	source.addDragListener(new DragSourceAdapter() {
		Point selection;
		@Override
		public void dragStart(DragSourceEvent event) {
			selection = text.getSelection();
			event.doit = selection.x != selection.y;
			text.setData(DRAG_START_DATA, selection);
		}
		@Override
		public void dragSetData(DragSourceEvent e) {
			e.data = text.getText(selection.x, selection.y-1);
		}
		@Override
		public void dragFinished(DragSourceEvent event) {
			if (event.detail == DND.DROP_MOVE) {
				Point newSelection= text.getSelection();
				int length = selection.y - selection.x;
				int delta = 0;
				if (newSelection.x < selection.x)
					delta = length; 
				text.replaceTextRange(selection.x + delta, length, "");
			}
			selection = null;
			text.setData(DRAG_START_DATA, null);
		}
	});
	
	DropTarget target = new DropTarget(text, DND.DROP_DEFAULT | DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK);
	target.setTransfer(new Transfer[] {TextTransfer.getInstance()});
	target.addDropListener(new DropTargetAdapter() {
		@Override
		public void dragEnter(DropTargetEvent event) {
			if (event.detail == DND.DROP_DEFAULT) {
				if (text.getData(DRAG_START_DATA) == null)
					event.detail = DND.DROP_COPY;
				else 
					event.detail = DND.DROP_MOVE;
			}
		}
		@Override
		public void dragOperationChanged(DropTargetEvent event) {
			if (event.detail == DND.DROP_DEFAULT) {
				if (text.getData(DRAG_START_DATA) == null)
					event.detail = DND.DROP_COPY;
				else 
					event.detail = DND.DROP_MOVE;
			}
		}
		@Override
		public void dragOver(DropTargetEvent event) {
			event.feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_SELECT;
		}
		@Override
		public void drop(DropTargetEvent event) {
			if (event.detail != DND.DROP_NONE) {
				Point selection = (Point) text.getData(DRAG_START_DATA);
				int insertPos = text.getCaretOffset();
				if (event.detail == DND.DROP_MOVE && selection != null && selection.x <= insertPos  && insertPos <= selection.y 
						|| event.detail == DND.DROP_COPY && selection != null && selection.x < insertPos  && insertPos < selection.y) {
					text.setSelection(selection);
					event.detail = DND.DROP_COPY;  // prevent source from deleting selection
				} else {
					String string = (String)event.data;
					text.insert(string);
					if (selection != null)
						text.setSelectionRange(insertPos, string.length());
				}
			}
		}
	});
	shell.open ();
	while (!shell.isDisposed ()) {
		if (!display.readAndDispatch ()) display.sleep ();
	}
	display.dispose ();
}

}
