/**
* Copyright 2012 Universitat Pompeu Fabra.
*
* 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.onexus.website.api.widgets.tableviewer;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractToolbar;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.model.PropertyModel;
import org.onexus.website.api.events.EventFiltersUpdate;
import org.onexus.website.api.events.EventQueryUpdate;
import org.onexus.website.api.events.EventViewChange;
import java.util.Arrays;
import java.util.List;
public class NavigationToolbar extends AbstractToolbar {
private Integer rowsPerPage;
private static List<Integer> PAGE_OPTIONS = Arrays.asList(20, 40, 60, 100);
public NavigationToolbar(final DataTable<?, ?> table) {
super(table);
}
@Override
protected void onBeforeRender() {
WebMarkupContainer span = new WebMarkupContainer("span");
addOrReplace(span);
span.add(AttributeModifier.replace("colspan", String.valueOf(getTable().getColumns().size())));
DropDownChoice<Integer> dropDown = new DropDownChoice<Integer>("rowsxpage",
new PropertyModel<Integer>(this, "rowsPerPage"),
PAGE_OPTIONS,
new RowsPerPageChoiceRenderer()
);
dropDown.add(new OnChangeAjaxBehavior() {
@Override
protected void onUpdate(AjaxRequestTarget target) {
send(getPage(), Broadcast.BREADTH, EventViewChange.EVENT);
}
});
span.add(dropDown);
span.add(new PrevLink("prev"));
span.add(new NextLink("next"));
AjaxLink<String> countLink = new IndicatingAjaxLink<String>("count") {
@Override
public void onClick(AjaxRequestTarget target) {
getDataProvider().forceCount();
target.add(getTable());
}
};
span.add(countLink);
countLink.add(new Label("from", new PropertyModel<Long>(this, "from")));
countLink.add(new Label("to", new PropertyModel<Long>(this, "to")));
countLink.add(new Label("of", new PropertyModel<String>(this, "of")));
super.onBeforeRender();
}
public long getFrom() {
if (getDataProvider().getRealSize() == 0) {
return 0;
}
long itemsPerPage = getTable().getItemsPerPage();
long currentPage = getTable().getCurrentPage();
return (currentPage * itemsPerPage) + 1;
}
public long getTo() {
long itemsPerPage = getTable().getItemsPerPage();
long from = getFrom();
return from + Math.min(itemsPerPage, getDataProvider().size() - from + 1) - 1;
}
public String getOf() {
long realSize = getDataProvider().getRealSize();
if (realSize == -1) {
return "(click to count)";
}
return Long.toString(realSize);
}
private EntitiesRowProvider getDataProvider() {
return (EntitiesRowProvider) getTable().getDataProvider();
}
public Integer getRowsPerPage() {
if (rowsPerPage == null) {
Integer sessionRowsPerPage = getSession().getMetaData(TableViewer.DEFAULT_ROWS_PER_PAGE);
rowsPerPage = sessionRowsPerPage == null ? 20 : sessionRowsPerPage;
}
return rowsPerPage;
}
public void setRowsPerPage(Integer rowsPerPage) {
getSession().setMetaData(TableViewer.DEFAULT_ROWS_PER_PAGE, rowsPerPage);
this.rowsPerPage = rowsPerPage;
}
private class PrevLink extends AjaxLink<String> {
public PrevLink(String id) {
super(id);
}
@Override
public void onClick(AjaxRequestTarget target) {
getTable().setCurrentPage(getTable().getCurrentPage() - 1);
target.add(getTable());
}
@Override
protected void onBeforeRender() {
setVisible(getFrom() > 1);
super.onBeforeRender();
}
}
private class NextLink extends AjaxLink<String> {
public NextLink(String id) {
super(id);
}
@Override
public void onClick(AjaxRequestTarget target) {
long page = getTable().getCurrentPage() + 1;
getTable().setCurrentPage(page);
getDataProvider().setKnownSize(((page + 1) * getTable().getItemsPerPage()) + 2);
target.add(getTable());
}
@Override
protected void onBeforeRender() {
long to = getTo();
long size = getDataProvider().size();
setVisible(size > to);
super.onBeforeRender();
}
}
private class RowsPerPageChoiceRenderer implements IChoiceRenderer<Integer> {
@Override
public Object getDisplayValue(Integer object) {
return String.valueOf(object) + " rows";
}
@Override
public String getIdValue(Integer object, int index) {
return String.valueOf(object);
}
}
}