/*******************************************************************************
* Copyright (c) 2009, 2013 EclipseSource 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:
* EclipseSource - initial API and implementation
******************************************************************************/
package org.eclipse.rap.examples.pages;
import java.util.Arrays;
import org.eclipse.rap.examples.ExampleUtil;
import org.eclipse.rap.examples.IExamplePage;
import org.eclipse.rap.examples.pages.internal.ImageUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.ByteArrayTransfer;
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.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.List;
public class ListExample implements IExamplePage {
private static final int LIST_STYLE = SWT.BORDER | SWT.MULTI | SWT.V_SCROLL;
private static final String IMG_ADD = "forward_nav.gif";
private static final String IMG_REMOVE = "backward_nav.gif";
private static final String[] ELEMENTS = new String[]{
"Dansk",
"Deutsch",
"English",
"Espa\u00f1ol",
"Fran\u00e7ais",
"Nederlands",
"\u0420\u0443\u0441\u0441\u043a\u0438\u0439",
"Suomi",
"Svenska",
};
public void createControl( Composite parent ) {
parent.setLayout( ExampleUtil.createMainLayout( 1 ) );
Composite composite = new Composite( parent, SWT.NONE );
composite.setLayout( ExampleUtil.createGridLayout( 3, false, true, true ) );
composite.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false ) );
final List leftList = new List( composite, LIST_STYLE );
leftList.setLayoutData( ExampleUtil.createFillData() );
addDragSupport( leftList );
addDropSupport( leftList );
Composite buttons = new Composite( composite, SWT.NONE );
RowLayout layout = new RowLayout( SWT.VERTICAL );
layout.fill = true;
buttons.setLayout( layout );
final Button addButton = createButton( buttons, "Add", IMG_ADD );
final Button removeButton = createButton( buttons, "Remove", IMG_REMOVE );
final List rightList = new List( composite, LIST_STYLE );
rightList.setLayoutData( ExampleUtil.createFillData() );
addDragSupport( rightList );
addDropSupport( rightList );
leftList.setItems( ELEMENTS );
addButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent event ) {
moveSelectedItems( leftList, rightList );
}
} );
removeButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent event ) {
moveSelectedItems( rightList, leftList );
}
} );
}
private static void addDragSupport( final List list ) {
DragSource dragSource = new DragSource( list, DND.DROP_MOVE );
dragSource.setTransfer( new Transfer[] { new StringArrayTransfer() } );
dragSource.addDragListener( new DragSourceAdapter() {
@Override
public void dragSetData( final DragSourceEvent event ) {
event.data = list.getSelection();
}
@Override
public void dragFinished( final DragSourceEvent event ) {
if( event.detail == DND.DROP_MOVE ) {
String[] items = list.getSelection();
for( int i = 0; i < items.length; i++ ) {
list.remove( items[ i ] );
}
}
}
} );
}
private static void addDropSupport( final List list ) {
DropTarget dropTarget = new DropTarget( list, DND.DROP_MOVE );
dropTarget.setTransfer( new Transfer[] { new StringArrayTransfer() } );
dropTarget.addDropListener( new DropTargetAdapter() {
@Override
public void drop( final DropTargetEvent event ) {
String[] items = ( String[] )event.data;
for( int i = 0; i < items.length; i++ ) {
list.add( items[ i ] );
}
}
} );
}
private Button createButton( Composite parent, String text, String image ) {
Button result = new Button( parent, SWT.PUSH | SWT.LEFT );
result.setText( text );
result.setImage( ImageUtil.getImage( result.getDisplay(), image ) );
return result;
}
private static void moveSelectedItems( List srcList, List dstList ) {
String[] selection = srcList.getSelection();
for( int i = 0; i < selection.length; i++ ) {
String item = selection[ i ];
srcList.remove( item );
dstList.add( item );
}
if( selection.length > 0 ) {
srcList.deselectAll();
sortItems( dstList );
dstList.setSelection( selection );
}
}
private static void sortItems( List srcList ) {
String[] items = srcList.getItems();
Arrays.sort( items );
srcList.setItems( items );
}
////////////////
// Inner classes
private static final class StringArrayTransfer extends ByteArrayTransfer {
private static final String TYPE_NAME = "string-array";
private static final int TYPE_ID = registerType( TYPE_NAME );
@Override
protected int[] getTypeIds() {
return new int[] { TYPE_ID };
}
@Override
protected String[] getTypeNames() {
return new String[] { TYPE_NAME };
}
@Override
public void javaToNative( final Object object,
final TransferData transferData )
{
transferData.data = object;
}
@Override
public Object nativeToJava( final TransferData transferData ) {
return transferData.data;
}
}
}