/**
Jaxe - Editeur XML en Java
Copyright (C) 2002 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 jelements;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.text.Position;
import jaxe.JaxeElement;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Fichier ou Répertoire externe. Le fichier ou le répertoire n'est pas affiché.
* Il s'agit d'une méthode pour obtenir un chemin à partir d'un popup pour le placer dans un champ XML.
* Type d'élément Jaxe: 'JEChemin'
* Valeur : le nom de l'attribut donnant le nom du fichier ou du répertoire
* paramètre: type: FILE (defaut) DIRECTORY BOTH
* paramètre: absolute: nom du champ texte où se trouve la valeur saisie du chemin de base absolu (le premier)
*
*
* Usage:
*/
public class JEChemin extends JaxeElement {
public final static String defaultTypeAttr = "type";
public String typeAttr = "FILE";
public int type = JFileChooser.FILES_ONLY;
public final static String defaultAbsAttr = "absolute";
public String absAttr = null;
public boolean absReady = false;
public String absolute = null;
JPanel panel = null;
JLabel label = null;
JTextField chemin = null;
private JEFichierMouseListener listener;
/**
* Renvoit le titre qui sera affiché sur les balises de début et de fin :
* nom de l'élément ou titre, en fonction des options d'affichage.
*/
public String titreElement() {
if (refElement != null)
return(doc.cfg.titreElement(refElement));
else if (noeud != null)
return(noeud.getNodeName());
else if (refElement != null)
return(doc.cfg.nomElement(refElement));
else
return(null);
}
// initialisation de l'affichage pour un élément DOM
public void init(Position pos, Node noeud) {
// lecture de la valeur de l'élément
String titre = titreElement();//el.getTagName();
Node child = noeud.getFirstChild();
String texte = null;
if (child != null)
texte = child.getNodeValue();
// création du composant Swing
panel = new JPanel();
Border border = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
panel.setBorder(border);
label = new JLabel(titre);
chemin = new JTextField(texte);
panel.add(label);
panel.add(chemin);
listener = new JEFichierMouseListener(this, doc.jframe);
chemin.addMouseListener(listener);
// insertion du composant dans le texte (insertComponent est une méthode de JaxeElement)
insertComponent(pos, panel);
}
// création d'un nouvel élément DOM
public Node nouvelElement(Element refElement) {
if (refElement != null) {
// récupére le type
typeAttr = doc.cfg.valeurParametreElement(refElement, defaultTypeAttr, "FILE");
absAttr = doc.cfg.valeurParametreElement(refElement, defaultAbsAttr, "");
absReady = true;
if (absAttr == null || absAttr.length() == 0) {
absAttr = null;
absolute = null;
}
}
if (typeAttr.compareToIgnoreCase("FILE") == 0) {
type = JFileChooser.FILES_ONLY;
} else if (typeAttr.compareToIgnoreCase("DIRECTORY") == 0) {
type = JFileChooser.DIRECTORIES_ONLY;
} else if (typeAttr.compareToIgnoreCase("BOTH") == 0) {
type = JFileChooser.FILES_AND_DIRECTORIES;
} else {
JOptionPane.showMessageDialog(doc.jframe,
"Type not specified: FILE by default",
defaultTypeAttr+": FILE, DIRECTORY, BOTH",
JOptionPane.INFORMATION_MESSAGE);
}
Element newel = nouvelElementDOM(doc, refElement);
String newchemin = selectionnerFichier(null);
Node textnode = doc.DOMdoc.createTextNode(newchemin);
newel.appendChild(textnode);
return (newel);
}
// mise à jour de l'affichage des attributs en fonction du DOM
public void majAffichage() {
Node child = noeud.getFirstChild();
if (child != null) {
String valeur = child.getNodeValue();
chemin.setText(valeur);
}
}
@Override
public void afficherDialogue(final JFrame jframe) {
String newchemin = selectionnerFichier(chemin.getText());
if (newchemin != null) {
setValeur(newchemin);
majAffichage();
}
}
public void setValeur(String valeur) {
Element el = (Element)noeud;
Node child = noeud.getFirstChild();
if (child != null)
child.setNodeValue(valeur);
else {
Node textnode = doc.DOMdoc.createTextNode(valeur);
el.appendChild(textnode);
}
doc.setModif(true);
}
public String selectionnerFichier(String oldchemin) {
String newchemin = oldchemin == null ? "" : oldchemin;
if (!absReady) {
absAttr = doc.cfg.valeurParametreElement(refElement, defaultAbsAttr, "");
absReady = true;
if (absAttr == null || absAttr.length() == 0) {
absAttr = null;
absolute = null;
}
}
if (absAttr != null && absAttr.length() > 0) {
NodeList list = doc.DOMdoc.getElementsByTagName(absAttr);
if (list != null && list.getLength() > 0) {
absolute = list.item(0).getTextContent();
File file = new File(newchemin);
if (! file.isAbsolute()) {
newchemin = absolute+"/"+newchemin;
}
} else {
absolute = null;
}
} else {
absolute = null;
}
JFileChooser fileChooser = new JFileChooser(newchemin);
fileChooser.setFileSelectionMode(type);
String title = "Choose a ";
if (type == JFileChooser.FILES_ONLY) {
title += "File";
} else if (type == JFileChooser.DIRECTORIES_ONLY) {
title += "Directory";
} else {
title += "File or Directory";
}
int returnVal = fileChooser.showDialog(this.doc.jframe, title);
if (returnVal == JFileChooser.APPROVE_OPTION) {
newchemin = fileChooser.getSelectedFile().getAbsolutePath();
if (absolute != null) {
if (newchemin.startsWith(absolute)) {
newchemin = newchemin.substring(absolute.length()+1);
}
}
return newchemin;
}
return null;
}
class JEFichierMouseListener extends MouseAdapter {
JEChemin jei;
JFrame jframe;
public JEFichierMouseListener(final JEChemin obj, final JFrame jframe) {
super();
jei = obj;
this.jframe = jframe;
}
@Override
public void mouseClicked(final MouseEvent e) {
jei.afficherDialogue(jframe);
}
}
}