Logo Search packages:      
Sourcecode: jaxe version File versions  Download package

AffichageFormulaire.java

/*
Jaxe - Editeur XML en Java

Copyright (C) 2006 Observatoire de Paris-Meudon

Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier conformément aux dispositions de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation ; version 2 de la licence, ou encore (à votre choix) toute version ultérieure.

Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans même la garantie implicite de COMMERCIALISATION ou D'ADAPTATION A UN OBJET PARTICULIER. Pour plus de détail, voir la Licence Publique Générale GNU .

Vous devez avoir reçu un exemplaire de la Licence Publique Générale GNU en même temps que ce programme ; si ce n'est pas le cas, écrivez à la Free Software Foundation Inc., 675 Mass Ave, Cambridge, MA 02139, Etats-Unis.
*/

package jaxe.elements;

import org.apache.log4j.Logger;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Point;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;

import jaxe.Balise;
import jaxe.Config;
import jaxe.DialogueAideElement;
import jaxe.DialogueAttributs;
import jaxe.ImageKeeper;
import jaxe.JaxeDocument;
import jaxe.JaxeElement;
import jaxe.VerifTypeSimple;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Affichage pour JEFormulaire (affichage d'un élément sous forme d'un formulaire).
 * Attention, le nombre de descendants possibles ne doit pas être infini !
 */
00057 public class AffichageFormulaire implements DocumentListener, ActionListener, ItemListener {
    /**
     * Logger for this class
     */
00061     private static final Logger LOG = Logger.getLogger(AffichageFormulaire.class);
    
    private static final Color couleurErreur = new Color(200, 0, 0);
    private static final Color couleurObligatoire = new Color(150, 0, 0);
    private static final Color couleurFacultatif = new Color(0, 100, 0);
    
    private static final ImageIcon iconeAttributs = new ImageIcon(ImageKeeper.loadImage("images/attributs.gif", true));
    private static final int profondeurMax = 10;
    
    final private Element refElement;
    private Element el;
    final private AffichageFormulaire affParent;
    final private JaxeDocument doc;
    final private Config cfg;
    private ArrayList<Element> enfants;
    private JComponent comp = null;
    private final VerifTypeSimple verif;
    private final ArrayList<Element> refEnfantsPossibles;
    private JLabel labelTitre = null;
    private JPanel panelElement = null;
    private JPanel panelEnfants = null;
    private JPanel panelGauche = null;
    private JPanel panelDroite = null;
    private int profondeur;
    private ArrayList<AffichageFormulaire> affEnfants = null;
    private ArrayList<String> listeValeurs = null;
    
    public AffichageFormulaire(final Element refElement, final Element el, final AffichageFormulaire affParent,
            final JaxeDocument doc) {
        this.refElement = refElement;
        this.el = el;
        this.affParent = affParent;
        this.doc = doc;
        this.cfg = doc.cfg;
        if (affParent == null)
            profondeur = 0;
        else
            profondeur = affParent.getProfondeur() + 1;
        refEnfantsPossibles = cfg.listeSousElements(refElement);
        
        lireEnfants();
        if (avecEnfants())
            verif = null;
        else
            verif = cfg.getVerifTypeSimple(refElement); // sera null si ce n'est pas un schéma W3C
    }
    
    /**
     * Lecture du tableau des éléments enfants.
     */
00111     private void lireEnfants() {
        if (el == null) {
            enfants = null;
            return;
        }
        enfants = new ArrayList<Element>();
        final NodeList nl = el.getChildNodes();
        for (int i=0; i<nl.getLength(); i++) {
            final Node n = nl.item(i);
            if (n.getNodeType() == Node.ELEMENT_NODE)
                enfants.add((Element)n);
        }
    }
    
    /**
     * Renvoit true si le nombre d'enfants possible est supérieur à 0.
     */
00128     private boolean avecEnfants() {
        return(refEnfantsPossibles.size() > 0);
    }
    
    /**
     * Renvoit le JPanel à afficher.
     */
00135     public JPanel getPanel() {
        return(getPanel(false));
    }
    
    /**
     * Renvoit le JPanel à afficher, avec en paramètre un booléen indiquant s'il s'agit du dernier
     * élément à afficher dans une liste d'enfants (auquel cas un bouton + peut être affiché)
     */
00143     private JPanel getPanel(final boolean dernier) {
        panelEnfants = new JPanel(new GridBagLayout());
        panelElement = new JPanel(new BorderLayout());
        if (affParent != null && affParent.enfantsMultiples(refElement)) {
            final JPanel panelBoutons = new JPanel(new BorderLayout());
            if (dernier) {
                final JButton boutonPlus = new JButton("+");
                boutonPlus.setAction(new AbstractAction("+") {
                    public void actionPerformed(final ActionEvent e) {
                        affParent.ajouterAffichageEnfant(AffichageFormulaire.this);
                    }
                });
                panelBoutons.add(boutonPlus, BorderLayout.WEST);
            }
            final JButton boutonMoins = new JButton("-");
            boutonMoins.setAction(new AbstractAction("-") {
                public void actionPerformed(final ActionEvent e) {
                    affParent.retirerAffichageEnfant(AffichageFormulaire.this);
                }
            });
            panelBoutons.add(boutonMoins, BorderLayout.EAST);
            panelElement.add(panelBoutons, BorderLayout.EAST);
            panelElement.add(panelEnfants, BorderLayout.CENTER);
        } else
            panelElement.add(panelEnfants, BorderLayout.CENTER);
        if (affParent != null) {
            panelElement.add(getPanelTitre(), BorderLayout.NORTH);
            panelEnfants.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));
            panelElement.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        }
        majPanel(null);
        if (affParent == null) {
            panelEnfants.setFocusCycleRoot(true);
            panelElement = new JPanel(new BorderLayout());
            panelElement.setOpaque(false);
            panelElement.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
            panelEnfants.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder(cfg.titreElement(refElement)),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));
            panelElement.add(panelEnfants, BorderLayout.CENTER);
        }
        return(panelElement);
    }
    
    /**
     * Panel avec le titre de l'élément, et les boutons d'aide et d'attributs de l'élément
     */
