Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.composants;

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.Information;
import org.tela_botanica.client.modeles.Valeur;
import org.tela_botanica.client.modeles.collection.Collection;
import org.tela_botanica.client.synchronisation.Sequenceur;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.vues.Formulaire;

import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.FieldEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.Size;
import com.extjs.gxt.ui.client.util.Util;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.VerticalPanel;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.layout.AbsoluteLayout;
import com.extjs.gxt.ui.client.widget.layout.AnchorLayout;
import com.extjs.gxt.ui.client.widget.layout.BoxLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;

import com.extjs.gxt.ui.client.data.BaseModelData;
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.PagingLoadResult;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class ChampComboBoxRechercheTempsReelPaginable extends LayoutContainer implements Rafraichissable {

          //-------------//
         //  ATTRIBUTS  //
        //-------------//
        
        private ListStore<ModelData> store = null;
        private ComboBox<ModelData> combo = null;

        private Proxy<?> proxy = null;
        private TransformateurJSONaModelData<PagingLoadResult<ModelData>> reader = null;
        private ChargeurListe<PagingLoadResult<ModelData>> loader = null;
        
        private int start = 0;
        private int limit = 10;
        private int largeur = 370;

        private BasePagingLoadConfig plc = null;
        private ModelType modeltype = null;
        private String displayName = "";
        private String recherche = "";
        
        private String champValeurInitiale = "";
        private String valeurInitiale = "";
        
          //-------------//
         //   METHODES  //
        //-------------//

        /*--------------
          Constructeur 
        --------------*/
        
        public ChampComboBoxRechercheTempsReelPaginable(Proxy<?> proxy, ModelType modeltype, String displayName) {
                
                this.modeltype = modeltype;
                this.proxy = proxy;
                this.displayName = displayName;

                plc = new BasePagingLoadConfig();
                plc.setLimit(limit);
                plc.setOffset(start);
                
                reader = new TransformateurJSONaModelData<PagingLoadResult<ModelData>>(modeltype, null);
                
                loader = new ChargeurListe<PagingLoadResult<ModelData>>(proxy, reader, this);
        loader.setLimit(plc.getLimit());
        loader.setOffset(plc.getOffset());

                loader.addListener(Loader.BeforeLoad, new Listener<LoadEvent>() {
                        public void handleEvent(LoadEvent be) {                                 
                                be.<ModelData> getConfig().set("start", be.<ModelData> getConfig().get("offset"));
                        }  
                });

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

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

                    }  
                });
                
                combo = new ComboBox<ModelData>();
                combo.setWidth(largeur);
                this.setWidth(largeur);
                combo.setDisplayField(displayName);
                combo.setHideTrigger(false);
                combo.setPageSize(plc.getLimit());
        store = new ListStore<ModelData>(loader);
        combo.setStore(store);
        loader.load(plc, recherche, false);

                combo.addListener(Events.KeyUp, new Listener<FieldEvent>() {
                
                        public void handleEvent(FieldEvent fe) {
                                // on vérifie que les touches enfoncées ne sont pas les flèches du clavier
                                if (!fe.isNavKeyPress()) {
                                        recherche = combo.getRawValue();
                                        plc.setLimit(limit); plc.setOffset(start);
                                        loader.setLimit(limit); loader.setOffset(start);
                                        loader.load(plc, recherche, false);
                                }
                        }
                          
                });

                this.add(combo);
        }

        /*------------
          Accesseurs 
        ------------*/
        public ComboBox<ModelData> getCombo()
        {
                return this.combo;
        }
        
        public ModelData getValeur()
        {
                if (combo.getSelection() != null && combo.getSelection().size() > 0) return combo.getSelection().get(0);
                else return null;
        }
        
        public ListStore<?> getStore()
        {
                return combo.getStore();
        }
        
        public void setWidth(int largeur)
        {
                this.largeur = largeur;
                this.combo.setWidth(largeur);
        }
        
        public void setWidth(int tailleLabel, int largeurTotale)
        {
                this.setWidth(largeurTotale);
                this.largeur = largeurTotale;
                this.combo.setWidth(largeurTotale - tailleLabel);
                
                FormLayout fl = new FormLayout();
                fl.setLabelWidth(tailleLabel);
                fl.setDefaultWidth(largeurTotale - tailleLabel);
                this.setLayout(fl);

                this.layout();
        }
        
        /*-----------------------------
          Gestion du contenu du champ 
        -----------------------------*/
        
        public List<ModelData> collecterValeursDuChamp()
        {
                return combo.getSelection();
        }
        
        public void peuplerChamp(List<ModelData> selection)
        {
                combo.setSelection(selection);
        }

        public void chargerValeurInitiale(String valeurInitiale, String champ)
        {               
                this.valeurInitiale = valeurInitiale;
                this.champValeurInitiale = champ;

                loader.load(plc, valeurInitiale, true);
        }

        /*-----------------------------
                        Rafraichir
        -----------------------------*/
        public void rafraichir(Object nouvellesDonnees) {
                if (nouvellesDonnees instanceof Information) {
                        Information info = (Information) nouvellesDonnees;
                        if (info.getType().equals("selectionnerValeurCombo")) {
                                if (combo.getStore().findModel(champValeurInitiale, valeurInitiale) == null) {
                                        Debug.log("ERREUR. Modele non trouvé.");
                                        Debug.log("Recherché : ["+champValeurInitiale+"]="+valeurInitiale);
                                        Debug.log("Le magasin contient "+combo.getStore().getCount()+" éléments. Les propriétés des modèles sont :");
                                        for (int i=0; i<combo.getStore().getCount(); i++) {
                                                Debug.log(combo.getStore().getAt(i).getProperties().toString());
                                        }
                                }
                                else combo.setValue(combo.getStore().findModel(champValeurInitiale, valeurInitiale));
                        }
                }
        }
        
        /*----------------
          Méthode privées 
        -----------------*/
        
        

}