Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1 → Rev 2

/trunk/src/org/tela_botanica/client/vues/ListeImageVue.java
New file
0,0 → 1,437
package org.tela_botanica.client.vues;
 
import org.tela_botanica.client.image.ImageMediateur;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.interfaces.VueListable;
 
import com.gwtext.client.core.EventObject;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.widgets.Component;
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
import com.gwtext.client.widgets.grid.CellMetadata;
import com.gwtext.client.widgets.grid.ColumnConfig;
import com.gwtext.client.widgets.grid.ColumnModel;
import com.gwtext.client.widgets.grid.GridPanel;
import com.gwtext.client.widgets.grid.Renderer;
import com.gwtext.client.widgets.grid.RowSelectionModel;
import com.gwtext.client.widgets.grid.event.GridRowListener;
import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
 
/**
* Liste d'image composée de miniatures et d'information sur l'image, implémente
* l'interface rafraichissable et l'interface vueListable
*
* @author aurelien
*/
public class ListeImageVue extends GridPanel implements Rafraichissable,
VueListable {
 
/**
* Le médiateur associé à la vue
*/
private ImageMediateur iMediateur = null;
/**
* Config de colonne
*/
private ColumnConfig numImage;
/**
* Config de colonne
*/
private ColumnConfig urlImage;
/**
* Config de colonne
*/
private ColumnConfig lieImage;
/**
* Config de colonne
*/
private ColumnConfig datImage;
/**
* Config de colonne
*/
private ColumnConfig appImage;
/**
* Config de colonne
*/
private ColumnConfig noteImage;
/**
* Modele de colonnes
*/
private ColumnModel modeleColonnes;
 
/**
* Booleen d'instanciation
*/
private boolean estInstancie = false;
 
/**
* Store qui contient les données à afficher
*/
private Store st = null;
/**
* Configuration des colonnes du store
*/
private ColumnConfig cl = null;
/**
* Barre de pagination
*/
private pageToolBarVue bt = null ;
 
/**
* Constructeur sans arguments (privé car ne doit pas être utilisé)
*/
private ListeImageVue()
{
super() ;
}
/**
* Constructeur avec argument
* @param im le médiateur à associer
*/
public ListeImageVue(ImageMediateur im) {
 
new ListeImageVue() ;
 
this.setId("listeImageGrid");
// on associe le médiateur
this.iMediateur = im;
// on place la barre de pagination
bt = new pageToolBarVue(iMediateur);
setBottomToolbar(bt) ;
 
// on construit le modèle de colonnes
numImage = new ColumnConfig("numéro", "num_image", 30, true, new Renderer() {
 
public String render(Object value, CellMetadata cellMetadata,
Record record, int rowIndex, int colNum, Store store) {
String ImgNum = record.getAsString("num_image");
return "<div class=\"centered-list\">"+ ImgNum +"</div>";
}
}) ;
datImage = new ColumnConfig("date", "dat_image", 120, true, new Renderer() {
 
public String render(Object value, CellMetadata cellMetadata,
Record record, int rowIndex, int colNum, Store store) {
String ImgDat = record.getAsString("dat_image");
if(ImgDat == null)
{
ImgDat = " " ;
}
return "<div class=\"centered-list\">"+ ImgDat +"</div>";
}
}) ;
lieImage = new ColumnConfig("lieu", "lie_image", 120, true, new Renderer() {
 
public String render(Object value, CellMetadata cellMetadata,
Record record, int rowIndex, int colNum, Store store) {
String ImgLie = record.getAsString("lie_image");
if(ImgLie == null)
{
ImgLie = " " ;
}
return "<div class=\"centered-list\">"+ ImgLie +"</div>";
}
}) ;
appImage = new ColumnConfig("appareil", "app_image", 120, true, new Renderer() {
 
public String render(Object value, CellMetadata cellMetadata,
Record record, int rowIndex, int colNum, Store store) {
String ImgApp = record.getAsString("app_image");
if(ImgApp == null)
{
ImgApp = " " ;
}
return "<div class=\"centered-list\">"+ ImgApp +"</div>";
}
}) ;
// la colonne url possède une méthode de rendu spéciale
urlImage = new ColumnConfig("Image", "url_image_S", 30, true,
new Renderer() {
 
public String render(Object value,
CellMetadata cellMetadata, Record record,
int rowIndex, int colNum, Store store) {
// on affiche une div contenant l'image pointée par l'url
String ImgUrl = record.getAsString("url_image_S");
String ImgNum = record.getAsString("num_image");
return "<div class=\"img-list centered-list\"> <img src=\"" + ImgUrl
+ "\" title='" + ImgNum + "'> </div>";
}
 
});
noteImage = new ColumnConfig("note", "note_image", 80, true,
new Renderer()
{
public String render(Object value, CellMetadata cellMetadata,
Record record, int rowIndex, int colNum, Store store) {
String htmlImage = "" ;
int noteImg = record.getAsInteger("note_image") ;
if(noteImg >= 0)
{
htmlImage += "<div class=\"img-note centered-list\">" ;
for(int i = 0 ; i <= noteImg ; i++)
{
htmlImage += "<img src=\"note-on.gif\">" ;
}
htmlImage += "</div>" ;
}
return htmlImage ;
}
}) ;
// on associe le modèle de colonnes
ColumnConfig[] cm = {numImage, urlImage, datImage, lieImage, appImage, noteImage};
modeleColonnes = new ColumnModel(cm);
this.setColumnModel(modeleColonnes);
this.setAutoScroll(true);
this.setAutoWidth(true);
this.setEnableColumnResize(true);
 
// creation du store
FieldDef defNumImage = new IntegerFieldDef("num_image");
FieldDef defDatImage = new StringFieldDef("dat_image");
FieldDef defLieImage = new StringFieldDef("lie_image");
FieldDef defAppImage = new StringFieldDef("app_image");
FieldDef defUrlImageS = new StringFieldDef("url_image_S");
FieldDef defUrlImageM = new StringFieldDef("url_image_M");
FieldDef defUrlImage = new StringFieldDef("url_image");
FieldDef defNoteImage = new StringFieldDef("note_image");
FieldDef[] defTab = { defNumImage, defDatImage, defLieImage,
defAppImage, defUrlImageS, defUrlImageM, defUrlImage, defNoteImage };
RecordDef rd = new RecordDef(defTab);
st = new Store(rd);
// on associe le store
this.setStore(st);
this.getView().setAutoFill(true);
// on crée un masque de chargement qui s'affichera lors des mises à jour
this.setLoadMask("chargement");
// on ajoute les listeners
ajouterListeners();
 
}
 
/**
* Ajoute les listeners pour la gestion des évènements
*/
private void ajouterListeners() {
this.addListener(new ContainerListenerAdapter() {
 
public void onHide(Component component) {
 
}
 
// lors du premier rendu on demande les données qui sont déjà contenues dans la galerie qui est le premier élément affiché
public void onRender(Component component) {
 
if (!isEstInstancie()) {
setEstInstancie(true);
getIMediateur().synchroniserSelection("galerie");
}
}
 
public void onShow(Component component) {
 
}
 
});
 
this.addGridRowListener(new GridRowListener() {
// gestion du clic sur une ligne
public void onRowClick(GridPanel grid, int rowIndex, EventObject e) {
 
// on notifie le médiateur et on lui passe le nuémro de ligne
getIMediateur().clicListeImage(rowIndex);
}
// gestion du clic droit
public void onRowContextMenu(GridPanel grid, int rowIndex,
EventObject e) {
// on stoppe l'évenement pour empecher le navigateur d'afficher son propre menu
e.stopEvent() ;
// on notifie le médiateur en lui passant l'évenement
getIMediateur().montrerContextMenu(e);
}
 
// gestion du double clic
public void onRowDblClick(GridPanel grid, int rowIndex,
EventObject e) {
// on notifie le médiateur en lui passant le numéro de ligne
getIMediateur().doubleClicListeImage(rowIndex);
}
});
 
this.getSelectionModel().addListener(new RowSelectionListenerAdapter() {
 
// gestion de la sélection
public void onSelectionChange(RowSelectionModel sm) {
 
// si on a rien de sélectionné
if (sm.getCount() <= 0) {
// on notifie le médiateur (qui désactive notamment l'accès à certaines infos)
getIMediateur().aucuneSelection();
} else {
// sinon on notifie le médiateur
getIMediateur().selection();
// et on lui demande de synchroniser la selection avec les autres vues
getIMediateur().synchroniserSelection("liste");
}
}
});
}
 
/**
* Méthode héritée de l'interface VueListable
* Sélectionne les images dans la galerie suivant les identifiants donnés en paramètres
*/
public String[] getIdSelectionnees() {
Record[] selection = this.getSelectionModel().getSelections();
int taille = selection.length;
String id_selection[] = new String[taille];
 
for (int i = 0; i < selection.length; i++) {
 
id_selection[i] = selection[i].getAsString("num_image");
}
 
return id_selection;
}
 
/**
* Accesseur pour la config de colonnes
* @return la config de colonnes
*/
public ColumnConfig getCl() {
return cl;
}
/**
* Accesseur pour le médiateur
* @return le médiateur associé
*/
public ImageMediateur getIMediateur() {
return iMediateur;
}
 
/**
* Accesseur pour le modèle de colonnes
* @return le modèle de colonnes
*/
public ColumnModel getModeleColonnes() {
return modeleColonnes;
}
 
/**
* Accesseur pour le store
* @return le store contenant les données
*/
public Store getSt() {
return st;
}
/**
* Accesseur pour le booleen d'instanciation
* @return le booleen d'instanciation
*/
public boolean isEstInstancie() {
return estInstancie;
}
 
/**
* Méthode héritée de l'interface rafraichissable
* @param nouvelleDonnees les nouvelles données
* @param repandreRafraichissement le booleen de notification du rafraichissement
*/
public void rafraichir(Object nouvelleDonnees,
boolean repandreRafraichissement) {
 
// si on reçoit un store
if (nouvelleDonnees instanceof Store) {
 
// on affecte celui-ci comme gestionnaire de données
st = (Store) nouvelleDonnees;
st.load();
// et on reconfigure et rafraichit la vue
this.reconfigure(st, this.getColumnModel());
}
 
// si on doit répandre l'évenement
if (repandreRafraichissement) {
// on notifie le médiateur avec une copie des données
getIMediateur().synchroniserDonneesZoomListeGalerie(
nouvelleDonnees, this);
}
}
 
/**
* Sélectionne des enregistrements donné
* @param sel un tableau d'enregistrement à selectionner
*/
public void selectionnerEnregistrements(Record[] sel) {
 
if (isEstInstancie()) {
getSelectionModel().clearSelections();
getSelectionModel().selectRecords(sel);
}
}
/**
* Accesseur pour la toolbar de pagination
* @return la toolbar de pagination
*/
public pageToolBarVue getToolBarVue()
{
return bt ;
}
 
/**
* Setteur pour le booleen d'instanciation
* @param estInstancie la nouvelle valeur du booleen
*/
public void setEstInstancie(boolean estInstancie) {
this.estInstancie = estInstancie;
}
 
public void mettreAjourInfos(String commentaires, String date, String note) {
for (int i = 0; i < getSelectionModel().getCount(); i++) {
getSelectionModel().getSelections()[i].set("note_image", note) ;
getSelectionModel().getSelections()[i].set("dat_image", date) ;
}
}
 
}