00190     private JPanel getPanelTitre() {
        final JButton baide = new JButton(new ActionAide(refElement));
        baide.setFont(baide.getFont().deriveFont((float)9));
        if (System.getProperty("os.name").startsWith("Mac OS")) {
            baide.setText("?");
            if ("10.5".compareTo(System.getProperty("os.version")) <= 0)
                baide.putClientProperty("JButton.buttonType", "help");
            else
                baide.putClientProperty("JButton.buttonType", "toolbar");
        } else {
            baide.setIcon(new ImageIcon(ImageKeeper.loadImage("images/aide.png")));
            baide.setMargin(new Insets(0, 0, 0, 0));
            baide.setBorderPainted(false);
            baide.setContentAreaFilled(false);
        }
        String documentation = cfg.documentation(refElement);
        if (documentation != null) {
            documentation = "<html><body>" + documentation.replaceAll("\n", "<br>") + "</body></html>";
            baide.setToolTipText(documentation);
        }
        final JPanel panelTitre = new JPanel();
        panelTitre.add(baide);
        if (aDesAttributs()) {
            final JButton battr = new JButton(iconeAttributs);
            if (System.getProperty("os.name").startsWith("Mac OS") &&
                    "10.5".compareTo(System.getProperty("os.version")) > 0)
                battr.putClientProperty("JButton.buttonType", "toolbar");
            else
                battr.setMargin( new java.awt.Insets(0, 0, 0, 0) );
            battr.addActionListener(this);
            battr.setActionCommand("attributs");
            panelTitre.add(battr);
        }
        final JLabel labelTitre = new JLabel(cfg.titreElement(refElement));
        Color couleurTitre;
        if (affParent != null) {
            if (affParent.elementObligatoire(refElement))
                couleurTitre = couleurObligatoire;
            else
                couleurTitre = couleurFacultatif;
        } else
            couleurTitre = panelEnfants.getForeground();
        labelTitre.setForeground(couleurTitre);
        panelTitre.add(labelTitre);
        panelTitre.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
        final JPanel panelNord = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0));
        panelNord.add(panelTitre);
        return(panelNord);
    }
    
    /**
     * Met à jour l'affichage quand on ajoute un élément (donné en paramètre)
     */
