Écrit par Neil Deakin.
Traduit par Maximilien (24/07/2004).
Page originale :
http://www.xulplanet.com/tutorials/xultu/xpcomex.html
Cette section donne quelques exemples d'utilisation de la technologie XPCOM avec de nouvelles interfaces.
La liste des fenêtres Mozilla ouvertes peut être utilisée comme une source de données RDF. Ceci permet de créer un menu de fenêtre qui donne la liste des fenêtres courantes ouvertes par l'application. La source de données correspondante est rdf:window-mediator dont voici un exemple d'utilisation :
Exemple 8.2.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 sera crée contenant la liste de toutes les fenêtres ouvertes.
Essayez cet exemple en ouvrant plusieurs
fenêtres , et vous les verrez toutes dans le menu.
Nous voudrions maintenant améliorer cela de sorte que lorsqu'on sélectionne un élément du menu,
on aille sur la fenêtre correspondante.
Ceci sera 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" qui est un service.
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 avoir le focus sur 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>
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();
}
}
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é.
Cette fonction récupère d'abord une
référence du composant qui implémente l'interface du "window mediator"
(NdT : plus exactement nsIWindowDataSource
).
Puis nous récupérons l'attribut
id
de l'élément. Nous utilisons cette valeur
comme ressource qui va être passée en paramètre à la fonction getWindowForResource
pour renvoyer la fenêtre correspondante.
Cette fenêtre est stockée dans la variable switchwindow
comme objet javascript window.
Par conséquent on peut utiliser toutes les fonctions disponibles de cet objet,
comme la fonction focus()
.
Ensuite, nous allons récupérer la liste des cookies sauvegardés par le
navigateur. Pour cela on va utiliser le service "Cookie" qui implémente
l'interface nsICookieManager
utilisé 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
vident 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.
Puis, 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 a une méthode hasMoreElements
retournant true jusqu'à ce qu'on récupère le dernier cookie.
La méthode getNext
renvoie un cookie et incrémente l'index de l'énumérateur.
Comme l'ité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 rajouté 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.
Dans la section suivante , nous allons voir les interfaces XPCOM qui manipulent des données RDF.