/*
    Exemple de création d'un nouvel élément Jaxe: élément booléen affiché avec une boîte à cocher
    compilation: javac -classpath .:Jaxe.jar -encoding ISO-8859-1 JEBooleen.java
*/

import jaxe.JaxeDocument;
import jaxe.JaxeElement;

import java.awt.event.*;
import javax.swing.JCheckBox;
import javax.swing.text.Position;

import org.w3c.dom.*;

/**
 * Elément booléen.
 * Valeurs possibles: "true" | "false" | "1" | "0"
 */
public class JEBooleen extends JaxeElement implements ItemListener {

    protected static final boolean defaut = false;
    
    protected JCheckBox coche;

    // initialisation de l'affichage pour un élément DOM
    public void init(Position pos, Node noeud) {
        Element el = (Element)noeud;
        
        // lecture de la valeur de l'élément
        String titre = el.getTagName();
        Node child = noeud.getFirstChild();
        String texte = null;
        if (child != null)
            texte = child.getNodeValue();
        
        // création du composant Swing
        coche = new JCheckBox(titre, stringVersBooleen(texte));
        coche.addItemListener(this);
        
        // insertion du composant dans le texte (insertComponent est une méthode de JaxeElement)
        insertComponent(pos, coche);
    }
    
    protected static boolean stringVersBooleen(String s) {
        if (s != null)
            s = s.trim();
        if ("true".equals(s) || "1".equals(s))
            return(true);
        else if ("false".equals(s) || "0".equals(s))
            return(false);
        else
            return(defaut);
    }
    
    protected static String booleenVersString(boolean b) {
        if (b)
            return("true");
        else
            return("false");
    }
    
    // création d'un nouvel élément DOM
    public Node nouvelElement(Element refElement) {
        Element newel = nouvelElementDOM(doc, refElement);
        Node textnode = doc.DOMdoc.createTextNode(booleenVersString(defaut));
        newel.appendChild(textnode);
        return(newel);
    }
    
    // mise à jour de l'affichage des attributs en fonction du DOM: rien à faire pour JEBooleen
    //public void majAffichage() { }
    
    public void itemStateChanged(ItemEvent e) {
        setValeur(coche.isSelected());
    }
    
    public void setValeur(boolean valeur) {
        Element el = (Element)noeud;
        Node child = noeud.getFirstChild();
        if (child != null)
            child.setNodeValue(booleenVersString(valeur));
        else {
            Node textnode = doc.DOMdoc.createTextNode(booleenVersString(valeur));
            el.appendChild(textnode);
        }
    }
}
