Rev 382 | Rev 390 | 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.Window;
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;
vue = new PaginationVue();
changerPas(this.pas);
}
/**
* Methode go du modèle MVP
*
* @param container
* : la vue ou éxécuter l'affichage
*/
public void go(HasWidgets container) {
gererEvenementsBoutonsStatiques();
actualiserLiens();
container.add(vue);
}
/** 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) {
this.pas = pas;
actualiserNbPage();
actualiserLiens();
changerPage(pas * (pageCourante -1), pas * pageCourante);
switch (pas) {
case 5:
vue.getSelecteurPas().setSelectedIndex(0);
break;
case 10:
vue.getSelecteurPas().setSelectedIndex(1);
break;
case 15:
vue.getSelecteurPas().setSelectedIndex(2);
break;
case 20:
vue.getSelecteurPas().setSelectedIndex(3);
break;
default:
break;
}
actualiserPasCache(pas);
}
/**
* 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(i+"");
zoneLiens.add(bouton);
}
setBoutonActif();
gererEvenementsBoutonsDynamiques();
}
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 statiques (précédent, suivant et selecteur pas)
* */
public void gererEvenementsBoutonsStatiques() {
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)));
synchroniser();
}
});
vue.boutonPrecedent.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
pagePrecedente();
}
});
vue.boutonSuivant.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
pageSuivante();
}
});
}
/**
* Gérer les évènements sur les boutons dynamiques (qui sont recréés à chaque fois)
* */
public void gererEvenementsBoutonsDynamiques() {
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()) - 1) * pas;
int fin = (debut + pas);
setBoutonActif();
changerPage(debut, fin);
actualiserLiens();
synchroniser();
}
});
}
}
/**
* Retourne la limite supèrieur du nombre de pages à afficher
* */
public void pageSuivante() {
if (pageCourante < nbPage - 1) {
pageCourante++;
int debut = (pageCourante -1) * pas;
int fin = debut + pas;
changerPage(debut, fin);
actualiserLiens();
synchroniser();
}
}
/**
* Retourne la limite infèrieure du nombre de pages à afficher
* */
public void pagePrecedente() {
if (pageCourante > 1) {
pageCourante--;
int debut = (pageCourante -1) * pas;
int fin = debut + pas;
changerPage(debut, fin);
actualiserLiens();
synchroniser();
}
}
protected int getPageCourante() {
return this.pageCourante;
}
protected int getPas() {
return this.pas;
}
public void setPageCourante(int pageCourante) {
this.pageCourante = pageCourante;
}
public abstract void changerPage(int debut, int fin);
public abstract void actualiserPasCache(int pas);
public abstract void synchroniser();
}