/** * 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.commons.collections.CollectionUtils; import org.apache.commons.collections.Predicate; import org.apache.wicket.MetaDataKey; import org.apache.wicket.event.IEvent; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.util.string.Strings; import org.onexus.collection.api.IEntityTable; import org.onexus.collection.api.query.Query; import org.onexus.resource.api.ORI; import org.onexus.resource.api.Progress; import org.onexus.website.api.events.EventAddFilter; import org.onexus.website.api.events.EventQueryUpdate; import org.onexus.website.api.events.EventRemoveFilter; import org.onexus.website.api.pages.browser.BrowserPageStatus; import org.onexus.website.api.utils.panels.ondomready.OnDomReadyPanel; import org.onexus.website.api.utils.visible.VisiblePredicate; import org.onexus.website.api.widgets.Widget; import org.onexus.website.api.widgets.tableviewer.columns.IColumnConfig; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class TableViewer extends Widget<TableViewerConfig, TableViewerStatus> { public static final CssResourceReference TABLE_VIEWER_CSS = new CssResourceReference(TableViewer.class, "TableViewer.css"); public static final MetaDataKey<Integer> DEFAULT_ROWS_PER_PAGE = new MetaDataKey<Integer>() { }; // Model objects private EntitiesRowProvider dataProvider; public TableViewer(String componentId, IModel<TableViewerStatus> status) { super(componentId, status); onEventFireUpdate(EventQueryUpdate.class, EventAddFilter.class, EventRemoveFilter.class); if (status.getObject() == null) { status.setObject(getStatus()); } Integer sessionRowsPerPage = getSession().getMetaData(DEFAULT_ROWS_PER_PAGE); final Integer rowsPerPage = sessionRowsPerPage == null ? 20 : sessionRowsPerPage; this.dataProvider = new EntitiesRowProvider(status, rowsPerPage) { @Override protected Query getQuery() { return TableViewer.this.getQuery(); } @Override protected void addTaskStatus(Progress progressStatus) { //TODO } }; // Create the columns from the config int ccs = getStatus().getCurrentColumnSet(); List<IColumnConfig> columnsConfig = getConfig().getColumnSets().get(ccs).getColumns(); final List<IColumn<IEntityTable, String>> columns = new ArrayList<IColumn<IEntityTable, String>>(); ORI parentURI = getQuery().getOn(); List<IColumnConfig> visibleColumnsConfig = new ArrayList<IColumnConfig>(columnsConfig.size()); BrowserPageStatus pageStatus = findParentStatus(BrowserPageStatus.class); Predicate sortablePredicate; if (pageStatus != null) { sortablePredicate = new VisiblePredicate(getPageBaseOri(), pageStatus.getEntitySelections()); Predicate filter = new VisiblePredicate(getPageBaseOri(), pageStatus.getEntitySelections()); CollectionUtils.select(columnsConfig, filter, visibleColumnsConfig); } else { sortablePredicate = new VisiblePredicate(getPageBaseOri(), Collections.EMPTY_LIST); visibleColumnsConfig = columnsConfig; } boolean tableSort = sortablePredicate.evaluate(getConfig().getSortable()); for (IColumnConfig columnConfig : visibleColumnsConfig) { String columnSortStr = columnConfig.getSortable(); boolean columnSort = sortablePredicate.evaluate(columnSortStr); columnConfig.addColumns(columns, parentURI, Strings.isEmpty(columnSortStr) ? tableSort : columnSort); } // Disable default status order if the table is not sortable. if (!tableSort) { getStatus().setOrder(null); } add(new OnDomReadyPanel("datatable") { @Override protected Panel onDomReadyPanel(String componentId) { Boolean forceCount = getConfig().getForceCount(); if (forceCount != null && forceCount.booleanValue()) { dataProvider.forceCount(); } return new DataTablePanel("datatable", columns, dataProvider, rowsPerPage); } }); } @Override public void onEvent(IEvent<?> event) { super.onEvent(event); if (event.getPayload() instanceof EventQueryUpdate) { this.dataProvider.clearCount(); } } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.render(CssHeaderItem.forReference(TABLE_VIEWER_CSS)); } }