Subversion Repositories eFlore/Applications.coel

Rev

Rev 1448 | Rev 1485 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.tela_botanica.client.composants;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.tela_botanica.client.composants.pagination.ChargeurListe;
import org.tela_botanica.client.composants.pagination.Proxy;
import org.tela_botanica.client.composants.pagination.TransformateurJSONaModelData;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.aDonnee;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.composants.GrilleParametrable;

import com.extjs.gxt.ui.client.Style.SortDir;
import com.extjs.gxt.ui.client.data.BasePagingLoadConfig;
import com.extjs.gxt.ui.client.data.LoadEvent;
import com.extjs.gxt.ui.client.data.Loader;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.ModelType;
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.Store;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.EditorGrid;
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar;

public class GrillePaginable<D extends ModelData>  extends ContentPanel implements Rafraichissable, GrilleParametrable<D> {

          //-------------//
         //  ATTRIBUTS  //
        //-------------//
        
        // Pagination
        private int start = 0;
        private int limit = 50;
        
        // Récupération, stockage et pagination des données
        private ModelType modelType = null;
        private Proxy<D> proxy = null;
        private TransformateurJSONaModelData<PagingLoadResult<D>> reader = null;
        private ChargeurListe<PagingLoadResult<D>> loader = null;
        private ListStore<D> storeGrille = null;
        
        // Elements graphiques
        EditorGrid<D> grillePersonne = null;
        List<ColumnConfig> colonnes = null;
        ColumnModel modeleDeColonnes = null;
        
          //-------------//
         //   METHODES  //
        //-------------//
        
        /*--------------
          Constructeur 
        --------------*/
        
        public GrillePaginable(ModelType modeltype, HashMap<String, String> virtualFields, Proxy<D> proxy, List<ColumnConfig> colonnes, ColumnModel modeleDeColonnes) {
                
                // Récupération des paramètres
                this.modelType = modeltype;
                this.proxy = proxy;
                this.colonnes = colonnes;
                this.modeleDeColonnes = modeleDeColonnes;
                
                // Formatage du conteneur;
                this.setLayout(new FitLayout());
                
                // Création des objets pour la récupération  et la pagination des données
                BasePagingLoadConfig plc = new BasePagingLoadConfig();
                plc.setLimit(limit);
                plc.setOffset(start);
                
                reader = new TransformateurJSONaModelData<PagingLoadResult<D>>(modelType, virtualFields);
                
                loader = new ChargeurListe<PagingLoadResult<D>>(proxy, reader, this);
        loader.setLimit(plc.getLimit());
        loader.setOffset(plc.getOffset());

                loader.addListener(Loader.BeforeLoad, new Listener<LoadEvent>() {
                        public void handleEvent(LoadEvent be) {                                 

                        }  
                });
                
                // Création de la grille
                creerGrille();
        }       
        
        
        /*------------
          Accesseurs 
        ------------*/
        
        public EditorGrid<D> getGrille() {
                return grillePersonne;
        }
        
        public ListStore<D> getStore() {
                return storeGrille;
        }
        
        public D getSelection() {
                return grillePersonne.getSelectionModel().getSelectedItem();
        }       
        
        
        /*-----------------------------
                        Rafraichir
        -----------------------------*/
        
        public void rafraichir(Object nouvellesDonnees) {
                
        }
        
        
        /*----------------
          Méthode privées 
        -----------------*/
        
        private void creerGrille() {
                
                final PagingToolBar toolBar = new PagingToolBar(this.limit);  
                toolBar.bind(loader);  
                this.setBottomComponent(toolBar);
                
                storeGrille = new ListStore<D>(loader);
                
                storeGrille.addListener(Store.Add, new Listener<StoreEvent<D>>() {
                        public void handleEvent(StoreEvent<D> ce) {

                        }
                });
                storeGrille.addListener(Store.Remove, new Listener<StoreEvent<D>>() {
                        public void handleEvent(StoreEvent<D> ce) {

                        }
                });
                storeGrille.addListener(Store.Update, new Listener<StoreEvent<D>>() {
                        public void handleEvent(StoreEvent<D> ce) {

                        }
                });
                
                RowNumberer pluginLigneNumero = new RowNumberer();
                
                GridSelectionModel<D> modeleDeSelection = new GridSelectionModel<D>();
                
                grillePersonne = new EditorGrid<D>(storeGrille, modeleDeColonnes);
                grillePersonne.setHeight("100%");
                grillePersonne.setBorders(true);
                grillePersonne.setSelectionModel(modeleDeSelection);
                grillePersonne.addPlugin(pluginLigneNumero);
                grillePersonne.getView().setForceFit(true);
                grillePersonne.setAutoExpandColumn("fmt_nom_complet");
                grillePersonne.setStripeRows(true);
                grillePersonne.setBorders(true); 
                
                grillePersonne.setStateful(true);  
                
                grillePersonne.addListener(Events.Attach, new Listener<GridEvent<D>>() {  
               public void handleEvent(GridEvent<D> be) {  
                 PagingLoadConfig config = new BasePagingLoadConfig();  
                 config.setOffset(0);  
                 config.setLimit(50);  
                   
                 Map<String, Object> state = grillePersonne.getState();  
                 if (state.containsKey("offset")) {  
                   int offset = (Integer)state.get("offset");  
                   int limit = (Integer)state.get("limit");  
                   config.setOffset(offset);  
                   config.setLimit(limit);  
                 }  
                 if (state.containsKey("sortField")) {  
                   config.setSortField((String)state.get("sortField"));  
                   config.setSortDir(SortDir.valueOf((String)state.get("sortDir")));
                 }  
                 loader.load(config);  
               }  
             });
                
                this.add(grillePersonne);
        }
}