/*******************************************************************************
* Copyright (c) 2000, 2014 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
* EclipseSource - modified to fit into ControlsDemo
*******************************************************************************/
package org.eclipse.rap.demo.controls;
import org.eclipse.rap.rwt.client.ClientFile;
import org.eclipse.rap.rwt.dnd.ClientFileTransfer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.HTMLTransfer;
import org.eclipse.swt.dnd.RTFTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class DNDExampleTab extends ExampleTab {
private static final int BUTTON_TOGGLE = 0;
private static final int BUTTON_RADIO = 1;
private static final int BUTTON_CHECK = 2;
private static final int CANVAS = 3;
private static final int LABEL = 4;
private static final int LIST = 5;
private static final int TABLE = 6;
private static final int TREE = 7;
private static final int TEXT = 8;
private int dragOperation;
private Transfer[] dragTypes = new Transfer[ 0 ];
private Control dragControl;
private int dragControlType;
private DragSource dragSource;
private String dragDataText;
private String dragDataRTF;
private String dragDataHTML;
private boolean dragEnabled;
private int dropOperation;
private int dropFeedback;
private int dropDefaultOperation;
private Transfer[] dropTypes = new Transfer[ 0 ];
private DropTarget dropTarget;
private Control dropControl;
private int dropControlType;
private Composite defaultParent;
private boolean dropEnabled;
private Text dragConsole;
private boolean dragEventDetail;
private Text dropConsole;
private boolean dropEventDetail;
public DNDExampleTab() {
super( "Drag & Drop" );
setHorizontalSashFormWeights( new int[] { 100, 0 } );
dragEnabled = true;
dropEnabled = true;
addDragTransfer( TextTransfer.getInstance() );
addDropTransfer( TextTransfer.getInstance() );
}
@Override
protected void createExampleControls( final Composite container ) {
container.setLayout( new FillLayout() );
ScrolledComposite sc = new ScrolledComposite( container, SWT.H_SCROLL
| SWT.V_SCROLL );
Composite parent = new Composite( sc, SWT.NONE );
sc.setContent( parent );
parent.setLayout( new FormLayout() );
Label dragLabel = new Label( parent, SWT.LEFT );
dragLabel.setText( "Drag Source:" );
Group dragWidgetGroup = new Group( parent, SWT.NONE );
dragWidgetGroup.setText( "Widget" );
createDragWidget( dragWidgetGroup );
Composite cLeft = new Composite( parent, SWT.NONE );
cLeft.setLayout( new GridLayout( 2, false ) );
Group dragOperationsGroup = new Group( cLeft, SWT.NONE );
dragOperationsGroup.setLayoutData( new GridData( SWT.LEFT,
SWT.FILL,
false,
false,
1,
1 ) );
dragOperationsGroup.setText( "Allowed Operation(s):" );
createDragOperations( dragOperationsGroup );
Group dragTypesGroup = new Group( cLeft, SWT.NONE );
dragTypesGroup.setLayoutData( new GridData( SWT.FILL,
SWT.TOP,
true,
false,
1,
1 ) );
dragTypesGroup.setText( "Transfer Type(s):" );
createDragTypes( dragTypesGroup );
dragConsole = new Text( cLeft, SWT.READ_ONLY
| SWT.BORDER
| SWT.V_SCROLL
| SWT.H_SCROLL
| SWT.MULTI );
dragConsole.setLayoutData( new GridData( SWT.FILL,
SWT.FILL,
true,
true,
2,
1 ) );
Menu menu = new Menu( container.getShell(), SWT.POP_UP );
MenuItem item = new MenuItem( menu, SWT.PUSH );
item.setText( "Clear" );
item.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
dragConsole.setText( "" );
}
} );
item = new MenuItem( menu, SWT.CHECK );
item.setText( "Show Event detail" );
item.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
MenuItem item = ( MenuItem )e.widget;
dragEventDetail = item.getSelection();
}
} );
dragConsole.setMenu( menu );
Label dropLabel = new Label( parent, SWT.LEFT );
dropLabel.setText( "Drop Target:" );
Group dropWidgetGroup = new Group( parent, SWT.NONE );
dropWidgetGroup.setText( "Widget" );
createDropWidget( dropWidgetGroup );
Composite cRight = new Composite( parent, SWT.NONE );
cRight.setLayout( new GridLayout( 2, false ) );
Group dropOperationsGroup = new Group( cRight, SWT.NONE );
dropOperationsGroup.setLayoutData( new GridData( SWT.LEFT,
SWT.FILL,
false,
false,
1,
2 ) );
dropOperationsGroup.setText( "Allowed Operation(s):" );
createDropOperations( dropOperationsGroup );
Group dropTypesGroup = new Group( cRight, SWT.NONE );
dropTypesGroup.setText( "Transfer Type(s):" );
createDropTypes( dropTypesGroup );
Group feedbackTypesGroup = new Group( cRight, SWT.NONE );
feedbackTypesGroup.setText( "Feedback Type(s):" );
createFeedbackTypes( feedbackTypesGroup );
dropConsole = new Text( cRight, SWT.READ_ONLY
| SWT.BORDER
| SWT.V_SCROLL
| SWT.H_SCROLL
| SWT.MULTI );
dropConsole.setLayoutData( new GridData( SWT.FILL,
SWT.FILL,
true,
true,
2,
1 ) );
menu = new Menu( container.getShell(), SWT.POP_UP );
item = new MenuItem( menu, SWT.PUSH );
item.setText( "Clear" );
item.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
dropConsole.setText( "" );
}
} );
item = new MenuItem( menu, SWT.CHECK );
item.setText( "Show Event detail" );
item.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
MenuItem item = ( MenuItem )e.widget;
dropEventDetail = item.getSelection();
}
} );
dropConsole.setMenu( menu );
int height = 200;
FormData data = new FormData();
data.top = new FormAttachment( 0, 10 );
data.left = new FormAttachment( 0, 10 );
dragLabel.setLayoutData( data );
data = new FormData();
data.top = new FormAttachment( dragLabel, 10 );
data.left = new FormAttachment( 0, 10 );
data.right = new FormAttachment( 50, -10 );
data.height = height;
dragWidgetGroup.setLayoutData( data );
data = new FormData();
data.top = new FormAttachment( dragWidgetGroup, 10 );
data.left = new FormAttachment( 0, 10 );
data.right = new FormAttachment( 50, -10 );
data.bottom = new FormAttachment( 100, -10 );
cLeft.setLayoutData( data );
data = new FormData();
data.top = new FormAttachment( 0, 10 );
data.left = new FormAttachment( cLeft, 10 );
dropLabel.setLayoutData( data );
data = new FormData();
data.top = new FormAttachment( dropLabel, 10 );
data.left = new FormAttachment( cLeft, 10 );
data.right = new FormAttachment( 100, -10 );
data.height = height;
dropWidgetGroup.setLayoutData( data );
data = new FormData();
data.top = new FormAttachment( dropWidgetGroup, 10 );
data.left = new FormAttachment( cLeft, 10 );
data.right = new FormAttachment( 100, -10 );
data.bottom = new FormAttachment( 100, -10 );
cRight.setLayoutData( data );
sc.setMinSize( parent.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
sc.setExpandHorizontal( true );
sc.setExpandVertical( true );
}
@Override
protected void createStyleControls( final Composite parent ) {
}
private void addDragTransfer( final Transfer transfer ) {
Transfer[] newTypes = new Transfer[ dragTypes.length + 1 ];
System.arraycopy( dragTypes, 0, newTypes, 0, dragTypes.length );
newTypes[ dragTypes.length ] = transfer;
dragTypes = newTypes;
if( dragSource != null ) {
dragSource.setTransfer( dragTypes );
}
}
private void addDropTransfer( final Transfer transfer ) {
Transfer[] newTypes = new Transfer[ dropTypes.length + 1 ];
System.arraycopy( dropTypes, 0, newTypes, 0, dropTypes.length );
newTypes[ dropTypes.length ] = transfer;
dropTypes = newTypes;
if( dropTarget != null ) {
dropTarget.setTransfer( dropTypes );
}
}
private void createDragOperations( final Composite parent ) {
parent.setLayout( new RowLayout( SWT.VERTICAL ) );
final Button moveButton = new Button( parent, SWT.CHECK );
moveButton.setText( "DND.DROP_MOVE" );
moveButton.setSelection( true );
dragOperation = DND.DROP_MOVE;
moveButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dragOperation |= DND.DROP_MOVE;
} else {
dragOperation = dragOperation & ~DND.DROP_MOVE;
if( dragOperation == 0 ) {
dragOperation = DND.DROP_MOVE;
moveButton.setSelection( true );
}
}
if( dragEnabled ) {
createDragSource();
}
}
} );
Button b = new Button( parent, SWT.CHECK );
b.setText( "DND.DROP_COPY" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dragOperation |= DND.DROP_COPY;
} else {
dragOperation = dragOperation & ~DND.DROP_COPY;
if( dragOperation == 0 ) {
dragOperation = DND.DROP_MOVE;
moveButton.setSelection( true );
}
}
if( dragEnabled ) {
createDragSource();
}
}
} );
b = new Button( parent, SWT.CHECK );
b.setText( "DND.DROP_LINK" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dragOperation |= DND.DROP_LINK;
} else {
dragOperation = dragOperation & ~DND.DROP_LINK;
if( dragOperation == 0 ) {
dragOperation = DND.DROP_MOVE;
moveButton.setSelection( true );
}
}
if( dragEnabled ) {
createDragSource();
}
}
} );
}
private void createDragSource() {
if( dragSource != null ) {
dragSource.dispose();
}
dragSource = new DragSource( dragControl, dragOperation );
dragSource.setTransfer( dragTypes );
dragSource.addDragListener( new DragSourceListener() {
public void dragFinished( final DragSourceEvent event ) {
dragConsole.append( ">>dragFinished\n" );
printEvent( event );
dragDataText = dragDataRTF = dragDataHTML = null;
if( event.detail == DND.DROP_MOVE ) {
switch( dragControlType ) {
case BUTTON_CHECK:
case BUTTON_TOGGLE:
case BUTTON_RADIO: {
Button b = ( Button )dragControl;
b.setText( "" );
break;
}
case TABLE: {
Table table = ( Table )dragControl;
TableItem[] items = table.getSelection();
for( int i = 0; i < items.length; i++ ) {
items[ i ].dispose();
}
break;
}
case TEXT: {
Text text = ( Text )dragControl;
text.clearSelection();
break;
}
case TREE: {
Tree tree = ( Tree )dragControl;
TreeItem[] items = tree.getSelection();
for( int i = 0; i < items.length; i++ ) {
items[ i ].dispose();
}
break;
}
case CANVAS: {
dragControl.setData( "STRINGS", null );
dragControl.redraw();
break;
}
case LABEL: {
Label label = ( Label )dragControl;
label.setText( "" );
break;
}
case LIST: {
List list = ( List )dragControl;
int[] indices = list.getSelectionIndices();
list.remove( indices );
break;
}
}
}
}
public void dragSetData( final DragSourceEvent event ) {
dragConsole.append( ">>dragSetData\n" );
printEvent( event );
if( TextTransfer.getInstance().isSupportedType( event.dataType ) ) {
event.data = dragDataText;
}
if( RTFTransfer.getInstance().isSupportedType( event.dataType ) ) {
event.data = dragDataRTF;
}
if( HTMLTransfer.getInstance().isSupportedType( event.dataType ) ) {
event.data = dragDataHTML;
}
}
public void dragStart( final DragSourceEvent event ) {
dragConsole.append( ">>dragStart\n" );
printEvent( event );
switch( dragControlType ) {
case BUTTON_CHECK:
case BUTTON_TOGGLE:
case BUTTON_RADIO: {
Button b = ( Button )dragControl;
dragDataText = b.getSelection()
? "true"
: "false";
break;
}
case TABLE: {
Table table = ( Table )dragControl;
TableItem[] items = table.getSelection();
if( items.length == 0 ) {
event.doit = false;
} else {
dragDataText = join( "\n", items );
}
break;
}
case TEXT: {
Text text = ( Text )dragControl;
String s = text.getSelectionText();
if( s.length() == 0 ) {
event.doit = false;
} else {
dragDataText = s;
}
break;
}
case TREE: {
Tree tree = ( Tree )dragControl;
TreeItem[] items = tree.getSelection();
if( items.length == 0 ) {
event.doit = false;
} else {
dragDataText = join( "\n", items );
}
break;
}
case CANVAS: {
String[] strings = ( String[] )dragControl.getData( "STRINGS" );
if( strings == null || strings.length == 0 ) {
event.doit = false;
} else {
dragDataText = join( "\n", strings );
}
break;
}
case LABEL: {
Label label = ( Label )dragControl;
String string = label.getText();
if( string.length() == 0 ) {
event.doit = false;
} else {
dragDataText = string;
}
break;
}
case LIST: {
List list = ( List )dragControl;
String[] selection = list.getSelection();
if( selection.length == 0 ) {
event.doit = false;
} else {
dragDataText = join( "\n", selection );
}
break;
}
default:
throw new SWTError( SWT.ERROR_NOT_IMPLEMENTED );
}
if( dragDataText != null ) {
dragDataRTF = "{\\rtf1{\\colortbl;\\red255\\green0\\blue0;}\\cf1\\b "
+ dragDataText
+ "}";
dragDataHTML = "<b>" + dragDataText + "</b>";
}
for( int i = 0; i < dragTypes.length; i++ ) {
if( dragTypes[ i ] instanceof TextTransfer && dragDataText == null ) {
event.doit = false;
}
if( dragTypes[ i ] instanceof RTFTransfer && dragDataRTF == null ) {
event.doit = false;
}
if( dragTypes[ i ] instanceof HTMLTransfer && dragDataHTML == null ) {
event.doit = false;
}
}
}
} );
}
private void createDragTypes( final Composite parent ) {
parent.setLayout( new GridLayout() );
Button b = new Button( parent, SWT.CHECK );
b.setText( "Text Transfer" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
addDragTransfer( TextTransfer.getInstance() );
} else {
removeDragTransfer( TextTransfer.getInstance() );
}
}
} );
b.setSelection( true );
b = new Button( parent, SWT.CHECK );
b.setText( "RTF Transfer" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
addDragTransfer( RTFTransfer.getInstance() );
} else {
removeDragTransfer( RTFTransfer.getInstance() );
}
}
} );
b = new Button( parent, SWT.CHECK );
b.setText( "HTML Transfer" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
addDragTransfer( HTMLTransfer.getInstance() );
} else {
removeDragTransfer( HTMLTransfer.getInstance() );
}
}
} );
}
private void createDragWidget( final Composite parent ) {
parent.setLayout( new FormLayout() );
Combo combo = new Combo( parent, SWT.READ_ONLY );
combo.setItems( new String[]{
"Toggle Button",
"Radio Button",
"Checkbox",
"Canvas",
"Label",
"List",
"Table",
"Tree"
} );
combo.select( LABEL );
dragControlType = combo.getSelectionIndex();
dragControl = createWidget( dragControlType, parent, "Drag Source" );
combo.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Object data = dragControl.getLayoutData();
Composite parent = dragControl.getParent();
dragControl.dispose();
Combo c = ( Combo )e.widget;
dragControlType = c.getSelectionIndex();
dragControl = createWidget( dragControlType, parent, "Drag Source" );
dragControl.setLayoutData( data );
updateDragSource();
parent.layout();
}
} );
Button b = new Button( parent, SWT.CHECK );
b.setText( "DragSource" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
dragEnabled = ( ( Button )e.widget ).getSelection();
updateDragSource();
}
} );
b.setSelection( dragEnabled );
FormData data = new FormData();
data.top = new FormAttachment( 0, 10 );
data.bottom = new FormAttachment( combo, -10 );
data.left = new FormAttachment( 0, 10 );
data.right = new FormAttachment( 100, -10 );
dragControl.setLayoutData( data );
data = new FormData();
data.bottom = new FormAttachment( 100, -10 );
data.left = new FormAttachment( 0, 10 );
combo.setLayoutData( data );
data = new FormData();
data.bottom = new FormAttachment( 100, -10 );
data.left = new FormAttachment( combo, 10 );
b.setLayoutData( data );
updateDragSource();
}
private void updateDragSource() {
if( dragSource != null ) {
dragSource.dispose();
}
if( dragEnabled ) {
createDragSource();
} else {
if( dragSource != null ) {
dragSource.dispose();
}
dragSource = null;
}
}
private void createDropOperations( final Composite parent ) {
parent.setLayout( new RowLayout( SWT.VERTICAL ) );
final Button moveButton = new Button( parent, SWT.CHECK );
moveButton.setText( "DND.DROP_MOVE" );
moveButton.setSelection( true );
dropOperation = DND.DROP_MOVE;
moveButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropOperation |= DND.DROP_MOVE;
} else {
dropOperation = dropOperation & ~DND.DROP_MOVE;
if( dropOperation == 0
|| ( dropDefaultOperation & DND.DROP_MOVE ) != 0 )
{
dropOperation |= DND.DROP_MOVE;
moveButton.setSelection( true );
}
}
if( dropEnabled ) {
createDropTarget();
}
}
} );
final Button copyButton = new Button( parent, SWT.CHECK );
copyButton.setText( "DND.DROP_COPY" );
copyButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropOperation |= DND.DROP_COPY;
} else {
dropOperation = dropOperation & ~DND.DROP_COPY;
if( dropOperation == 0
|| ( dropDefaultOperation & DND.DROP_COPY ) != 0 )
{
dropOperation = DND.DROP_COPY;
copyButton.setSelection( true );
}
}
if( dropEnabled ) {
createDropTarget();
}
}
} );
final Button linkButton = new Button( parent, SWT.CHECK );
linkButton.setText( "DND.DROP_LINK" );
linkButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropOperation |= DND.DROP_LINK;
} else {
dropOperation = dropOperation & ~DND.DROP_LINK;
if( dropOperation == 0
|| ( dropDefaultOperation & DND.DROP_LINK ) != 0 )
{
dropOperation = DND.DROP_LINK;
linkButton.setSelection( true );
}
}
if( dropEnabled ) {
createDropTarget();
}
}
} );
Button b = new Button( parent, SWT.CHECK );
b.setText( "DND.DROP_DEFAULT" );
defaultParent = new Composite( parent, SWT.NONE );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropOperation |= DND.DROP_DEFAULT;
defaultParent.setVisible( true );
} else {
dropOperation = dropOperation & ~DND.DROP_DEFAULT;
defaultParent.setVisible( false );
}
if( dropEnabled ) {
createDropTarget();
}
}
} );
defaultParent.setVisible( false );
GridLayout layout = new GridLayout();
layout.marginWidth = 20;
defaultParent.setLayout( layout );
Label label = new Label( defaultParent, SWT.NONE );
label.setText( "Value for default operation is:" );
b = new Button( defaultParent, SWT.RADIO );
b.setText( "DND.DROP_MOVE" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
if( ( ( Button )e.widget ).getSelection() ) {
dropDefaultOperation = DND.DROP_MOVE;
dropOperation |= DND.DROP_MOVE;
moveButton.setSelection( true );
if( dropEnabled ) {
createDropTarget();
}
}
}
} );
b = new Button( defaultParent, SWT.RADIO );
b.setText( "DND.DROP_COPY" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropDefaultOperation = DND.DROP_COPY;
dropOperation |= DND.DROP_COPY;
copyButton.setSelection( true );
if( dropEnabled ) {
createDropTarget();
}
}
}
} );
b = new Button( defaultParent, SWT.RADIO );
b.setText( "DND.DROP_LINK" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropDefaultOperation = DND.DROP_LINK;
dropOperation |= DND.DROP_LINK;
linkButton.setSelection( true );
if( dropEnabled ) {
createDropTarget();
}
}
}
} );
b = new Button( defaultParent, SWT.RADIO );
b.setText( "DND.DROP_NONE" );
b.setSelection( true );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropDefaultOperation = DND.DROP_NONE;
dropOperation &= ~DND.DROP_DEFAULT;
if( dropEnabled ) {
createDropTarget();
}
}
}
} );
}
private void createDropTarget() {
if( dropTarget != null ) {
dropTarget.dispose();
}
dropTarget = new DropTarget( dropControl, dropOperation );
dropTarget.setTransfer( dropTypes );
dropTarget.addDropListener( new DropTargetListener() {
public void dragEnter( final DropTargetEvent event ) {
dropConsole.append( ">>dragEnter\n" );
printEvent( event );
if( event.detail == DND.DROP_DEFAULT ) {
event.detail = dropDefaultOperation;
}
event.feedback = dropFeedback;
}
public void dragLeave( final DropTargetEvent event ) {
dropConsole.append( ">>dragLeave\n" );
printEvent( event );
}
public void dragOperationChanged( final DropTargetEvent event ) {
dropConsole.append( ">>dragOperationChanged\n" );
printEvent( event );
if( event.detail == DND.DROP_DEFAULT ) {
event.detail = dropDefaultOperation;
}
event.feedback = dropFeedback;
}
public void dragOver( final DropTargetEvent event ) {
dropConsole.append( ">>dragOver\n" );
printEvent( event );
event.feedback = dropFeedback;
}
public void drop( final DropTargetEvent event ) {
dropConsole.append( ">>drop\n" );
printEvent( event );
String[] strings = null;
if( TextTransfer.getInstance().isSupportedType( event.currentDataType )
|| RTFTransfer.getInstance()
.isSupportedType( event.currentDataType )
|| HTMLTransfer.getInstance()
.isSupportedType( event.currentDataType ) )
{
strings = new String[]{
( String )event.data
};
}
if( FileTransfer.getInstance().isSupportedType( event.currentDataType ) )
{
strings = ( String[] )event.data;
}
if( ClientFileTransfer.getInstance().isSupportedType( event.currentDataType ) ) {
ClientFile[] files = ( ClientFile[] )event.data;
strings = new String[ files.length ];
for( int i = 0; i < files.length; i++ ) {
strings[ i ] = files[ i ].toString();
}
}
if( strings == null || strings.length == 0 ) {
dropConsole.append( "!!Invalid data dropped" );
return;
}
if( strings.length == 1
&& ( dropControlType == TABLE || dropControlType == TREE || dropControlType == LIST ) )
{
// convert string separated by "\n" into an array of strings
String string = strings[ 0 ];
int count = 0;
int offset = string.indexOf( "\n", 0 );
while( offset > 0 ) {
count++;
offset = string.indexOf( "\n", offset + 1 );
}
if( count > 0 ) {
strings = new String[ count + 1 ];
int start = 0;
int end = string.indexOf( "\n" );
int index = 0;
while( start < end ) {
strings[ index++ ] = string.substring( start, end );
start = end + 1;
end = string.indexOf( "\n", start );
if( end == -1 ) {
end = string.length();
}
}
}
}
switch( dropControlType ) {
case BUTTON_CHECK:
case BUTTON_TOGGLE:
case BUTTON_RADIO: {
Button b = ( Button )dropControl;
b.setText( strings[ 0 ] );
break;
}
case TABLE: {
Table table = ( Table )dropControl;
Point p = event.display.map( null, table, event.x, event.y );
TableItem dropItem = table.getItem( p );
int index = dropItem == null
? table.getItemCount()
: table.indexOf( dropItem );
for( int i = 0; i < strings.length; i++ ) {
TableItem item = new TableItem( table, SWT.NONE, index );
item.setText( 0, strings[ i ] );
item.setText( 1, "dropped item" );
}
TableColumn[] columns = table.getColumns();
for( int i = 0; i < columns.length; i++ ) {
columns[ i ].pack();
}
break;
}
case TEXT: {
Text text = ( Text )dropControl;
for( int i = 0; i < strings.length; i++ ) {
text.append( strings[ i ] + "\n" );
}
break;
}
case TREE: {
Tree tree = ( Tree )dropControl;
Point p = event.display.map( null, tree, event.x, event.y );
TreeItem parentItem = tree.getItem( p );
for( int i = 0; i < strings.length; i++ ) {
TreeItem item = parentItem != null
? new TreeItem( parentItem,
SWT.NONE )
: new TreeItem( tree, SWT.NONE );
item.setText( strings[ i ] );
}
break;
}
case CANVAS: {
dropControl.setData( "STRINGS", strings );
dropControl.redraw();
break;
}
case LABEL: {
Label label = ( Label )dropControl;
label.setText( join( "\n", strings ) );
break;
}
case LIST: {
List list = ( List )dropControl;
for( int i = 0; i < strings.length; i++ ) {
list.add( strings[ i ] );
}
break;
}
default:
throw new SWTError( SWT.ERROR_NOT_IMPLEMENTED );
}
}
public void dropAccept( final DropTargetEvent event ) {
dropConsole.append( ">>dropAccept\n" );
printEvent( event );
}
} );
}
private void createFeedbackTypes( final Group parent ) {
parent.setLayout( new RowLayout( SWT.VERTICAL ) );
Button b = new Button( parent, SWT.CHECK );
b.setText( "FEEDBACK_SELECT" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropFeedback |= DND.FEEDBACK_SELECT;
} else {
dropFeedback &= ~DND.FEEDBACK_SELECT;
}
}
} );
b = new Button( parent, SWT.CHECK );
b.setText( "FEEDBACK_SCROLL" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropFeedback |= DND.FEEDBACK_SCROLL;
} else {
dropFeedback &= ~DND.FEEDBACK_SCROLL;
}
}
} );
b = new Button( parent, SWT.CHECK );
b.setText( "FEEDBACK_INSERT_BEFORE" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropFeedback |= DND.FEEDBACK_INSERT_BEFORE;
} else {
dropFeedback &= ~DND.FEEDBACK_INSERT_BEFORE;
}
}
} );
b = new Button( parent, SWT.CHECK );
b.setText( "FEEDBACK_INSERT_AFTER" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropFeedback |= DND.FEEDBACK_INSERT_AFTER;
} else {
dropFeedback &= ~DND.FEEDBACK_INSERT_AFTER;
}
}
} );
b = new Button( parent, SWT.CHECK );
b.setText( "FEEDBACK_EXPAND" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Button b = ( Button )e.widget;
if( b.getSelection() ) {
dropFeedback |= DND.FEEDBACK_EXPAND;
} else {
dropFeedback &= ~DND.FEEDBACK_EXPAND;
}
}
} );
}
private void createDropTypes( final Composite parent ) {
parent.setLayout( new RowLayout( SWT.VERTICAL ) );
createDropTypeButton( parent, "Text Transfer", TextTransfer.getInstance() )
.setSelection( true );
createDropTypeButton( parent, "RTF Transfer", RTFTransfer.getInstance() );
createDropTypeButton( parent, "HTML Transfer", HTMLTransfer.getInstance() );
createDropTypeButton( parent, "ClientFile Transfer", ClientFileTransfer.getInstance() );
}
private Button createDropTypeButton( Composite parent, String name, final Transfer transfer ) {
final Button button = new Button( parent, SWT.CHECK );
button.setText( name );
button.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
if( button.getSelection() ) {
addDropTransfer( transfer );
} else {
removeDropTransfer( transfer );
}
}
} );
return button;
}
private void createDropWidget( final Composite parent ) {
parent.setLayout( new FormLayout() );
Combo combo = new Combo( parent, SWT.READ_ONLY );
combo.setItems( new String[]{
"Toggle Button",
"Radio Button",
"Checkbox",
"Canvas",
"Label",
"List",
"Table",
"Tree",
"Text"
} );
combo.select( LABEL );
dropControlType = combo.getSelectionIndex();
dropControl = createWidget( dropControlType, parent, "Drop Target" );
combo.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
Object data = dropControl.getLayoutData();
Composite parent = dropControl.getParent();
dropControl.dispose();
Combo c = ( Combo )e.widget;
dropControlType = c.getSelectionIndex();
dropControl = createWidget( dropControlType, parent, "Drop Target" );
dropControl.setLayoutData( data );
updateDropTarget();
parent.layout();
}
} );
Button b = new Button( parent, SWT.CHECK );
b.setText( "DropTarget" );
b.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
dropEnabled = ( ( Button )e.widget ).getSelection();
updateDropTarget();
}
} );
b.setSelection( dropEnabled );
FormData data = new FormData();
data.top = new FormAttachment( 0, 10 );
data.bottom = new FormAttachment( combo, -10 );
data.left = new FormAttachment( 0, 10 );
data.right = new FormAttachment( 100, -10 );
dropControl.setLayoutData( data );
data = new FormData();
data.bottom = new FormAttachment( 100, -10 );
data.left = new FormAttachment( 0, 10 );
combo.setLayoutData( data );
data = new FormData();
data.bottom = new FormAttachment( 100, -10 );
data.left = new FormAttachment( combo, 10 );
b.setLayoutData( data );
updateDropTarget();
}
private void updateDropTarget() {
if( dropTarget != null ) {
dropTarget.dispose();
}
if( dropEnabled ) {
createDropTarget();
} else {
if( dropTarget != null ) {
dropTarget.dispose();
}
dropTarget = null;
}
}
private Control createWidget( final int type, final Composite parent, final String prefix ) {
switch( type ) {
case BUTTON_CHECK: {
Button button = new Button( parent, SWT.CHECK );
button.setText( prefix + " Check box" );
return button;
}
case BUTTON_TOGGLE: {
Button button = new Button( parent, SWT.TOGGLE );
button.setText( prefix + " Toggle button" );
return button;
}
case BUTTON_RADIO: {
Button button = new Button( parent, SWT.RADIO );
button.setText( prefix + " Radio button" );
return button;
}
case TABLE: {
Table table = new Table( parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL );
TableColumn column1 = new TableColumn( table, SWT.NONE );
TableColumn column2 = new TableColumn( table, SWT.NONE );
for( int i = 0; i < 10; i++ ) {
TableItem item = new TableItem( table, SWT.NONE );
item.setText( 0, prefix + " name " + i );
item.setText( 1, prefix + " value " + i );
}
column1.pack();
column2.pack();
return table;
}
case TEXT: {
Text text = new Text( parent, SWT.BORDER
| SWT.MULTI
| SWT.V_SCROLL
| SWT.H_SCROLL );
text.setText( prefix + " Text" );
return text;
}
case TREE: {
Tree tree = new Tree( parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL );
for( int i = 0; i < 3; i++ ) {
TreeItem item = new TreeItem( tree, SWT.NONE );
item.setText( prefix + " item " + i );
for( int j = 0; j < 3; j++ ) {
TreeItem subItem = new TreeItem( item, SWT.NONE );
subItem.setText( prefix + " item " + j );
for( int k = 0; k < 3; k++ ) {
TreeItem subsubItem = new TreeItem( subItem, SWT.NONE );
subsubItem.setText( prefix + " item " + k );
}
}
}
return tree;
}
case CANVAS: {
Canvas canvas = new Canvas( parent, SWT.BORDER );
canvas.setData( "STRINGS", new String[]{
prefix + " Canvas widget"
} );
return canvas;
}
case LABEL: {
Label label = new Label( parent, SWT.BORDER );
label.setText( prefix + " Label" );
return label;
}
case LIST: {
List list = new List( parent, SWT.BORDER | SWT.V_SCROLL );
list.setItems( new String[]{
prefix + " Item a",
prefix + " Item b",
prefix + " Item c",
prefix + " Item d"
} );
return list;
}
default:
throw new SWTError( SWT.ERROR_NOT_IMPLEMENTED );
}
}
private void printEvent( final DragSourceEvent e ) {
if( !dragEventDetail ) {
return;
}
StringBuilder sb = new StringBuilder();
sb.append( "widget: " );
sb.append( e.widget );
sb.append( ", time: " );
sb.append( e.time );
sb.append( ", operation: " );
sb.append( e.detail );
sb.append( ", type: " );
sb.append( e.dataType != null ? e.dataType.type : 0 );
sb.append( ", doit: " );
sb.append( e.doit );
sb.append( ", data: " );
sb.append( e.data );
sb.append( "\n" );
dragConsole.append( sb.toString() );
}
private void printEvent( final DropTargetEvent e ) {
if( !dropEventDetail ) {
return;
}
StringBuilder sb = new StringBuilder();
sb.append( "widget; " );
sb.append( e.widget );
sb.append( ", time: " );
sb.append( e.time );
sb.append( ", x: " );
sb.append( e.x );
sb.append( ", y: " );
sb.append( e.y );
sb.append( ", item: " );
sb.append( e.item );
sb.append( ", operations: " );
sb.append( e.operations );
sb.append( ", operation: " );
sb.append( e.detail );
sb.append( ", feedback: " );
sb.append( e.feedback );
if( e.dataTypes != null ) {
for( int i = 0; i < e.dataTypes.length; i++ ) {
sb.append( ", dataType " );
sb.append( i );
sb.append( ": " );
sb.append( e.dataTypes[ i ].type );
}
} else {
sb.append( ", dataTypes: none" );
}
sb.append( ", currentDataType: " );
sb.append( e.currentDataType );
sb.append( ", data: " );
sb.append( e.data );
sb.append( "\n" );
dropConsole.append( sb.toString() );
}
private void removeDragTransfer( final Transfer transfer ) {
if( dragTypes.length == 1 ) {
dragTypes = new Transfer[ 0 ];
} else {
int index = -1;
for( int i = 0; i < dragTypes.length; i++ ) {
if( dragTypes[ i ] == transfer ) {
index = i;
break;
}
}
if( index == -1 ) {
return;
}
Transfer[] newTypes = new Transfer[ dragTypes.length - 1 ];
System.arraycopy( dragTypes, 0, newTypes, 0, index );
System.arraycopy( dragTypes, index + 1, newTypes, index, dragTypes.length
- index
- 1 );
dragTypes = newTypes;
}
if( dragSource != null ) {
dragSource.setTransfer( dragTypes );
}
}
private void removeDropTransfer( final Transfer transfer ) {
if( dropTypes.length == 1 ) {
dropTypes = new Transfer[ 0 ];
} else {
int index = -1;
for( int i = 0; i < dropTypes.length; i++ ) {
if( dropTypes[ i ] == transfer ) {
index = i;
break;
}
}
if( index == -1 ) {
return;
}
Transfer[] newTypes = new Transfer[ dropTypes.length - 1 ];
System.arraycopy( dropTypes, 0, newTypes, 0, index );
System.arraycopy( dropTypes, index + 1, newTypes, index, dropTypes.length
- index
- 1 );
dropTypes = newTypes;
}
if( dropTarget != null ) {
dropTarget.setTransfer( dropTypes );
}
}
private static String join( String glue, Item[] items ) {
String[] strings = new String[ items.length ];
for( int i = 0; i < items.length; i++ ) {
strings[ i ] = items[ i ].getText();
}
return join( glue, strings );
}
private static String join( String glue, String[] strings ) {
StringBuilder stringBuilder = new StringBuilder();
for( int i = 0; i < strings.length; i++ ) {
stringBuilder.append( strings[ i ] );
if( i != strings.length -1 ) {
stringBuilder.append( glue );
}
}
return stringBuilder.toString();
}
}