/** Enregistre un changement dans le DOM. */
 private void enregistrerChangement() {
   String valeur = getValeur();
   if ((valeur == null || "".equals(valeur)) && noeud == null) {
     // arrive si enregistrerChangement est appelé 2 fois lors d'un effacement
     // il n'y a rien à changer
     return;
   }
   if (valeur == null) valeur = "";
   doc.setModif(true);
   MyCompoundEdit cedit = null;
   if (noeud == null && !"".equals(valeur)) {
     cedit = new MyCompoundEdit();
     creerNoeud(cedit);
   } else if (noeud != null && "".equals(valeur) && affParent != null) {
     effacerNoeud(false, null);
     return;
   }
   if (!attribut) {
     final Element el = (Element) noeud;
     final Node firstChild = el.getFirstChild();
     if (firstChild == null) {
       final FormUndoableEdit fedit = new FormUndoableEdit(this, "", valeur);
       if (cedit != null) cedit.addEdit(fedit);
       else doc.textPane.addEdit(fedit);
       final Node textnode = el.getOwnerDocument().createTextNode(valeur);
       el.appendChild(textnode);
     } else if (firstChild.getNodeType() == Node.TEXT_NODE) {
       final FormUndoableEdit fedit =
           new FormUndoableEdit(this, firstChild.getNodeValue(), valeur);
       if (cedit != null) cedit.addEdit(fedit);
       else doc.textPane.addEdit(fedit);
       firstChild.setNodeValue(valeur);
     } else
       LOG.error(
           "AffichageFormulaire.enregistrerChangement : pas de noeud texte pour enregistrer le champ");
   } else {
     final FormUndoableEdit fedit = new FormUndoableEdit(this, noeud.getNodeValue(), valeur);
     if (cedit != null) cedit.addEdit(fedit);
     else doc.textPane.addEdit(fedit);
     final Element elparent = (Element) affParent.getNoeud();
     final String nom = cfg.nomAttribut(refNoeud);
     final String espace = cfg.espaceAttribut(refNoeud);
     elparent.setAttributeNS(espace, nom, valeur);
   }
   if (cedit != null) {
     cedit.end();
     doc.textPane.addEdit(cedit);
   }
   if ("".equals(valeur)) setValidite(true);
   else {
     if (attribut) setValidite(cfg.attributValide(refNoeud, valeur));
     else setValidite(cfg.valeurElementValide(refNoeud, valeur));
   }
 }
 /**
  * Renvoit le JPanel de droite, avec la valeur modifiable. Utilisé dans le cas où il n'y a pas
  * d'enfants.
  */
 private JPanel getPanelDroite(final boolean dernier) {
   panelDroite = new JPanel(new BorderLayout());
   String valeur = "";
   if (noeud != null) {
     if (attribut) valeur = noeud.getNodeValue();
     else {
       final Node firstChild = ((Element) noeud).getFirstChild();
       if (firstChild != null && firstChild.getNodeType() == Node.TEXT_NODE)
         valeur = firstChild.getNodeValue();
     }
   }
   if (attribut || cfg.contientDuTexte(refNoeud)) {
     ArrayList<String> enumeration;
     if (attribut) enumeration = cfg.listeValeursAttribut(refNoeud);
     else enumeration = cfg.listeValeursElement(refNoeud);
     final String[] tvalbool = {"true", "false", "1", "0"};
     if (enumeration != null && Arrays.equals(enumeration.toArray(), tvalbool)) {
       final String titre = getTitre();
       final JCheckBox cb = new JCheckBox(titre);
       if ("true".equals(valeur.trim()) || "1".equals(valeur.trim())) cb.setSelected(true);
       cb.addItemListener(this);
       comp = cb;
     } else if (enumeration != null) {
       listeValeurs = new ArrayList<String>(enumeration);
       if (!listeValeurs.contains(valeur)) listeValeurs.add(valeur);
       if (!obligatoire() && !listeValeurs.contains("")) listeValeurs.add("");
       final List<String> titresValeurs = new ArrayList<String>(listeValeurs.size());
       for (final String val : listeValeurs) {
         final String titreValeur;
         if (attribut) {
           final Element refParent = affParent.getNoeudRef();
           titreValeur = cfg.titreValeurAttribut(refParent, refNoeud, val);
         } else titreValeur = cfg.titreValeurElement(refNoeud, val);
         titresValeurs.add(titreValeur);
       }
       final JComboBox cb = new JComboBox(titresValeurs.toArray());
       final String titreValeur;
       if (attribut) {
         final Element refParent = affParent.getNoeudRef();
         titreValeur = cfg.titreValeurAttribut(refParent, refNoeud, valeur);
       } else titreValeur = cfg.titreValeurElement(refNoeud, valeur);
       cb.setSelectedItem(titreValeur);
       cb.addItemListener(this);
       comp = cb;
     } else {
       final ArrayList<String> listeValeursSuggerees;
       if (attribut) {
         final Element refParent = affParent.getNoeudRef();
         listeValeursSuggerees = doc.cfg.listeValeursSuggereesAttribut(refParent, refNoeud);
       } else listeValeursSuggerees = doc.cfg.listeValeursSuggereesElement(refNoeud);
       if (listeValeursSuggerees != null && listeValeursSuggerees.size() > 0) {
         listeValeurs = new ArrayList<String>(listeValeursSuggerees);
         if (!listeValeurs.contains(valeur)) listeValeurs.add(valeur);
         final List<String> titresValeurs = new ArrayList<String>(listeValeurs.size());
         for (final String val : listeValeurs) {
           final String titreValeur;
           if (attribut) {
             final Element refParent = affParent.getNoeudRef();
             titreValeur = cfg.titreValeurAttribut(refParent, refNoeud, val);
           } else titreValeur = cfg.titreValeurElement(refNoeud, val);
           titresValeurs.add(titreValeur);
         }
         final JComboBox cb = new JComboBox(titresValeurs.toArray());
         cb.setEditable(true);
         final String titreValeur;
         if (attribut) {
           final Element refParent = affParent.getNoeudRef();
           titreValeur = cfg.titreValeurAttribut(refParent, refNoeud, valeur);
         } else titreValeur = cfg.titreValeurElement(refNoeud, valeur);
         cb.setSelectedItem(titreValeur);
         cb.addItemListener(this);
         comp = cb;
       } else {
         final JTextField tf = new JTextField(valeur);
         tf.getDocument().addDocumentListener(this);
         comp = tf;
       }
     }
     panelDroite.add(comp, BorderLayout.CENTER);
     if (!"".equals(valeur)) {
       if (attribut) setValidite(cfg.attributValide(refNoeud, valeur));
       else setValidite(cfg.valeurElementValide(refNoeud, valeur));
     }
   }
   if (!attribut && affParent != null && affParent.enfantsMultiples(refNoeud)) {
     final JPanel panelBoutons = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
     if (dernier) {
       final JButton boutonPlus = new JButton("+");
       boutonPlus.setAction(
           new AbstractAction("+") {
             public void actionPerformed(final ActionEvent e) {
               affParent.ajouterAffichageEnfant(AffichageFormulaire.this);
             }
           });
       panelBoutons.add(boutonPlus);
     }
     final JButton boutonMoins = new JButton("-");
     boutonMoins.setAction(
         new AbstractAction("-") {
           public void actionPerformed(final ActionEvent e) {
             affParent.retirerAffichageEnfant(AffichageFormulaire.this);
           }
         });
     panelBoutons.add(boutonMoins);
     panelDroite.add(panelBoutons, BorderLayout.EAST);
   }
   panelDroite.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0));
   return (panelDroite);
 }