Envoyé par : Myrdhin
Date : 25/05/2006 23:11
Bonsoir,
J'ai actuellement une fenêtre qui possède un champ à remplir et deux boutons : "OK" et "Annuler". Si le champ n'est pas remplit au moment où l'utilisateur clic qur le bouton "OK", une fonction javascript ajoute un message d'erreur en haut de la fenêtre.
Evidemment, lors de l'ajout de ce message, le champ et les deux boutons descendent tous d'un cran... Mais la taille de la fenêtre n'est pas modifiée :( Les boutons en bas de la fenêtre se trouvent à moitié dissimulés. L'utilisateur peut redimensioner la fenêtre mais je souhaiterai éviter cela.
J'aimerai donc que la fenêtre s'adapte automatiquement à son contenu. Je n'ai malheureusement pas trouvé de quoi effectuer cela. Peut-être pourriez-vous m'aider ?
Merci d'avance,
Envoyé par : Myrdhin
Date : 26/05/2006 00:00
C'est bon, j'ai trouvé une solution... Ce n'est peut-être pas la meilleure mais ça fonctionne :D Si vous avez d'autres façons de faire je suis intéressé.
Ma fenêtre est organisée ainsi :
Dans 'main_box' et au-dessus de 'form', je désire ajouter mon message 'warning'. J'aurai alors la fenêtre suivante :
Voici la fonction permettant d'ajouter le message et de redimensionner la fenêtre :
function warning(msg) { var mainBox = document.getElementById('main_box'); var formBox = document.getElementById('form'); var warningBox = document.getElementById('warning'); if(!warningBox) { warningBox = document.createElement('description'); mainBox.insertBefore(warningBox, formBox); warningBox.setAttribute('id', 'warning'); warningBox.setAttribute('value', msg); warningBox.setAttribute('style', 'color: red;'); var h = warningBox.boxObject.height; window.resizeBy(0,h); } else { warningBox.value = msg; } }
le if/else c'est pour afficher différents messages suivants les champs non-remplis, et donc ne pas recréer une boite pour le message warning à chaque fois que le"formulaire est validé
Envoyé par : chBok
Date : 26/05/2006 09:27
Tu as certainement placé tes éléments en définissant leur position exacte à coup de style CSS, ce n'est pas la meilleure chose à faire.
Il va falloir regarder du côté de l'attribut flex et de l'élément <spacer>. regarde cette page dans le wiki pour te faire une idée : /wiki/Tutoriel/ModeleDeBoite
Envoyé par : thefab
Date : 26/05/2006 10:17
Un autre moyen de redimenssionner la fenêtre d'après son contenu (pas testé): sizeToContent.
Au lieu de créer le tag description dans ta fonction warning() ce n'est pas plus simple de le mettre directement dans le XUL et de l'afficher ou masquer avec JS ?
Envoyé par : chBok
Date : 26/05/2006 11:20
<perso>beurk le sizeToContent</perso> ;) ;)
Oui, il serait préférable de placer un élément <description> dans ton fichier XUL, et de le remplir au besoin. Tu peux le masquer, soit par un attribut hidden, soit collapse (/wiki/Reference/Xul/ElementXul).
Envoyé par : Myrdhin
Date : 26/05/2006 12:11
chBok a écrit:
Tu as certainement placé tes éléments en
définissant leur position exacte à coup de style
CSS, ce n'est pas la meilleure chose à faire.
Il va falloir regarder du côté de l'attribut flex
et de l'élément <spacer>. regarde cette page dans
le wiki pour te faire une idée :
/wiki/Tutoriel/ModeleDeBoite
Non, mes éléments sont placés dans des boites :D Je n'utilise pas encore de CSS, tout est brut pour l'instant.
Envoyé par : Myrdhin
Date : 26/05/2006 12:30
thefab a écrit:
Un autre moyen de redimenssionner la fenêtre
d'après son contenu (pas testé): sizeToContent
Arf :D je ne l'avais pas vue celle-là. Et hop, je viens de tester et j'ai remplacé :
var h = warningBox.boxObject.height; window.resizeBy(0,h);
par
window.sizeToContent();
Et ça fonctionne sans problème :D Merci.
thefab a écrit:
Au lieu de créer le tag description dans ta
fonction warning() ce n'est pas plus simple de le
mettre directement dans le XUL et de l'afficher ou
masquer avec JS ?
Si ce serait plus simple...
chBok a écrit:
Oui, il serait préférable de placer un élément <description>
dans ton fichier XUL, et de le remplir au besoin. Tu peux le
masquer, soit par un attribut hidden, soit collapse
Je viens de tester la chose :
Je ne pense pas que ces attributs soit une bonne solution.
Merci quand même pour toutes ces idées !
Envoyé par : David
Date : 26/05/2006 16:00
J'ai encore plus simple, dans le <dialog> (pas testé avec <window>), il suffit de ne pas préciser les attributs width et height (ou peut-être en les mettant à 0). La fenêtre s'adaptera toute seule à son contenu. C'est bien pratique si ton application est disponible en plusieurs langues.
David
Envoyé par : Myrdhin
Date : 27/05/2006 01:02
Merci David, mais malheureusement (ou heureusement ;p) je n'ai aucun attribut width ou height de précisé... La fenêtre (j'utilise bien un dialog) ne s'adapte pas automatiquement.
Par contre, je n'ai pas testé la valeur 0...
Envoyé par : thefab
Date : 02/06/2006 08:26
Autre solution: ne pas redimmensionner la fenêtre
Je m'explique: tu as une zone flex dans ta fenêtre (ou dialogue), tu en as certainement une ! Donc placer ton message (qui fera l'objet d'un binding) au dessus de cette zone et lorsque tu affiches le message c'est la zone flexible qui s'adapte.
En code ça donne quelque chose comme:
XUL
<window> <toolbox/> <message id="warning" src="warning.png" value="Message d'erreur" style="-moz-binding: url('message.xml#message');"/> // Zone flex <vbox flex="1"> // Contenu de la fenêtre </vbox> <statusbar/> </window>
XBL
<binding id="message"> <content> <xul:hbox class="spaced box-padded" align="center" style="color: InfoText; background-color: InfoBackground;" flex="1"> <xul:image xbl:inherits="src"/> <xul:description xbl:inherits="value" flex="1"/> </xul:hbox> </content> </binding>
JS (hidden fonctionne bien dans ce cas, la zone flex est redimmensionnée)
// Afficher document.getElementById("warning").removeAttribute("hidden"); // Masquer document.getElementById("warning").setAttribute("hidden", true);
Fabrice
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.