package org.aperteworkflow.util.vaadin.ui.table; import com.vaadin.data.Container; import com.vaadin.data.validator.IntegerValidator; import com.vaadin.ui.*; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.themes.Reindeer; import pl.net.bluesoft.rnd.util.i18n.I18NSource; import java.util.ArrayList; import java.util.List; public class LocalizedPagedTable extends Table { public interface PageChangeListener { public void pageChanged(PagedTableChangeEvent event); } public class PagedTableChangeEvent { final LocalizedPagedTable table; public PagedTableChangeEvent(LocalizedPagedTable table) { this.table = table; } public LocalizedPagedTable getTable() { return table; } public int getCurrentPage() { return table.getCurrentPage(); } public int getTotalAmountOfPages() { return table.getTotalAmountOfPages(); } } private List<PageChangeListener> listeners = null; private PagedTableContainer container; public LocalizedPagedTable() { this(null); } public LocalizedPagedTable(String caption) { super(caption); setPageLength(10); addStyleName("pagedtable"); } public HorizontalLayout createPageSizeControls(I18NSource messageSource) { return createPageSizeControls(messageSource.getMessage("pagedtable.itemsperpage")); } public HorizontalLayout createPageSizeControls(String itemsPerPageCaption) { Label itemsPerPageLabel = new Label(itemsPerPageCaption + ":"); itemsPerPageLabel.addStyleName("pagedtable-label pagedtable-itemsperpagecaption"); final ComboBox itemsPerPageSelect = new ComboBox(); itemsPerPageSelect.addStyleName("pagedtable-combobox pagedtable-itemsperpagecombobox"); itemsPerPageSelect.addItem("5"); itemsPerPageSelect.addItem("10"); itemsPerPageSelect.addItem("25"); itemsPerPageSelect.addItem("50"); itemsPerPageSelect.addItem("100"); itemsPerPageSelect.setImmediate(true); itemsPerPageSelect.setNullSelectionAllowed(false); itemsPerPageSelect.setWidth("50px"); itemsPerPageSelect.addListener(new ValueChangeListener() { public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) { setPageLength(Integer.valueOf(String.valueOf(event.getProperty().getValue()))); } }); itemsPerPageSelect.select(String.valueOf(getPageLength())); HorizontalLayout pageSize = new HorizontalLayout(); pageSize.addComponent(itemsPerPageLabel); pageSize.addComponent(itemsPerPageSelect); pageSize.setComponentAlignment(itemsPerPageLabel, Alignment.MIDDLE_LEFT); pageSize.setComponentAlignment(itemsPerPageSelect, Alignment.MIDDLE_LEFT); pageSize.setSpacing(true); addListener(new PageChangeListener() { public void pageChanged(PagedTableChangeEvent event) { itemsPerPageSelect.setValue(String.valueOf(getPageLength())); } }); return pageSize; } public HorizontalLayout createPageManagementControls(I18NSource messageSource) { return createPageManagementControls(messageSource.getMessage("pagedtable.page")); } public HorizontalLayout createPageManagementControls(String pageCaption) { Label pageLabel = new Label(pageCaption + ": ", Label.CONTENT_XHTML); final TextField currentPageTextField = new TextField(); currentPageTextField.setValue(String.valueOf(getCurrentPage())); currentPageTextField.addValidator(new IntegerValidator(null)); Label separatorLabel = new Label(" / ", Label.CONTENT_XHTML); final Label totalPagesLabel = new Label(String.valueOf(getTotalAmountOfPages()), Label.CONTENT_XHTML); currentPageTextField.setStyleName(Reindeer.TEXTFIELD_SMALL); currentPageTextField.setImmediate(true); currentPageTextField.addListener(new ValueChangeListener() { public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) { if (currentPageTextField.isValid() && currentPageTextField.getValue() != null) { int page = Integer.valueOf(String.valueOf(currentPageTextField.getValue())); setCurrentPage(page); } } }); pageLabel.setWidth(null); currentPageTextField.setWidth("20px"); separatorLabel.setWidth(null); totalPagesLabel.setWidth(null); HorizontalLayout pageManagement = new HorizontalLayout(); final Button first = new Button("<<", new ClickListener() { public void buttonClick(ClickEvent event) { setCurrentPage(0); } }); final Button previous = new Button("<", new ClickListener() { public void buttonClick(ClickEvent event) { previousPage(); } }); final Button next = new Button(">", new ClickListener() { public void buttonClick(ClickEvent event) { nextPage(); } }); final Button last = new Button(">>", new ClickListener() { public void buttonClick(ClickEvent event) { setCurrentPage(getTotalAmountOfPages()); } }); first.setStyleName(Reindeer.BUTTON_LINK); previous.setStyleName(Reindeer.BUTTON_LINK); next.setStyleName(Reindeer.BUTTON_LINK); last.setStyleName(Reindeer.BUTTON_LINK); pageLabel.addStyleName("pagedtable-label pagedtable-pagecaption"); currentPageTextField.addStyleName("pagedtable-label pagedtable-pagefield"); separatorLabel.addStyleName("pagedtable-label pagedtable-separator"); totalPagesLabel.addStyleName("pagedtable-label pagedtable-total"); first.addStyleName("pagedtable-button pagedtable-first"); previous.addStyleName("pagedtable-button pagedtable-previous"); next.addStyleName("pagedtable-button pagedtable-next"); last.addStyleName("pagedtable-button pagedtable-last"); pageManagement.addComponent(first); pageManagement.addComponent(previous); pageManagement.addComponent(pageLabel); pageManagement.addComponent(currentPageTextField); pageManagement.addComponent(separatorLabel); pageManagement.addComponent(totalPagesLabel); pageManagement.addComponent(next); pageManagement.addComponent(last); pageManagement.setComponentAlignment(first, Alignment.MIDDLE_LEFT); pageManagement.setComponentAlignment(previous, Alignment.MIDDLE_LEFT); pageManagement.setComponentAlignment(pageLabel, Alignment.MIDDLE_LEFT); pageManagement.setComponentAlignment(currentPageTextField, Alignment.MIDDLE_LEFT); pageManagement.setComponentAlignment(separatorLabel, Alignment.MIDDLE_LEFT); pageManagement.setComponentAlignment(totalPagesLabel, Alignment.MIDDLE_LEFT); pageManagement.setComponentAlignment(next, Alignment.MIDDLE_LEFT); pageManagement.setComponentAlignment(last, Alignment.MIDDLE_LEFT); pageManagement.setWidth(null); pageManagement.setSpacing(true); addListener(new PageChangeListener() { @Override public void pageChanged(PagedTableChangeEvent event) { first.setEnabled(container.getStartIndex() > 0); previous.setEnabled(container.getStartIndex() > 0); next.setEnabled(container.getStartIndex() < container .getRealSize() - getPageLength()); last.setEnabled(container.getStartIndex() < container .getRealSize() - getPageLength()); currentPageTextField.setValue(String.valueOf(getCurrentPage())); totalPagesLabel.setValue(getTotalAmountOfPages()); } }); return pageManagement; } public HorizontalLayout createControls(I18NSource messageSource) { return createControls(messageSource.getMessage("pagedtable.itemsperpage"), messageSource.getMessage("pagedtable.page")); } public HorizontalLayout createControls(String itemsPerPageCaption, String pageCaption) { HorizontalLayout pageSize = createPageSizeControls(itemsPerPageCaption); HorizontalLayout pageManagement = createPageManagementControls(pageCaption); HorizontalLayout controlBar = new HorizontalLayout(); controlBar.addComponent(pageSize); controlBar.addComponent(pageManagement); controlBar.setComponentAlignment(pageManagement, Alignment.MIDDLE_CENTER); controlBar.setWidth("100%"); controlBar.setExpandRatio(pageSize, 1); return controlBar; } @Override public Container.Indexed getContainerDataSource() { return container; } @Override public void setContainerDataSource(Container newDataSource) { if (!(newDataSource instanceof Container.Indexed)) { throw new IllegalArgumentException("PagedTable can only use containers that implement Container.Indexed"); } PagedTableContainer pagedTableContainer = new PagedTableContainer((Container.Indexed) newDataSource); pagedTableContainer.setPageLength(getPageLength()); if (newDataSource instanceof Container.ItemSetChangeNotifier) { Container.ItemSetChangeNotifier notifier = (ItemSetChangeNotifier) newDataSource; notifier.addListener(this); } super.setContainerDataSource(pagedTableContainer); this.container = pagedTableContainer; firePagedChangedEvent(); } private void setPageFirstIndex(int firstIndex) { if (container != null) { if (firstIndex <= 0) { firstIndex = 0; } if (firstIndex > container.getRealSize() - 1) { int size = container.getRealSize() - 1; int pages = 0; if (getPageLength() != 0) { pages = (int) Math.floor((double)size / getPageLength()); } firstIndex = pages * getPageLength(); } container.setStartIndex(firstIndex); containerItemSetChange(new Container.ItemSetChangeEvent() { public Container getContainer() { return container; } }); if (alwaysRecalculateColumnWidths) { for (Object columnId : container.getContainerPropertyIds()) { setColumnWidth(columnId, -1); } } firePagedChangedEvent(); } } public void firePagedChangedEvent() { if (listeners != null) { PagedTableChangeEvent event = new PagedTableChangeEvent(this); for (PageChangeListener listener : listeners) { listener.pageChanged(event); } } } @Override public void setPageLength(int pageLength) { if (pageLength >= 0 && getPageLength() != pageLength) { container.setPageLength(pageLength); super.setPageLength(pageLength); firePagedChangedEvent(); } } public void nextPage() { setPageFirstIndex(container.getStartIndex() + getPageLength()); } public void previousPage() { setPageFirstIndex(container.getStartIndex() - getPageLength()); } public int getCurrentPage() { double pageLength = getPageLength(); int page = (int) Math.floor((double) container.getStartIndex() / pageLength) + 1; if (page < 1) { page = 1; } return page; } public void setCurrentPage(int page) { int newIndex = (page - 1) * getPageLength(); if (newIndex < 0) { newIndex = 0; } if (newIndex >= 0 && newIndex != container.getStartIndex()) { setPageFirstIndex(newIndex); } } public int getTotalAmountOfPages() { int size = container.getContainer().size(); double pageLength = getPageLength(); int pageCount = (int) Math.ceil(size / pageLength); if (pageCount < 1) { pageCount = 1; } return pageCount; } public void addListener(PageChangeListener listener) { if (listeners == null) { listeners = new ArrayList<PageChangeListener>(); } listeners.add(listener); } public void removeListener(PageChangeListener listener) { if (listeners == null) { listeners = new ArrayList<PageChangeListener>(); } listeners.remove(listener); } public void setAlwaysRecalculateColumnWidths(boolean alwaysRecalculateColumnWidths) { this.alwaysRecalculateColumnWidths = alwaysRecalculateColumnWidths; } }