Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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,

# Re: Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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 :

  • une boite (id='main_box') dans laquelle se trouve
    • une autre boite représentant un formulaire (id='form', mon champ et le bouton)

Dans 'main_box' et au-dessus de 'form', je désire ajouter mon message 'warning'. J'aurai alors la fenêtre suivante :

  • une boite (id='main_box') dans laquelle se trouvent
    • le message (id='warning')
    • le formulaire (id='form', mon champ et le bouton)

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é

# Re: Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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

# Re: Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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 ?

# Re: Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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).

# Re: Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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.

# Re: Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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 :

  • hidden : ne fonctionne pas. Quand le message apparaît, la fenêtre ne se redimensionne pas et cache en partie les boutons du bas.
  • collapsed : fonctionne + ou - puisque l'espace réservé au message est présent. La fenêtre n'a donc pas besoin d'être redimensionnée et il y a donc un espace blanc pas très esthétique... De plus, si le message a afficher est très très grand, le problème est le même que pour hidden : la fenêtre ne se redimensionne pas et une partie du bas n'est plus accessible... En fait il faut réserver un espace suffisant...

Je ne pense pas que ces attributs soit une bonne solution.

Merci quand même pour toutes ces idées !

# Re: Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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

# Re: Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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...

# Re: Adapter la taille d'une fenêtre (window ou dialog) à son contenu

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.