Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Récupérer mes préférences

Envoyé par : efdur

Date : 30/11/2006 01:04

  • Bonjour :)

Voila un moment que je tourne en rond a vouloir récupérer mes préférences.

Après un redémarrage de FireFox 2.0 les radios reste bien "coché" suivant mon choix mes les actions ne sont pas exécutée. En faite je change le background (la couleur) d'un menu via des radio, tous fonctionne bien, je redémarre, et je retrouve mon menu blanc :(


Le code:

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://customxpmenu/skin/customxpmenu.css"   type="text/css"?>


<!DOCTYPE window [   
 <!ENTITY % cxpCommonUrlDTD SYSTEM "chrome://customxpmenu/content/cxpCommonUrl.dtd">  %cxpCommonUrlDTD;
 <!ENTITY % cxpLocaleDTD SYSTEM "chrome://customxpmenu/locale/customxpmenu.dtd">      %cxpLocaleDTD;
 <!ENTITY % cxpImageShackDTD SYSTEM "chrome://customxpmenu/locale/imageShack.dtd">    %cxpImageShackDTD;    
]>
<overlay id="cxp-overlay"   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script type="application/x-javascript" src="customxpmenu.js"/>
<script type="application/x-javascript" src="customxpmenufonctions.js"/>
<script type="application/x-javascript" src="ImageShackOverlay.js"/>


<preferences>
<preference id="pref_backgroundimage" name="extensions.cxp.backgroundimage" type="string"/>
</preferences>

<toolbarpalette id="BrowserToolbarPalette">
<toolbarbutton  id="cxp-toolbarbutton" type="menu"  class="toolbarbutton-1" label="CustomXPmenu" tooltiptext="CustomXPmenu">

<menupopup id="cxp-menu">
<radiogroup preference="pref_backgroundimage" value="1" flex="1" orient="vertical" >
   <caption label="Couleurs">
    <vbox>
     <radio label="Bleu" selected="true" tooltiptext="Bleu" value="1" oncommand="colorize('background-color: #294a74');"/>
     <menuseparator/>
     <radio label="Noir" tooltiptext="Noir" value="2" oncommand="colorize('background-color: #000000');"/>
     <menuseparator/>
     <radio label="Gris" tooltiptext="Gris" value="3" oncommand="colorize('background-color: #8d8f91');"/>
    </vbox>
   </caption>
 </radiogroup>

la fonction:

function colorize(newStyle)
{   
 document.getElementById("cxp-menu").setAttribute("style",newStyle);
 SetPrefWindowStyle(this.value);
}

Pour le reste tous fonctionne donc j'ai passé les menuitems et autre ! Comme je débute (c'est ma première extension) j'ai un peu de mal a comprendre la façon de récupérer les préférences donc si quelqu'un peu m'aider MERCI...

# Re: Récupérer mes préférences

Envoyé par : efdur

Date : 30/11/2006 11:53

Je rajoute un aperçu du problème au cas ou je ne saurais pas claire..

http://img149.imageshack.us/my.php?image(..)

# Re: Récupérer mes préférences

Envoyé par : demanghonj

Date : 02/12/2006 00:25

tape about:config dans la barre d'adresse

A ce moment la tu verifie que tes préférences sont bien enregistré.

Moi je n'utilise pas ce système pour ajouter et récupérer des préférences. J'utilise le composant XPCOM.

# Re: Récupérer mes préférences

Envoyé par : efdur

Date : 02/12/2006 00:39

Merci j'avais vérifié elle sont bien enregistrées mais ne sont pas lu au redémarrage.il me manque quelque chose, un "onload" et une fonction.js pour le faire. Enfin c'est ce que je pense !

# Re: Récupérer mes préférences

Envoyé par : demanghonj

Date : 02/12/2006 03:08

La fonction SetPrefWindowStyle(value) est une fonction à toi ou intégrée aux préférences. Si elle est une fonction intégrée aux préférences alors je suppose que la fonction pour récupérer la valeur est GetPrefWindowStyle(). Sinon il te faut créer ta fonction qui va récupérer ta préférences. Utilise XPCOM pour le faire comme moi.

