/*******************************************************************************
 * Copyright (c) 2007 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) {
		public void dragStart(DragSourceEvent event) {
			event.image = display.getSystemImage(SWT.ICON_WARNING);
		}
	});
	source.setTransfer(new Transfer[] {TextTransfer.getInstance()});
	source.addDragListener(new DragSourceAdapter() {
		Point selection;
		public void dragStart(DragSourceEvent event) {
			selection = text.getSelection();
			event.doit = selection.x != selection.y;
			text.setData(DRAG_START_DATA, selection);
		}
		public void dragSetData(DragSourceEvent e) {
			e.data = text.getText(selection.x, selection.y-1);
		}
		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() {
		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;
			}
		}
		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;
			}
		}
		public void dragOver(DropTargetEvent event) {
			event.feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_SELECT;
		}
		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 ();
}

}
