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() {
@Override
public void onChange(ChangeEvent event) {
changerPas(vue.getPasSelectionne());
}
});
vue.getBoutonPrecedent().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
allerALaPagePrecedente();
}
});
vue.getBoutonSuivant().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
allerALapageSuivante();
}
});
vue.getBoutonPremierePage().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
allerALaPremierePage();
}
});
vue.getBoutonDernierePage().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
allerAlaDernierePage();
}
});
BusEvenementiel.getInstance().addHandler(EvenementChangementPage.TYPE, new GestionnaireEvenementChangementPage() {
@Override
public void onChangementPage(EvenementChangementPage event) {
if(event.getGroupePagination() == groupePagination) {
pageCourante = event.getPageAAfficher();
mettreEnValeurPageCourante();
}
}
});
BusEvenementiel.getInstance().addHandler(EvenementChangementPas.TYPE, new GestionnaireEvenementChangementPas() {
@Override
public void onChangementPas(EvenementChangementPas event) {
if(event.getGroupePagination() == groupePagination) {
// modifie le pas et les liens en fonction
pas = 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() {
@Override
public 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;
}
}