/* * Copyright (c) 2010-2013 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 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.component.data.paging.NavigatorPanel; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.session.UserProfileStorage; import org.apache.commons.lang.Validate; import org.apache.wicket.AttributeModifier; 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.markup.html.panel.Panel; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import java.util.List; /** * @author lazyman */ public class TablePanel<T> extends Panel implements Table { private static final String ID_TABLE = "table"; private static final String ID_PAGING = "paging"; private IModel<Boolean> showPaging = new Model<>(true); private IModel<Boolean> showCount = new Model<>(true); private UserProfileStorage.TableId tableId; public TablePanel(String id, ISortableDataProvider provider, List<IColumn<T, String>> columns) { this(id, provider, columns, null, UserProfileStorage.DEFAULT_PAGING_SIZE); } public TablePanel(String id, ISortableDataProvider provider, List<IColumn<T, String>> columns, UserProfileStorage.TableId tableId, long pageSize) { super(id); Validate.notNull(provider, "Object type must not be null."); Validate.notNull(columns, "Columns must not be null."); this.tableId = tableId; initLayout(columns, provider, pageSize); } private void initLayout(List<IColumn<T, String>> columns, ISortableDataProvider provider, long pageSize) { DataTable<T, String> table = new SelectableDataTable<>(ID_TABLE, columns, provider, (int) pageSize); table.setOutputMarkupId(true); TableHeadersToolbar headers = new TableHeadersToolbar(table, provider); headers.setOutputMarkupId(true); table.addTopToolbar(headers); CountToolbar count = new CountToolbar(table) { @Override protected void pageSizeChanged(AjaxRequestTarget target) { PageBase page = (PageBase) getPage(); Integer pageSize = page.getSessionStorage().getUserProfile().getPagingSize(tableId); setItemsPerPage(pageSize); target.add(getNavigatorPanel()); target.add(getDataTable()); } @Override protected boolean isPageSizePopupVisible() { return tableId != null; } }; addVisibleBehaviour(count, showCount); table.addBottomToolbar(count); add(table); NavigatorPanel nb2 = new NavigatorPanel(ID_PAGING, table, showPagedPagingModel(provider)); addVisibleBehaviour(nb2, showPaging); add(nb2); } @Override public UserProfileStorage.TableId getTableId() { return tableId; } private void addVisibleBehaviour(Component comp, final IModel<Boolean> model) { comp.add(new VisibleEnableBehaviour() { @Override public boolean isVisible() { return model.getObject(); } }); } private IModel<Boolean> showPagedPagingModel(ISortableDataProvider provider) { if (!(provider instanceof BaseSortableDataProvider)) { return new AbstractReadOnlyModel<Boolean>() { @Override public Boolean getObject() { return true; } }; } BaseSortableDataProvider baseProvider = (BaseSortableDataProvider) provider; return baseProvider.isSizeAvailableModel(); } @Override public DataTable<T, ?> getDataTable() { return (DataTable<T, ?>) get(ID_TABLE); } public NavigatorPanel getNavigatorPanel() { return (NavigatorPanel) get(ID_PAGING); } @Override public void setItemsPerPage(int size) { getDataTable().setItemsPerPage(size); } @Override public int getItemsPerPage() { return (int) getDataTable().getItemsPerPage(); } @Override public void setCurrentPage(long page) { getDataTable().setCurrentPage(page); } @Deprecated @Override public void setCurrentPage(ObjectPaging paging) { WebComponentUtil.setCurrentPage(this, paging); } @Override public void setShowPaging(boolean showPaging) { this.showPaging.setObject(showPaging); this.showCount.setObject(showPaging); if (!showPaging) { setItemsPerPage(Integer.MAX_VALUE); } else { setItemsPerPage(10); } } public void setShowCount(boolean showCount) { this.showCount.setObject(showCount); } public void setTableCssClass(String cssClass) { Validate.notEmpty(cssClass, "Css class must not be null or empty."); DataTable table = getDataTable(); table.add(new AttributeAppender("class", new Model(cssClass), " ")); } public void setStyle(String value) { Validate.notEmpty(value, "Value must not be null or empty."); DataTable table = getDataTable(); table.add(new AttributeModifier("style", new Model(value))); } }