package com.constellio.app.ui.framework.components.table;
import static com.constellio.app.ui.i18n.i18n.$;
import java.io.Serializable;
import java.util.Map;
import com.jensjansson.pagedtable.PagedTable;
import com.vaadin.data.Container;
import com.vaadin.data.Property;
import com.vaadin.data.validator.IntegerRangeValidator;
import com.vaadin.server.ClientConnector;
import com.vaadin.server.PaintException;
import com.vaadin.server.PaintTarget;
import com.vaadin.server.Resource;
import com.vaadin.server.StreamVariable;
import com.vaadin.server.VariableOwner;
import com.vaadin.ui.Alignment;
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.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.themes.ValoTheme;
public class BasePagedTable<T extends Container> extends PagedTable {
public static final int DEFAULT_PAGE_LENGTH = 10;
protected T container;
protected ComboBox itemsPerPageField;
public BasePagedTable(T container) {
this.container = container;
itemsPerPageField = new ComboBox();
}
@Override
public HorizontalLayout createControls() {
HorizontalLayout pageSize;
Label itemsPerPageLabel = new Label($("SearchResultTable.itemsPerPage"));
itemsPerPageField.addItem(DEFAULT_PAGE_LENGTH);
if (container.size() >= 10) {
itemsPerPageField.addItem(10);
}
if (container.size() > 10) {
itemsPerPageField.addItem(25);
}
if (container.size() > 25) {
itemsPerPageField.addItem(50);
}
if (container.size() > 50) {
itemsPerPageField.addItem(100);
}
itemsPerPageField.setNullSelectionAllowed(false);
itemsPerPageField.setWidth("85px");
itemsPerPageField.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
setPageLength((int) itemsPerPageField.getValue());
}
});
itemsPerPageField.setEnabled(itemsPerPageField.size() > 1);
pageSize = new HorizontalLayout(itemsPerPageLabel, itemsPerPageField);
pageSize.setComponentAlignment(itemsPerPageLabel, Alignment.MIDDLE_LEFT);
pageSize.setComponentAlignment(itemsPerPageField, Alignment.MIDDLE_LEFT);
pageSize.setSpacing(true);
Label page = new Label($("SearchResultTable.page"));
final TextField currentPage = new TextField();
currentPage.setConverter(Integer.class);
currentPage.setConvertedValue(getCurrentPage());
currentPage.setWidth("45px");
currentPage.addValidator(
new IntegerRangeValidator("Wrong page number", 1, getTotalAmountOfPages()));
currentPage.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
if (currentPage.isValid() && currentPage.getValue() != null) {
setCurrentPage((int) currentPage.getConvertedValue());
}
}
});
currentPage.setEnabled(getTotalAmountOfPages() > 1);
Label separator = new Label($("SearchResultTable.of"));
final Label totalPages = new Label(String.valueOf(getTotalAmountOfPages()));
final Button first = new Button("\uF100", new ClickListener() {
public void buttonClick(ClickEvent event) {
setCurrentPage(0);
}
});
first.setStyleName(ValoTheme.BUTTON_LINK);
first.setEnabled(getCurrentPage() > 1);
final Button previous = new Button("\uF104", new ClickListener() {
public void buttonClick(ClickEvent event) {
previousPage();
}
});
previous.setStyleName(ValoTheme.BUTTON_LINK);
previous.setEnabled(getCurrentPage() > 1);
final Button next = new Button("\uF105", new ClickListener() {
public void buttonClick(ClickEvent event) {
nextPage();
}
});
next.setStyleName(ValoTheme.BUTTON_LINK);
next.setEnabled(getCurrentPage() < getTotalAmountOfPages());
final Button last = new Button("\uF101", new ClickListener() {
public void buttonClick(ClickEvent event) {
setCurrentPage(getTotalAmountOfPages());
}
});
last.setStyleName(ValoTheme.BUTTON_LINK);
last.setEnabled(getCurrentPage() < getTotalAmountOfPages());
HorizontalLayout pageManagement = new HorizontalLayout(
first, previous, page, currentPage, separator, totalPages, next, last);
pageManagement.setComponentAlignment(first, Alignment.MIDDLE_LEFT);
pageManagement.setComponentAlignment(previous, Alignment.MIDDLE_LEFT);
pageManagement.setComponentAlignment(page, Alignment.MIDDLE_LEFT);
pageManagement.setComponentAlignment(currentPage, Alignment.MIDDLE_LEFT);
pageManagement.setComponentAlignment(separator, Alignment.MIDDLE_LEFT);
pageManagement.setComponentAlignment(totalPages, Alignment.MIDDLE_LEFT);
pageManagement.setComponentAlignment(next, Alignment.MIDDLE_LEFT);
pageManagement.setComponentAlignment(last, Alignment.MIDDLE_LEFT);
pageManagement.setSpacing(true);
HorizontalLayout controlBar = new HorizontalLayout(pageSize, pageManagement);
controlBar.setComponentAlignment(pageManagement, Alignment.MIDDLE_CENTER);
controlBar.setExpandRatio(pageSize, 1);
controlBar.setWidth("100%");
addListener(new PageChangeListener() {
public void pageChanged(PagedTableChangeEvent event) {
first.setEnabled(getCurrentPage() > 1);
previous.setEnabled(getCurrentPage() > 1);
next.setEnabled(getCurrentPage() < getTotalAmountOfPages());
last.setEnabled(getCurrentPage() < getTotalAmountOfPages());
currentPage.setValue(String.valueOf(getCurrentPage()));
currentPage.setEnabled(getTotalAmountOfPages() > 1);
totalPages.setValue(String.valueOf(getTotalAmountOfPages()));
}
});
return controlBar;
}
public ComboBox getItemsPerPageField() {
return itemsPerPageField;
}
@Override
public void paintContent(PaintTarget target) throws PaintException {
super.paintContent(new PaintTargetAdapter(target));
}
public void setItemsPerPageValue(int value) {
itemsPerPageField.setValue(value);
}
@Override
public void setPageLength(int pageLength) {
super.setPageLength(pageLength);
}
@SuppressWarnings("deprecation")
private static class PaintTargetAdapter implements Serializable, PaintTarget {
private PaintTarget adaptee;
private PaintTargetAdapter(PaintTarget adaptee) {
this.adaptee = adaptee;
}
public void addSection(String sectionTagName, String sectionData) throws PaintException {
adaptee.addSection(sectionTagName, sectionData);
}
public PaintStatus startPaintable(Component paintable, String tag) throws PaintException {
return adaptee.startPaintable(paintable, tag);
}
public void endPaintable(Component paintable) throws PaintException {
adaptee.endPaintable(paintable);
}
public void startTag(String tagName) throws PaintException {
adaptee.startTag(tagName);
}
public void endTag(String tagName) throws PaintException {
adaptee.endTag(tagName);
}
private boolean isIgnoredAttribute(String name) {
return "pagelength".equals(name);
}
public void addAttribute(String name, boolean value) throws PaintException {
if (!isIgnoredAttribute(name)) {
adaptee.addAttribute(name, value);
}
}
public void addAttribute(String name, int value) throws PaintException {
if (!isIgnoredAttribute(name)) {
adaptee.addAttribute(name, value);
}
}
public void addAttribute(String name, Resource value) throws PaintException {
if (!isIgnoredAttribute(name)) {
adaptee.addAttribute(name, value);
}
}
public void addVariable(VariableOwner owner, String name, StreamVariable value) throws PaintException {
adaptee.addVariable(owner, name, value);
}
public void addAttribute(String name, long value) throws PaintException {
adaptee.addAttribute(name, value);
}
public void addAttribute(String name, float value) throws PaintException {
adaptee.addAttribute(name, value);
}
public void addAttribute(String name, double value) throws PaintException {
adaptee.addAttribute(name, value);
}
public void addAttribute(String name, String value) throws PaintException {
adaptee.addAttribute(name, value);
}
public void addAttribute(String name, Map<?, ?> value) throws PaintException {
adaptee.addAttribute(name, value);
}
public void addAttribute(String name, Component value) throws PaintException {
adaptee.addAttribute(name, value);
}
public void addVariable(VariableOwner owner, String name, String value) throws PaintException {
adaptee.addVariable(owner, name, value);
}
public void addVariable(VariableOwner owner, String name, int value) throws PaintException {
adaptee.addVariable(owner, name, value);
}
public void addVariable(VariableOwner owner, String name, long value) throws PaintException {
adaptee.addVariable(owner, name, value);
}
public void addVariable(VariableOwner owner, String name, float value) throws PaintException {
adaptee.addVariable(owner, name, value);
}
public void addVariable(VariableOwner owner, String name, double value) throws PaintException {
adaptee.addVariable(owner, name, value);
}
public void addVariable(VariableOwner owner, String name, boolean value) throws PaintException {
adaptee.addVariable(owner, name, value);
}
public void addVariable(VariableOwner owner, String name, String[] value) throws PaintException {
adaptee.addVariable(owner, name, value);
}
public void addVariable(VariableOwner owner, String name, Component value) throws PaintException {
adaptee.addVariable(owner, name, value);
}
public void addUploadStreamVariable(VariableOwner owner, String name) throws PaintException {
adaptee.addUploadStreamVariable(owner, name);
}
public void addXMLSection(String sectionTagName, String sectionData, String namespace) throws PaintException {
adaptee.addXMLSection(sectionTagName, sectionData, namespace);
}
public void addUIDL(String uidl) throws PaintException {
adaptee.addUIDL(uidl);
}
public void addText(String text) throws PaintException {
adaptee.addText(text);
}
public void addCharacterData(String text) throws PaintException {
adaptee.addCharacterData(text);
}
public void addAttribute(String string, Object[] keys) {
adaptee.addAttribute(string, keys);
}
public String getTag(ClientConnector paintable) {
return adaptee.getTag(paintable);
}
public boolean isFullRepaint() {
return adaptee.isFullRepaint();
}
}
}