/trunk/src/org/tela_botanica/client/vues/PanneauMetadonneesVue.java |
---|
13,6 → 13,7 |
import com.google.gwt.user.client.ui.Widget; |
import com.gwtext.client.core.EventObject; |
import com.gwtext.client.core.NameValuePair; |
import com.gwtext.client.core.RegionPosition; |
import com.gwtext.client.data.Store; |
import com.gwtext.client.data.StringFieldDef; |
import com.gwtext.client.widgets.Button; |
29,6 → 30,8 |
import com.gwtext.client.widgets.grid.PropertyGridPanel; |
import com.gwtext.client.widgets.grid.event.GridCellListener; |
import com.gwtext.client.widgets.grid.event.GridCellListenerAdapter; |
import com.gwtext.client.widgets.layout.BorderLayout; |
import com.gwtext.client.widgets.layout.BorderLayoutData; |
import com.gwtext.client.widgets.layout.RowLayout; |
import com.gwtext.client.widgets.layout.RowLayoutData; |
import com.gwtext.client.widgets.layout.VerticalLayout; |
125,10 → 128,16 |
panneauInfoGrid = new Panel("info") ; |
panneauMotsCles = new ArbreMotsClesVue(im) ; |
panneauInfoGrid.setLayout(new VerticalLayout()); |
panneauInfoGrid.setHeight(500); |
panneauInfoGrid.setMargins(5) ; |
panneauInfoGrid.setPaddings(5) ; |
Panel sousPanneauInfosGenerales = new Panel("Infos Générales") ; |
sousPanneauInfosGenerales.setLayout(new VerticalLayout()); |
sousPanneauInfosGenerales.setBorder(false) ; |
sousPanneauInfosGenerales.setHeight(200); |
sousPanneauInfosGenerales.setAutoWidth(true) ; |
sousPanneauInfosGenerales.setMargins(5) ; |
sousPanneauInfosGenerales.setPaddings(5) ; |
sousPanneauInfosGenerales.setCollapsible(true) ; |
Label labelComm = new Label("Commentaires :") ; |
labelComm.setHeight("20px") ; |
commentaireGeneral = new TextArea() ; |
143,18 → 152,25 |
validerInfo = new Button("OK") ; |
panneauInfoGrid.add(labelComm) ; |
panneauInfoGrid.add(commentaireGeneral) ; |
panneauInfoGrid.add(labelDate) ; |
panneauInfoGrid.add(dateImage) ; |
panneauInfoGrid.add(validerInfo) ; |
sousPanneauInfosGenerales.add(labelComm) ; |
sousPanneauInfosGenerales.add(commentaireGeneral) ; |
sousPanneauInfosGenerales.add(labelDate) ; |
sousPanneauInfosGenerales.add(dateImage) ; |
sousPanneauInfosGenerales.add(validerInfo) ; |
sousPanneauInfosGenerales.setAutoHeight(true); |
panneauMotsCles.setAutoHeight(true) ; |
panneauInfoGrid.setBorder(false); |
panneauInfoGrid.setAutoHeight(true); |
panneauInfoGrid.add(sousPanneauInfosGenerales) ; |
panneauInfoGrid.add(panneauMotsCles) ; |
this.add(panneauInfoGrid) ; |
this.add(panneauExifGrid) ; |
this.add(panneauIptcGrid) ; |
this.add(panneauMotsCles) ; |
gViewExif = new GridView(); |
gViewExif.setForceFit(true); |
/trunk/src/org/tela_botanica/client/vues/ArbreMotsClesFiltreVue.java |
---|
New file |
0,0 → 1,241 |
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.core.client.JavaScriptObject; |
import com.gwtext.client.data.Node; |
import com.gwtext.client.data.NodeTraversalCallback; |
import com.gwtext.client.data.Tree; |
import com.gwtext.client.core.EventObject; |
import com.gwtext.client.core.JsObject; |
import com.gwtext.client.widgets.Button; |
import com.gwtext.client.widgets.Component; |
import com.gwtext.client.widgets.Panel; |
import com.gwtext.client.widgets.Window; |
import com.gwtext.client.widgets.event.ButtonListener; |
import com.gwtext.client.widgets.event.ButtonListenerAdapter; |
import com.gwtext.client.widgets.event.ContainerListener; |
import com.gwtext.client.widgets.event.ContainerListenerAdapter; |
import com.gwtext.client.widgets.event.WindowListenerAdapter; |
import com.gwtext.client.widgets.form.TextField; |
import com.gwtext.client.widgets.layout.RowLayout; |
import com.gwtext.client.widgets.layout.RowLayoutData; |
import com.gwtext.client.widgets.menu.Menu; |
import com.gwtext.client.widgets.tree.TreeEditor; |
import com.gwtext.client.widgets.tree.TreeNode; |
import com.gwtext.client.widgets.tree.TreePanel; |
public class ArbreMotsClesFiltreVue extends Window 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 ; |
/** |
* Bouton rechercher |
*/ |
private Button rechercher = null ; |
/** |
* booléen d'initialisation |
*/ |
private boolean estInstancie = false ; |
/** |
* booléen d'etat |
*/ |
private boolean filtreModifie = false ; |
private ArbreMotsClesFiltreVue() |
{ |
super() ; |
} |
public ArbreMotsClesFiltreVue(ImageMediateur im) |
{ |
// on crée le panel |
super("Mots clés") ; |
this.setLayout(new RowLayout()); |
iMediateur = im ; |
// 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-filter") ; |
arbreMotsCles.setAutoWidth(true) ; |
//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(false) ; |
arbreMotsCles.getRootNode().setIcon("tela.png") ; |
arbreMotsCles.setBorder(false) ; |
rechercher = new Button("Rechercher") ; |
// on met en forme le layout |
this.add(arbreMotsCles,new RowLayoutData("90%")) ; |
this.add(rechercher,new RowLayoutData("10%")) ; |
this.setBorder(false) ; |
this.setCollapsible(true) ; |
this.setTitleCollapse(true) ; |
// on ajoute les listeners |
ajouterListeners() ; |
estInstancie = true ; |
} |
public void ajouterListeners() |
{ |
// gestion de la validation |
rechercher.addListener(new ButtonListenerAdapter() { |
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() ; |
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 ; |
// enfin on notifie le médiateur et on lui passe l'arbre et la liste des mots clés ainsi obtenue |
getIMediateur().obtenirPhotoGalerie(getIMediateur().getFiltreMotsCles()) ; |
} |
}) ; |
this.addListener(new WindowListenerAdapter() { |
public void onClose(Panel panel) { |
arbreMotsCles.getRootNode().destroy() ; |
// 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) ; |
} |
}) ; |
} |
public void rafraichir(Object nouvelleDonnees, |
boolean repandreRaffraichissement) { |
// si on a reçu un arbre |
if(nouvelleDonnees instanceof Tree) |
{ |
Tree nouvelArbre = (Tree)nouvelleDonnees ; |
copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles.getRootNode()) ; |
getArbreMotsCles().expandAll() ; |
// si l'arbre n'était pas encore considéré comme instancié |
if(!estInstancie) |
{ |
// on signale que oui |
estInstancie = true ; |
} |
filtreModifie = false ; |
setSize(200, 300) ; |
show() ; |
} |
} |
public ImageMediateur getIMediateur() |
{ |
return iMediateur ; |
} |
public TreePanel getArbreMotsCles() |
{ |
return arbreMotsCles ; |
} |
public String renvoyerNomFiltre() { |
return "mots clés" ; |
} |
public String[] renvoyerValeursAFiltrer() { |
String[] valeursFiltrees = {"ci_meta_mots_cles",motsClesEncours} ; |
return valeursFiltrees ; |
} |
public void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) |
{ |
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.setIcon("tela.png") ; |
child.setChecked(false); |
child.setUserObject(usObj) ; |
ndPereCopie.appendChild(child) ; |
if(! ndNodeFils[i].isLeaf()) |
{ |
copierFilsNoeud(ndNodeFils[i],child) ; |
} |
} |
} |
public boolean renvoyerEtatFiltre() { |
return filtreModifie ; |
} |
} |
/trunk/src/org/tela_botanica/client/vues/pageToolBarVue.java |
---|
315,9 → 315,20 |
*/ |
public void rafraichirNumeroPage() |
{ |
champPage.setValue(""+(pageCourante+1)) ; |
surTotalPage.setText(" sur "+pageTotale) ; |
System.out.println("Nombre d'éléments :"+nbElement); |
if(nbElement == 0) |
{ |
champPage.setValue(""+(0)) ; |
// on met simplement à jour l'intervalle qui contient toujours le même nombre d'éléments |
intervalleElements.setText("Images 0 - 0 sur 0") ; |
} |
else |
{ |
champPage.setValue(""+(pageCourante+1)) ; |
// si la page n'est pas la dernière |
if(pageCourante + 1 != pageTotale) |
{ |
326,17 → 337,9 |
} |
else |
{ |
if(nbElement == 0) |
{ |
// on met simplement à jour l'intervalle qui contient toujours le même nombre d'éléments |
intervalleElements.setText("Images 0 - 0 sur 0") ; |
} |
else |
{ |
// on met simplement à jour l'intervalle qui contient toujours le même nombre d'éléments |
intervalleElements.setText("Images "+pageCourante*taillePage+" - "+nbElement+" sur "+nbElement) ; |
} |
} |
} |
371,7 → 374,7 |
// si la page courante dépasse la page totale (cas normalement improbable car géré en amont) |
// on met le numéro de page à la page courante -1 (car la page courante est comptée à partir |
// de zéro) |
if(pageCourante >= pageTotale) |
if(pageCourante >= pageTotale && pageCourante != 0) |
{ |
pageCourante = pageTotale - 1 ; |
// le cas échéant on en notifie le médiateur |
/trunk/src/org/tela_botanica/client/vues/ArbreMotsClesVue.java |
---|
97,6 → 97,10 |
arbreMotsCles = new TreePanel() ; |
// on permet le drag and drop dans l'arbre |
arbreMotsCles.setEnableDD(true) ; |
arbreMotsCles.setId("x-view-tree-keyword") ; |
arbreMotsCles.setAutoWidth(true) ; |
//arbreMotsCles.setAutoScroll(true) ; |
arbreMotsCles.setBorder(false) ; |
// on crée une racine pour l'arbre |
TreeNode root = new TreeNode("Tags") ; |
120,6 → 124,8 |
this.add(valider,new RowLayoutData("10%")) ; |
this.setBorder(false) ; |
this.setCollapsible(true) ; |
this.setTitleCollapse(true) ; |
// on ajoute les listeners |
ajouterListeners() ; |
/trunk/src/org/tela_botanica/client/vues/MenuImageVue.java |
---|
54,6 → 54,7 |
chercherImage = new Item("Filtrer des images") ; |
addItem(uploaderImage); |
addItem(supprimerImage) ; |
addItem(chercherImage) ; |
// on ajoute les listeners |
ajouterListeners() ; |
87,7 → 88,13 |
hide() ; |
} |
if(item.equals(chercherImage)) |
{ |
getIMediateur().afficherFiltres() ; |
hide() ; |
} |
} |
}) ; |
/trunk/src/org/tela_botanica/client/interfaces/Filtrable.java |
---|
New file |
0,0 → 1,9 |
package org.tela_botanica.client.interfaces; |
public interface Filtrable { |
public String[] renvoyerValeursAFiltrer() ; |
public String renvoyerNomFiltre() ; |
public boolean renvoyerEtatFiltre() ; |
} |
/trunk/src/org/tela_botanica/client/interfaces/VueListable.java |
---|
1,7 → 1,19 |
package org.tela_botanica.client.interfaces; |
/** |
* Les classes qui implétement cette interface sont des classes qui affichent |
* des éléments qui peuvent être identifiés de manière unique |
* Cette interface facilite le travail du médiateur dans la mesure ou il peut obtenir |
* les éléments selectionnés d'une vue sans se préoccuper de son type précis |
* @author aurelien |
* |
*/ |
public interface VueListable { |
/** |
* Renvoie un tableau contenant les identifiants des élements selectionnés |
* @return les id des éléments sélectionnés |
*/ |
public String[] getIdSelectionnees() ; |
} |
/trunk/src/org/tela_botanica/client/interfaces/Rafraichissable.java |
---|
1,7 → 1,21 |
package org.tela_botanica.client.interfaces; |
/** |
* Toutes les classes qui recoivent des données de manières asynchrones ou imprévisible |
* implémentent cette interface. |
* Elle permet de faire transiter le rafraichissable jusqu'au DAO et d'appeler sa méthode rafraichir un fois |
* les données reçues, tout celà en préservant bien la séparation des rôles car les classes qui font transiter |
* le rafraichissable ne connaissent que cette interface et pas le restye de l'objet |
* @author aurelien |
* |
*/ |
public interface Rafraichissable { |
/** |
* Méthode de mise à jour d'un objet |
* @param nouvelleDonnees Un objet de n'importe quel type (programmation générique) qui contient les données de mise à jour |
* @param repandreRaffraichissement indique si l'élement doit notifier d'autres éléments de sa mise à jour |
*/ |
public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement); |
} |