00243     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;
        for (final Element refEnfantPossible : refEnfantsPossibles) {
            boolean unEnfant = false;
            if (enfants != null) {
                final int enfantsSize = enfants.size();
                for (int i=0; i<enfantsSize; i++) {
                    final Element elEnfant = enfants.get(i);
                    final Element refEnfant = cfg.getElementRef(elEnfant);
                    if (refEnfant == refEnfantPossible) {
                        final AffichageFormulaire affEnfant = new AffichageFormulaire(refEnfant, elEnfant, this, doc);
                        affEnfants.add(affEnfant);
                        final boolean dernier = (refAjout == null &&
                            !(i+1 < enfantsSize && cfg.getElementRef(enfants.get(i+1)) == refEnfant));
                        placerAffichage(affEnfant, panelEnfants, c, pos++, dernier);
                        unEnfant = true;
                    }
                }
            }
            if (!unEnfant || refEnfantPossible == refAjout) {
                final AffichageFormulaire affEnfant = new AffichageFormulaire(refEnfantPossible, null, this, doc);
                affEnfants.add(affEnfant);
                placerAffichage(affEnfant, panelEnfants, c, pos++, true);
            }
        }
    }
    
    /**
     * Place le JPanel d'un enfant dans le JPanel courant (elpane).
     */
00279     private void placerAffichage(final AffichageFormulaire affEnfant, final JPanel elpane, final GridBagConstraints c, final int pos, final boolean dernier) {
        if (affEnfant.avecEnfants()) {
            final JPanel panelEnfant = affEnfant.getPanel(dernier);
            c.weightx = 1;
            c.gridwidth = 2;
            c.gridx = 0;
            c.gridy = pos;
            c.fill = GridBagConstraints.HORIZONTAL;
            c.anchor = GridBagConstraints.CENTER;
            elpane.add(panelEnfant, c);
        } else {
            final JPanel panelGaucheEnfant = affEnfant.getPanelGauche();
            c.weightx = 0;
            c.gridwidth = 1;
            c.gridx = 0;
            c.gridy = pos;
            c.fill = GridBagConstraints.NONE;
            c.anchor = GridBagConstraints.WEST;
            elpane.add(panelGaucheEnfant, c);
            
            final JPanel panelDroiteEnfant = affEnfant.getPanelDroite(dernier);
            c.weightx = 1;
            c.gridwidth = 1;
            c.gridx = 1;
            c.gridy = pos;
            c.fill = GridBagConstraints.HORIZONTAL;
            c.anchor = GridBagConstraints.CENTER;
            elpane.add(panelDroiteEnfant, c);
        }
    }
    
    /**
     * Renvoit le nom de l'élément, optionnellement avec une valeur d'attribut spécifié par le paramètre titreAtt
     */
00313     private String getStringLabelTitre() {
        final StringBuilder titreAtt = new StringBuilder(cfg.titreElement(refElement));
        if (el != null) {
            final ArrayList<String> attributsTitre = cfg.getParametresElement(refElement).get("titreAtt");
            if (attributsTitre != null)
                for (final String nomAtt : attributsTitre) {
                    final String valeurAtt = el.getAttribute(nomAtt);
                    if (!"".equals(valeurAtt)) {
                        titreAtt.append(" '").append(valeurAtt).append("'");
                        break;
                    }
                }
        }
        return(titreAtt.toString());
    }
    
    /**
     * Renvoit le JPanel de gauche, avec le titre du champ.
     * Utilisé dans le cas où il n'y a pas d'enfants.
     */