Oui il te faut créer une fonction au démarrage avec onload qui va récupérer la préférence. Et une fois celle-ci récupérée tu appelle ta fonction colorize pour mettre à jour la couleur.

# Re: Récupérer mes préférences

Envoyé par : efdur

Date : 02/12/2006 09:48

demanghonj a écrit:

La fonction SetPrefWindowStyle(value) est une
fonction à toi ou intégrée aux préférences.

  • J'ai juste rajouter "SetPrefWindowStyle(this.value)" a la fonction colorize pensant que cela étais suffisant pour qu'au redémarrage je retrouve mon menu avec la couleur que j'avais choisi...

Si elle est une fonction intégrée aux préférences
alors je suppose que la fonction pour récupérer la
valeur est GetPrefWindowStyle(). Sinon il te faut
créer ta fonction qui va récupérer ta préférences.
Utilise XPCOM pour le faire comme moi.

  • Tu aurais un exemple de cette fonction a me montrer ?


Oui il te faut créer une fonction au démarrage
avec onload qui va récupérer la préférence. Et une
fois celle-ci récupérée tu appelle ta fonction
colorize pour mettre à jour la couleur.

  • Comme mon menu est dans un overlay je dois rajouter ce code juste après la déclaration de mon overlay?
<overlay id="cxp-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<window id="charger" onload="ma fonction a lancer au demarrage();"/>
<script type="application/x-javascript" src="le script.js ou ce trouve ma fonction"/>

Merci pour ton aide :)

  • Sur cette histoire de préférences (création,récupération,mise a jour)je n'est trouvé aucun tutoriel en français ces bien dommage!

# Re: Récupérer mes préférences

Envoyé par : demanghonj

Date : 03/12/2006 03:21

Je n'utilise pas la même méthode pour enregistrer mes préféences donc voici ma méthode pour enregistrer mes préférences (XPCOM):

//Cette méthode enregistre des préférences en utilisant XPCOM
//param type: nom de la préférence (ex: interface)
//param pPrefs: un tableau de valeur 
//              (dans ton cas tu n'as qu'une valeur (la couleur) 
//               mais tu pourra ajouter d'autre préférence comme la
//               police par exemple)
 function enregistrerPrefs(type, pPrefs)
{
    //Récupération des services XPCOM qui vont permmettre l'enregistrement des préférences. Si la préférences existe les données sont écraser.
 	var service = Components.classes["@mozilla.org/preferences-service;1"]	
	.getService(Components.interfaces.nsIPrefService)
	.getBranch("3jgestion."+type+".");
var branche = Components.classes["@mozilla.org/preferences-service;1"]	
	.getService(Components.interfaces.nsIPrefBranch);		
       try
{
               //On parcours le tableau de valeur
	for(p in pPrefs)
	{
                       //On peut enregistrer 3 type de valeur
                       //(string, number et boolean). On récupère le
                       // type de la valeur et appelle la méthode
                       //  approprié
		switch (typeof pPrefs[p])
		{
			case "string":
					service.setCharPref(p, pPrefs[p]);
					break;
			case"number":
					service.setIntPref(p, pPrefs[p]);
					break;
			case "boolean":
					service.setBoolPref(p, pPrefs[p]);
					break;
		}
	}
}
catch(e)
{
              //renvoi l'erreur en cas de problème
	alert("erreur" + e);
}
}


//Cette méthode récupère des préférences en utilisant XPCOM
//param type: nom de la préférence (ex: interface)
//param pPrefs: un tableau  qui va contenir les valeurs
               //(dans ton cas tu n'as qu'une valeur (la couleur))
