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