/*
* Copyright 2009-2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jdal.vaadin.ui.table;
import java.io.Serializable;
import org.jdal.beans.MessageSourceWrapper;
import org.jdal.dao.Page;
import org.jdal.dao.Paginator;
import org.jdal.dao.PaginatorListener;
import org.jdal.vaadin.ui.AbstractView;
import org.jdal.vaadin.ui.form.BoxFormBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.MessageSource;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.NativeButton;
/**
* Paginator implementation for Vaadin framework
*
* @author Jose Luis Martin - (jlm@joseluismartin.info)
*/
@Configurable
public class VaadinPaginator<T> extends AbstractView<Page<T>> implements Paginator, Serializable {
public static final String PAGINATOR = "paginator";
private static final long serialVersionUID = 1L;
/** Label to show in pagination status. */
private Label status = new Label("- / -");
private Label resultCount = new Label(" ");
/** String array with available page sizes */
private String[] pageSizes = { "10", "20", "30", "40", "50", "100", "ALL" };
/** goto next page button */
private Button next;
/** goto previous page button */
private Button previous;
/** goto first page button */
private Button first;
/** goto last page button */
private Button last;
/** select with page sizes */
private ComboBox pgs = new ComboBox();
/** select with all pages for jump to page number */
private ComboBox goTo = new ComboBox();
/** Listen buttons clicks */
private ButtonClickListener buttonClickListener = new ButtonClickListener();
private MessageSourceWrapper messageSource = new MessageSourceWrapper();
private String nextIconUrl = "images/table/go-next.png";
private String previousIconUrl = "images/table/go-previous.png";
private String lastIconUrl = "images/table/go-last.png";
private String firstIconUrl = "images/table/go-first.png";
private boolean nativeButtons;
/**
* Creates a new paginator with default page size of 10 records
*/
public VaadinPaginator() {
this (new Page<T>(10));
}
/**
* Creates a new paginator with current page
* @param page current page
*/
public VaadinPaginator(Page<T> page) {
setModel(page);
page.firstPage();
}
private Button createButton(String icon) {
Button b = nativeButtons ? new NativeButton() : new Button() ;
b.setIcon(new ThemeResource(icon));
return b;
}
/**
* {@inheritDoc}
*/
@Override
protected Component buildPanel() {
// buttons
if (next == null) {
setNext(createButton(nextIconUrl));
}
if (this.last == null) {
setLast(createButton(lastIconUrl));
}
if (this.previous == null) {
setPrevious(createButton(previousIconUrl));
}
if (this.first == null) {
setFirst(createButton(firstIconUrl));
}
// goto page select
Label goToLabel = new Label(messageSource.getMessage("vaadinPaginator.goto"));
goToLabel.setSizeUndefined();
goToLabel.setStyleName(PAGINATOR);
goTo.addValueChangeListener(new GoToValueChangeListener());
goTo.setImmediate(true);
// records by page select
Label showRecords = new Label(messageSource.getMessage("vaadinPaginator.pageSize"));
showRecords.setSizeUndefined();
// page size combo
for (String size : pageSizes) {
pgs.addItem(size);
}
pgs.setNullSelectionAllowed(false);
pgs.setValue(String.valueOf(getModel().getPageSize()));
pgs.setWidth("6em");
pgs.setImmediate(true);
pgs.addValueChangeListener(new PgsValueChangeListener());
BoxFormBuilder fb = new BoxFormBuilder();
fb.setMargin(false);
fb.setFixedHeight();
fb.row();
fb.add(resultCount);
fb.addHorizontalGlue();
fb.add(first);
fb.add(previous);
fb.add(status);
fb.add(next);
fb.add(last);
fb.add(goToLabel);
fb.add(goTo, 60);
fb.addHorizontalGlue();
fb.add(showRecords);
fb.add(pgs, 60);
return fb.getForm();
}
// Paginator Interface Implementation //
/**
* {@inheritDoc}
*/
public boolean hasNext() {
return getModel().hasNext();
}
/**
* {@inheritDoc}
*/
public boolean hasPrevious() {
return getModel().hasPrevious();
}
/**
* {@inheritDoc}
*/
public boolean hasPage(int indexPage) {
return getModel().hasPage(indexPage);
}
/**
* {@inheritDoc}
*/
public void setPage(int indexPage) {
getModel().setPage(indexPage);
}
/**
* {@inheritDoc}
*/
public int getPage() {
return getModel().getPage();
}
/**
* {@inheritDoc}
*/
public int getTotalPages() {
return getModel().getTotalPages();
}
/**
* {@inheritDoc}
*/
public void nextPage() {
getModel().nextPage();
}
/**
* {@inheritDoc}
*/
public void previousPage() {
getModel().previousPage();
}
/**
* {@inheritDoc}
*/
public void lastPage() {
setPage(getTotalPages());
}
/**
* {@inheritDoc}
*/
public void firstPage() {
setPage(1);
}
/**
* {@inheritDoc}
*/
public int getStartIndex() {
return getModel().getStartIndex();
}
/**
* {@inheritDoc}
*/
public int getPageSize() {
return getModel().getPageSize();
}
/**
* {@inheritDoc}
*/
public void setPageSize(int pageSize) {
getModel().setPageSize(pageSize);
}
/**
* {@inheritDoc}
*/
public void addPaginatorListener(PaginatorListener listener) {
getModel().addPaginatorListener(listener);
}
/**
* {@inheritDoc}
*/
public void removePaginatorListener(PaginatorListener listener) {
getModel().removePaginatorListener(listener);
}
/**
* Parse string with page number
* @param item
* @return
*/
private int parsePageSize(String item) {
int pageSize = 20;
if (item != null) {
try {
pageSize = Integer.parseInt(item.trim());
} catch (NumberFormatException e) {
pageSize = Integer.MAX_VALUE;
}
}
return pageSize;
}
/**
* {@inheritDoc}
*/
public void doRefresh() {
// update status
int currentPage = getTotalPages() == 0 ? 0 : getPage();
status.setValue(currentPage + " / " + getTotalPages());
resultCount.setValue(messageSource.getMessage("vaadinPaginator.records")
+ getModel().getCount());
// fill goto page select
goTo.removeAllItems();
for (int i = 1; i <= getModel().getTotalPages(); i++) {
goTo.addItem(i);
}
if (next != null) {
// Buttons
next.setEnabled(hasNext());
last.setEnabled(hasNext());
previous.setEnabled(hasPrevious());
first.setEnabled(hasPrevious());
}
}
// Getters and Setters
public String[] getPageSizes() {
return pageSizes;
}
public void setPageSizes(String[] pageSizes) {
this.pageSizes = pageSizes;
}
public Button getNext() {
return next;
}
public void setNext(Button next) {
this.next = next;
next.addClickListener(buttonClickListener);
}
public Button getPrevious() {
return previous;
}
public void setPrevious(Button previous) {
this.previous = previous;
previous.addClickListener(buttonClickListener);
}
public Button getFirst() {
return first;
}
public void setFirst(Button first) {
this.first = first;
first.addClickListener(buttonClickListener);
}
public Button getLast() {
return last;
}
public void setLast(Button last) {
this.last = last;
last.addClickListener(buttonClickListener);
}
// Listeners
class PgsValueChangeListener implements ValueChangeListener {
private static final long serialVersionUID = 1L;
public void valueChange(ValueChangeEvent event) {
int pageSize = parsePageSize((String) pgs.getValue());
if (pageSize != getModel().getPageSize()) {
setPageSize(pageSize);
}
}
}
class GoToValueChangeListener implements ValueChangeListener {
private static final long serialVersionUID = 1L;
public void valueChange(ValueChangeEvent event) {
if (goTo.getValue() instanceof Integer) {
if (!goTo.getValue().equals(getModel().getPage()))
setPage((Integer) goTo.getValue());
}
}
}
/**
* Handle clicks on paginator buttons
*
* @author Jose Luis Martin - (jlm@joseluismartin.info)
*/
class ButtonClickListener implements ClickListener {
private static final long serialVersionUID = 1L;
public void buttonClick(ClickEvent event) {
if (event.getComponent() == next) {
nextPage();
}
else if (event.getComponent() == last) {
lastPage();
}
else if (event.getComponent() == previous) {
previousPage();
}
else if (event.getComponent() == first) {
firstPage();
}
}
}
/**
* {@inheritDoc}
*/
public int getCount() {
return getModel().getCount();
}
/**
* {@inheritDoc}
*/
public void setCount(int count) {
getModel().setCount(count);
}
/**
* @return the nextIconUrl
*/
public String getNextIconUrl() {
return nextIconUrl;
}
/**
* @param nextIconUrl the nextIconUrl to set
*/
public void setNextIconUrl(String nextIconUrl) {
this.nextIconUrl = nextIconUrl;
}
/**
* @return the previousIconUrl
*/
public String getPreviousIconUrl() {
return previousIconUrl;
}
/**
* @param previousIconUrl the previousIconUrl to set
*/
public void setPreviousIconUrl(String previousIconUrl) {
this.previousIconUrl = previousIconUrl;
}
/**
* @return the lastIconUrl
*/
public String getLastIconUrl() {
return lastIconUrl;
}
/**
* @param lastIconUrl the lastIconUrl to set
*/
public void setLastIconUrl(String lastIconUrl) {
this.lastIconUrl = lastIconUrl;
}
/**
* @return the firstIconUrl
*/
public String getFirstIconUrl() {
return firstIconUrl;
}
/**
* @param firstIconUrl the firstIconUrl to set
*/
public void setFirstIconUrl(String firstIconUrl) {
this.firstIconUrl = firstIconUrl;
}
public MessageSource getMessageSource() {
return messageSource.getMessageSource();
}
@Autowired
public void setMessageSource(MessageSource messageSource) {
this.messageSource.setMessageSource(messageSource);
}
public boolean isNativeButtons() {
return nativeButtons;
}
public void setNativeButtons(boolean nativeButtons) {
this.nativeButtons = nativeButtons;
}
}