New file |
0,0 → 1,453 |
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 org.tela_botanica.client.observation.ObservationMediateur; |
|
import com.gwtext.client.core.EventObject; |
import com.gwtext.client.data.Node; |
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.layout.RowLayout; |
import com.gwtext.client.widgets.layout.RowLayoutData; |
import com.gwtext.client.widgets.tree.MultiSelectionModel; |
import com.gwtext.client.widgets.tree.TreeNode; |
import com.gwtext.client.widgets.tree.TreePanel; |
import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter; |
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter; |
|
/** |
* 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; |
|
/** |
* Le médiateur associé à la vue |
*/ |
private ObservationMediateur oMediateur = null; |
|
/** |
* Les mots clés en cours |
*/ |
private String motsClesEncours = ""; |
|
/** |
* Le treepanel qui affiche l'arbre |
*/ |
private static TreePanel arbreMotsCles = null; |
|
/** |
* booléen d'initialisation |
*/ |
private boolean estInstancie = false; |
|
private boolean arbreInitialise = false; |
|
/** |
* booléen d'etat |
*/ |
private boolean filtreModifie = false; |
|
/** |
* prefixe pour générer des ids adaptées |
*/ |
private String prefixe = "_filtre" ; |
|
private final String prefixeImg = "_images" ; |
|
private final String prefixeObs = "_obs" ; |
|
/** |
* 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(); |
iMediateur = im; |
this.prefixe += prefixeImg; |
initialiserPanel(); |
} |
|
/** |
* Constructeur avec paramètres |
* |
* @param im |
* le médiateur à associer |
*/ |
public ArbreMotsClesFiltreVue(ObservationMediateur om) { |
|
// on crée le panel |
super(); |
oMediateur = om; |
this.prefixe += prefixeObs; |
initialiserPanel(); |
|
this.setLayout(new RowLayout()); |
|
} |
|
public void initialiserPanel() { |
// on crée le conteneur de l'arbre |
arbreMotsCles = new TreePanel(); |
arbreMotsCles.setId("x-view-tree-filter"+prefixe); |
|
MultiSelectionModel msModel = new MultiSelectionModel(); |
arbreMotsCles.setSelectionModel(msModel); |
|
// on crée une racine pour l'arbre |
TreeNode root = new TreeNode("Tags"); |
root.setId("racine"+prefixe); |
String[] usObject = { "Mots clés", "racine"+prefixe }; |
root.setUserObject(usObject); |
|
root.setExpandable(true); |
|
arbreMotsCles.setRootNode(root); |
|
arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() { |
|
@Override |
public void onClick(Node node, EventObject e) { |
if(!arbreInitialise) { |
expand(); |
} |
} |
|
@Override |
public void onExpand(Node node) { |
if(!arbreInitialise) { |
obtenirArbreMotsCles(); |
arbreInitialise = true; |
} |
} |
|
}); |
|
this.setPaddings(5); |
|
this.setBorder(false); |
this.setCollapsible(true); |
this.setAutoWidth(true); |
|
// 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 |
@Override |
public void onRender(Component component) { |
|
// on interdit le drag and drop dans l'arbre |
arbreMotsCles.setEnableDD(false); |
arbreMotsCles.setAutoWidth(false); |
arbreMotsCles.setAutoScroll(true); |
arbreMotsCles.setBorder(false); |
|
// on met en forme le layout |
((Panel) component).add(arbreMotsCles,new RowLayoutData("80%")); |
|
// on ajoute les listeners d'évenements |
ajouterListeners(); |
//obtenirArbreMotsCles(); |
} |
|
}); |
} |
|
/** |
* ajoute les listeners pour les boutons et le cochage des mots clés |
*/ |
private void ajouterListeners() { |
arbreMotsCles.addListener(new TreePanelListenerAdapter() { |
|
// gestion du clic sur un noeud |
@Override |
public void onClick(TreeNode node, EventObject e) { |
|
e.stopEvent(); |
|
boolean multi = false; |
if(e.hasModifier()) { |
multi = true; |
} |
gererClicNoeud(node,multi); |
} |
}); |
} |
|
/** |
* Fonction de gestion sur le clic sur le noeud |
* |
* @param node |
*/ |
public void gererClicNoeud(TreeNode node, boolean multi) { |
|
if(!arbreInitialise) { |
obtenirArbreMotsCles(); |
} else { |
if(node.equals(arbreMotsCles.getRootNode())) { |
arbreMotsCles.getSelectionModel().clearSelections(); |
} else { |
((MultiSelectionModel)arbreMotsCles.getSelectionModel()).select(node, multi); |
} |
filtreModifie = true; |
iMediateur.obtenirPhotoGalerie(); |
} |
} |
|
/** |
* Méthode héritée de l'interface rafraichissable |
*/ |
@Override |
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 de l'ancien arbre |
Node[] rootChild = arbreMotsCles.getRootNode().getChildNodes(); |
for (int i = 0; i < rootChild.length; i++) { |
|
rootChild[i].remove(); |
} |
|
// 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; |
} |
|
if(!arbreInitialise) { |
arbreInitialise = true; |
} |
|
arbreMotsCles.setRootNode(arbreMotsCles.getRootNode()); |
|
// l'état du filtre est réinitialisé |
filtreModifie = false; |
doLayout() ; |
} |
} |
|
/** |
* Accesseur pour le médiateur |
* |
* @return le médiateur associé |
*/ |
public ImageMediateur getIMediateur() { |
return iMediateur; |
} |
|
public ObservationMediateur getOMediateur() { |
return oMediateur ; |
} |
|
/** |
* 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 |
*/ |
@Override |
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 |
*/ |
@Override |
public String[] renvoyerValeursAFiltrer() { |
|
String val = ""; |
|
TreeNode[] noeuds = ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).getSelectedNodes(); |
|
for(int i = 0; i< noeuds.length ; i++) { |
if(noeuds[i].getDepth() > 0) { |
|
String[] userObj = (String[])noeuds[i].getUserObject(); |
String idMotCle = noeuds[i].getId(); |
|
if(userObj != null && userObj[1] != null) { |
idMotCle = userObj[1]; |
} |
|
val += ";"+idMotCle; |
} |
} |
|
val = val.replaceFirst(";", ""); |
|
String[] valeursFiltres = {"id_mots_cles", val}; |
|
return valeursFiltres; |
} |
|
/** |
* 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] +prefixe); |
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) |
*/ |
@Override |
public boolean renvoyerEtatFiltre() { |
|
return filtreModifie; |
} |
|
public void mettreAJourMotsCles(String valeur, String id) { |
if(getIMediateur() != null) { |
getIMediateur().mettreAjourMotsClesId(valeur, |
id); |
} |
else |
{ |
getOMediateur().mettreAjourMotsClesId(valeur, id); |
} |
} |
|
public void obtenirArbreMotsCles() { |
if(getIMediateur() != null) { |
getIMediateur().obtenirArbreMotsCles(this); |
} |
else |
{ |
getOMediateur().obtenirArbreMotsCles(this); |
} |
} |
|
@Override |
public void valider() { |
if (estInstancie) { |
// on vide les mots clés en cours |
motsClesEncours = ""; |
// on suppose que le filtre a change |
filtreModifie = true; |
} |
} |
|
public void raz() { |
|
if(arbreInitialise) { |
// on vide tous les noeuds de l'ancien arbre |
Node[] rootChild = arbreMotsCles.getRootNode().getChildNodes(); |
for (int i = 0; i < rootChild.length; i++) { |
|
rootChild[i].remove(); |
} |
|
arbreInitialise = false ; |
|
// on crée une racine pour l'arbre |
TreeNode root = new TreeNode("Tags"); |
root.setId("racine"+prefixe); |
String[] usObject = { "Mots clés", "racine"+prefixe }; |
root.setUserObject(usObject); |
|
root.setExpandable(true); |
|
arbreMotsCles.setRootNode(root); |
|
arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() { |
|
@Override |
public void onClick(Node node, EventObject e) { |
if(!arbreInitialise) { |
expand(); |
} |
} |
|
@Override |
public void onExpand(Node node) { |
if(!arbreInitialise) { |
obtenirArbreMotsCles(); |
arbreInitialise = true; |
} |
} |
}); |
} |
} |
|
@Override |
public void viderFiltre() { |
motsClesEncours = ""; |
arbreMotsCles.getSelectionModel().clearSelections(); |
} |
|
} |