1,5 → 1,11 |
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; |
21,7 → 27,6 |
public abstract class PaginationPresenteur { |
|
public interface Vue extends IsWidget { |
|
public HasWidgets getZoneLiens(); |
|
public int getNbWidgetsZoneLiens(); |
58,11 → 63,13 |
|
public int getPasSelectionne(); |
|
public void changerSelecteurPas(int index); |
public void afficherPas(int pas); |
|
public void mettreEnValeurPageActive(int pageActive); |
} |
|
private Vue vue; |
private int nbPage; |
private int nbPage = 1; |
private int pageCourante = 1; |
private int nbElementsTotal = 0; |
private int pas = 10; |
75,10 → 82,11 |
* @param pas |
* : le nombre d'éléments à afficher par page |
* */ |
public PaginationPresenteur(Vue vue, int nbElementsTotal, int pas) { |
public PaginationPresenteur(Vue vue, int nbElementsTotal, int pas, int pageCourante) { |
this.nbElementsTotal = nbElementsTotal; |
this.vue = vue; |
changerPas(this.pas); |
this.pas = pas; |
this.pageCourante = pageCourante; |
} |
|
/** |
88,140 → 96,22 |
* : la vue ou éxécuter l'affichage |
*/ |
public void go(HasWidgets container) { |
gererEvenementsBoutonsStatiques(); |
actualiserLiens(); |
container.add(vue.asWidget()); |
gererEvenements(); |
actualiserLiensPagesPagination(); |
actualiserPas(); |
} |
|
/** Met à jour le nombre de page en fonction du pas */ |
public void actualiserNbPage() { |
Double nombrePages = Math.ceil((double) nbElementsTotal / (double) pas); |
this.nbPage = nombrePages.intValue(); |
} |
|
public void setNbPages(int nbPages) { |
this.nbPage = nbPages; |
} |
|
public int getNbPages() { |
return nbPage; |
} |
|
public Vue getVue() { |
return vue; |
} |
|
/** |
* Changer le pas de la pagination |
* |
* @param pas |
* : le nombre d'éléments à afficher par page |
*/ |
public void changerPas(int pas) { |
int ancienPas = this.pas; |
setPas(pas); |
actualiserNbPage(); |
gererDecalagePageCourante(ancienPas, pas); |
changerPage(pas * (pageCourante - 1), pas * pageCourante); |
actualiserLiens(); |
actualiserPasCache(pas); |
} |
|
public void setPas(int pas) { |
this.pas = pas; |
switch (pas) { |
case 5: |
vue.changerSelecteurPas(0); |
break; |
case 10: |
vue.changerSelecteurPas(1); |
break; |
case 15: |
vue.changerSelecteurPas(2); |
break; |
case 20: |
vue.changerSelecteurPas(3); |
break; |
default: |
break; |
} |
} |
|
private void gererDecalagePageCourante(int ancienPas, int nouveauPas) { |
if (ancienPas != nouveauPas) { |
double rapportPas = (double) ancienPas / (double) nouveauPas; |
pageCourante = (int) (Math.ceil((double) pageCourante * (double) rapportPas)); |
} |
} |
|
/** |
* Actualiser les liens pour n'afficher 5 avant et 5 après |
* */ |
public void actualiserLiens() { |
|
HasWidgets zoneLiens = vue.getZoneLiens(); |
zoneLiens.clear(); |
|
int pageDebut = pagesAvant(); |
int pageFin = pagesApres(); |
|
for (int i = pageDebut; i < pageFin; i++) { |
vue.ajouterBoutonZoneLiens(i + ""); |
} |
setBoutonActif(); |
gererEvenementsBoutonsDynamiques(); |
} |
|
private int pagesAvant() { |
int pageDebut = pageCourante - 5; |
if (pageDebut < 1) { |
pageDebut = 1; |
} |
if (pageCourante == 1) { |
vue.masquerBoutonPrecedent(); |
} else { |
vue.afficherBoutonPrecedent(); |
} |
return pageDebut; |
} |
|
private int pagesApres() { |
int pageFin = pageCourante + 5; |
vue.afficherBoutonSuivant(); |
if (pageFin > nbPage) { |
pageFin = nbPage; |
} |
if (pageCourante == nbPage - 1) { |
vue.masquerBoutonSuivant(); |
} else { |
vue.afficherBoutonSuivant(); |
} |
|
return pageFin; |
} |
|
private void setBoutonActif() { |
int nbLiens = vue.getNbWidgetsZoneLiens(); |
for (int i = 0; i < nbLiens; i++) { |
HasText boutonCourant = vue.getWidgetZoneLiensAsText(i); |
if (boutonCourant.getText().equals(String.valueOf(pageCourante))) { |
vue.changerStyleBoutonZoneLiens(i, "actif"); |
} else { |
vue.changerStyleBoutonZoneLiens(i, "inactif"); |
} |
} |
} |
|
/** |
* Gérer les évènements sur les boutons statiques (précédent, suivant et |
* selecteur pas) |
* */ |
public void gererEvenementsBoutonsStatiques() { |
protected void gererEvenements() { |
vue.getSelecteurPas().addChangeHandler(new ChangeHandler() { |
@Override |
public void onChange(ChangeEvent event) { |
changerPas(vue.getPasSelectionne()); |
synchroniser(); |
chargerElements(0, vue.getPasSelectionne()); |
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPas(vue.getPasSelectionne())); |
} |
}); |
|
228,7 → 118,7 |
vue.getBoutonPrecedent().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
pagePrecedente(); |
allerALaPagePrecedente(); |
} |
}); |
|
235,7 → 125,7 |
vue.getBoutonSuivant().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
pageSuivante(); |
allerALapageSuivante(); |
} |
}); |
|
242,7 → 132,7 |
vue.getBoutonPremierePage().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
premierePage(); |
afficherLaPremierePage(); |
} |
}); |
|
249,16 → 139,41 |
vue.getBoutonDernierePage().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
dernierePage(); |
afficherlaDernierePage(); |
} |
}); |
|
BusEvenementiel.getInstance().addHandler(EvenementChangementPage.TYPE, new GestionnaireEvenementChangementPage() { |
|
@Override |
public void onChangementPage(EvenementChangementPage event) { |
pageCourante = event.getPageAAfficher(); |
mettreEnValeurPageCourante(); |
} |
}); |
|
BusEvenementiel.getInstance().addHandler(EvenementChangementPas.TYPE, new GestionnaireEvenementChangementPas() { |
|
@Override |
public void onChangementPas(EvenementChangementPas event) { |
|
// remet la page a zero lors du changement de pas |
pageCourante = 1; |
|
// modifie le pas et les liens en fonction |
pas = event.getPas(); |
actualiserPas(); |
actualiserLiensPagesPagination(); |
|
} |
}); |
} |
|
/** |
* Gérer les évènements sur les boutons dynamiques (qui sont recréés à |
* chaque fois) |
* */ |
public void gererEvenementsBoutonsDynamiques() { |
private void gererEvenementsBoutonsDynamiques() { |
int nbLiens = vue.getNbWidgetsZoneLiens(); |
for (int i = 0; i < nbLiens; i++) { |
HasClickHandlers boutonCourant = vue.getWidgetZoneLiensHasClickHandlers(i); |
266,83 → 181,108 |
@Override |
public void onClick(ClickEvent event) { |
HasText boutonCourant = (HasText) event.getSource(); |
pageCourante = Integer.parseInt(boutonCourant.getText()); |
int debut = (Integer.parseInt(boutonCourant.getText()) - 1) * pas; |
int fin = (debut + pas); |
setBoutonActif(); |
changerPage(debut, fin); |
actualiserLiens(); |
synchroniser(); |
int pageAAfficher = Integer.parseInt(boutonCourant.getText()); |
chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher)); |
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher)); |
} |
}); |
} |
} |
|
public void premierePage() { |
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 allerALaPagePrecedente() { |
if (pageCourante > 1) { |
pageCourante = 1; |
int debut = (pageCourante - 1) * pas; |
int fin = debut + pas; |
changerPage(debut, fin); |
actualiserLiens(); |
synchroniser(); |
int pageAAfficher = pageCourante - 1; |
chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher)); |
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher)); |
} |
|
} |
|
public void dernierePage() { |
public void allerALapageSuivante() { |
if (pageCourante < nbPage - 1) { |
pageCourante = nbPage - 1; |
int debut = (pageCourante - 1) * pas; |
int fin = debut + pas; |
changerPage(debut, fin); |
actualiserLiens(); |
synchroniser(); |
int pageAAfficher = pageCourante + 1; |
chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher)); |
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher)); |
} |
} |
|
public void pageSuivante() { |
if (pageCourante < nbPage - 1) { |
pageCourante++; |
int debut = (pageCourante - 1) * pas; |
int fin = debut + pas; |
changerPage(debut, fin); |
actualiserLiens(); |
synchroniser(); |
public void afficherLaPremierePage() { |
int pageAAfficher = 1; |
chargerElements(0, pas); |
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher)); |
} |
|
public void afficherlaDernierePage() { |
int pageAAfficher = nbPage - 1; |
chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher)); |
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher)); |
} |
|
public void pagePrecedente() { |
if (pageCourante > 1) { |
pageCourante--; |
int debut = (pageCourante - 1) * pas; |
int fin = debut + pas; |
changerPage(debut, fin); |
actualiserLiens(); |
synchroniser(); |
/** 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 int getPageCourante() { |
return this.pageCourante; |
public void setNbPages(int nbPages) { |
this.nbPage = nbPages; |
} |
|
public int getPas() { |
return this.pas; |
public int getNbPages() { |
return nbPage; |
} |
|
public void setPageCourante(int pageCourante) { |
this.pageCourante = pageCourante; |
public Vue getVue() { |
return vue; |
} |
|
public abstract void changerPage(int debut, int fin); |
public abstract void chargerElements(int debut, int fin); |
|
public abstract void actualiserPasCache(int pas); |
|
public void synchroniser() { |
setPas(getPas()); |
setPageCourante(getPageCourante()); |
setNbPages(getNbPages()); |
actualiserLiens(); |
public void setPas(int pas) { |
this.pas = pas; |
} |
|
} |