/*
* Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron,
* Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
*
* THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
* WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
* NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
* IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
* CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
* NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
* DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
* THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
* USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
* PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
* AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
*/
package org.csstudio.sds.util;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.widgets.Text;
/**
* A util class for adding Drag & Drop support to a {@link Text}.
* @author Kai Meyer
*
*/
public final class TextDnDUtil {
/**
* Private Constructor.
*/
private TextDnDUtil() {
//do nothing
}
/**
* Adds Drop & Drop support for the given {@link Text}.
* @param textWidget The {@link Text} widget
*/
public static void addDnDSupport(final Text textWidget) {
addDropSupport(textWidget);
addDragSupport(textWidget);
}
/**
* Adds Drop support for the given {@link Text}.
* @param textWidget The {@link Text} widget
*/
public static void addDropSupport(final Text textWidget) {
DropTarget dropTarget = new DropTarget(textWidget, DND.DROP_COPY | DND.DROP_MOVE);
Transfer[] transferTypes = new Transfer[] { TextTransfer.getInstance() };
dropTarget.setTransfer(transferTypes);
dropTarget.addDropListener(new DropTargetAdapter() {
@Override
public void dragEnter(final DropTargetEvent event) {
for (TransferData transfer : event.dataTypes) {
if (TextTransfer.getInstance().isSupportedType(
transfer)) {
event.detail = DND.DROP_COPY;
break;
}
}
super.dragEnter(event);
}
@Override
public void drop(final DropTargetEvent event) {
if (event.data instanceof String) {
textWidget.setText((String) event.data);
}
}
});
}
/**
* Adds Drag support for the given {@link Text}.
* @param textWidget The {@link Text} widget
*/
public static void addDragSupport(final Text textWidget) {
DragSource dragSource = new DragSource(textWidget, DND.DROP_COPY);
Transfer[] transferTypes = new Transfer[] { TextTransfer.getInstance() };
dragSource.setTransfer(transferTypes);
dragSource.addDragListener(new DragSourceAdapter() {
@Override
public void dragStart(final DragSourceEvent event) {
if (textWidget.getText().trim().length()==0) {
event.doit = false;
}
}
@Override
public void dragSetData(final DragSourceEvent event) {
if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
String text = textWidget.getText();
if (text != null && text.trim().length()>0) {
event.data = text;
}
}
}
});
}
}