Écrit par Neil Deakin
,
mise à jour par les contributeurs à MDC
.
Traduit par Maximilien (24/07/2004), mise à jour par Alain B. (04/04/2007) .
Page originale :
http://developer.mozilla.org/en/docs/XUL_Tutorial/XPCOM_Examples
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.
Cette section donne quelques exemples d'utilisation de la technologie XPCOM avec de nouvelles interfaces.
Cet exemple contient une source de données RDF qui sera décrite dans une prochaine section. Vous devriez passer cet exemple pour l'instant, à moins d'en savoir suffisamment sur le sujet.
La liste des fenêtres Mozilla ouvertes peut être utilisée comme une source de données RDF. Elle vous permer de créer dans votre application un menu donnant la liste des fenêtres courantes ouvertes. La source de données correspondante est rdf:window-mediator dont voici un exemple d'utilisation :
Exemple 7.6.1 : Source
<menubar id="windowlist-menubar">
<menu label="Fenêtres">
<menupopup id="window-menu" datasources="rdf:window-mediator" ref="NC:WindowMediatorRoot">
<template>
<rule>
<menuitem uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#Name"/>
</rule>
</template>
</menupopup>
</menu>
</menubar>
</toolbox>
Un menu contenant la liste de toutes les fenêtres ouvertes sera créé. Essayez cet exemple en ouvrant plusieurs fenêtres, et vous les verrez toutes dans le menu.
Cet exemple peut être amélioré de telle façon que lorsque l'on clique sur un élément
du menu, la fenêtre correspondante soit affichée.
Cette tâche sera rendue possible grâce au composant "window mediator" qui implémente
l'interface nsIWindowDataSource
. Le code suivant montre comment il fonctionne :
var wmdata = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService();
wmdata.QueryInterface(Components.interfaces.nsIWindowDataSource);
Ce code récupère le composant "window mediator". Le composant utilisé ici est le même que celui qui gère la source de données RDF "Window-mediator". Vous pouvez également récupérer ce composant au travers du service RDF qui est un autre service de gestion des sources de données RDF.
L'interface nsIWindowDataSource
possède une fonction
getWindowForResource
qui nous donne une fenêtre
à partir d'une ressource. Dans un exemple précédent, nous avons généré une liste
de fenêtres que nous avons ajoutée à un menu via une balise
template
.
Celle-ci génère un attribut id
pour chaque élément
menuitem
.
La valeur de cet attribut peut être utilisée comme ressource.
Ainsi pour donner le focus à la fenêtre sélectionnée, nous pouvons procéder
de la manière suivante :
id
de cet élément.getWindowForResource()
pour avoir l'objet "window".L'exemple ci-dessous nous montre comment procéder :
<toolbox>
<menubar id="windowlist-menubar">
<menu label="Fenêtre" oncommand="switchFocus(event.target);">
<menupopup id="window-menu" datasources="rdf:window-mediator" ref="NC:WindowMediatorRoot">
<template>
<rule>
<menuitem uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#Name"/>
</rule>
</template>
</menupopup>
</menu>
</menubar>
</toolbox>
<script>
function switchFocus(elem)
{
var mediator = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService();
mediator.QueryInterface(Components.interfaces.nsIWindowDataSource);
var resource = elem.getAttribute('id');
switchwindow = mediator.getWindowForResource(resource);
if (switchwindow){
switchwindow.focus();
}
}
</script>
Un gestionnaire de commande a été ajouté à l'élément menu. Ce gestionnaire appelle
la fonction switchFocus()
avec comme paramètre l'élément du menu que nous avons sélectionné.
La fonction switchFocus()
:
nsIWindowDataSource
).id
de l'élément. Nous utilisons cette valeur comme ressource.getWindowForResource()
qui renvoie la fenêtre correspondante. Cette fenêtre est stockée dans la variable switchwindow
comme objet javascript window.focus()
.Maintenant, nous allons récupérer la liste des cookies sauvegardés par le
navigateur. Nous allons utiliser le service "Cookie" qui implémente
l'interface nsICookieManager
utilisée pour énumérer tous les cookies.
Voici un exemple qui alimente la liste d'un menu avec le nom de tous les
cookies provenant du site MozillaZine.
<script>
function getCookies()
{
var menu = document.getElementById("cookieMenu");
menu.removeAllItems();
var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
.getService(Components.interfaces.nsICookieManager);
var iter = cookieManager.enumerator;
while (iter.hasMoreElements()){
var cookie = iter.getNext();
if (cookie instanceof Components.interfaces.nsICookie){
if (cookie.host == "www.mozillazine.org")
menu.appendItem(cookie.name,cookie.value);
}
}
}
</script>
<hbox>
<menulist id="cookieMenu" onpopupshowing="getCookies();"/>
</hbox>
La fonction getCookies()
sera appelée à chaque ouverture du menu, comme
indiqué par l'attribut onpopupshowing
de
l'élément menulist
.
Les deux premières lignes de getCookies()
récupèrent l'élément
menulist
et
suppriment tous les items existants. En effet comme cette fonction est appelée
à chaque fois que nous l'ouvrons, nous ne voulons pas garder les anciens éléments.
Ensuite, le gestionnaire de cookie est récupéré. Celui-ci a une méthode qui
renvoie un objet énumérateur implémentant nsISimpleEnumerator
. Il nous permet de
parcourir tous les cookies. Un énumérateur dispose d'une méthode hasMoreElements()
retournant true jusqu'à ce que le dernier cookie soit récupéré.
La méthode getNext()
renvoie un cookie et incrémente l'index de l'énumérateur.
Comme l'énumérateur ne renvoie qu'un objet générique, nous devons lui indiquer
que nous voulons utiliser l'interface nsICookie
.
Dans ce cas, l'opérateur instanceof
permet d'accomplir cette vérification.
Finalement, un élément est ajouté au menu pour chaque cookie (
NdT : dont le site
hôte est "www.mozillazine.org"). Les propriétés hôte, nom et valeur du cookie sont alors utilisées.
Les menus ont une fonction appendItem()
qui ajoute un élément avec un libellé et une valeur.
D'autres exemples sont disponibles ici :
Dans la section suivante, nous allons voir comment utiliser le presse papier.
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.