function chargerPrefs(type, prefs)
{
var service = Components.classes["@mozilla.org/preferences-service;1"]	
	.getService(Components.interfaces.nsIPrefService)	
               .getBranch("3jgestion."+type+".");
var branche = Components.classes["@mozilla.org/preferences-service;1"]	
	.getService(Components.interfaces.nsIPrefBranch);

try
{
               //On va insérer la valeur dans le tableau en paramètre. 
               //Sa strucuture doit bien sur être identique à celui 
               //qui à permis l'enregistrement des mêmes préférences
	for(p in prefs)
	{
                       //On récupère a préférence et insère la valeur au tableau
		switch (service.getPrefType(p))
		{
			case branche.PREF_STRING:
					prefs[p] = service.getCharPref(p);
					break;
			case branche.PREF_INT:
					prefs[p] = service.getIntPref(p);
					break;
			case branche.PREF_BOOL:
					prefs[p] = service.getBoolPref(p);
					break;
		}
	}
}
catch(e)
{
	alert(e);
}
	return prefs;
}

Moi j'ai créer un fichier javascript qui contient ces méthodes. Pour charger mes préférences je créer une petite methode (aussi dans mon fichier javascript), dans ton cas ce sera:

//Cette fonction récupère les préférence de l'interfec, donc ta couleur
function GetPrefInteface()
{
        //On créer la strucutre du tableau dans lequel on va insérer
        //la valeur de la préférence
 var prefs = {couleur: null};
        //On retourne le tableau remplit
 return chargerPrefs("interface",prefs);
}

//Cette fonction enregistre la valeur de la couleur dans la 
//preference interface.
function GetPrefInteface()
{
        //On créer la strucutre du tableau
        //on indique la valeur de la préférence (la couleur)
 var prefs = {couleur: valeur de la couleur cochée};
        //On enregistre la couleur dans la preference interface
 enregistrerPrefs("interface",prefs);
}

Après tu n'as plus que à applé cette méthode pour récupérer la valeur enregistrer des préférences et tu rappelle ta méthode colorize(la valeur que tu vient re recup). ça devrait marcher.

C(est un peu plus compliquer mais une fois le fichier js fait il n'y as pas plus simple. Il suffit de créer un tableau de valeur correspondant à une ou plusieur préférences et donner un nom à ces préférences.

Pour infos j'ai vu ça dans le livre (cahier des programmeurs: XUL). Il traite de pas mal de chose je te le conseils. Il donne un parcu de tous ce que tu peux faire.

# Re: Récupérer mes préférences

Envoyé par : efdur

Date : 03/12/2006 17:39

je n'y arrive toujours pas, je fais sûrement une erreur!

1) -Suis je obligé d'utiliser le premier script puisque mes préférences sont déja créées et quelle varies bien dans about:config?

2) -Pour le second script les deux fonctions on le même nom est ce normal?

J'ai testé avec "GetPrefsaveInterface()" pour la seconde mais ça ne marche pas non plus.

Quand tu écris

//On créer la structure du tableau dans lequel on va insérer la valeur de la préférence
//On créer la strucutre du tableau on indique la valeur de la préférence (la couleur)

je ne sais pas si il faut que je fasse un tableau moi méme ou si il est générer automatiquement suivant mes preférences choisie

voilas en gros ce que j'ai fait:

// cxppreferences.js
//Cette méthode enregistre des préférences en utilisant XPCOM
//param type: nom de la préférence (ex: interface)
//param pPrefs: un tableau de valeur 
//              (dans ton cas tu n'as qu'une valeur (la couleur) 
//               mais tu pourra ajouter d'autre préférence comme la
//               police par exemple)
function enregistrerPrefs(cxp.interface, pPrefs)
{
   //Récupération des services XPCOM qui vont permmettre   l'enregistrement des préférences. Si la préférences existe les données sont écraser.
	var service =   Components.classes["@mozilla.org/preferences-service;1"]	
.getService(Components.interfaces.nsIPrefService)
.getBranch("3jgestion."+cxp.interface+".");
var branche = Components.classes["@mozilla.org/preferences-service;1"]	
.getService(Components.interfaces.nsIPrefBranch);		
      try
{
              //On parcours le tableau de valeur
for(p in pPrefs)
{
                      //On peut enregistrer 3 type de valeur
                      //(string, number et boolean). On récupère le
                      // type de la valeur et appelle la méthode
                      //  approprié
	switch (typeof pPrefs[p])
	{
		case "string":
				service.setCharPref(p, pPrefs[p]);
				break;
		case"number":
				service.setIntPref(p, pPrefs[p]);
				break;
		case "boolean":
				service.setBoolPref(p, pPrefs[p]);
				break;
	}
}
}
catch(e)
{
             //renvoi l'erreur en cas de problème
alert("erreur" + e);
}
}
//Cette méthode récupère des préférences en utilisant XPCOM
//param type: nom de la préférence (ex: interface)
//param pPrefs: un tableau  qui va contenir les valeurs
              //(dans ton cas tu n'as qu'une valeur (la couleur))
