All Downloads are FREE. Search and download functionalities are using the official Maven repository.

rwt.widgets.DropTarget.js Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright (c) 2014, 2015 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
 ******************************************************************************/

namespace( "rwt.widgets" );

(function() {
  var callWithElement = rwt.widgets.util.WidgetUtil.callWithElement;

  rwt.widgets.DropTarget = function( control, operations ) {
    this.control = control;
    this.actions = rwt.remote.DNDSupport.getInstance()._operationsToActions( operations );
    rwt.remote.DNDSupport.getInstance().registerDropTarget( this );
    this._onDragEvent = rwt.util.Functions.bind( this._onDragEvent, this );
  };

  rwt.widgets.DropTarget.prototype = {

    dispose : function() {
      rwt.remote.DNDSupport.getInstance().deregisterDropTarget( this );
    },

    setTransfer : function( transferTypes ) {
      rwt.remote.DNDSupport.getInstance().setDropTargetTransferTypes( this.control, transferTypes );
    },

    changeFeedback : function( feedback, flags ) {
      rwt.remote.DNDSupport.getInstance().setFeedback( this.control, feedback, flags );
    },

    changeDetail : function( detail ) {
      rwt.remote.DNDSupport.getInstance().setOperationOverwrite( this.control, detail );
    },

    changeDataType : function( dataType ) {
      rwt.remote.DNDSupport.getInstance().setDataType( this.control, dataType );
    },

    setFileDropEnabled : function( enabled ) {
      if( rwt.client.Client.supportsFileDrop() ) {
        var listener = this._onDragEvent;
        callWithElement( this.control, function( element ) {
          if( enabled ) {
            element.addEventListener( "dragenter", listener, false );
            element.addEventListener( "dragover", listener, false );
            element.addEventListener( "drop", listener, false );
          } else {
            element.removeEventListener( "dragenter", listener, false );
            element.removeEventListener( "dragover", listener, false );
            element.removeEventListener( "drop", listener, false );
          }
        } );
      }
    },

    _onDragEvent : function( event ) {
      try {
        if( this._isDraggingFiles( event ) ) {
          // NOTE: Feedback effects are currenlty only respected by webkit, will ignore for now
          rwt.event.EventHandlerUtil.stopDomEvent( event );
          event.stopPropagation();
          if( event.type === "drop" ) {
            this._sendDropAccept( event );
          }
        }
      } catch( ex ) {
        rwt.runtime.ErrorHandler.processJavaScriptError( ex );
      }
    },

    _sendDropAccept : function( event ) {
      var remoteObject = rwt.remote.Connection.getInstance().getRemoteObject( this );
      remoteObject.notify( "DropAccept", {
        "x" : Math.round( event.pageX ),
        "y" : Math.round( event.pageY ),
        "time" : rwt.remote.EventUtil.eventTimestamp(),
        "operation" : "move",
        "feedback" : 0,
        "files" : this._getFiles( event )
      } );
    },

    _isDraggingFiles : function( event ) {
      var types = event.dataTransfer.types;
      return types.indexOf ? ( types.indexOf( "Files" ) !== -1 ) : types.contains( "Files" );
    },

    _getFiles : function( event ) {
      var fileUploader = rwt.client.FileUploader.getInstance();
      var files = event.dataTransfer.files;
      var result = {};
      for( var i = 0; i < files.length; i++ ) {
        var file = files.item( i );
        var fileId = fileUploader.addFile( file );
        result[ fileId ] = {
          "type" : file.type,
          "size" : file.size,
          "name" : file.name
        };
      }
      return result;
    }

  };

}());




© 2015 - 2025 Weber Informatics LLC | Privacy Policy