I figured out a way for users to DnD into GWT's RichTextArea from either 
inside the GWT application and for us even more importantly from another 
website/page.  We had to use JSNI as the standard GWT drop listeners are 
never fired, I assume it's because it uses an iFrame.  I thought I'd post 
it here as perhaps others will find it useful.  Also if you see some 
potential problems let me know as I'd like to improve it. 

One question I have is should I be adding the listener to the iframe too or 
just to iframe.contentWindow?

Also things works really well with Firefox I need to determine if any 
changes are needed for IE8/9/10 and Chrome.

public class GwtRichTextArea extends RichTextArea {

    private Object dragenterFunction = null;
    private Object dragoverFunction = null;
    private Object dropFunction = null;

    public GwtRichTextArea () {
    }

    @Override
    protected void onAttach() {
        super.onAttach();

        IFrameElement iFrame = IFrameElement.as(getElement());
        iFrame.setName(UUID.uuid());
        addDragOverHandler(iFrame);
        addDropHandler(iFrame);
    }

    @Override
    protected void onDetach() {
        IFrameElement iFrame = IFrameElement.as(getElement());
        removeDragOverHandler(iFrame);
        removeDropHandler(iFrame);

        super.onDetach();
    }

    private native void addDragEnterHandler(IFrameElement iframe)
/*-{
    if (iframe == null)
        return;

    var _this = this;

    var dragenterFunction = function (e) {

        // todo: add some css style here
    }

    
[email protected]::dragenterFunction 
= dragenterFunction;

    iframe.addEventListener('dragenter', dragenterFunction, true);
    iframe.contentWindow.addEventListener('dragenter', dragenterFunction, 
true);

}-*/;

    private native void addDragOverHandler(IFrameElement iframe)
/*-{
    if (iframe != null) {
        var _this = this;

        var dragoverFunction = function (e) {

            if (e.preventDefault) {
                e.preventDefault(); 
            }

            e.dataTransfer.dropEffect = 'copy'; 

            return false;
        }

        
[email protected]::dragoverFunction = 
dragoverFunction;

        iframe.addEventListener('dragover', dragoverFunction, true);
        iframe.contentWindow.addEventListener('dragover', dragoverFunction, 
true);
    }
}-*/;

    private native void addDropHandler(IFrameElement iframe)
/*-{
    if (iframe == null) {
        return;
    }

    var _this = this;

    var dropFunction = function (event) {

       // Handle the drop.  We attach to the body element...
       iframe.contentWindow.document.body.appendChild(newElement);
        

        return false;
    }

    [email protected]::dropFunction = 
dropFunction;

    iframe.addEventListener('drop', dropFunction, true);
    iframe.contentWindow.addEventListener('drop', dropFunction, true);

}-*/;

    private native void removeDragOverHandler(IFrameElement iframe)
/*-{
    if (iframe != null) {
        var _this = this;

        var dragoverFunction = 
[email protected]::dragoverFunction;

        iframe.removeEventListener('dragover', dragoverFunction, true);
        iframe.contentWindow.removeEventListener('dragover', 
dragoverFunction, true);
    }
}-*/;

    private native void removeDropHandler(IFrameElement iframe)
/*-{
    if (iframe != null) {
        var _this = this;

        var dropFunction = 
[email protected]::dropFunction;

        iframe.removeEventListener('drop', dropFunction, true);
        iframe.contentWindow.removeEventListener('drop', dropFunction, 
true);
    }
}-*/;

    private native void removeTextPasteHandler(IFrameElement iframe)
/*-{
    if (iframe != null) {
        var _this = this;

        var pasteFunction = 
[email protected]::pasteFunction;

        iframe.removeEventListener('paste', pasteFunction, true);
        iframe.contentWindow.removeEventListener('paste', pasteFunction, 
true);
    }
}-*/;

}


-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to