/** Efface le noeud DOM, et son parent s'il devient vide. */
 private void effacerNoeud(final boolean annulation, final CompoundEdit cedit1) {
   CompoundEdit cedit = null;
   if (!annulation) {
     final FormUndoableEdit fedit =
         new FormUndoableEdit(FormUndoableEdit.TypeEdition.SUPPRIMER, this);
     if (cedit1 != null) cedit1.addEdit(fedit);
     else {
       cedit = new CompoundEdit();
       cedit.addEdit(fedit);
     }
   }
   final Element elparent = (Element) affParent.getNoeud();
   if (attribut) {
     final String nom = cfg.nomAttribut(refNoeud);
     final String espace = cfg.espaceAttribut(refNoeud);
     elparent.removeAttributeNS(espace, nom);
   } else {
     final Node textNode = noeud.getNextSibling();
     elparent.removeChild(noeud);
     if (textNode.getNodeType() == Node.TEXT_NODE) elparent.removeChild(textNode);
   }
   noeud = null;
   if (!annulation) affParent.testEffacementParent(cedit1 != null ? cedit1 : cedit);
   else lireEnfants();
   doc.textPane.miseAJourArbre();
   if (cedit1 == null && cedit != null) {
     cedit.end();
     doc.textPane.addEdit(cedit);
   }
 }
 /**
  * Crée l'élément DOM correspondant à l'affichage, si nécessaire en créant l'élément DOM parent.
  */
 private void creerNoeud(final MyCompoundEdit cedit) {
   if (attribut) {
     Element elparent = (Element) affParent.getNoeud();
     if (elparent == null) {
       affParent.creerNoeud(cedit);
       elparent = (Element) affParent.getNoeud();
     }
     final String nom = cfg.nomAttribut(refNoeud);
     final String espace = cfg.espaceAttribut(refNoeud);
     elparent.setAttributeNS(espace, nom, "");
     noeud = elparent.getAttributeNodeNS(espace, nom);
     cedit.addEdit(new FormUndoableEdit(FormUndoableEdit.TypeEdition.AJOUTER, this));
   } else {
     noeud = JaxeElement.nouvelElementDOM(doc, refNoeud);
     Element elparent = (Element) affParent.getNoeud();
     if (elparent == null) {
       affParent.creerNoeud(cedit);
       elparent = (Element) affParent.getNoeud();
       elparent.appendChild(noeud.getOwnerDocument().createTextNode("\n"));
     }
     final Element suivant = affParent.trouverSuivant(refNoeud);
     final Node textnode = noeud.getOwnerDocument().createTextNode("\n");
     if (suivant == null) {
       elparent.appendChild(noeud);
       elparent.appendChild(textnode);
     } else {
       elparent.insertBefore(noeud, suivant);
       elparent.insertBefore(textnode, suivant);
     }
     cedit.addEdit(new FormUndoableEdit(FormUndoableEdit.TypeEdition.AJOUTER, this));
   }
   affParent.lireEnfants();
   doc.textPane.miseAJourArbre();
 }
 /** 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));
   }
 }
 /** Met à jour l'affichage quand on ajoute un élément (donné en paramètre) */
 private void majPanel(final Element refAjout) {
   lireEnfants();
   if (profondeur > profondeurMax) return;
   panelEnfants.removeAll();
   affEnfants = new ArrayList<AffichageFormulaire>();
   final GridBagConstraints c = new GridBagConstraints();
   int pos = 0;
   if (!attribut) {
     for (final Element refAttributPossible : refAttributsPossibles) {
       Node nEnfant = null;
       if (enfants != null) {
         for (Node enfanti : enfants) {
           if (enfanti instanceof Attr) {
             final String nomAtt = enfanti.getNodeName();
             final String espaceAtt = enfanti.getNamespaceURI();
             boolean match = nomAtt.equals(cfg.nomAttribut(refAttributPossible));
             final String espace2 = cfg.espaceAttribut(refAttributPossible);
             match =
                 match
                     && ((espaceAtt == null && espace2 == null)
                         || (espaceAtt != null && espaceAtt.equals(espace2)));
             if (match) nEnfant = enfanti;
           }
         }
       }
       final AffichageFormulaire affEnfant =
           new AffichageFormulaire(refAttributPossible, nEnfant, this, doc, true);
       affEnfants.add(affEnfant);
       placerAffichage(affEnfant, panelEnfants, c, pos++, false);
     }
     for (final Element refEnfantPossible : refEnfantsPossibles) {
       boolean unEnfant = false;
       if (enfants != null) {
         final int enfantsSize = enfants.size();
         for (int i = 0; i < enfantsSize; i++) {
           final Node nEnfant = enfants.get(i);
           if (nEnfant instanceof Element) {
             final Element refEnfant;
             refEnfant = cfg.getElementRef((Element) nEnfant);
             if (refEnfant == refEnfantPossible) {
               final AffichageFormulaire affEnfant =
                   new AffichageFormulaire(refEnfant, nEnfant, this, doc, false);
               affEnfants.add(affEnfant);
               final Element refip1;
               if (i + 1 < enfantsSize) {
                 final Node enfantip1 = enfants.get(i + 1);
                 if (enfantip1 instanceof Element) refip1 = cfg.getElementRef((Element) enfantip1);
                 else refip1 = null;
               } else refip1 = null;
               final boolean dernier = (refAjout == null && refip1 != refEnfant);
               placerAffichage(affEnfant, panelEnfants, c, pos++, dernier);
               unEnfant = true;
             }
           }
         }
       }
       if (!unEnfant || refEnfantPossible == refAjout) {
         final AffichageFormulaire affEnfant =
             new AffichageFormulaire(refEnfantPossible, null, this, doc, false);
         affEnfants.add(affEnfant);
         placerAffichage(affEnfant, panelEnfants, c, pos++, true);
       }
     }
   }
 }