20,391 → 20,400 |
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 |
* 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 ; |
|
private ImageMediateur iMediateur = null; |
|
/** |
* Bouton précédent |
*/ |
private ToolbarButton prevPage = new ToolbarButton() ; |
private ToolbarButton prevPage = new ToolbarButton(); |
/** |
* Bouton suivant |
*/ |
private ToolbarButton suivPage = new ToolbarButton() ; |
private ToolbarButton suivPage = new ToolbarButton(); |
/** |
* Numéro de la page courante (attention, commence à zéro pour des raisons pratiques) |
* Numéro de la page courante (attention, commence à zéro pour des raisons |
* pratiques) |
*/ |
private int pageCourante = 0 ; |
private int pageCourante = 0; |
/** |
* Nombre de page total |
*/ |
private int pageTotale = 1 ; |
private int pageTotale = 1; |
/** |
* Nombre d'élements total |
*/ |
private int nbElement = 0 ; |
private int nbElement = 0; |
/** |
* Nombre d'élément par page |
*/ |
private int taillePage = 0 ; |
private int taillePage = 0; |
/** |
* Texte statique de la toolbar 1 |
*/ |
private ToolbarTextItem page = new ToolbarTextItem("Page ") ; |
private ToolbarTextItem page = new ToolbarTextItem("Page "); |
/** |
* Affichage de la page courante |
*/ |
private TextField champPage = new TextField(""+(pageCourante+1)) ; |
private TextField champPage = new TextField("" + (pageCourante + 1)); |
/** |
* Affichage de "sur pageTotale " |
*/ |
private ToolbarTextItem surTotalPage = new ToolbarTextItem(" sur "+pageTotale) ; |
private ToolbarTextItem surTotalPage = new ToolbarTextItem(" sur " |
+ pageTotale); |
/** |
* Texte statique de la toolbar 2 |
*/ |
private ToolbarTextItem afficherNbElem = new ToolbarTextItem("Afficher ") ; |
private ToolbarTextItem afficherNbElem = new ToolbarTextItem("Afficher "); |
/** |
* Combobox permettant de selectionner le nombre d'élements à afficher par page |
* et donc de changer la variable taillePage |
* Combobox permettant de selectionner le nombre d'élements à afficher par |
* page et donc de changer la variable taillePage |
*/ |
private ComboBox selecteurTaillePage = new ComboBox() ; |
private ComboBox selecteurTaillePage = new ComboBox(); |
/** |
* Texte statique de la toolbar 3 |
*/ |
private ToolbarTextItem nbElemParPage = new ToolbarTextItem(" images par page ") ; |
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) ; |
private ToolbarTextItem intervalleElements = new ToolbarTextItem("Images " |
+ pageCourante * taillePage + " sur " + nbElement); |
|
/** |
* retourne le mediateur associe à la barre |
*/ |
public ImageMediateur getImediateur() |
{ |
return iMediateur ; |
public ImageMediateur getImediateur() { |
return iMediateur; |
} |
|
/*** |
|
/*************************************************************************** |
* constructeur sans argument (privé car ne doit pas être utilisé) |
*/ |
@SuppressWarnings("unused") |
private pageToolBarVue() |
{ |
super() ; |
private pageToolBarVue() { |
super(); |
} |
|
|
/** |
* constructeur avec paramètres |
* @param im le médiateur à associer à la barre |
* |
* @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éments |
addButton(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") ; |
|
public pageToolBarVue(ImageMediateur im) { |
super(); |
|
iMediateur = im; |
|
// on dispose un peu de texte et quelques espaces pour séparer les |
// éléments |
addButton(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 page |
final 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 combobox |
final Template tp = new Template("<div class=\"x-combo-list-item\">" |
+ "{nb_page}" |
+ "<div class=\"x-clear\"></div></div>"); |
final 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 combobox |
final 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 barre |
addFill() ; |
addItem(intervalleElements) ; |
addSpacer() ; |
|
|
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 barre |
addFill(); |
addItem(intervalleElements); |
addSpacer(); |
|
// on ajoute les différents listeners |
ajouterListeners() ; |
ajouterListeners(); |
} |
|
|
/** |
* ajoute les différents listeners nécessaires au bon fonctionnement des éléments de la barre de pagination |
* 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édents |
private void ajouterListeners() { |
// boutons suivants et précédents |
prevPage.addListener(new ButtonListenerAdapter() { |
|
|
public void onClick(Button button, EventObject e) { |
|
|
// si la page courante n'est pas la première |
if(pageCourante > 0) |
{ |
if (pageCourante > 0) { |
// on décrémente la page courante de 1 |
pageCourante -- ; |
pageCourante--; |
// on rafraichit l'affichage |
rafraichirNumeroPage() ; |
rafraichirNumeroPage(); |
// et on notifie le médiateur de l'évenement |
getImediateur().changerNumeroPage(pageCourante) ; |
|
getImediateur().changerNumeroPage(pageCourante); |
|
} |
} |
}) ; |
|
}); |
|
suivPage.addListener(new ButtonListenerAdapter() { |
|
|
|
public void onClick(Button button, EventObject e) { |
|
|
// si la page courante n'est pas la dernière |
if(pageCourante < pageTotale -1) |
{ |
if (pageCourante < pageTotale - 1) { |
// on incrémente la page courante de 1 |
pageCourante ++ ; |
pageCourante++; |
// on rafraichit l'affichage |
rafraichirNumeroPage() ; |
rafraichirNumeroPage(); |
// et on notifie le médiateur de l'évenement |
getImediateur().changerNumeroPage(pageCourante) ; |
|
} |
getImediateur().changerNumeroPage(pageCourante); |
|
} |
} |
}) ; |
|
}); |
|
champPage.addListener(new TextFieldListenerAdapter() { |
|
|
public void onSpecialKey(Field field, EventObject e) { |
|
|
// on teste si la touche entrée a été pressée |
if(e.getKey() == EventObject.ENTER) |
{ |
int nouvellePage = pageCourante ; |
if (e.getKey() == EventObject.ENTER) { |
int nouvellePage = pageCourante; |
// on teste avec parseInt si la valeur entrée est un entier |
try |
{ |
nouvellePage = Integer.parseInt(champPage.getRawValue()) ; |
} |
// si ce n'est pas le cas alors on remet le numéro de page correct |
catch(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édiateur |
changerPageCourante(nouvellePage - 1) ; |
getImediateur().changerNumeroPage(pageCourante) ; |
try { |
nouvellePage = Integer |
.parseInt(champPage.getRawValue()); |
} |
// si ce n'est pas le cas alors on remet le numéro de page |
// correct |
catch (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édiateur |
changerPageCourante(nouvellePage - 1); |
getImediateur().changerNumeroPage(pageCourante); |
|
} else { |
// sinon on reaffiche l'ancien numero de page sans rien |
// changer |
rafraichirNumeroPage(); |
champPage.focus(true); |
} |
else |
{ |
// sinon on reaffiche l'ancien numero de page sans rien changer |
rafraichirNumeroPage() ; |
champPage.focus(true) ; |
} |
} |
} |
|
|
|
public void onFocus(Field field) { |
|
champPage.focus(true) ; |
|
champPage.focus(true); |
} |
|
|
}); |
|
// pour éviter de se compliquer la vie, on filtre tous les charactères non numériques |
|
// pour éviter de se compliquer la vie, on filtre tous les charactères |
// non numériques |
champPage.addKeyPressListener(new EventCallback() { |
|
public void execute(EventObject e) { |
|
|
// si c'est un numerique |
if(Character.isDigit((char)e.getCharCode())) |
{ |
if (Character.isDigit((char) e.getCharCode())) { |
// on laisse passer |
return ; |
return; |
} |
|
|
// si c'est la touche entrée ou backspace (valider ou effacer) |
if(e.getKey() == EventObject.ENTER || e.getKey() == EventObject.BACKSPACE) |
{ |
if (e.getKey() == EventObject.ENTER |
|| e.getKey() == EventObject.BACKSPACE) { |
// on laisse passer |
return ; |
return; |
} else { |
// sinon on remet le numero de page correct et on annule |
// l'évenement |
rafraichirNumeroPage(); |
e.stopEvent(); |
} |
else |
{ |
// sinon on remet le numero de page correct et on annule l'évenement |
rafraichirNumeroPage() ; |
e.stopEvent() ; |
} |
} |
|
}) ; |
|
// listener pour la selection dans la combobox |
|
}); |
|
// listener pour la selection dans la combobox |
selecteurTaillePage.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) ; |
|
|
String nouvelleTaillePageString = comboBox.getStore() |
.getRecordAt(index).getAsString("nb_page"); |
int nouvelleTaillePage = Integer |
.parseInt(nouvelleTaillePageString); |
|
// si la taille de page est différente de l'ancienne |
if(nouvelleTaillePage != taillePage) |
{ |
if (nouvelleTaillePage != taillePage) { |
// on la change |
changerTaillePage(nouvelleTaillePage) ; |
changerTaillePage(nouvelleTaillePage); |
} |
// et on met la valeur à jour dans la combobox |
comboBox.setValue(nouvelleTaillePageString) ; |
comboBox.setValue(nouvelleTaillePageString); |
} |
|
}) ; |
|
}); |
} |
|
|
/** |
* Met à jour les affichage sur les numéros de pages et d'intervalle d'éléments |
* à partir des variables de classes |
* 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éments |
intervalleElements.setText("Images 0 - 0 sur 0") ; |
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éments |
intervalleElements.setText("Images 0 - 0 sur 0"); |
} else { |
champPage.setValue("" + (pageCourante + 1)); |
|
// si la page n'est pas la dernière |
if (pageCourante + 1 != pageTotale) { |
// sauf pour la dernière page qui contient souvent moins |
// d'élements que le nombre d'élements par page |
intervalleElements.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éments |
intervalleElements.setText("Images " + pageCourante |
* taillePage + " - " + nbElement + " sur " + nbElement); |
} |
} |
else |
{ |
champPage.setValue(""+(pageCourante+1)) ; |
|
// si la page n'est pas la dernière |
if(pageCourante + 1 != pageTotale) |
{ |
// sauf pour la dernière page qui contient souvent moins d'élements que le nombre d'élements par page |
intervalleElements.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éments |
intervalleElements.setText("Images "+pageCourante*taillePage+" - "+nbElement+" sur "+nbElement) ; |
} |
} |
} |
|
|
/** |
* Met à jour la page en cours |
* @param nouvellePageCourante la nouvelle page en cours |
* Met à jour la page en cours |
* |
* @param nouvellePageCourante |
* la nouvelle page en cours |
*/ |
public void changerPageCourante(int nouvellePageCourante) |
{ |
pageCourante = nouvellePageCourante ; |
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 int |
if(nouvelleDonnees instanceof int[]) |
{ |
int [] page = (int[])nouvelleDonnees ; |
// le premier élement est le nombre de pages totales |
pageTotale = page[0] ; |
if (nouvelleDonnees instanceof int[]) { |
int[] page = (int[]) nouvelleDonnees; |
// le premier élement est le nombre de pages totales |
pageTotale = page[0]; |
// le second la page en cours |
pageCourante = page[1] ; |
pageCourante = page[1]; |
// le troisième la taille de la page |
taillePage = page[2] ; |
taillePage = page[2]; |
// et le dernier le nombre total d'éléments |
nbElement = 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 |
nbElement = 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 ; |
if (pageCourante >= pageTotale && pageCourante != 0) { |
pageCourante = pageTotale - 1; |
// le cas échéant on en notifie le médiateur |
getImediateur().changerNumeroPage(pageCourante) ; |
getImediateur().changerNumeroPage(pageCourante); |
} |
} |
|
// enfin on rafraichit les informations affichées à partir des nouvelles variables de classes mises à jour |
rafraichirNumeroPage() ; |
|
// enfin on rafraichit les informations affichées à partir des nouvelles |
// variables de classes mises à jour |
rafraichirNumeroPage(); |
} |
|
|
/** |
* Renvoie les différents intervalles de pages possibles |
* @return un tableau de tableau de string qui contient les différentes taille de pages |
* |
* @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 ; |
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()) |
* 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) ; |
|
|
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 |
* 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) ; |
|
selecteurTaillePage.setValue("" + nouvelleTaillePage); |
} |
|
|
} |