org.onexus.website.api.widgets.tableviewer.TableViewer.java Source code

Java tutorial

Introduction

Here is the source code for org.onexus.website.api.widgets.tableviewer.TableViewer.java

Source

/**
 *  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));
    }

}