function chargerPrefs(cxp.interface, prefs)
{
var service = Components.classes["@mozilla.org/preferences-service;1"]	
.getService(Components.interfaces.nsIPrefService)	
              .getBranch("3jgestion."+cxp.interface+".");
var branche = Components.classes["@mozilla.org/preferences-service;1"]	
.getService(Components.interfaces.nsIPrefBranch);

try
{
              //On va insérer la valeur dans le tableau en paramètre. 
              //Sa strucuture doit bien sur être identique à celui 
              //qui à permis l'enregistrement des mêmes préférences
for(p in prefs)
{
                      //On récupère a préférence et insère la valeur au tableau
	switch (service.getPrefType(p))
	{
		case branche.PREF_STRING:
				prefs[p] = service.getCharPref(p);
				break;
		case branche.PREF_INT:
				prefs[p] = service.getIntPref(p);
				break;
		case branche.PREF_BOOL:
				prefs[p] = service.getBoolPref(p);
				break;
	}
}
}
catch(e)
{
alert(e);
}
return prefs;
}


//Cette fonction récupère les préférence de l'interfec, donc ta couleur
function GetPrefInterface()
{
       //On créer la strucutre du tableau dans lequel on va insérer
       //la valeur de la préférence
var prefs = {couleur: null};
       //On retourne le tableau remplit
return chargerPrefs("cxp.interface",prefs);
}

//Cette fonction enregistre la valeur de la couleur dans la 
//preference interface.
function GetPrefsaveInterface()
{
       //On créer la strucutre du tableau
       //on indique la valeur de la préférence (la couleur)
var prefs = {background-color: #294a74};
var prefs = {background-color: yellow};
var prefs = {background-color: magenta};
       //On enregistre la couleur dans la preference interface
enregistrerPrefs("cxp.interface",prefs);
} 

4) Pour le livre c'est bientot noël Super :)

Je vais continuer a faire d'autres essais et essayer de comprendre ou ça "bug", je tes envoyer aussi un MP.

Merci.

# Re: Récupérer mes préférences

Envoyé par : demanghonj

Date : 04/12/2006 00:34

Je viens de lire ton MP. On va continuer à résoudre ton pb sur le forum car le but est que tu comprenne et que les autres personnes qui ont le même problème que toi puissent lire ce post.

J'ai une question: sur quoi tu travaille (firefox, mozilla, xulrunner).

1) -Suis je obligé d'utiliser le premier script puisque mes préférences sont déja créées et quelle varies bien dans about:config?

reponse: Non je pense que tu n'est pas obligé d'utilisé ma méthode pour enregistrer les préférences. Tu peut donc garder la tienne mais cependant je pense qu'il faut rester coherent dans sa façon de procéder. Je te conseils d' utiliser la même methode pour travailler avec les préférences donc ici XPCOM.

2) -Pour le second script les deux fonctions on le même nom est ce normal?

Non ce n'est pas normal, j'ai fais un copier coller et j'ai oublier de modfifier le nom de la fonction.

J'ai testé avec "GetPrefsaveInterface()" pour la seconde mais ça ne marche pas non plus.

Au moins on aura essayé.

Je vais te reexplique chaque méthode:

