Écrit par Neil Deakin.
Traduit par Gabriel de Perthuis (27/07/2004).
Page originale :
http://www.xulplanet.com/tutorials/xultu/dragdrop.html
Cette section indique comment implémenter des objets capables d'être déplacés, et lâchés sur d'autres objets.
De nombreuses interfaces graphiques permettent de glisser-déposer des objets. Il est par exemple possible de déplacer des fichiers d'un dossier à l'autre, ou de lâcher une icone sur une fenêtre pour ouvrir le document qui lui correspond. Mozilla et XUL fournissent une panoplie d'évènements qui se déclenchent lorsque un utilisateur essaie de déplacer un objet.
L'utilisateur commence le glissement en cliquant et en déplaçant la souris sans relacher le bouton. Le glissement finit quand l'utilisateur relâche le bouton. Des gestionnaires d'évènements sont appellés dans ces deux situations, ainsi que lors de certaines étapes intermédiaires.
Mozilla implémente le glisser-déposer à l'aide d'une session de glisser-déposer. Quand un utilisateur demande à faire glisser un objet, et que celui-ci est susceptible d'être glissé-déposé, une session est initiée. La session se charge de modifier le curseur de la souris là où l'objet peut être déposé. Si l'objet ne supporte pas le glisser déposer, la session n'est pas créée. L'utilisateur n'ayant en général qu'une souris, une seule session est active à un instant donné.
Notez que la session peut être créée depuis Mozilla, mais aussi par d'autres applications. Le cas échéant, Mozilla s'occupe de traduire la session.
La liste qui suit décrit tous les gestionnaires d'évènements pouvant être appellés, et que n'importe quel élément peut implémenter. Vous n'avez à définir que les évènements qui vous intéressent.
ondraggesture
ondragover
ondragenter
ondragexit
ondragdrop
Il y a deux façons de gérer les évènements de glisser-déposer. La première passe par l'emploi direct des interfaces de glisser-déposer XPCOM. La seconde est de passer par un conteneur javascript qui vous décharge d'une partie du travail. Ce conteneur est inclus dans le paquet "toolkit" ou "global" de Mozilla.
Deux interfaces sont utilisées pour le glisser-déposer. La première est un service de glisser-déposer,
nsIDragService
, et la seconde est la session, nsIDragSession
.
nsIDragService
est responsable de la création de session quand le glissement commence, et de sa
destruction quand le glissement s'achève. Sa fonction invokeDragSession
doit être appellée
pour commencer le glisser-déposer, dans le contexte d'un évènement
ondraggesture
. Une fois cette fonction appellée, le
glisser-déposer a commencé.
La fonction invokeDragSession
prend quatre paramètres, décris ci-après :
invokeDragSession(element,transferableArray,region,actions);
element
event.target
dans le gestionnaire d'évènement.transferableArray
nsITransferable
, un par élément glissé-déposé. On utilise un tableau
pour pouvoir déplacer plusieurs éléments d'un coup, comme un ensemble de fichiers.region
actions
nsIDragSession.DRAGDROP_ACTION_NONE
nsIDragSession.DRAGDROP_ACTION_COPY
nsIDragSession.DRAGDROP_ACTION_MOVE
nsIDragSession.DRAGDROP_ACTION_LINK
L'interface nsIDragService
fournit également la fonction getCurrentSession
, qui peut
être appellée dans le contexte d'un des évènements de glisser-déposer pour accéder à, et modifier,
l'état du glisser-déposer. Cette fonction renvoie un objet implémentant nsIDragSession
.
L'interface nsIDragSession
sert à modifier les propriétés du glisser-déposer en cours.
Elle expose les propriétés et méthodes suivantes :
canDrop
ondragover
et ondragenter
.dragAction
numDropItems
getData (transfer,index)
nsITransferable
qui recevra
la réponse, le second est l'indice de l'élément à retourner.sourceDocument
sourceNode
isDataFlavorSupported(flavour)
Dans la prochaîne section, nous verrons comment utiliser le conteneur Javascript pour le glisser-déposer.