Subversion Repositories eFlore/Applications.del

Rev

Rev 137 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

package org.tela_botanica.del.client.pagination;

import java.util.Iterator;
import java.util.Vector;

import org.tela_botanica.del.client.cache.CacheClient;

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;

public abstract class PaginationPresenteur {

        // Singleton
        private static PaginationPresenteur presenteur;

        private final PaginationVue vue;
        private int nbElementsTotal = 0;
        private int nbPage;
        private Vector<Button> liens;

        public PaginationPresenteur(int nbElements) {
                presenteur = this;
                this.nbElementsTotal = nbElements;
                actualiserNbPage();
                vue = new PaginationVue();
                setPas(CacheClient.getInstance().getPasPageRechercheImage());
        }

        private void setBoutonActif() {
                Iterator<Button> it = liens.iterator();
                while (it.hasNext()) {
                        Button boutonCourant = it.next();
                        if (boutonCourant.getText().equals(String.valueOf(CacheClient.getInstance().getNumPageRechercheImage()))) {
                                boutonCourant.setStyleName("actif");
                        } else {
                                boutonCourant.setStyleName("inactif");
                        }
                }
        }

        private void actualiserNbPage() {
                Double a = Math.ceil((double) nbElementsTotal / (double) CacheClient.getInstance().getPasPageRechercheImage());
                this.nbPage = a.intValue();
        }

        public void setPas(int pas) {
                CacheClient.getInstance().setPasPageRechercheImage(pas);
                actualiserNbPage();
                creerLiens();
                changerPage(CacheClient.getInstance().getPasPageRechercheImage() * CacheClient.getInstance().getNumPageRechercheImage(), CacheClient.getInstance().getPasPageRechercheImage() * (CacheClient.getInstance().getNumPageRechercheImage() + 1));
        }

        public void creerLiens() {
                HorizontalPanel zoneLiens = vue.getZoneLiens();
                zoneLiens.clear();
                liens = new Vector<Button>();
                Button precedent = new Button();
                precedent.setText("<");
                precedent.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                pagePrecedente();
                        }
                });

                liens.add(precedent);
                vue.getZoneLiens().add(precedent);

                // TODO : gérer le nombre de pages excessives
                for (int i = 0; i < nbPage; i++) {
                        Button bouton = new Button();
                        bouton.setText(String.valueOf(i));
                        liens.add(bouton);
                        zoneLiens.add(bouton);
                }

                Button suivant = new Button();
                suivant.setText(">");
                suivant.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                pageSuivante();
                        }
                });

                liens.add(suivant);
                vue.getZoneLiens().add(suivant);

                handleEvents();
                setBoutonActif();
        }

        public void initNbElements() {

                ListBox nbElements = vue.getNbElements();
                for (int i = 0; i < 20; i += 5) {
                        int valeur = i;
                        if (i == 0) {
                                valeur = 1;
                        }

                        nbElements.addItem(String.valueOf(valeur));
                }
                nbElements.setSelectedIndex(CacheClient.getInstance().getPasPageRechercheImage() / 5);
                nbElements.addChangeHandler(new ChangeHandler() {

                        @Override
                        public void onChange(ChangeEvent event) {
                                ListBox nbElements = (ListBox) event.getSource();
                                int index = nbElements.getSelectedIndex();
                                setPas(Integer.parseInt(nbElements.getValue(index)));
                        }

                });
        }

        public void go(HasWidgets container) {
                initNbElements();
                creerLiens();
                container.add(vue);

        }

        public void handleEvents() {
                Iterator<Button> iterator = liens.iterator();
                while (iterator.hasNext()) {
                        Button bouton = iterator.next();

                        bouton.addClickHandler(new ClickHandler() {

                                @Override
                                public void onClick(ClickEvent event) {
                                        Button bouton = (Button) event.getSource();
                                        CacheClient.getInstance().setNumPageRechercheImage(Integer.parseInt(bouton.getText()));
                                        int debut = Integer.parseInt(bouton.getText()) * CacheClient.getInstance().getPasPageRechercheImage();
                                        int fin = (debut + CacheClient.getInstance().getPasPageRechercheImage());
                                        setBoutonActif();
                                        changerPage(debut, fin);

                                }
                        });

                }
        }

        public void pageSuivante() {
                if (CacheClient.getInstance().getNumPageRechercheImage() < nbPage - 1) {
                        CacheClient.getInstance().setNumPageRechercheImage(CacheClient.getInstance().getNumPageRechercheImage() + 1);
                        int debut = CacheClient.getInstance().getNumPageRechercheImage() * CacheClient.getInstance().getPasPageRechercheImage();
                        int fin = debut + CacheClient.getInstance().getPasPageRechercheImage();
                        changerPage(debut, fin);
                }
                setBoutonActif();
        }

        public void pagePrecedente() {

                if (CacheClient.getInstance().getNumPageRechercheImage() > 0) {
                        CacheClient.getInstance().setNumPageRechercheImage(CacheClient.getInstance().getNumPageRechercheImage() - 1);
                        int debut = CacheClient.getInstance().getNumPageRechercheImage() * CacheClient.getInstance().getPasPageRechercheImage();
                        int fin = debut + CacheClient.getInstance().getPasPageRechercheImage();
                        changerPage(debut, fin);
                }
                setBoutonActif();
        }

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

        public PaginationPresenteur getInstance() {
                return presenteur;
        }
}