Rev 5 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.vues;import org.tela_botanica.client.image.ImageMediateur;import org.tela_botanica.client.interfaces.Rafraichissable;import com.gwtext.client.core.EventCallback;import com.gwtext.client.core.EventObject;import com.gwtext.client.core.Template;import com.gwtext.client.data.Record;import com.gwtext.client.data.SimpleStore;import com.gwtext.client.data.Store;import com.gwtext.client.widgets.Button;import com.gwtext.client.widgets.Toolbar;import com.gwtext.client.widgets.ToolbarButton;import com.gwtext.client.widgets.ToolbarTextItem;import com.gwtext.client.widgets.event.ButtonListenerAdapter;import com.gwtext.client.widgets.form.ComboBox;import com.gwtext.client.widgets.form.Field;import com.gwtext.client.widgets.form.TextField;import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;import com.gwtext.client.widgets.form.event.TextFieldListenerAdapter;/*** Barre de pagination asynchrone avec filtrage des touches et accès directs et séquentiels à une page* @author aurelien**/public class pageToolBarVue extends Toolbar implements Rafraichissable {/*** Instance du médiateur à qui on notifie les évnènements*/private ImageMediateur iMediateur = null ;/*** Bouton précédent*/private ToolbarButton prevPage = new ToolbarButton() ;/*** Bouton suivant*/private ToolbarButton suivPage = new ToolbarButton() ;/*** Numéro de la page courante (attention, commence à zéro pour des raisons pratiques)*/private int pageCourante = 0 ;/*** Nombre de page total*/private int pageTotale = 1 ;/*** Nombre d'élements total*/private int nbElement = 0 ;/*** Nombre d'élément par page*/private int taillePage = 0 ;/*** Texte statique de la toolbar 1*/private ToolbarTextItem page = new ToolbarTextItem("Page ") ;/*** Affichage de la page courante*/private TextField champPage = new TextField(""+(pageCourante+1)) ;/*** Affichage de "sur pageTotale "*/private ToolbarTextItem surTotalPage = new ToolbarTextItem(" sur "+pageTotale) ;/*** Texte statique de la toolbar 2*/private ToolbarTextItem afficherNbElem = new ToolbarTextItem("Afficher ") ;/*** Combobox permettant de selectionner le nombre d'élements à afficher par page* et donc de changer la variable taillePage*/private ComboBox selecteurTaillePage = new ComboBox() ;/*** Texte statique de la toolbar 3*/private ToolbarTextItem nbElemParPage = new ToolbarTextItem(" images par page ") ;/*** Affiche l'intervalle des éléments contenus dans la page*/private ToolbarTextItem intervalleElements = new ToolbarTextItem("Images "+pageCourante*taillePage+" sur "+nbElement) ;/*** retourne le mediateur associe à la barre*/public ImageMediateur getImediateur(){return iMediateur ;}/**** constructeur sans argument (privé car ne doit pas être utilisé)*/@SuppressWarnings("unused")private pageToolBarVue(){super() ;}/*** constructeur avec paramètres* @param im le médiateur à associer à la barre*/public pageToolBarVue(ImageMediateur im){super() ;iMediateur = im ;// on dispose un peu de texte et quelques espaces pour séparer les élémentsaddButton(prevPage) ;addSpacer() ;addItem(page) ;addField(champPage) ;addItem(surTotalPage) ;addSpacer() ;addButton(suivPage) ;champPage.setWidth(30) ;addSpacer() ;addItem(afficherNbElem) ;prevPage.setIcon("page_prev.png") ;suivPage.setIcon("page_suiv.png") ;// le store contient les valeur possibles pour les tailles de pagefinal Store store = new SimpleStore(new String[]{"nb_page"}, getNbPages());store.load();// le template definit ce que l'on affiche pour chaque element du store dans la comboboxfinal Template tp = new Template("<div class=\"x-combo-list-item\">"+ "{nb_page}"+ "<div class=\"x-clear\"></div></div>");tp.compile();selecteurTaillePage.setTpl(tp) ;selecteurTaillePage.setStore(store) ;selecteurTaillePage.setWidth(40) ;selecteurTaillePage.setEditable(false) ;addField(selecteurTaillePage) ;selecteurTaillePage.setValue("50") ;selecteurTaillePage.setWidth(50) ;addItem(nbElemParPage) ;// on remplit l'espace pour que l'intervalle d'élement se place à droite de la barreaddFill() ;addItem(intervalleElements) ;addSpacer() ;// on ajoute les différents listenersajouterListeners() ;}/*** ajoute les différents listeners nécessaires au bon fonctionnement des éléments de la barre de pagination*/private void ajouterListeners(){// boutons suivants et précédentsprevPage.addListener(new ButtonListenerAdapter() {public void onClick(Button button, EventObject e) {// si la page courante n'est pas la premièreif(pageCourante > 0){// on décrémente la page courante de 1pageCourante -- ;// on rafraichit l'affichagerafraichirNumeroPage() ;// et on notifie le médiateur de l'évenementgetImediateur().changerNumeroPage(pageCourante) ;}}}) ;suivPage.addListener(new ButtonListenerAdapter() {public void onClick(Button button, EventObject e) {// si la page courante n'est pas la dernièreif(pageCourante < pageTotale -1){// on incrémente la page courante de 1pageCourante ++ ;// on rafraichit l'affichagerafraichirNumeroPage() ;// et on notifie le médiateur de l'évenementgetImediateur().changerNumeroPage(pageCourante) ;}}}) ;champPage.addListener(new TextFieldListenerAdapter() {public void onSpecialKey(Field field, EventObject e) {// on teste si la touche entrée a été presséeif(e.getKey() == EventObject.ENTER){int nouvellePage = pageCourante ;// on teste avec parseInt si la valeur entrée est un entiertry{nouvellePage = Integer.parseInt(champPage.getRawValue()) ;}// si ce n'est pas le cas alors on remet le numéro de page correctcatch(NumberFormatException nfe){rafraichirNumeroPage() ;champPage.focus(true) ;return ;}// si la conversion reussit on verifie s'il est nécessaire de changer de page// et si la nouvelle est comprise dans l'intervalle des pages existantes (0..pageTotale)if(nouvellePage != pageCourante + 1 && nouvellePage > 0 && nouvellePage <= pageTotale){// le cas échéant, on charge la nouvelle page et on notifie le médiateurchangerPageCourante(nouvellePage - 1) ;getImediateur().changerNumeroPage(pageCourante) ;}else{// sinon on reaffiche l'ancien numero de page sans rien changerrafraichirNumeroPage() ;champPage.focus(true) ;}}}public void onFocus(Field field) {champPage.focus(true) ;}});// pour éviter de se compliquer la vie, on filtre tous les charactères non numériqueschampPage.addKeyPressListener(new EventCallback() {public void execute(EventObject e) {// si c'est un numeriqueif(Character.isDigit((char)e.getCharCode())){// on laisse passerreturn ;}// si c'est la touche entrée ou backspace (valider ou effacer)if(e.getKey() == EventObject.ENTER || e.getKey() == EventObject.BACKSPACE){// on laisse passerreturn ;}else{// sinon on remet le numero de page correct et on annule l'évenementrafraichirNumeroPage() ;e.stopEvent() ;}}}) ;// listener pour la selection dans la comboboxselecteurTaillePage.addListener(new ComboBoxListenerAdapter() {public void onSelect(ComboBox comboBox, Record record, int index) {String nouvelleTaillePageString = comboBox.getStore().getRecordAt(index).getAsString("nb_page") ;int nouvelleTaillePage = Integer.parseInt(nouvelleTaillePageString) ;// si la taille de page est différente de l'ancienneif(nouvelleTaillePage != taillePage){// on la changechangerTaillePage(nouvelleTaillePage) ;}// et on met la valeur à jour dans la comboboxcomboBox.setValue(nouvelleTaillePageString) ;}}) ;}/*** Met à jour les affichage sur les numéros de pages et d'intervalle d'éléments* à partir des variables de classes*/public void rafraichirNumeroPage(){surTotalPage.setText(" sur "+pageTotale) ;if(nbElement == 0){champPage.setValue(""+(0)) ;// on met simplement à jour l'intervalle qui contient toujours le même nombre d'élémentsintervalleElements.setText("Images 0 - 0 sur 0") ;}else{champPage.setValue(""+(pageCourante+1)) ;// si la page n'est pas la dernièreif(pageCourante + 1 != pageTotale){// sauf pour la dernière page qui contient souvent moins d'élements que le nombre d'élements par pageintervalleElements.setText("Images "+pageCourante*taillePage+" - "+(pageCourante+1)*taillePage+" sur "+nbElement) ;}else{// on met simplement à jour l'intervalle qui contient toujours le même nombre d'élémentsintervalleElements.setText("Images "+pageCourante*taillePage+" - "+nbElement+" sur "+nbElement) ;}}}/*** Met à jour la page en cours* @param nouvellePageCourante la nouvelle page en cours*/public void changerPageCourante(int nouvellePageCourante){pageCourante = nouvellePageCourante ;}/*** Methode héritée de l'interface rafraichissable*/public void rafraichir(Object nouvelleDonnees,boolean repandreRaffraichissement) {// si on reçoit un tableau de intif(nouvelleDonnees instanceof int[]){int [] page = (int[])nouvelleDonnees ;// le premier élement est le nombre de pages totalespageTotale = page[0] ;// le second la page en courspageCourante = page[1] ;// le troisième la taille de la pagetaillePage = page[2] ;// et le dernier le nombre total d'élémentsnbElement = page[3] ;// si la page courante dépasse la page totale (cas normalement improbable car géré en amont)// on met le numéro de page à la page courante -1 (car la page courante est comptée à partir// de zéro)if(pageCourante >= pageTotale && pageCourante != 0){pageCourante = pageTotale - 1 ;// le cas échéant on en notifie le médiateurgetImediateur().changerNumeroPage(pageCourante) ;}}// enfin on rafraichit les informations affichées à partir des nouvelles variables de classes mises à jourrafraichirNumeroPage() ;}/*** Renvoie les différents intervalles de pages possibles* @return un tableau de tableau de string qui contient les différentes taille de pages*/public String[][] getNbPages(){String[][] pages = {{"200"},{"100"},{"50"},{"20"},{"10"}} ;return pages ;}/*** Envoie au médiateur une demande pour modifier la taille de la page* (qui va à son tour faire les modifications nécessaires)* @param nouvelleTaillePage la nouvelle taille de page (élement appartenant au tableau renvoyé par getNbPages())*/public void changerTaillePage(int nouvelleTaillePage) {getImediateur().changerTaillePage(nouvelleTaillePage) ;}/*** Selectionne la valeur correspond à celle passée en paramètre dans la combobox (si elle existe)* @param nouvelleTaillePage la nouvelle taille de page*/public void selectionnerTaillePage(int nouvelleTaillePage) {selecteurTaillePage.setValue(""+nouvelleTaillePage) ;}}