00333     private JPanel getPanelGauche() {
        panelGauche = new JPanel(new FlowLayout(FlowLayout.LEFT));
        final JButton baide = new JButton(new ActionAide(refElement));
        baide.setFont(baide.getFont().deriveFont((float)9));
        if (System.getProperty("os.name").startsWith("Mac OS")) {
            baide.setText("?");
            if ("10.5".compareTo(System.getProperty("os.version")) <= 0)
                baide.putClientProperty("JButton.buttonType", "help");
            else
                baide.putClientProperty("JButton.buttonType", "toolbar");
        } else {
            baide.setIcon(new ImageIcon(ImageKeeper.loadImage("images/aide.png")));
            baide.setMargin(new Insets(0, 0, 0, 0));
            baide.setBorderPainted(false);
            baide.setContentAreaFilled(false);
        }
        String documentation = cfg.documentation(refElement);
        if (documentation != null) {
            documentation = "<html><body>" + documentation.replaceAll("\n", "<br>") + "</body></html>";
            baide.setToolTipText(documentation);
        }
        panelGauche.add(baide);
        if (aDesAttributs()) {
            final JButton battr = new JButton(iconeAttributs);
            if (System.getProperty("os.name").startsWith("Mac OS") &&
                    "10.5".compareTo(System.getProperty("os.version")) > 0)
                battr.putClientProperty("JButton.buttonType", "toolbar");
            else
                battr.setMargin( new java.awt.Insets(0, 0, 0, 0) );
            battr.addActionListener(this);
            battr.setActionCommand("attributs");
            panelGauche.add(battr);
        }
        labelTitre = new JLabel(getStringLabelTitre());
        if (affParent != null) {
            if (affParent.elementObligatoire(refElement))
                labelTitre.setForeground(couleurObligatoire);
            else
                labelTitre.setForeground(couleurFacultatif);
        }
        panelGauche.add(labelTitre);
        return(panelGauche);
    }
    
    /**
     * Renvoit le JPanel de droite, avec la valeur modifiable.
     * Utilisé dans le cas où il n'y a pas d'enfants.
     */
00381     private JPanel getPanelDroite(final boolean dernier) {
        panelDroite = new JPanel(new BorderLayout());
        String valeur = "";
        if (el != null) {
            final Node firstChild = el.getFirstChild();
            if (firstChild != null && firstChild.getNodeType() == Node.TEXT_NODE)
                valeur = firstChild.getNodeValue();
        }
        if (cfg.contientDuTexte(refElement)) {
            String baseType = null;
            ArrayList<String> enumeration = null;
            if (verif != null) {
                baseType = verif.getBaseType();
                enumeration = verif.getEnumeration();
            }
            if ("boolean".equals(baseType)) {
                final String titre = cfg.titreElement(refElement);
                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 (!affParent.elementObligatoire(refElement) && !listeValeurs.contains(""))
                    listeValeurs.add("");
                final List<String> titresValeurs = new ArrayList<String>(listeValeurs.size());
                for (final String val : listeValeurs)
                    titresValeurs.add(cfg.titreValeurElement(refElement, val));
                final JComboBox cb = new JComboBox(titresValeurs.toArray());
                cb.setSelectedItem(cfg.titreValeurElement(refElement, valeur));
                cb.addItemListener(this);
                comp = cb;
            } else {
                final ArrayList<String> listeValeursSuggerees = doc.cfg.listeValeursSuggereesElement(refElement);
                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)
                        titresValeurs.add(cfg.titreValeurElement(refElement, val));
                    final JComboBox cb = new JComboBox(titresValeurs.toArray());
                    cb.setEditable(true);
                    cb.setSelectedItem(cfg.titreValeurElement(refElement, valeur));
                    cb.addItemListener(this);
                    comp = cb;
                } else {
                    final JTextField tf = new JTextField(valeur);
                    tf.getDocument().addDocumentListener(this);
                    comp = tf;
                }
            }
            panelDroite.add(comp, BorderLayout.CENTER);
            if (verif != null && !"".equals(valeur))
                setValidite(verif.estValide(valeur));
        }
        if (affParent != null && affParent.enfantsMultiples(refElement)) {
            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);
    }
    
    public void insertUpdate(final DocumentEvent e) {
        enregistrerChangement();
    }
    
    public void removeUpdate(final DocumentEvent e) {
        enregistrerChangement();
    }
    
    public void changedUpdate(final DocumentEvent e) {
        enregistrerChangement();
    }
    
    /**
     * Enregistre un changement dans le DOM.
     */
