Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1 → Rev 2

/trunk/src/org/tela_botanica/client/vues/ArbreMotsClesFiltreVue.java
New file
0,0 → 1,338
package org.tela_botanica.client.vues;
 
import org.tela_botanica.client.image.ImageMediateur;
import org.tela_botanica.client.interfaces.Filtrable;
import org.tela_botanica.client.interfaces.Rafraichissable;
 
import com.google.gwt.user.client.ui.Label;
import com.gwtext.client.data.Node;
import com.gwtext.client.data.NodeTraversalCallback;
import com.gwtext.client.data.Tree;
import com.gwtext.client.widgets.Component;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.event.PanelListenerAdapter;
import com.gwtext.client.widgets.tree.TreeNode;
import com.gwtext.client.widgets.tree.TreePanel;
 
/**
* fenêtre de recherche affichant l'arbre des mots clés en lecture et un bouton
* cliquable
* @author aurelien
*
*/
public class ArbreMotsClesFiltreVue extends Panel implements Rafraichissable, Filtrable {
 
/**
* Le médiateur associé à la vue
*/
private ImageMediateur iMediateur = null ;
/**
* Les mots clés en cours
*/
private String motsClesEncours = "" ;
/**
* Le treepanel qui affiche l'arbre
*/
private TreePanel arbreMotsCles = null ;
/**
* booléen d'initialisation
*/
private boolean estInstancie = false ;
/**
* booléen d'etat
*/
private boolean filtreModifie = false ;
/**
* Constructeur sans argument (privé car ne doit pas être utilisé)
*/
@SuppressWarnings("unused")
private ArbreMotsClesFiltreVue()
{
super() ;
}
/**
* Constructeur avec paramètres
* @param im le médiateur à associer
*/
public ArbreMotsClesFiltreVue(ImageMediateur im)
{
// on crée le panel
super() ;
//this.setLayout(new VerticalLayout());
iMediateur = im ;
// on crée le conteneur de l'arbre
Label labelRecherche = new Label("Mots clés :") ;
arbreMotsCles = new TreePanel() ;
this.setPaddings(5) ;
this.setBorder(false) ;
this.setCollapsible(true) ;
this.setAutoWidth(true) ;
add(labelRecherche) ;
// on ajoute les listeners
ajouterListenersPanel() ;
estInstancie = false ;
}
/**
* Ajoute les listeners pour le rendu du panel
*/
private void ajouterListenersPanel()
{
this.addListener(new PanelListenerAdapter() {
 
// on instancie réellement les composants au moment du rendu pour accélérer l'affichage
// et éviter des bugs
public void onRender(Component component) {
// on interdit le drag and drop dans l'arbre
arbreMotsCles.setEnableDD(false) ;
arbreMotsCles.setId("x-view-tree-filter") ;
arbreMotsCles.setAutoWidth(false) ;
arbreMotsCles.setAutoScroll(true) ;
arbreMotsCles.setBorder(false) ;
// on crée une racine pour l'arbre
TreeNode root = new TreeNode("Tags") ;
root.setId("racine_filtre") ;
String[] usObject = {"Mots clés" , "racine" } ;
root.setUserObject(usObject) ;
arbreMotsCles.setRootNode(root) ;
arbreMotsCles.setRootVisible(true) ;
arbreMotsCles.setBorder(false) ;
// on met en forme le layout
((Panel)component).add(arbreMotsCles) ;
// on ajoute les listeners d'évenements
ajouterListeners() ;
// et on demande l'arbre des mots clés
getIMediateur().obtenirArbreMotsCles(getIMediateur().getPanneauFiltres().getMotsClesFiltre()) ;
// enfin on considère le composant comme instancié
estInstancie = true ;
}
}) ;
}
/**
* ajoute les listeners pour les boutons et le cochage des mots clés
*/
private void ajouterListeners()
{
 
}
/**
* Méthode héritée de l'interface rafraichissable
*/
public void rafraichir(Object nouvelleDonnees,
boolean repandreRaffraichissement) {
// si on a reçu un arbre
if(nouvelleDonnees instanceof Tree)
{
Tree nouvelArbre = (Tree)nouvelleDonnees ;
// on vide tous les noeuds
arbreMotsCles.getRootNode().eachChild(new NodeTraversalCallback() {
public boolean execute(Node node) {
node.remove() ;
return true ;
}
}) ;
// et on recopie le nouvel arbre
copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles.getRootNode()) ;
// si l'arbre n'était pas encore considéré comme instancié
if(!estInstancie)
{
// on signale que oui
estInstancie = true ;
}
// l'état du filtre est réinitialisé
filtreModifie = false ;
show() ;
}
if(nouvelleDonnees instanceof TreeNode)
{
TreeNode nd = (TreeNode)nouvelleDonnees ;
// si le noeud n'existe pas déjà c'est un ajout
if(arbreMotsCles.getTree().getNodeById(nd.getId()+"_filtre") == null)
{
// donc on ne fait rien de spécial
}
// si le noeud existe déjà c'est un déplacement
else
{
// alors on supprime d'abord le noeud concerné
arbreMotsCles.getTree().getNodeById(nd.getId()+"_filtre").remove() ;
}
// on cherche le père du nouveau noeud
Node ndPereOriginal = nd.getParentNode() ;
String idPereFiltre = ndPereOriginal.getId()+"_filtre" ;
String[] usObj = (String[])nd.getUserObject() ;
TreeNode child = new TreeNode(usObj[0]) ;
child.setId(usObj[1]+"_filtre") ;
child.setChecked(false);
child.setUserObject(usObj) ;
arbreMotsCles.getNodeById(idPereFiltre).appendChild(child) ;
// et on ajoute le nouveau noeud à son père
copierFilsNoeud(nd, child) ;
}
// si on reçoit une string
if(nouvelleDonnees instanceof String)
{
String idSupp = (String)nouvelleDonnees+"_filtre" ;
// c'est une suppression et si le noeud existe bien
if(arbreMotsCles.getTree().getNodeById(idSupp) != null)
{
// on le supprime
arbreMotsCles.getTree().getNodeById(idSupp).remove() ;
}
}
}
/**
* Accesseur pour le médiateur
* @return le médiateur associé
*/
public ImageMediateur getIMediateur()
{
return iMediateur ;
}
/**
* Accesseur pour le panneau contenant l'arbre
* @return le panneau de l'arbre des mots clés
*/
public TreePanel getArbreMotsCles()
{
return arbreMotsCles ;
}
/**
* Méthode héritée de Filtrable
* renvoie le nom du filtre
*/
public String renvoyerNomFiltre() {
return "mots clés" ;
}
/**
* Renvoie un tableau contenant le nom du champ à filtrer et la valeur
* @return un tableau contenant le nom du champ à filtrer et sa valeur
*/
public String[] renvoyerValeursAFiltrer() {
valider() ;
String[] valeursFiltrees = {"ci_meta_mots_cles",motsClesEncours} ;
return valeursFiltrees ;
}
/**
* Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un copie du sous arbre du premier
* noeud, qu'elle concatène au deuxième
* @param ndPereOriginal le père des noeuds de l'arbre original
* @param ndPereCopie le père qui va recevoir les copies
*/
private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie)
{
if(ndPereCopie != null && ndPereOriginal != null)
{
Node[] ndNodeFils = ndPereOriginal.getChildNodes() ;
for (int i = 0; i < ndNodeFils.length; i++) {
String[] usObj = (String[])ndNodeFils[i].getUserObject() ;
TreeNode child = new TreeNode(usObj[0]) ;
child.setId(usObj[1]+"_filtre") ;
child.setChecked(false);
child.setUserObject(usObj) ;
ndPereCopie.appendChild(child) ;
if(! ndNodeFils[i].isLeaf())
{
copierFilsNoeud(ndNodeFils[i],child) ;
}
}
}
}
 
/**
* Méthode héritée de Filtrable
* Renvoie l'état du filtre (modifié ou non)
*/
public boolean renvoyerEtatFiltre() {
return filtreModifie ;
}
public void valider()
{
if(estInstancie)
{
// on vide les mots clés en cours
motsClesEncours = "" ;
// pour chaque noeud à partir de la racine
getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
// on éxécute une fonction
public boolean execute(Node node) {
// on récupère le mot clé associé au noeud et ses infos
TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
String[] usObject = (String[])tn.getUserObject() ;
getIMediateur().mettreAjourMotsClesId(usObject[0],usObject[1]) ;
if(tn.getUI().isChecked())
{
// et les concatène à la string des mots clés en cours
motsClesEncours += usObject[1]+"," ;
}
return true ;
}
});
// on suppose que le filtre a change
filtreModifie = true ;
}
}
 
}