1,10 → 1,13 |
package org.tela_botanica.client.vues; |
|
import org.tela_botanica.client.image.ImageMediateur; |
import com.gwtext.client.core.Ext; |
import org.tela_botanica.client.interfaces.Rafraichissable; |
import org.tela_botanica.client.interfaces.VueListable; |
import com.google.gwt.user.client.Element; |
import com.google.gwt.user.client.ui.Label; |
import com.gwtext.client.core.EventObject; |
import com.gwtext.client.core.ExtElement; |
import com.gwtext.client.core.XTemplate; |
import com.gwtext.client.data.FieldDef; |
import com.gwtext.client.data.IntegerFieldDef; |
15,42 → 18,70 |
import com.gwtext.client.util.Format; |
import com.gwtext.client.widgets.Component; |
import com.gwtext.client.widgets.DataView; |
import com.gwtext.client.widgets.PagingToolbar; |
import com.gwtext.client.widgets.Panel; |
import com.gwtext.client.widgets.ToolTip; |
import com.gwtext.client.widgets.Toolbar; |
import com.gwtext.client.widgets.ToolbarButton; |
import com.gwtext.client.widgets.ToolbarTextItem; |
import com.gwtext.client.widgets.event.ContainerListenerAdapter; |
import com.gwtext.client.widgets.event.DataViewListenerAdapter; |
import com.gwtext.client.widgets.form.Field; |
import com.gwtext.client.widgets.form.NumberField; |
import com.gwtext.client.widgets.form.event.FieldListenerAdapter; |
|
/** |
* Galerie d'images miniatures |
* |
* Avec barre de pagination |
* @author aurelien |
*/ |
public class GalerieImageVue extends Panel implements Rafraichissable, |
VueListable { |
|
// instance du médiateur |
/** |
* instance du médiateur |
*/ |
private ImageMediateur iMediateur = null; |
/** |
* Dataview, littéralement "vue de données" qui permet de définir la manière d'afficher les données |
*/ |
private DataView dView = null; |
/** |
* Dataview, littéralement "vue de données" qui permet de définir la manière d'afficher les données |
*/ |
private Store st = null; |
/** |
* Barre de pagination gérant l'affichage d'un nombre donné d'élements par page et la navigation entre eux |
*/ |
private pageToolBarVue pt = null ; |
/** |
* Booleen indiquant si la galerie est instanciée ou pas |
*/ |
private boolean estInstancie = false ; |
|
/** |
* Constructeur sans argument, privé car ne doit pas être utilisé |
*/ |
private GalerieImageVue() |
{ |
super() ; |
} |
|
/** |
* Constructeur avec argument |
* @param im le médiateur avec lequel la vue va communiquer |
*/ |
public GalerieImageVue(ImageMediateur im) { |
super("Galerie"); |
iMediateur = im; |
|
// on ajoute des listeners au composant tout entier |
this.addListener(new ContainerListenerAdapter() { |
|
public void onHide(Component component) { |
// TODO Auto-generated method stub |
|
} |
|
public void onRender(Component component) { |
// TODO Auto-generated method stub |
|
} |
|
// pour gagner du temps on n'instancie la vue en elle même que lors du premier affichage (lazy rendering) |
public void onShow(Component component) { |
|
if (dView == null) { |
if (!estInstancie) { |
initialiser(); |
} |
} |
57,8 → 88,15 |
|
}); |
|
// et on ajoute la tool bar |
pt = new pageToolBarVue(im) ; |
this.setBottomToolbar(pt) ; |
|
} |
|
/** |
* Ajoute tous les listeners nécessaires à l'intercation utilisateur avec la vue de données |
*/ |
public void ajouterListenersDataView() { |
|
// ajout de listeners pour la gestion de la selection |
65,40 → 103,46 |
// dans la galerie |
dView.addListener(new DataViewListenerAdapter() { |
|
// gestion du clic sur une image |
public void onClick(DataView source, int index, Element node, |
EventObject e) { |
|
// on en notifie le médiateur |
getIMediateur().clicGalerieImage(index, node, e); |
|
} |
|
public void onContainerClick(DataView source, EventObject e) { |
// TODO: appeler le mediateur |
|
} |
|
// gestion du clic droit |
public void onContextMenu(DataView source, int index, Element node, |
EventObject e) { |
|
// on stoppe l'évenement |
e.stopEvent(); |
// et on notifie le médiateur |
getIMediateur().montrerContextMenu(e); |
|
} |
|
// gestion du double clic |
public void onDblClick(DataView source, int index, Element node, |
EventObject e) { |
|
// TODO: appeler le mediateur |
// on notife le mediateur |
getIMediateur().clicGalerieImage(index, node, e); |
|
} |
|
// gestion des actions en fonction de la selection |
public void onSelectionChange(DataView view, Element[] selections) { |
|
// s'il n'y a aucun élement sélectionné |
if (selections.length <= 0) { |
// on en notifie le médiateur |
getIMediateur().aucuneSelection(); |
} else { |
// sinon on notifie le médiateur |
getIMediateur().selection(); |
// et on lui demande de synchroniser la séléction avec les autres vues |
getIMediateur().synchroniserSelection("galerie"); |
} |
} |
106,10 → 150,18 |
}); |
} |
|
/** |
* Accesseur pour la dataview |
* @return la dataview |
*/ |
public DataView getDView() { |
return dView; |
} |
|
/** |
* Renvoie les ids des images sélectionnées |
* @return un tableau de String contenant les identifiants des images sélectionnées |
*/ |
public String[] getIdSelectionnees() { |
Record[] selection = getDView().getSelectedRecords(); |
int taille = selection.length; |
123,16 → 175,37 |
return id_selection; |
} |
|
/** |
* Accesseur pour le médiateur |
* @return le mdéiateur associé à la vue |
*/ |
public ImageMediateur getIMediateur() { |
return iMediateur; |
} |
|
/** |
* Accesseur pour le store |
* @return le store associée à la vue |
*/ |
public Store getSt() { |
return st; |
} |
|
// instantiation paresseuse |
/** |
* Accesseur pour la toolbar |
* @return la toolbar associée à la vue |
*/ |
public pageToolBarVue getToolBarVue() |
{ |
return pt ; |
} |
|
/** |
* Fonction d'initialisation du contenu (appelée lors du premier affichage de la liste) |
*/ |
public void initialiser() { |
|
|
// Preparation de la dataview et du template |
// le template va créer une div contenant une image |
// pour chacune des photos |
143,6 → 216,7 |
"<div class='thumb'><img src='{url_image_M}' title='{num_image}'></div>", |
"<span>{nom}</span></div>", "</tpl>", |
"<div class='x-clear'></div>" }); |
// pour des raisons de performances on compile le template en une fonction |
template.compile(); |
|
// la dataview affichera les images en accord avec le template |
177,6 → 251,7 |
st = new Store(rd); |
dView.setStore(st); |
|
|
this.getDView().setLoadingText("chargement"); |
|
// ajouts de la gestion des evenements pour la dataview |
184,28 → 259,52 |
|
this.add(dView); |
|
// enfin on envoie une demande de données au médiateur |
getIMediateur().obtenirPhotoGalerie(this); |
// et on déclare le composant comme instancié |
estInstancie = true ; |
} |
|
/** |
* Méthode héritée de l'interface rafraichissable |
*/ |
public void rafraichir(Object nouvelleDonnees, |
boolean repandreRafraichissement) { |
|
// si l'objet reçu est un store |
if (nouvelleDonnees instanceof Store) { |
|
st = (Store) nouvelleDonnees; |
// on le charge |
st.load(); |
// on l'affecte à la vue |
dView.setStore(st); |
// et on rafrachit la vue |
dView.refresh(); |
|
} |
|
// si le com)posant doit répandre le rafraichissement |
if (repandreRafraichissement) { |
// il en notifie le médiateur en lui donnant une copie des données |
getIMediateur().synchroniserDonneesZoomListeGalerie( |
nouvelleDonnees, this); |
} |
|
if(!estInstancie) |
{ |
estInstancie = true ; |
} |
} |
|
/** |
* Sélectionne les images dans la galerie suivant les identifiants donnés en paramètres |
* @param ids les identifiants des images à sélectionner |
*/ |
public void selectionnerImages(int[] ids) { |
|
getDView().select(ids); |
|
} |
|
} |