Subversion Repositories eFlore/Applications.del

Rev

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

package org.tela_botanica.del.client.composants.pagination;

import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ListBox;

/**
 * @author gregoire
 * Pagination GENERIQUE qui permet d'afficher un nombre donné d'éléments (pas)
 * La méthode changerPage est abstraite et doit être définie lors de l'instanciation 
 * de la classe pagination pour permettre d'afficher la suite des éléments
 * La méthode actualiserPasCache est abstraite car le pas est différent en 
 * fonction de la page où l'on se trouve
 * */
public abstract class PaginationPresenteur {

        private final PaginationVue vue;
        private int nbPage;
        private int pageCourante = 1;
        private int nbElementsTotal = 0;
        private int pas = 10;
        
        /**
         * Constructeur de l'application
         * @param nbElementsTotal : le nombre total des éléments à paginer
         * @param pas : le nombre d'éléments à afficher par page
         * */
        public PaginationPresenteur(int nbElementsTotal, int pas) {
                this.nbElementsTotal = nbElementsTotal;
                this.pas=pas;
                vue = new PaginationVue();
        }
        
        /** Met à jour le nombre de page en fonction du pas */
        private void actualiserNbPage() {
                Double nombrePages = Math.ceil((double) nbElementsTotal / (double) pas);
                this.nbPage = nombrePages.intValue();
        }

        /** Changer le pas de la pagination 
         *  @param pas : le nombre d'éléments à afficher par page */
        public void changerPas(int pas) {
                actualiserNbPage();
                changerPage(pas * pageCourante, pas * (pageCourante + 1));
                actualiserPasCache(pas);
        }
        
        /** Methode Go du modèle MVP 
         * @param container : la vue ou éxécuter l'affichage */
        public void go(HasWidgets container) {
                actualiserLiens();
                container.add(vue);
        }
        
        /** Actualiser les liens pour n'afficher 5 avant et 5 après
         * */
        public void actualiserLiens() {
                HorizontalPanel zoneLiens = vue.zoneLiens;
                zoneLiens.clear();
                
                
                int pageDebut = pagesAvant();
                int pageFin = pagesApres();
                
                for (int i = pageDebut; i < pageFin; i++) {
                        Button bouton = new Button(String.valueOf(i));
                        zoneLiens.add(bouton);
                }
                setBoutonActif();
                gererEvenements();
        }
        
        private int pagesAvant() {
                int pageDebut = pageCourante - 5;
                vue.afficherBoutonDebut();
                if (pageDebut < 1) {
                        pageDebut = 1;
                        //Masquer le bouton de début
                        vue.masquerBoutonDebut();
                }
                return pageDebut;
        }
        
        private int pagesApres() {
                int pageFin = pageCourante + 5;
                vue.afficherBoutonSuivant();
                if (pageFin > nbPage) {
                        pageFin = nbPage;
                        vue.masquerBoutonSuivant();
                }
                return pageFin;
        }
        
        private void setBoutonActif() {
                int nbLiens = vue.zoneLiens.getWidgetCount();
                for (int i=0; i < nbLiens; i++) {
                        Button boutonCourant = (Button) vue.zoneLiens.getWidget(i);
                        if (boutonCourant.getText().equals(String.valueOf(pageCourante))) {
                                boutonCourant.setStyleName("actif");
                        } else {
                                boutonCourant.setStyleName("inactif");
                        }
                }
        }

        /** Gérer les évènements sur les boutons
         * */
        public void gererEvenements() {
                vue.selecteurPas.addChangeHandler(new ChangeHandler() {
                        @Override
                        public void onChange(ChangeEvent event) {
                                ListBox nbElements = (ListBox) event.getSource();
                                int index = nbElements.getSelectedIndex();
                                changerPas(Integer.parseInt(nbElements.getValue(index)));
                        }

                });
                
                vue.boutonPrecedent.addClickHandler(new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                                pagePrecedente();
                        }
                });

                vue.boutonSuivant.addClickHandler(new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                                pageSuivante();
                        }
                });
                
                
                int nbLiens = vue.zoneLiens.getWidgetCount();
                for (int i=0; i < nbLiens; i++) {
                        Button boutonCourant = (Button) vue.zoneLiens.getWidget(i);

                        boutonCourant.addClickHandler(new ClickHandler() {

                                @Override
                                public void onClick(ClickEvent event) {
                                        Button boutonCourant = (Button) event.getSource();
                                        pageCourante = Integer.parseInt(boutonCourant.getText());
                                        int debut = Integer.parseInt(boutonCourant.getText()) * pas;
                                        int fin = (debut + pas);
                                        setBoutonActif();
                                        changerPage(debut, fin);
                                        actualiserLiens();
                                }
                        });
                }
        }

        /** Retourne la limite supèrieur du nombre de pages à afficher
         * */
        public void pageSuivante() {
                if (pageCourante < nbPage - 1) {
                        pageCourante++;
                        int debut = pageCourante * pas;
                        int fin = debut + pas;
                        changerPage(debut, fin);
                        actualiserLiens();
                }
        }
        
        /** Retourne la limite infèrieure du nombre de pages à afficher
         * */
        public void pagePrecedente() {
                if (pageCourante > 1) {
                        pageCourante--;
                        int debut = pageCourante * pas;
                        int fin = debut + pas;
                        changerPage(debut, fin);
                        actualiserLiens();
                }
        }
        
        protected int getPageCourante() {
                return this.pageCourante;
        }

        public abstract void changerPage(int debut, int fin);
        public abstract void actualiserPasCache(int pas);

}