/*
* Copyright (c) 2010-2016 Evolveum
*
* 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 com.evolveum.midpoint.web.component.data;
import java.util.List;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.CSVDataExporter;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.ExportToolbar;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.navigation.paging.IPageable;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataViewBase;
import org.apache.wicket.model.AbstractReadOnlyModel;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import org.apache.wicket.model.IModel;
/**
* @author Viliam Repan (lazyman)
*/
public class BoxedTablePanel<T> extends BasePanel<T> implements Table {
private static final long serialVersionUID = 1L;
private static final String ID_BOX = "box";
private static final String ID_HEADER = "header";
private static final String ID_FOOTER = "footer";
private static final String ID_TABLE = "table";
private static final String ID_TABLE_CONTAINER = "tableContainer";
private static final String ID_PAGING_FOOTER = "pagingFooter";
private static final String ID_PAGING = "paging";
private static final String ID_COUNT = "count";
private static final String ID_MENU = "menu";
private static final String ID_FOOTER_CONTAINER = "footerContainer";
private static final String ID_BUTTON_TOOLBAR = "buttonToolbar";
private UserProfileStorage.TableId tableId;
private boolean showPaging;
private String additionalBoxCssClasses = null;
public BoxedTablePanel(String id, ISortableDataProvider provider, List<IColumn<T, String>> columns) {
this(id, provider, columns, null, Integer.MAX_VALUE);
}
public BoxedTablePanel(String id, ISortableDataProvider provider, List<IColumn<T, String>> columns,
UserProfileStorage.TableId tableId) {
this(id, provider, columns, tableId, UserProfileStorage.DEFAULT_PAGING_SIZE);
}
public BoxedTablePanel(String id, ISortableDataProvider provider, List<IColumn<T, String>> columns,
UserProfileStorage.TableId tableId, int pageSize) {
super(id);
this.tableId = tableId;
initLayout(columns, provider, pageSize);
}
private void initLayout(List<IColumn<T, String>> columns, ISortableDataProvider provider, int pageSize) {
setOutputMarkupId(true);
WebMarkupContainer box = new WebMarkupContainer(ID_BOX);
box.add(new AttributeAppender("class", new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
String boxCssClasses = getAdditionalBoxCssClasses();
if (boxCssClasses == null) {
return "";
} else {
return " " + boxCssClasses;
}
}
}));
add(box);
WebMarkupContainer tableContainer = new WebMarkupContainer(ID_TABLE_CONTAINER);
tableContainer.setOutputMarkupId(true);
DataTable<T, String> table = new SelectableDataTable<T>(ID_TABLE, columns, provider, pageSize) {
@Override
protected Item<T> newRowItem(String id, int index, IModel<T> rowModel) {
Item<T> item = super.newRowItem(id, index, rowModel);
return customizeNewRowItem(item, rowModel);
}
};
table.setOutputMarkupId(true);
tableContainer.add(table);
box.add(tableContainer);
TableHeadersToolbar headersTop = new TableHeadersToolbar(table, provider);
headersTop.setOutputMarkupId(true);
table.addTopToolbar(headersTop);
box.add(createHeader(ID_HEADER));
box.add(createFooter(ID_FOOTER));
}
public String getAdditionalBoxCssClasses() {
return additionalBoxCssClasses;
}
public void setAdditionalBoxCssClasses(String boxCssClasses) {
this.additionalBoxCssClasses = boxCssClasses;
}
// TODO better name?
protected Item<T> customizeNewRowItem(Item<T> item, IModel<T> model) {
return item;
}
@Override
public DataTable getDataTable() {
return (DataTable) get(ID_BOX).get(ID_TABLE_CONTAINER).get(ID_TABLE);
}
public WebMarkupContainer getDataTableContainer() {
return (WebMarkupContainer) get(ID_BOX).get(ID_TABLE_CONTAINER);
}
@Override
public UserProfileStorage.TableId getTableId() {
return tableId;
}
@Override
public void setItemsPerPage(int size) {
getDataTable().setItemsPerPage(size);
}
@Override
public int getItemsPerPage() {
return (int) getDataTable().getItemsPerPage();
}
@Override
public void setShowPaging(boolean show) {
// todo make use of this [lazyman]
this.showPaging = show;
if (!show) {
setItemsPerPage(Integer.MAX_VALUE);
} else {
setItemsPerPage(10);
}
}
public WebMarkupContainer getHeader() {
return (WebMarkupContainer) get(ID_BOX).get(ID_HEADER);
}
public WebMarkupContainer getFooter() {
return (WebMarkupContainer) get(ID_BOX).get(ID_FOOTER);
}
protected WebMarkupContainer createHeader(String headerId) {
WebMarkupContainer header = new WebMarkupContainer(headerId);
header.setVisible(false);
return header;
}
protected WebMarkupContainer createFooter(String footerId) {
return new PagingFooter(footerId, ID_PAGING_FOOTER, this, this);
}
public Component getFooterMenu() {
return ((PagingFooter) getFooter()).getFooterMenu();
}
public Component getFooterCountLabel() {
return ((PagingFooter) getFooter()).getFooterCountLabel();
}
public Component getFooterPaging() {
return ((PagingFooter) getFooter()).getFooterPaging();
}
@Override
public void setCurrentPage(ObjectPaging paging) {
WebComponentUtil.setCurrentPage(this, paging);
}
@Override
public void setCurrentPage(long page) {
getDataTable().setCurrentPage(page);
}
protected WebMarkupContainer createButtonToolbar(String id) {
return new WebMarkupContainer(id);
}
private static class PagingFooter extends Fragment {
public PagingFooter(String id, String markupId, BoxedTablePanel markupProvider, Table table) {
super(id, markupId, markupProvider);
setOutputMarkupId(true);
initLayout(markupProvider, table);
}
private void initLayout(final BoxedTablePanel boxedTablePanel, final Table table) {
WebMarkupContainer buttonToolbar = boxedTablePanel.createButtonToolbar(ID_BUTTON_TOOLBAR);
add(buttonToolbar);
final DataTable dataTable = table.getDataTable();
WebMarkupContainer footerContainer = new WebMarkupContainer(ID_FOOTER_CONTAINER);
footerContainer.setOutputMarkupId(true);
final Label count = new Label(ID_COUNT, new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
return createCountString(dataTable);
}
});
count.setOutputMarkupId(true);
footerContainer.add(count);
BoxedPagingPanel nb2 = new BoxedPagingPanel(ID_PAGING, dataTable, true) {
@Override
protected void onPageChanged(AjaxRequestTarget target, long page) {
target.add(count);
}
};
footerContainer.add(nb2);
TableConfigurationPanel menu = new TableConfigurationPanel(ID_MENU) {
@Override
protected void pageSizeChanged(AjaxRequestTarget target) {
Table table = findParent(Table.class);
UserProfileStorage.TableId tableId = table.getTableId();
if (tableId != null) {
PageBase page = (PageBase) getPage();
Integer pageSize = page.getSessionStorage().getUserProfile().getPagingSize(tableId);
table.setItemsPerPage(pageSize);
}
target.add(findParent(PagingFooter.class));
target.add((Component) table);
}
};
footerContainer.add(menu);
add(footerContainer);
}
public Component getFooterMenu() {
return get(ID_FOOTER_CONTAINER).get(ID_MENU);
}
public Component getFooterCountLabel() {
return get(ID_FOOTER_CONTAINER).get(ID_COUNT);
}
public Component getFooterPaging() {
return get(ID_FOOTER_CONTAINER).get(ID_PAGING);
}
private String createCountString(IPageable pageable) {
long from = 0;
long to = 0;
long count = 0;
if (pageable instanceof DataViewBase) {
DataViewBase view = (DataViewBase) pageable;
from = view.getFirstItemOffset() + 1;
to = from + view.getItemsPerPage() - 1;
long itemCount = view.getItemCount();
if (to > itemCount) {
to = itemCount;
}
count = itemCount;
} else if (pageable instanceof DataTable) {
DataTable table = (DataTable) pageable;
from = table.getCurrentPage() * table.getItemsPerPage() + 1;
to = from + table.getItemsPerPage() - 1;
long itemCount = table.getItemCount();
if (to > itemCount) {
to = itemCount;
}
count = itemCount;
}
if (count > 0) {
if (count == Integer.MAX_VALUE) {
return PageBase.createStringResourceStatic(PagingFooter.this, "CountToolbar.label.unknownCount",
new Object[] { from, to }).getString();
}
return PageBase.createStringResourceStatic(PagingFooter.this, "CountToolbar.label",
new Object[] { from, to, count }).getString();
}
return PageBase
.createStringResourceStatic(PagingFooter.this, "CountToolbar.noFound", new Object[] {})
.getString();
}
}
}