/**
*
*/
package org.inbio.m3s.gwt.client.widgets.galleries.ui;
import org.inbio.m3s.gwt.client.widgets.galleries.listener.PaginationListener;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
/**
* @author jgutierrez
*
*/
public class Pagination extends Composite implements ClickListener {
private HorizontalPanel main;
private Label text;
private HorizontalPanel pages;
private PaginationListener paginationListener;
private int totalPages;
private int actualPage;
private static int TOTAL_PAGES_TO_SHOW = 10;
private static String LESS = "anteriores";
private static String MORE = "siguientes";
public Pagination(PaginationListener paginationListener) {
main = new HorizontalPanel();
main.setHorizontalAlignment(HorizontalPanel.ALIGN_LEFT);
main.setSpacing(10);
// text = new Label("Páginas: ");
text = new Label();
pages = new HorizontalPanel();
pages.setSpacing(5);
main.add(text);
main.add(pages);
this.paginationListener = paginationListener;
initWidget(main);
}
/**
* Sets (for the first time) the number of pages
* to be shown on the pagination widget
*
* @param pagesNumber
*/
public void setPages(int pagesNumber) {
if (pagesNumber > 0){
this.totalPages = pagesNumber;
this.actualPage = 1;
updateShownPages();
text.setText("Mostrando "+Pagination.TOTAL_PAGES_TO_SHOW+" paginas de un total de "+this.totalPages+".");
}
}
/**
* Determines the range of pages to be shown. And then invoke the
* generateUIElement with the correct parameters
*
*/
private void updateShownPages(){
//se va a mostrar todas las paginas pues son menos del total a mostrar
if (this.totalPages <= Pagination.TOTAL_PAGES_TO_SHOW) {
generateUIElement(1, this.totalPages, false, false);
//la pagina a mostrar está en el último bloque de imágenes medio de otras...
} else if(this.actualPage + (Pagination.TOTAL_PAGES_TO_SHOW-1) >= this.totalPages){
generateUIElement(this.totalPages - (Pagination.TOTAL_PAGES_TO_SHOW-1), this.totalPages, true, false);
//la imagen seleccionada esta en medio de otras, pero no esta en el bloque final de images.
} else {
generateUIElement(this.actualPage, this.actualPage+ (Pagination.TOTAL_PAGES_TO_SHOW-1), true, true);
}
}
/**
*
* @param firstPageNumber
* the initial page number to show
* @param lastPageNumber
* the last page number to show
* @param LESS
* show the LESS pages message ("anteriores")
* @param MORE
* show the MORE pages message ("siguientes")
*/
private void generateUIElement(int firstPageNumber, int lastPageNumber, boolean less, boolean more) {
pages.removeFromParent();
pages = new HorizontalPanel();
pages.setSpacing(5);
Label item;
if(less){
item = new Label(Pagination.LESS);
item.addClickListener(this);
item.setStyleName("pagination-text");
pages.add(item);
}
for (int i = firstPageNumber; i <= lastPageNumber; i++) {
item = new Label(String.valueOf(i));
item.addClickListener(this);
if (i == this.actualPage)
item.setStyleName("pagination-text-selected");
else
item.setStyleName("pagination-text");
pages.add(item);
}
if(more){
item = new Label(Pagination.MORE);
item.addClickListener(this);
item.setStyleName("pagination-text");
pages.add(item);
}
main.add(pages);
}
/**
*Calcultes the new actual page.
*
*/
private void calculateNewSelectedPage(String text){
if(text.equals(Pagination.LESS)){
if(this.actualPage - Pagination.TOTAL_PAGES_TO_SHOW < 1){
this.actualPage = 1;
} else {
this.actualPage = this.actualPage - Pagination.TOTAL_PAGES_TO_SHOW;
}
} else { // == this.more
if(this.actualPage + Pagination.TOTAL_PAGES_TO_SHOW > this.totalPages){
this.actualPage = this.totalPages;
} else {
this.actualPage = this.actualPage + Pagination.TOTAL_PAGES_TO_SHOW;
}
}
}
/**
* Page label that was clicked!
*/
public void onClick(Widget sender) {
Label item = (Label) sender;
item.setStyleName("pagination-text-selected");
try {
paginationListener.pageSelected(Integer.parseInt(item.getText()));
this.actualPage = Integer.parseInt(item.getText());
updateShownPages();
} catch (NumberFormatException nfe) {
this.calculateNewSelectedPage(item.getText());
updateShownPages();
}
}
}