00479     private void enregistrerChangement() {
        String valeur = getValeur();
        if (valeur == null)
            valeur = "";
        doc.setModif(true);
        if (el == null && !"".equals(valeur))
            creerElement();
        else if (el != null && "".equals(valeur) && affParent != null) {
            effacerElement();
            return;
        }
        if (el != null) {
            final Node firstChild = el.getFirstChild();
            if (firstChild == null) {
                final Node textnode = el.getOwnerDocument().createTextNode(valeur);
                el.appendChild(textnode);
            } else if (firstChild.getNodeType() == Node.TEXT_NODE)
                firstChild.setNodeValue(valeur);
            else
                LOG.error("AffichageFormulaire.enregistrerChangement : pas de noeud texte pour enregistrer le champ");
        }
        if (verif != null)
            setValidite("".equals(valeur) || verif.estValide(valeur));
    }
    
    /**
     * Renvoit la valeur du composant d'édition
     */
00507     private String getValeur() {
        final String valeur;
        if (comp instanceof JTextField) {
            final javax.swing.text.Document document = ((JTextField)comp).getDocument();
            try {
                valeur = document.getText(0, document.getLength());
            } catch (final BadLocationException ex) {
                LOG.error("lecture du champ texte", ex);
                return(null);
            }
        } else if (comp instanceof JCheckBox) {
            valeur = Boolean.toString(((JCheckBox)comp).isSelected());
        } else if (comp instanceof JComboBox) {
            final JComboBox cb = (JComboBox)comp;
            final int index = cb.getSelectedIndex();
            if (index != -1)
                valeur = listeValeurs.get(cb.getSelectedIndex());
            else
                valeur = (String)cb.getSelectedItem();
        } else
            valeur = null;
        return(valeur);
    }
    
    /**
     * Change l'affichage du composant d'édition en fonction de la validité de sa valeur
     */
00534     private void setValidite(final boolean valide) {
        if (comp == null)
            LOG.error("AffichageFormulaire.setValidite : pas de champ ?");
        if (valide)
            comp.setForeground(Color.black);
        else
            comp.setForeground(couleurErreur);
    }
    
    /**
     * Renvoit l'élément DOM.
     */
00546     private Element getElement() {
        return(el);
    }
    
    /**
     * Renvoit la référence de l'élément dans le schéma.
     */
00553     private Element getElementRef() {
        return(refElement);
    }
    
    /**
     * Renvoit la profondeur de l'affichage (utile pour éviter les dépassements de pile).
     */
00560     private int getProfondeur() {
        return(profondeur);
    }
    
    /**
     * Crée l'élément DOM correspondant à l'affichage, si nécessaire en créant l'élément DOM parent.
     */
00567     private void creerElement() {
        el = JaxeElement.nouvelElementDOM(doc, refElement);
        Element elparent = affParent.getElement();
        if (elparent == null) {
            affParent.creerElement();
            elparent = affParent.getElement();
            elparent.appendChild( el.getOwnerDocument().createTextNode("\n") );
        }
        final Element suivant = affParent.trouverSuivant(refElement);
        final Node textnode = el.getOwnerDocument().createTextNode("\n");
        if (suivant == null) {
            elparent.appendChild(el);
            elparent.appendChild(textnode);
        } else {
            elparent.insertBefore(el, suivant);
            elparent.insertBefore(textnode, suivant);
        }
        affParent.lireEnfants();
        doc.textPane.miseAJourArbre();
    }
    
    /**
     * Renvoit 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)
     */
00592     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 Element elEnfant : enfants) {
            final Element refEnfant = cfg.getElementRef(elEnfant);
            final int ind2 = refEnfantsPossibles.indexOf(refEnfant);
            if (ind2 > ind)
                return(elEnfant);
        }
        return(null);
    }
    
    /**
     * Efface l'élément DOM, et son parent s'il devient vide.
     */
