Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Drag and drop avec data perso

Envoyé par : papy

Date : 30/06/2006 17:05

Bonjour,

j'essai de faire du drag and drop avec des objets javascript que j'ai crée, mais lors du drop j'ai une erreur quand j'essai de lire ces données :

Error: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsITransferable.getAnyTransferData]
Source file: chrome://global/content/nsDragAndDrop.js
Line: 88

En cherchant dans le code de ce fichier, j'ai vu de nombreux appels à des composants XPCOM et à des objets implémentant des interfaces particulières (entre autre nsITransferable), alors j'ai plusieurs questions:

  • est ce que je suis obligé d'implémenter des interfaces pour permettre à des objets perso d'être pris en drag and drop ?
  • si oui comment dois-je faire cela, j'ai regardé dans la doc sur XPCom mais il y a pas mal de points que je trouve encore obscure.

# Re: Drag and drop avec data perso

Envoyé par : papy

Date : 12/10/2006 17:33

Je rafraichis un coup ce post car j'ai trouvé des informations supplémentaire (enfin je comprend plus de chose maintenant :p) mais toujours pas de solution...

Pour intialiser une session de Drag&Drop, on doit utiliser entre autre un composant de type nsITransferable et affecter les données à l'aide la méthode setTransferData

A ce niveau j'ai deux soucis :

  • qu'est ce que je peux bien mettre pour le paramètre dataLen ?
  • mes données doivent être de type nsISupports mais ce sont des objets javascript. J'ai trouvé sur le net le code suivant :
XPCOM IDL allows you to pass parameters of certain types only (e.g.,
string, integer), in addition to objects with XPCOM interfaces
(e.g., nsISupports). In order to pass anything else (e.g.,
a Javascript array, a Java object) from the client of a Javascript-based
XPCOM component into the component, you need to wrap the object to
be passed in another XPCOM object implemented using Javascript:

function WrapperClass(object) {
    this.wrappedJSObject = this;
    this.object = object;
}

WrapperClass.prototype = {
    QueryInterface : function(iid) {
        if (!iid.equals(Components.interfaces.nsISupports)) {
            throw Components.results.NS_ERROR_NO_INTERFACE;
        }
        return this;
    }
}

Now you can call the first XPCOM component passing in any kind
of object by wrapping it first:

 theComponent.foo(new WrapperClass(theObject))

And inside foo(), the wrapped object can be retrieved as follows:

foo : function(arg) {
    var theActualObject = arg.wrappedJSObject.object;
}

In the interface definition of theComponent (in your IDL file),
you need to declare that foo() takes an nsISupports parameter.

Ca ne change pas le problème, je fais mon appel comme suit :

trans.setTransferData('app/test1', new WrapperClass(monObjet), 0)

j'obtient toujours la même erreur lorsque j'essai de récupérer les données :

var dataObj = new Object();
var bFlavor = new Object();
var len = new Object();
trans.getAnyTransferData(bFlavor, dataObj, len);

-----

[Exception... "Component returned failure code: 0x80004005 
(NS_ERROR_FAILURE) [nsITransferable.getAnyTransferData]"  nsresult: 
"0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: file:///tmp/
dnd.js :: anonymous :: line 203"  data: no]

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.