enregistrerPrefs(type, pPrefs)

Cette fonction te permet d'enregistrer des valeurs dans les préférences de firefox par exemple. Tu dois assoicer les valeur à un nom qui les représente. comme une famille par exemple. Exemple: les valeurs de ton background, de la police, de la couleur du texte. Le nom données à ces valeurs est "interface" par exemple car elle représente des paramètres concernant l'interface. mais tu peux donner n'importe qu'elle autre nom.

Le paramètre type contient le nom données aux valeurs Le paramètre pPrefs est tableau qui contient les valeurs.

Tu as modifier le paramètre "type" par "cxp.interface".C'est inutile, c'est juste une variable qui va contenir le nom que tu donne à tes préférences.

chargerPrefs(type, prefs)

Cette fonction va récupérer les préférences à partir du nom donc "interface". C'est la valeur que tu as transmis au parammètre type de la fonction enregistrerPrefs(type, pPrefs).

Le paramètre type est donc le nom de la préférence qu tu veux récupérer Le paramètre pPrefs est le tableau dans lequel les valeurs récupérer vont être enregistrer. Ce tableau tu dois le donner quand tu appelle la fonction. Sa structure doit être identique à celui que tu as transmis quand tu l'as enregistrer.

La fonction retourne le tableau avec les valeurs.

La fonction qui va te permettre d'enregistrer ta couleur dans une préférence que l'on va nommer interface.

function SetPrefInteface()
{
        //On créer la strucutre du tableau
        //on indique la valeur de la préférence (la couleur)
        //Regarde bien sa strucure
       //ici on suppose que yellow est la valeur cochée
 var prefs = {couleur: "yellow"};
        //On enregistre la couleur dans la preference interface
 enregistrerPrefs("interface",prefs);
}

La fonction qui va te permettre de récupérer ta couleur dans la préférence que l'on a nommer interface.

function GetPrefInteface()
{
        //On créer la strucutre du tableau
        //on définit la strucure du tableau__
        //Regarde bien sa strucure, elle identique à l'autre tableau mais ca valeur est null.
 var prefs = {couleur: null};
        //On récupère la couleur dans la preference interface
 enregistrerPrefs("interface",prefs);
}

Maintenant je vais te donner une fonction qui va te permettre de récupérer ta préférence sans utiliser ce que je t'ai dit au-dessus mais je pense qu'il ne faut pas chercher la simplicicté. Je te conseil d'essayerla méthode au dessus pour plusieur raison:

  • autant conprendre ce que l'on fait
  • si un jour tu à d'autre préférence à enregistrer, ce code sera réutilisable. Tu auras juste une petite fonction Get et Set comme je t'es montré pour le faire. En gros ce code est réutilisable alors que la fonction qui va suivre ne permet que de récupérer ta couleur.

Voici cete fonction:

Cette fonction retourne la valeur de la couleur enregistrer. Tu devra appeler ta fonction colorize pour mettre à jour ton interface.

function chargerCouleur(prefs)
{
var prefs = Components.classes["@mozilla.org/preferences-service;1"].
   getService(Components.interfaces.nsIPrefBranch);
couleur = prefs.getPrefType("extensions.cxp.backgroundimage");

return couleur;
}

Certe c'est plus simple mais non réutilisable.

# Re: Récupérer mes préférences

Envoyé par : efdur

Date : 04/12/2006 02:51

je suis sur Firefox 2.0 et oui faut que tous le monde en profite :) Je n'y arrive toujour pas.

var prefs = {couleur: "yellow"};

je doit recréer cette ligne avec toute les couleurs que l'on peu choisir?
j'ai copier/coller les fonctions dans mon fichier "cxppreferences.js".

Pour la seconde méthode:"function chargerCouleur(prefs)"
Ca ne veux pas fonctionner non plus.

j'ai modifier le onload dans mon fichier options.Xul:

 <?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://customxpmenu/skin/customxpmenu.css" type="text/css"?>
