Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 47 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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(im);            
                this.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=\"etoile_petite.png\">" ;
                                                }
                                                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) ;
                        //this.getView().refresh() ;
                        
                }
                
        }

}