/** 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); } } } }