Rev 445 | Rev 491 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.del.client.composants.pagination;import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;import org.tela_botanica.del.client.navigation.evenement.pagination.EvenementChangementPage;import org.tela_botanica.del.client.navigation.evenement.pagination.EvenementChangementPas;import org.tela_botanica.del.client.navigation.evenement.pagination.GestionnaireEvenementChangementPage;import org.tela_botanica.del.client.navigation.evenement.pagination.GestionnaireEvenementChangementPas;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.event.dom.client.HasChangeHandlers;import com.google.gwt.event.dom.client.HasClickHandlers;import com.google.gwt.user.client.ui.HasText;import com.google.gwt.user.client.ui.HasWidgets;import com.google.gwt.user.client.ui.IsWidget;/*** @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 {public interface Vue extends IsWidget {public HasWidgets getZoneLiens();public int getNbWidgetsZoneLiens();public HasClickHandlers getWidgetZoneLiensHasClickHandlers(int index);public HasText getWidgetZoneLiensAsText(int index);public void changerStyleBoutonZoneLiens(int index, String style);public void ajouterBoutonZoneLiens(String label);public HasClickHandlers getBoutonSuivant();public HasClickHandlers getBoutonPrecedent();public HasClickHandlers getBoutonPremierePage();public HasClickHandlers getBoutonDernierePage();public void masquerBoutonPrecedent();public void afficherBoutonPrecedent();public void masquerBoutonSuivant();public void afficherBoutonSuivant();public boolean boutonPrecedentEstAffiche();public boolean boutonSuivantEstAffiche();public HasChangeHandlers getSelecteurPas();public int getPasSelectionne();public void afficherPas(int pas);public void mettreEnValeurPageActive(int pageActive);}private Vue vue;private int nbPage = 1;private int pageCourante = 1;private int nbElementsTotal = 0;private int pas = 10;private String groupePagination = null;/*** 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(Vue vue, int nbElementsTotal, int pas, int pageCourante) {this.nbElementsTotal = nbElementsTotal;this.vue = vue;this.pas = pas;this.pageCourante = pageCourante;this.nbPage = calculerNbPage();}/*** Methode go du modèle MVP** @param container* : la vue ou éxécuter l'affichage*/public void go(HasWidgets container) {container.add(vue.asWidget());gererEvenements();actualiserLiensPagesPagination();actualiserPas();}/*** Gérer les évènements sur les boutons statiques (précédent, suivant et* selecteur pas)* */protected void gererEvenements() {vue.getSelecteurPas().addChangeHandler(new ChangeHandler() {@Overridepublic void onChange(ChangeEvent event) {changerPas(vue.getPasSelectionne());}});vue.getBoutonPrecedent().addClickHandler(new ClickHandler() {@Overridepublic void onClick(ClickEvent event) {allerALaPagePrecedente();}});vue.getBoutonSuivant().addClickHandler(new ClickHandler() {@Overridepublic void onClick(ClickEvent event) {allerALapageSuivante();}});vue.getBoutonPremierePage().addClickHandler(new ClickHandler() {@Overridepublic void onClick(ClickEvent event) {allerALaPremierePage();}});vue.getBoutonDernierePage().addClickHandler(new ClickHandler() {@Overridepublic void onClick(ClickEvent event) {allerAlaDernierePage();}});BusEvenementiel.getInstance().addHandler(EvenementChangementPage.TYPE, new GestionnaireEvenementChangementPage() {@Overridepublic void onChangementPage(EvenementChangementPage event) {if(event.getGroupePagination() == groupePagination) {pageCourante = event.getPageAAfficher();mettreEnValeurPageCourante();}}});BusEvenementiel.getInstance().addHandler(EvenementChangementPas.TYPE, new GestionnaireEvenementChangementPas() {@Overridepublic void onChangementPas(EvenementChangementPas event) {if(event.getGroupePagination() == groupePagination) {// modifie le pas et les liens en fonctionpas = event.getPas();actualiserPas();actualiserLiensPagesPagination();}}});}private void gererDecalagePageCourante(int ancienPas, int nouveauPas) {if(ancienPas != nouveauPas) {double rapportPas = (double)ancienPas/(double)nouveauPas;pageCourante = (int)(Math.ceil((double)pageCourante*(double)rapportPas));}}/*** Gérer les évènements sur les boutons dynamiques (qui sont recréés à* chaque fois)* */private void gererEvenementsBoutonsDynamiques() {int nbLiens = vue.getNbWidgetsZoneLiens();for (int i = 0; i < nbLiens; i++) {HasClickHandlers boutonCourant = vue.getWidgetZoneLiensHasClickHandlers(i);boutonCourant.addClickHandler(new ClickHandler() {@Overridepublic void onClick(ClickEvent event) {HasText boutonCourant = (HasText) event.getSource();int pageAAfficher = Integer.parseInt(boutonCourant.getText());pageCourante = pageAAfficher;chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));}});}}public void actualiserPas() {actualiserPasCache(pas);vue.afficherPas(pas);}/*** Actualiser les liens pour n'afficher 5 avant et 5 après* */public void actualiserLiensPagesPagination() {this.nbPage = calculerNbPage();HasWidgets zoneLiens = vue.getZoneLiens();zoneLiens.clear();int pageDebut = 1;int pageFin = nbPage;for (int i = pageDebut; i < pageFin; i++) {vue.ajouterBoutonZoneLiens(i + "");}gererEvenementsBoutonsDynamiques();mettreEnValeurPageCourante();}public int getPageCourante() {return this.pageCourante;}public int getPas() {return this.pas;}public void setPageCourante(int pageCourante) {this.pageCourante = pageCourante;}public void changerPas(int nouveauPas) {gererDecalagePageCourante(pas, nouveauPas);pas = nouveauPas;chargerElements((pageCourante - 1)*pas, pageCourante*pas);BusEvenementiel.getInstance().fireEvent(new EvenementChangementPas(nouveauPas, groupePagination));BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageCourante, groupePagination));}public void allerALaPagePrecedente() {if (pageCourante > 1) {int pageAAfficher = pageCourante - 1;pageCourante = pageAAfficher;chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));}}public void allerALapageSuivante() {if (pageCourante < nbPage - 1) {int pageAAfficher = pageCourante + 1;pageCourante = pageAAfficher;chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));}}public void allerALaPremierePage() {int pageAAfficher = 1;pageCourante = pageAAfficher;chargerElements(0, pas);BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));}public void allerAlaDernierePage() {int pageAAfficher = nbPage - 1;pageCourante = pageAAfficher;chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));}/** calcule le nombre de page en fonction du pas */private int calculerNbPage() {Double nombrePages = Math.ceil((double) nbElementsTotal / (double) pas);return nombrePages.intValue();}public void mettreEnValeurPageCourante() {getVue().mettreEnValeurPageActive(getPageCourante());}public void setNbPages(int nbPages) {this.nbPage = nbPages;}public int getNbPages() {return nbPage;}public Vue getVue() {return vue;}public abstract void chargerElements(int debut, int fin);public abstract void actualiserPasCache(int pas);public void setPas(int pas) {this.pas = pas;}public void setGroupePagination(String groupePagination) {this.groupePagination = groupePagination;}public String getGroupePagination() {return groupePagination;}}