package org.vaadin.viritin.v7; import com.vaadin.annotations.Theme; import com.vaadin.server.FontAwesome; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Component; import com.vaadin.ui.Label; import com.vaadin.ui.themes.ValoTheme; import org.vaadin.addonhelpers.AbstractTest; import org.vaadin.viritin.button.MButton; import org.vaadin.viritin.v7.fields.MTable; import org.vaadin.viritin.layouts.MHorizontalLayout; import org.vaadin.viritin.layouts.MVerticalLayout; import org.vaadin.viritin.testdomain.Person; import org.vaadin.viritin.testdomain.Service; /** * * @author Matti Tahvonen */ @Theme("valo") public class MTableWithTraditionalPaging extends AbstractTest { private static final long serialVersionUID = -3645542297869930694L; /** * A quickly drafted version of pagination bar. */ public static class PaginationBar extends MHorizontalLayout { private static final long serialVersionUID = 7799263034212965499L; private final ClickListener handler = new Button.ClickListener() { private static final long serialVersionUID = 5019806363620874205L; @Override public void buttonClick(Button.ClickEvent event) { if (event.getButton() == first) { currentPage = 0; } else if (event.getButton() == last) { currentPage = pages - 1; } else if (event.getButton() == next) { currentPage++; } else if (event.getButton() == previous) { currentPage--; } updateState(); listener.pageRequested(currentPage); } }; private void updateState() { final boolean hasPrev = currentPage > 0; first.setEnabled(hasPrev); previous.setEnabled(hasPrev); final boolean hasNext = currentPage < pages - 1; last.setEnabled(hasNext); next.setEnabled(hasNext); status.setValue((currentPage + 1) + "/" + pages); } private void initButtons() { first = new MButton(FontAwesome.FAST_BACKWARD, handler).withStyleName(ValoTheme.BUTTON_BORDERLESS); last = new MButton(FontAwesome.FAST_FORWARD, handler).withStyleName(ValoTheme.BUTTON_BORDERLESS); next = new MButton(FontAwesome.FORWARD, handler).withStyleName(ValoTheme.BUTTON_BORDERLESS); previous = new MButton(FontAwesome.BACKWARD, handler).withStyleName(ValoTheme.BUTTON_BORDERLESS); } public interface PagingListener { void pageRequested(int page); } private PagingListener listener; final private long size; private final int pageSize; private int currentPage; final private int pages; public long getSize() { return size; } public PagingListener getListener() { return listener; } public void setListener(PagingListener listener) { this.listener = listener; } private Button first, last, next, previous; private final Label status = new Label(); public PaginationBar(PagingListener listener, int pageSize, long size) { this.listener = listener; this.size = size; this.pageSize = pageSize; pages = (int) (size / pageSize); initButtons(); updateState(); addComponents(first, previous, status, next, last); alignAll(Alignment.MIDDLE_CENTER); withFullWidth(); } } @Override public Component getTestComponent() { final int pageSize = 10; final long results = Service.count(); final MTable<Person> table = new MTable<>(Person.class); table.setPageLength(10); // set the initial content table.setBeans(Service.findAll(0, pageSize)); // create a paginationBar PaginationBar paginationBar = new PaginationBar(new PaginationBar.PagingListener() { @Override public void pageRequested(int page) { // reset the proper content to table // when page is changed by user int firstResult = page * pageSize; table.setBeans(Service.findAll(firstResult, pageSize)); } }, pageSize, results); return new MVerticalLayout(table,paginationBar).withWidth(""); } }