00610     private void effacerElement() {
        final Node textNode = el.getNextSibling();
        affParent.getElement().removeChild(el);
        if (textNode.getNodeType() == Node.TEXT_NODE)
            affParent.getElement().removeChild(textNode);
        el = null;
        affParent.testEffacementParent();
        doc.textPane.miseAJourArbre();
    }
    
    /**
     * Efface l'élément s'il est vide.
     */
00623     private void testEffacementParent() {
        lireEnfants();
        if (enfants.size() == 0 && el != null && affParent != null)
            effacerElement();
    }
    
    /**
     * Renvoit true si l'élément peut avoir des enfants multiples avec la référence ref (sequence ou choice).
     */
00632     private boolean enfantsMultiples(final Element ref) {
        if (cfg.getSchema() == null)
            return(true);
        return(cfg.getSchema().enfantsMultiples(refElement, ref));
    }
    
    /**
     * Renvoit true si l'enfant de référence ref est obligatoire.
     */
00641     private boolean elementObligatoire(final Element ref) {
        if (cfg.getSchema() == null)
            return(false);
        return(cfg.getSchema().elementObligatoire(refElement, ref));
    }
    
    /**
     * Renvoit true si l'élément a des attributs.
     */
00650     private boolean aDesAttributs() {
        final ArrayList<Element> latt = cfg.listeAttributs(refElement);
        return (latt != null && latt.size() > 0);
    }
    
    /**
     * Mise à jour de l'affichage causée par le changement dans un sous-affichage.
     */
00658     private void ajouterAffichageEnfant(final AffichageFormulaire aff) {
        majPanel(aff.getElementRef());
    }
    
    /**
     * Retire un élément et son affichage ( bouton - )
     */
00665     private void retirerAffichageEnfant(final AffichageFormulaire aff) {
        if (aff.getElement() != null)
            aff.effacerElement();
        majPanel(null);
    }
    
    public void actionPerformed(final ActionEvent e) {
        final String cmd = e.getActionCommand();
        if ("attributs".equals(cmd))
            afficherDialogueAttributs();
    }
    
    public void itemStateChanged(final ItemEvent e) {
        enregistrerChangement();
    }
    
    /**
     * Affiche le dialogue d'édition des attributs.
     */
00684     public void afficherDialogueAttributs() {
        boolean creation;
        if (el == null) {
            creerElement();
            creation = true;
        } else
            creation = false;
        final DialogueAttributs dlg = new DialogueAttributs(doc.jframe, doc,
            cfg.titreElement(refElement), refElement, el);
        if (dlg.afficher()) {
            dlg.enregistrerReponses();
            if (labelTitre != null)
                labelTitre.setText(getStringLabelTitre());
        } else if (creation)
            effacerElement();
        dlg.dispose();
    }
    
    public Point getPointEnfant(final Element enfant) {
        if (el == enfant) {
            return(getPoint());
        } else if (affEnfants != null) {
            for (final AffichageFormulaire affEnfant : affEnfants) {
                final Point pt = affEnfant.getPointEnfant(enfant);
                if (pt != null) {
                    final Point monPoint = getPoint();
                    if (monPoint != null)
                        pt.translate(monPoint.x, monPoint.y);
                    return(pt);
                }
            }
        }
        return(null);
    }
    
    public Point getPoint() {
        if (panelElement != null)
            return(panelElement.getLocation());
        else if (panelGauche != null)
            return(panelGauche.getLocation());
        else
            return(null);
    }
    
    public void selection(final boolean select) {
        if (select)
            panelEnfants.setBackground(Balise.getCouleurs()[0][1]);
        else
            panelEnfants.setBackground(null);
    }
    
    public void majAffichage() {
        // à faire
    }
    
    class ActionAide extends AbstractAction {
        Element refElement;
        ActionAide(final Element refElement) {
            super();
            this.refElement = refElement;
        }
        public void actionPerformed(final ActionEvent e) {
            final DialogueAideElement dlg = new DialogueAideElement(refElement, cfg.getRefConf(refElement),
                (JFrame)doc.textPane.getTopLevelAncestor());
            dlg.setVisible(true);
        }
    }
}

Generated by  Doxygen 1.6.0   Back to index