1,24 → 1,47 |
package org.tela_botanica.client.vues.observation.filtres; |
import org.tela_botanica.client.interfaces.Filtrable; |
import org.tela_botanica.client.interfaces.Rafraichissable; |
import org.tela_botanica.client.observation.ObservationMediateur; |
import org.tela_botanica.client.vues.observation.ListeObservationVue; |
|
import com.google.gwt.core.client.JavaScriptObject; |
import com.google.gwt.user.client.Window; |
import com.google.gwt.user.client.ui.KeyboardListener; |
import com.gwtext.client.core.EventObject; |
import com.gwtext.client.data.Node; |
import com.gwtext.client.data.NodeTraversalCallback; |
import com.gwtext.client.data.Record; |
import com.gwtext.client.data.Tree; |
import com.gwtext.client.dd.DD; |
import com.gwtext.client.dd.DragData; |
import com.gwtext.client.dd.DragDrop; |
import com.gwtext.client.dd.DragSource; |
import com.gwtext.client.dd.DropTarget; |
import com.gwtext.client.dd.DropTargetConfig; |
import com.gwtext.client.widgets.BoxComponent; |
import com.gwtext.client.widgets.Button; |
import com.gwtext.client.widgets.Component; |
import com.gwtext.client.widgets.Container; |
import com.gwtext.client.widgets.Panel; |
import com.gwtext.client.widgets.event.ButtonListenerAdapter; |
import com.gwtext.client.widgets.event.PanelListenerAdapter; |
import com.gwtext.client.widgets.form.TextField; |
import com.gwtext.client.widgets.grid.GridDragData; |
import com.gwtext.client.widgets.grid.GridView; |
import com.gwtext.client.widgets.layout.VerticalLayout; |
import com.gwtext.client.widgets.tree.DropNodeCallback; |
import com.gwtext.client.widgets.tree.MultiSelectionModel; |
import com.gwtext.client.widgets.tree.TreeDragData; |
import com.gwtext.client.widgets.tree.TreeDropZone; |
import com.gwtext.client.widgets.tree.TreeDropZoneConfig; |
import com.gwtext.client.widgets.tree.TreeEditor; |
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.TreePanelListener; |
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter; |
|
public class ArbreMotsClesObservationVue extends Panel implements Rafraichissable { |
public class ArbreMotsClesObservationVue extends Panel implements Rafraichissable, Filtrable { |
|
/** |
* Le médiateur associé à la vue |
40,7 → 63,7 |
/** |
* Bouton de validation |
*/ |
private Button valider = null; |
private Button ajouterMotCle = null; |
/** |
* Une string permettant connaitre les mots clés cochés en cours séparés par |
* des virgules |
66,10 → 89,19 |
* Booléen d'instanciation du conteneur |
*/ |
private boolean arbreCharge = false; |
|
/** |
* Booléen nécessaire pour l'affichage |
* |
*/ |
private boolean estInstancie = false; |
|
/** |
* Booléen d'évènement qui sert à savoir si les mots clés ont bien été reçu |
*/ |
private boolean motsCleInitialises; |
|
private Component livue = null; |
|
/** |
* Constructeur sans paramètre (privé car interdit d'utilisation) |
88,58 → 120,90 |
public ArbreMotsClesObservationVue(ObservationMediateur om) { |
// on crée le panel |
super("Mots clés"); |
|
this.setLayout(new VerticalLayout()); |
oMediateur = om; |
|
setBorder(false); |
setCollapsible(true); |
setTitleCollapse(true); |
|
// on crée le conteneur de l'arbre |
arbreMotsCles = new TreePanel(); |
// on permet le drag and drop dans l'arbre |
arbreMotsCles.setEnableDD(true); |
arbreMotsCles.setId("x-view-tree-keyword-obs"); |
// on ajoute les listeners |
ajouterListenersPanel(); |
|
// on crée une racine pour l'arbre |
TreeNode root = new TreeNode("Tags"); |
root.setId("racine_obs"); |
String[] usObject = { "Mots clés", "racine" }; |
root.setUserObject(usObject); |
root.setExpandable(true); |
arbreMotsCles.setRootNode(root); |
arbreMotsCles.setRootVisible(true); |
arbreMotsCles.setBorder(false); |
// arbreMotsCles.setWidth(500); |
|
arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() { |
public void onClick(Node node, EventObject e) { |
if(!arbreCharge) { |
expand(); |
} |
} |
} |
|
/** |
* Ajoute les listeners pour le rendu du panel |
*/ |
private void ajouterListenersPanel() { |
this.addListener(new PanelListenerAdapter() { |
|
public void onExpand(Node node) { |
if(!arbreCharge) { |
obtenirArbreMotsCles(); |
arbreCharge = true; |
} |
} |
}); |
// 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) { |
|
livue = oMediateur.getListeObservation(); |
|
// on crée le conteneur de l'arbre |
arbreMotsCles = new TreePanel(); |
// on permet le drag and drop dans l'arbre |
//arbreMotsCles.setEnableDD(true); |
arbreMotsCles.setId("x-view-tree-keyword-obs"); |
|
|
MultiSelectionModel msModel = new MultiSelectionModel(); |
arbreMotsCles.setSelectionModel(msModel); |
|
// on crée l'éditeur pour l'arbre |
tfEdit = new TextField(); |
te = new TreeEditor(arbreMotsCles, tfEdit); |
valider = new Button("Appliquer"); |
arbreMotsCles.add(te); |
// on crée une racine pour l'arbre |
TreeNode root = new TreeNode("Tags"); |
root.setId("racine_obs"); |
String[] usObject = { "Mots clés", "racine_obs" }; |
root.setUserObject(usObject); |
root.setExpandable(true); |
|
arbreMotsCles.setRootNode(root); |
|
// on crée l'éditeur pour l'arbre |
tfEdit = new TextField(); |
te = new TreeEditor(arbreMotsCles, tfEdit); |
ajouterMotCle = new Button("Nouveau mot clé"); |
arbreMotsCles.add(te); |
|
arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() { |
public void onClick(Node node, EventObject e) { |
if(!arbreCharge) { |
expand(); |
} |
} |
|
// on met en forme le layout |
this.add(arbreMotsCles); |
this.add(valider); |
public void onExpand(Node node) { |
if(!arbreCharge) { |
obtenirArbreMotsCles(); |
arbreCharge = true; |
} |
} |
}); |
|
this.setBorder(false); |
this.setCollapsible(true); |
this.setTitleCollapse(true); |
|
// on ajoute les listeners |
ajouterListeners(); |
// on interdit le drag and drop dans l'arbre |
arbreMotsCles.setRootVisible(true); |
arbreMotsCles.setBorder(false); |
|
// on met en forme le layout |
add(arbreMotsCles); |
add(ajouterMotCle); |
|
// enfin on considère le composant comme instancié |
estInstancie = true; |
|
configDragAndDrop(); |
|
// on ajoute les listeners d'évenements |
ajouterListeners(); |
} |
|
}); |
} |
|
/** |
190,7 → 254,11 |
public void onClick(TreeNode node, EventObject e) { |
|
e.stopEvent(); |
gererClicNoeud(node); |
boolean multi = false; |
if(e.hasModifier()) { |
multi = true; |
} |
gererClicNoeud(node,multi); |
} |
|
// gestion du clic droit sur un noeud |
250,54 → 318,85 |
getOMediateur().deplacerMotCleDansArbre(node, |
getArbreMotsCles().getTree()); |
} |
|
public boolean doBeforeNodeDrop(TreePanel treePanel, |
TreeNode target, DragData dragData, |
String point, DragDrop source, |
TreeNode dropNode, |
DropNodeCallback dropNodeCallback) { |
|
if(dragData instanceof GridDragData) { |
|
Record[] obsALier = ((GridDragData)dragData).getSelections(); |
|
String idObsALier[] = new String[obsALier.length]; |
String idMotCle = ((String[])target.getUserObject())[1]; |
String idObsALierString = ""; |
|
for(int i = 0; i < obsALier.length; i++) { |
idObsALierString += obsALier[i].getAsString("ordre_observation")+", "; |
idObsALier[i] = obsALier[i].getAsString("ordre_observation"); |
} |
|
if(Window.confirm("lier les observations "+idObsALierString+" seront liées au mot clé "+target.getText()+" ?")) { |
oMediateur.mettreAjourMotsCles(idMotCle, idObsALier); |
} |
} |
return true; |
} |
|
|
public void onNodeDrop(TreePanel treePanel, |
TreeNode target, DragData dragData, |
String point, DragDrop source, TreeNode dropNode) { |
|
} |
|
}); |
|
// gestion de la validation |
valider.addListener(new ButtonListenerAdapter() { |
ajouterMotCle.addListener(new ButtonListenerAdapter() { |
|
// lors du clic |
public void onClick(Button button, EventObject e) { |
|
// 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(); |
getOMediateur().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; |
} |
|
}); |
|
// enfin on notifie le médiateur et on lui passe l'arbre et la |
// liste des mots clés ainsi obtenue |
getOMediateur().mettreAjourMotsCles(motsClesEnCours, |
arbreMotsCles.getTree()); |
|
ajouterNoeud(arbreMotsCles.getRootNode()); |
|
} |
}); |
|
} |
|
|
/** |
* Configure le drag 'n drop pour la liste |
*/ |
private void configDragAndDrop() |
{ |
|
// on fabrique la nouvelle configuration |
// les éléments sur lesquels on fait du drag 'n drop doivent tous avoir le même ddGroup |
arbreMotsCles.setDdGroup("ObsMotsClesGroup"); |
//arbreMotsCles.setEnableDD(true); |
arbreMotsCles.setEnableDrag(true); |
arbreMotsCles.setEnableDrop(true); |
DropTargetConfig dtc = new DropTargetConfig(); |
dtc.setdDdGroup("ObsMotsClesGroup"); |
|
DropTarget tg = new DropTarget(livue, dtc) { |
public boolean notifyDrop(DragSource source, EventObject e, |
DragData data) { |
|
return true; |
} |
|
public String notifyOver(DragSource source, EventObject e, |
DragData data) { |
return "x-dd-drop-ok"; |
} |
}; |
} |
|
/** |
* Envoie une demande au médiateur pour obtenir l'arbre des mots clés |
*/ |
343,7 → 442,6 |
// on crée un nouveau noeud vide |
TreeNode nd = new TreeNode(""); |
nd.setCls("x-view-treenode-keyword"); |
nd.setChecked(true); |
// on associe un objet au noeud qui contient des infos |
String[] usObject = new String[2]; |
// l'objet contient le nom du noeud |
364,16 → 462,13 |
} |
|
/** |
* Coche le noeud s'il est décoché, le décoche sinon |
* Fonction de gestion sur le clic sur le noeud |
* |
* @param node |
*/ |
public void gererClicNoeud(TreeNode node) { |
if (node.getUI().isChecked()) { |
node.getUI().toggleCheck(false); |
} else { |
node.getUI().toggleCheck(true); |
} |
public void gererClicNoeud(TreeNode node, boolean multi) { |
|
((MultiSelectionModel)arbreMotsCles.getSelectionModel()).select(node, multi); |
} |
|
/** |
393,8 → 488,8 |
// pour chaque noeud |
public boolean execute(Node node) { |
|
getArbreMotsCles().getNodeById(node.getId()) |
.getUI().toggleCheck(false); |
//getArbreMotsCles().getNodeById(node.getId()) |
//.getUI().toggleCheck(false); |
|
// on parcourt le tableau des mots clés |
for (int i = 0; i < motsClesIds.length; i++) { |
405,8 → 500,8 |
String nodeId = usObject[1]; |
|
if (nodeId.equals(motsClesIds[i])) { |
getArbreMotsCles().getNodeById(nodeId+"_obs") |
.getUI().toggleCheck(true); |
//getArbreMotsCles().getNodeById(nodeId+"_obs") |
// .getUI().toggleCheck(true); |
|
return true; |
} |
452,6 → 547,7 |
arbreCharge = true; |
} |
|
/* |
// s'il y a des mots clés en attente (lors du premier rendering) |
if (motsCleInitialises == false && motsClesEnAttente != null) { |
// on les coche |
461,11 → 557,11 |
|
if(motsClesEnAttente.length > 0) { |
cocherMotsCles(motsClesEnAttente); |
} |
}*/ |
} |
|
// Si on reçoit un tableau de String (cas ou l'on séléectionne une |
// nouvelle image) |
// nouvelle obs) |
if (nouvelleDonnees instanceof String[]) { |
// et que l'arbre est instancié |
if (arbreCharge) { |
505,8 → 601,7 |
|
String[] usObj = (String[]) ndNodeFils[i].getUserObject(); |
TreeNode child = new TreeNode(usObj[0]); |
child.setId(usObj[1] +"_obs"); |
child.setChecked(false); |
child.setId(usObj[1]); |
child.setUserObject(usObj); |
ndPereCopie.appendChild(child); |
|
517,4 → 612,28 |
} |
} |
} |
|
public void raz() { |
|
} |
|
public boolean renvoyerEtatFiltre() { |
// TODO Auto-generated method stub |
return false; |
} |
|
public String renvoyerNomFiltre() { |
// TODO Auto-generated method stub |
return null; |
} |
|
public String[] renvoyerValeursAFiltrer() { |
// TODO Auto-generated method stub |
return null; |
} |
|
public void valider() { |
// TODO Auto-generated method stub |
|
} |
} |