public AffichageFormulaire(
      final Element refNoeud,
      final Node noeud,
      final AffichageFormulaire affParent,
      final JaxeDocument doc,
      final boolean attribut) {
    this.refNoeud = refNoeud;
    this.noeud = noeud;
    this.affParent = affParent;
    this.doc = doc;
    if (!attribut) cfg = doc.cfg.getRefConf(refNoeud);
    else cfg = affParent.cfg;
    this.attribut = attribut;
    if (affParent == null) profondeur = 0;
    else profondeur = affParent.getProfondeur() + 1;
    if (!attribut) {
      refAttributsPossibles = cfg.listeAttributs(refNoeud);
      refEnfantsPossibles = cfg.listeSousElements(refNoeud);
    } else {
      refAttributsPossibles = null;
      refEnfantsPossibles = null;
    }

    lireEnfants();
  }
 protected Set<ToutElement> listeAny(final String namespace, final String targetNamespace) {
   final LinkedHashSet<ToutElement> liste = new LinkedHashSet<ToutElement>();
   if (namespace == null || "".equals(namespace) || "##any".equals(namespace)) {
     for (final WXSElement el : lTousElements)
       if (el.getName() != null && el.getRef() == null && !el.getAbstract()) liste.add(el);
   } else if ("##local".equals(namespace)) {
     for (final WXSElement el : lTousElements) {
       if (el.getName() != null && el.getRef() == null && !el.getAbstract()) {
         final String tns = el.getNamespace();
         if (tns == null || tns.equals(targetNamespace)) liste.add(el);
       }
     }
   } else if ("##other".equals(namespace)) {
     final ArrayList<Element> references = cfg.listeElementsHorsEspace(targetNamespace);
     for (Element ref : references) liste.add(new ElementExterne(ref, cfg));
   } else {
     // liste d'espaces de noms s?par?s par des espaces
     final HashSet<String> espaces = new HashSet<String>(Arrays.asList(namespace.split("\\s")));
     if (espaces.contains("##targetNamespace")) {
       espaces.remove("##targetNamespace");
       espaces.add(targetNamespace);
     }
     if (espaces.contains("##local")) {
       espaces.remove("##local");
       espaces.add("");
     }
     final ArrayList<Element> references = cfg.listeElementsDansEspaces(espaces);
     for (Element ref : references) liste.add(new ElementExterne(ref, cfg));
   }
   return (liste);
 }
 /** 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();
 }
 private String getDocumentation() {
   String documentation;
   if (attribut) {
     final Element refParent = affParent.getNoeudRef();
     documentation = cfg.documentationAttribut(refParent, refNoeud);
   } else documentation = cfg.documentation(refNoeud);
   if (documentation != null)
     documentation = "<html><body>" + documentation.replaceAll("\n", "<br>") + "</body></html>";
   return (documentation);
 }
 /** 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));
   }
 }
 /**
  * Renvoie l'élément enfant se trouvant après la place où se trouverait l'enfant de référence ref.
  * (permet d'insérer un futur élément de référence ref par rapport à l'élément suivant)
  */
 private Element trouverSuivant(final Element ref) {
   final int ind = refEnfantsPossibles.indexOf(ref);
   if (ind == refEnfantsPossibles.size() - 1) return (null);
   if (enfants == null) return (null);
   for (final Node nEnfant : enfants) {
     if (nEnfant instanceof Element) {
       final Element refEnfant = cfg.getElementRef((Element) nEnfant);
       final int ind2 = refEnfantsPossibles.indexOf(refEnfant);
       if (ind2 > ind) return ((Element) nEnfant);
     }
   }
   return (null);
 }
 protected String titreElement(final Element refElement) {
   return (cfg.titreElement(refElement));
 }
 /** Renvoit true si l'attribut de référence ref est obligatoire. */
 private boolean attributObligatoire(final Element ref) {
   return (cfg.attributObligatoire(refNoeud, ref));
 }
 /** Renvoit true si l'enfant de référence ref est obligatoire. */
 private boolean elementObligatoire(final Element ref) {
   if (cfg.getSchema() == null) return (false);
   return (cfg.getSchema().elementObligatoire(refNoeud, ref));
 }
 /**
  * Renvoit true si l'élément peut avoir des enfants multiples avec la référence ref (sequence ou
  * choice).
  */
 private boolean enfantsMultiples(final Element ref) {
   if (attribut) return (false);
   if (cfg.getSchema() == null) return (true);
   return (cfg.getSchema().enfantsMultiples(refNoeud, ref));
 }
 private String getTitre() {
   if (attribut) {
     final Element refParent = affParent.getNoeudRef();
     return (cfg.titreAttribut(refParent, refNoeud));
   } else return (cfg.titreElement(refNoeud));
 }
 /**
  * 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);
 }
 /** 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);
       }
     }
   }
 }