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