<!DOCTYPE dialog SYSTEM "chrome://customxpmenu/locale/about.dtd">
<prefwindow id="cxp-options"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
title="&skin.options;"
width="580"
height="755"
onload="chargerCouleur(prefs); colorier(newStyle);"
ondialogaccept="SetPrefInteface();"
ondialogcancel="closeWindow()"
buttons="accept,cancel">
<script type="application/x-javascript" src="cxppreferences.js"/>
<script type="application/x-javascript" src="customxpmenu.js"/>
<script type="application/x-javascript" src="customxpmenufonctions.js"/>
<prefpane id="skinoptions" label="&skin.options;">
<preferences>
<preference id="pref_cxpstyle" name="extensions.cxp.style" type="string"/>
<preference id="pref_iconview" name="extensions.cxp.iconview" type="string"/>
<preference id="pref_backgroundmenu" name="extensions.cxp.backgroundmenu" type="string"/>
<preference id="pref_backgroundoption" name="extensions.cxp.backgroundoption" type="string"/>
</preferences>

ma fonction colorier:

//customxpmenufonctions.js
function colorier(couleur) 
{   
document.getElementById("cxp-options").setAttribute("style",couleur);
}

La groupbox dans le prefpane du prefwindow:

<radiogroup id="prefcolorbackgroundoption" preference="pref_backgroundoption" value="1" flex="1" orient="vertical" >
     <caption label="couleur de la page option"/>
     <vbox> 
     <radio label="bleu" value="#294a74" oncommand="colorier('background-color: #294a74'); SetPrefInteface();"/>
     <menuseparator/>
     <radio label="jaune" value="yellow" oncommand="colorier('background-color: yellow'); SetPrefInteface();"/>
     <menuseparator/>
     <radio label="magenta" value="magenta" oncommand="colorier('background-color: magenta'); SetPrefInteface();"/>
     </vbox>
</radiogroup>

je vois bien les préférences changer mais quand je redémarre y a plus rien je reviens au départ...

# Re: Récupérer mes préférences

Envoyé par : demanghonj

Date : 04/12/2006 03:29

Je t'ai laisser un MP pour que tu m'envoi ton code source. Je verrai le problème et je donneari la réponse sur le forum

Je me suis tromper dans ma fonction:

Il n'y a pas de paramètre prefs, Il n'y as aucun paramètre. Voici la methode complète

function getCouleur()
{
var prefs = Components.classes["@mozilla.org/preferences-service;1"].
   getService(Components.interfaces.nsIPrefBranch);
couleur = prefs.getPrefType("extensions.cxp.backgroundimage");

return couleur;
}

function colorier(couleur) 
{    
document.getElementById("cxp-options").setAttribute("style",couleur);
}
function chargerCouleur()
{
  colorier(getCouleur());
}

Tu placeça ou tu veux, commence d'abord par le mettre entre deux balise script. Et quand ca marche tu pourra le mettre dans ton fichier js. Si ça ne marche pas verfie en tout premier si la valeur de ta préférence est bonne en regardant à l'adresse about:config (liste tous les paramètres) après le redémarrage de firefox. Puis fais des dump ou des alert dans tes fonction pour voir l'avancement de tes fonction.

je doit recréer cette ligne avec toute les couleurs que l'on peu choisir?

Non, la ligne de code permet de renseigner dans un tableau la valeur coché. Donc tu dois d'abord récupérer la valeur cocher puis tu mets cette valeur dans le tableau.

# Re: Récupérer mes préférences

Envoyé par : efdur

Date : 04/12/2006 14:58

je tes envoyé le code car cela ne fonctionne toujours pas.

le backgroud change de couleur quand je choisi un autre radio mais si je ferme la fenêtre et la ré ouvre, retour au poing de départ.
(même sans relancer Firefox)

j'ai retenté avec tes fonctions Xpcom mais non.
j'aimerai pourtant pouvoir utiliser les deux possibilités.
De plus je n'est aucun message d'erreur dans la console ce qui ne m'aide pas a trouver d'ou viens le problème.

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.