Écrit par Neil Deakin
.
Traduit par Nadine Henry (22/07/2004), mise à jour par Alain B. (04/04/2007) .
Attention : Ce tutoriel est ancien et n'est pas mis à jour. Bien que beaucoup d'informations soient encore valables pour les dernières versions de gecko, beaucoup sont aussi obsolètes. Il est préférable d'aller consulter cette page sur la version française de ce tutoriel sur developer.mozilla.org.
Attention, cette page est maintenue dans la version française, mais elle a été enlevée par son auteur sur la version anglaise.
Cette section fournit des informations au sujet du couper, copier et coller dans le presse-papiers et à partir du presse-papiers.
Mozilla fournit un certain nombre d'interfaces pour accéder au presse-papiers. Le composant
@mozilla.org/widget/clipboardhelper;1 peut être utilisé pour copier du texte dans le
presse-papiers. Ce composant implémente l'interface nsIClipboardHelper
, dont la fonction
copyString
peut être utilisée pour copier une chaîne de caractères.
const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"]
.getService(Components.interfaces.nsIClipboardHelper);
gClipboardHelper.copyString("Mettez-moi dans le presse-papiers, s'il vous plaît.");
Cet exemple va tout d'abord créer un outil d'aide pour le presse-papiers puis y copiera une courte chaîne de caractère. Cette méthode fonctionne uniquement pour insérer des chaînes de caractères dans le presse-papiers. Pour d'autres types de données, comme les URLs ou les images, vous aurez besoin d'utiliser une méthode plus complexe.
Un composant @mozilla.org/widget/clipboard;1 et une interface nsIClipboard
fournissent un accès
général au presse-papiers du système. Vous pouvez l'utiliser pour copier et coller n'importe quel
type de données de votre application vers le presse-papiers. Trois objets XPCOM sont nécessaires
pour manipuler les opérations concernant le presse-papiers. Le premier est un objet chargé de prendre les
données pour les insérer dans le presse-papiers. Le deuxième est l'objet presse-papiers. Le troisième
est un objet qui est utilisé pour transférer les données du premier objet vers le presse-papiers. Le
modèle de presse-papiers dans Mozilla nécessite que vous suiviez les étapes suivantes pour copier
les données :
nsITransferable
,Vous pourriez vous demander pourquoi un objet de transfert est nécessaire au lieu de simplement insérer directement l'objet dans le presse-papiers. L'une des raisons est que certains systèmes ne copient pas les données tout de suite. Au lieu de cela, ils attendent jusqu'à ce que les données soient collées. Une autre raison est que l'objet de transfert peut contenir de multiples représentations d'une seule et même donnée. Par exemple, un extrait HTML peut être représenté autant dans sa forme originale en HTML qu'en texte brut. Si une application souhaite obtenir la donnée à partir du presse-papiers et ne comprend pas le HTML, elle peut utiliser la version en texte brut. Si elle peut comprendre le HTML, elle peut récupérer cette version. L'objet de transfert contiendra le contenu du presse-papiers jusqu'à ce que l'application ait précisé ses besoins. Il permet au presse-papiers de pouvoir être utilisé par une autre application de suite.
Décomposons à présent les étapes nécessaires pour copier les données dans le presse-papiers. Tout
d'abord, nous avons besoin de créer un objet XPCOM pour encapsuler ce que nous voulons copier. Nous
supposerons que nous voulons copier un peu de texte. Nous utiliserons l'interface nsISupportsString
qui peut être utilisée pour représenter des chaînes de caractères (spécifiquement, des chaînes
en Unicode).
var copytext="Texte à copier";
var str = Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
str.data=copytext;
La première ligne contient le texte que l'on veut copier. Ensuite, la variable str
est
assignée à un composant qui peut être utilisé pour contenir une chaîne de caractères. La troisième
ligne assigne la chaîne de caractères au composant en utilisant la propriété data
.
Ici, la chaîne de caractères Texte à copier va être copiée mais vous
pouvez la remplacer par la chaîne de caractères que vous souhaitez copier. À présent que l'on a
l'objet à copier, un objet de transfert doit être créé :
var trans = Components.classes["@mozilla.org/widget/transferable;1"]
.createInstance(Components.interfaces.nsITransferable);
trans.addDataFlavor("text/unicode");
trans.setTransferData("text/unicode",str,copytext.length * 2);
La première ligne reçoit le composant de transfert qui implémente nsITransferable
.
Ensuite, nous devons spécifier à l'objet de transfert quel type de données nous souhaitons utiliser.
Le type de données est représenté par son type mime. La fonction addDataFlavor
est utilisée pour indiquer à l'objet de transfert qu'il doit transférer les données d'un
certain type.
Dans le cas présent, nous transférons le type mime text/unicode qui indique une
chaîne de caractères Unicode.
Puis, la fonction setTransferData
qui copie les données de la chaîne
de caractères vers l'objet de transfert est appelée. Cette fonction prend en compte trois paramètres. Le
premier est le type mime que nous déclarons, le deuxième est l'objet qui contient la chaîne de
caractères et le troisième est la longueur de la donnée, en octets. Ici, la longueur est multipliée
par deux car nous utilisons une chaîne de caractères Unicode qui requiert deux octets par caractère.
Vous pouvez répéter les deux dernières lignes et appeler addDataFlavor
et setTransferData
pour de multiples types mime. De cette façon, vous
pouvez avoir une version texte brut et une version HTML du contenu. L'objet de transfert va
contenir sa propre copie des données. Lorsque vous avez ajouté tous les types souhaités,
vous pouvez tous les mettre dans le presse-papiers immédiatement. L'objet de transfert va
contenir toutes les données souhaitées jusqu'à ce que vous soyez prêt à les insérer dans le
presse-papiers.
Ensuite, nous devons créer un objet presse-papiers qui se réfère au presse-papiers du système.
var clipid = Components.interfaces.nsIClipboard;
var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(clipid);
clip.setData(trans,null,clipid.kGlobalClipboard);
Nous obtenons l'objet presse-papiers du système et le stockons dans la variable clip
.
Nous pouvons copier la donnée dans le presse-papiers en appelant la fonction
setData
. Le premier paramètre de cette fonction est l'objet de transfert.
Le deuxième paramètre est habituellement initialisé à null mais vous pourriez le
déclarer à un nsIClipboardOwner
de sorte que vous puissiez indiquer
que la donnée copiée doit être écrasée lors d'une autre opération de copie.
N'appelez setData
que
lorsque vous êtes prêt à copier dans le presse-papiers du système.
Le troisième paramètre de setData
(ainsi que le paramètre de emptyClipboard) indique
quel tampon de presse-papiers utiliser. Le code ci-dessus utilise la constante
kGlobalConstant
pour cela, qui se réfère au presse-papiers global. Ce serait la même
constante qui coupe et colle les opérations dans le menu d'édition utilisé généralement. Si vous utilisez
kSelectionClipboard
à la place, vous allez copier dans le tampon de sélection,
qui n'est en général disponible que sous des systèmes Unix.
Ce processus pluri-étapes a eu pour résultat la copie du texte dans le presse-papiers. Nous pouvons couper vers le presse-papiers au lieu de copier, en effaçant la donnée originale après la copie. Normalement, le texte serait dans un document ou une zone de texte. Le code est rassemblé ci-dessous, avec en plus une vérification des erreurs :
var copytext = "Texte à copier";
var str = Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
if (!str) return false;
str.data = copytext;
var trans = Components.classes["@mozilla.org/widget/transferable;1"]
.createInstance(Components.interfaces.nsITransferable);
if (!trans) return false;
trans.addDataFlavor("text/unicode");
trans.setTransferData("text/unicode",str,copytext.length * 2);
var clipid = Components.interfaces.nsIClipboard;
var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(clipid);
if (!clip) return false;
clip.setData(trans,null,clipid.kGlobalClipboard);
Pour coller la donnée à partir du presse-papiers nous pouvons utiliser un processus similaire, sauf
que nous employons getData
au lieu de setData
et getTransferData
au lieu de setTransferData
. Voici les étapes pour le collage :
nsITransferable
,La première étape est similaire à celle utilisée pour la copie :
var clip = Components.classes["@mozilla.org/widget/clipboard;1"]
.createInstance(Components.interfaces.nsIClipboard);
if (!clip) return false;
var trans = Components.classes["@mozilla.org/widget/transferable;1"]
.createInstance(Components.interfaces.nsITransferable);
if (!trans) return false;
trans.addDataFlavor("text/unicode");
Ce code reçoit l'objet presse-papiers du système et un objet de transfert. Le type mime est ajouté à ce dernier. Maintenant, nous avons besoin d'obtenir la donnée du presse-papiers :
clip.getData(trans,clip.kGlobalClipboard);
var str = new Object();
var strLength = new Object();
trans.getTransferData("text/unicode",str,strLength);
La première ligne exécute le contraire de setData
. La donnée actuellement
dans le presse-papiers du système est placée dans l'objet de transfert. Ensuite, nous créons deux objets
Javascript qui prendrons la donnée et sa longueur. Notez que nous n'avons aucune idée du type de
donnée qui est actuellement dans le presse-papiers. Elle a pu avoir été placée là par une autre
application. C'est pour cela que nous utilisons des objets génériques pour str
et
strLength
.
Puis nous utilisons getTransferData
pour récupérer la donnée à partir
de l'objet de transfert. Nous spécifions le type mime que nous voudrions obtenir.
La donnée sera convertie si elle n'est pas du type désiré et si une conversion entre le type mime
actuel et celui voulu est possible. Si vous avez copié la donnée sous plusieurs
types dans le presse-papiers, vous pouvez récupérer la donnée dans le meilleur format voulu.
Par exemple, un champ de saisie de texte accepterait du texte unicode (ou du texte brut) tandis qu'une
fenêtre d'édition pourrait accepter du HTML et des images.
La variable str
contient maintenant la donnée du presse-papiers. Nous
devons à nouveau convertir la donnée dans une chaîne de caractères Javascript à partir d'un objet
XPCOM. Pour ce faire, le code ci-dessous peut être utilisé :
if (str) str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
if (str) pastetext = str.data.substring(0,strLength.value / 2);
Du fait que la donnée de l'objet de transfert est un nsISupportsString
,
nous devons la convertir en une chaîne de caractères Javascript. La propriété
value
de l'objet complété par getTransferData
, qui est
str dans ce cas, fournit la valeur actuelle de l'objet.
Nous assignons la chaîne de caractères à la variable pastetext
. Nous
pouvons ainsi la mettre dans un champ texte ou à un autre endroit si nécessaire.
Dans la prochaine section, nous verrons comment faire du glisser-déposer.
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.