/******************************************************************************* * Copyright (c) 2009 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.swt.internal.dnd.dragsourcekit; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.rwt.lifecycle.*; import org.eclipse.swt.dnd.*; import org.eclipse.swt.internal.dnd.IDNDAdapter; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Widget; public final class DragSourceLCA extends AbstractWidgetLCA { private static final String JSFUNC_REGISTER = "org.eclipse.rwt.DNDSupport.getInstance().registerDragSource"; private static final String JSFUNC_DEREGISTER = "org.eclipse.rwt.DNDSupport.getInstance().deregisterDragSource"; private static final String JSFUNC_SET_TRANSFER_TYPES = "org.eclipse.rwt.DNDSupport.getInstance().setDragSourceTransferTypes"; private static final String JSFUNC_SET_OPERATION_OVERWRITE = "org.eclipse.rwt.DNDSupport.getInstance().setOperationOverwrite"; private static final String JSFUNC_SET_FEEDBACK = "org.eclipse.rwt.DNDSupport.getInstance().setFeedback"; private static final String JSFUNC_SET_DATATYPE = "org.eclipse.rwt.DNDSupport.getInstance().setDataType"; private static final String JSFUNC_CANCEL = "org.eclipse.rwt.DNDSupport.getInstance().cancel"; private static final Transfer[] DEFAULT_TRANSFER = new Transfer[ 0 ]; private static final String PROP_CONTROL = "control"; private static final String PROP_TRANSFER = "transfer"; public void preserveValues( final Widget widget ) { DragSource dragSource = ( DragSource )widget; IWidgetAdapter adapter = WidgetUtil.getAdapter( dragSource ); adapter.preserve( PROP_CONTROL, dragSource.getControl() ); adapter.preserve( PROP_TRANSFER, dragSource.getTransfer() ); } public void readData( final Widget widget ) { } public void renderInitialization( final Widget widget ) throws IOException { DragSource dragSource = ( DragSource )widget; JSWriter writer = JSWriter.getWriterFor( dragSource ); String[] operations = DNDLCAUtil.convertOperations( dragSource.getStyle() ); Object[] args = new Object[]{ dragSource.getControl(), operations }; writer.callStatic( JSFUNC_REGISTER, args ); } public void renderChanges( final Widget widget ) throws IOException { DragSource dragSource = ( DragSource )widget; writeTransfer( dragSource ); writeDetail( dragSource ); writeFeedback( dragSource ); writeDataType( dragSource ); writeCancel( dragSource ); } public void renderDispose( final Widget widget ) throws IOException { DragSource dragSource = ( DragSource )widget; IWidgetAdapter adapter = WidgetUtil.getAdapter( dragSource ); Control control = ( Control )adapter.getPreserved( PROP_CONTROL ); JSWriter writer = JSWriter.getWriterFor( dragSource ); writer.callStatic( JSFUNC_DEREGISTER, new Object[]{ control } ); } private static void writeTransfer( final DragSource dragSource ) throws IOException { Transfer[] newValue = dragSource.getTransfer(); if( WidgetLCAUtil.hasChanged( dragSource, PROP_TRANSFER, newValue, DEFAULT_TRANSFER ) ) { JSWriter writer = JSWriter.getWriterFor( dragSource ); Object[] args = new Object[]{ dragSource.getControl(), DNDLCAUtil.convertTransferTypes( newValue ) }; writer.callStatic( JSFUNC_SET_TRANSFER_TYPES, args ); } } private void writeDetail( final DragSource dragSource ) throws IOException { IDNDAdapter dndAdapter = ( IDNDAdapter )dragSource.getAdapter( IDNDAdapter.class ); if( dndAdapter.hasDetailChanged() ) { JSWriter writer = JSWriter.getWriterFor( dragSource ); Object[] args = new Object[]{ dndAdapter.getDetailChangedControl(), convertOperation( dndAdapter.getDetailChangedValue() ) }; writer.callStatic( JSFUNC_SET_OPERATION_OVERWRITE, args ); } } private void writeFeedback( final DragSource dragSource ) throws IOException { IDNDAdapter dndAdapter = ( IDNDAdapter )dragSource.getAdapter( IDNDAdapter.class ); if( dndAdapter.hasFeedbackChanged() ) { JSWriter writer = JSWriter.getWriterFor( dragSource ); int value = dndAdapter.getFeedbackChangedValue(); Object[] args = new Object[]{ dndAdapter.getFeedbackChangedControl(), convertFeedback( value ), new Integer( value ) }; writer.callStatic( JSFUNC_SET_FEEDBACK, args ); } } private void writeDataType( final DragSource dragSource ) throws IOException { IDNDAdapter dndAdapter = ( IDNDAdapter )dragSource.getAdapter( IDNDAdapter.class ); if( dndAdapter.hasDataTypeChanged() ) { JSWriter writer = JSWriter.getWriterFor( dragSource ); TransferData value = dndAdapter.getDataTypeChangedValue(); Object[] args = new Object[]{ dndAdapter.getDataTypeChangedControl(), new Integer( value.type ) }; writer.callStatic( JSFUNC_SET_DATATYPE, args ); } } private static void writeCancel( final DragSource dragSource ) throws IOException { IDNDAdapter dndAdapter = ( IDNDAdapter )dragSource.getAdapter( IDNDAdapter.class ); if( dndAdapter.isCanceled() ) { JSWriter writer = JSWriter.getWriterFor( dragSource ); writer.callStatic( JSFUNC_CANCEL, null ); } } private static String convertOperation( final int operation ) { String result = "none"; switch( operation ) { case DND.DROP_COPY: result = "copy"; break; case DND.DROP_MOVE: result = "move"; break; case DND.DROP_LINK: result = "link"; break; } return result; } private static String[] convertFeedback( final int feedback ) { List list = new ArrayList(); if( ( feedback & DND.FEEDBACK_EXPAND ) != 0 ) { list.add( "expand" ); } if( ( feedback & DND.FEEDBACK_INSERT_AFTER ) != 0 ) { list.add( "after" ); } if( ( feedback & DND.FEEDBACK_INSERT_BEFORE ) != 0 ) { list.add( "before" ); } if( ( feedback & DND.FEEDBACK_SCROLL ) != 0 ) { list.add( "scroll" ); } if( ( feedback & DND.FEEDBACK_SELECT ) != 0 ) { list.add( "select" ); } String[] result = new String[ list.size() ]; for( int i = 0; i < list.size(); i++ ) { result[ i ] = ( String )list.get( i ); } return result; } }