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

Java tutorial

Introduction

Here is the source code for org.onexus.website.api.widgets.tableviewer.HeadersToolbar.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.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.IAjaxCallListener;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.ajax.markup.html.repeater.data.sort.AjaxFallbackOrderByBorder;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.ISortStateLocator;
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.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.Model;
import org.onexus.website.api.events.EventSortUpdate;
import org.onexus.website.api.utils.panels.HelpMark;
import org.onexus.website.api.widgets.tableviewer.columns.AbstractColumn;
import org.onexus.website.api.widgets.tableviewer.columns.CollectionColumn;
import org.onexus.website.api.widgets.tableviewer.headers.FieldHeader;
import org.onexus.website.api.widgets.tableviewer.headers.FilteredHeader;
import org.onexus.website.api.widgets.tableviewer.headers.IHeader;

import java.util.List;

public class HeadersToolbar extends AbstractToolbar {

    private static final long serialVersionUID = 1L;

    /**
     * Constructor
     *
     * @param table        data table this toolbar will be attached to
     * @param stateLocator locator for the ISortState implementation used by sortable
     *                     headers
     */
    public <T, S> HeadersToolbar(final DataTable<T, S> table, final ISortStateLocator stateLocator) {
        super(table);

        table.setOutputMarkupId(true);

        RepeatingView headersGrandParents = new RepeatingView("headersGrandParents");
        RepeatingView headersParents = new RepeatingView("headersParents");
        RepeatingView headers = new RepeatingView("headers");

        //TODO Show optionally headers
        headersGrandParents.setVisible(false);
        headersParents.setVisible(false);

        add(headersGrandParents);
        add(headersParents);
        add(headers);

        final List<? extends IColumn<T, S>> columns = table.getColumns();

        WebMarkupContainer secondHeaderContainer = null;
        String lastSecondHeaderTitle = null;
        int lastSecondHeaderColspan = 0;

        WebMarkupContainer thirdHeaderContainer = null;
        String lastThirdHeaderTitle = null;
        int lastThirdHeaderColspan = 0;

        int col = 0;
        for (final IColumn<T, S> c : columns) {

            String placement = col == 0 ? "right" : (col + 1 == columns.size() ? "left" : "top");

            // Process only Track columns
            CollectionColumn column = null;
            if (c instanceof CollectionColumn) {
                column = (CollectionColumn) c;
            } else {

                if (c instanceof AbstractColumn) {
                    WebMarkupContainer item = new WebMarkupContainer(headers.newChildId());
                    item.setRenderBodyOnly(true);

                    WebMarkupContainer parentItem = new WebMarkupContainer(headersParents.newChildId());
                    parentItem.setRenderBodyOnly(true);

                    WebMarkupContainer grandParentItem = new WebMarkupContainer(headersGrandParents.newChildId());
                    grandParentItem.setRenderBodyOnly(true);

                    headers.add(item);
                    headersParents.add(parentItem);
                    headersGrandParents.add(grandParentItem);

                    WebMarkupContainer firstHeaderContainer = new WebMarkupContainer("header");

                    WebMarkupContainer innerHeader = new WebMarkupContainer("filter");
                    innerHeader.add(c.getHeader("label"));
                    firstHeaderContainer.add(innerHeader);
                    firstHeaderContainer.add(new AttributeModifier("style",
                            new Model<String>("font-size:12px; font-family:sans-serif;")));

                    item.add(firstHeaderContainer);

                    secondHeaderContainer = new WebMarkupContainer("header");
                    decorateSecondParentHeader(secondHeaderContainer, null, column);

                    secondHeaderContainer.add(new AttributeModifier("class", new Model<String>("empty")));
                    parentItem.add(secondHeaderContainer);
                    secondHeaderContainer = null;

                    thirdHeaderContainer = new WebMarkupContainer("header");
                    thirdHeaderContainer.add(new EmptyPanel("label"));
                    thirdHeaderContainer.add(new AttributeModifier("class", new Model<String>("empty")));
                    grandParentItem.add(thirdHeaderContainer);
                    thirdHeaderContainer = null;
                }

                continue;
            }

            IHeader firstHeader = column.getHeaderDecorator();
            IHeader secondHeader = firstHeader == null ? null : firstHeader.getParentHeader();
            IHeader thirdHeader = secondHeader == null ? null : secondHeader.getParentHeader();

            WebMarkupContainer item = new WebMarkupContainer(headers.newChildId());
            headers.add(item);

            WebMarkupContainer firstHeaderContainer = null;
            if (column.isFilterable()) {
                firstHeaderContainer = new FilteredHeader("header", (FieldHeader) column.getHeaderDecorator());
            } else {
                firstHeaderContainer = new WebMarkupContainer("header");
            }

            WebMarkupContainer innerHeader;
            if (column.isSortable()) {
                innerHeader = newSortableHeader("filter", column.getSortProperty(), stateLocator);
            } else {
                innerHeader = new WebMarkupContainer("filter");
            }
            firstHeaderContainer.add(innerHeader);

            item.add(firstHeaderContainer);
            item.setRenderBodyOnly(true);
            innerHeader.add(firstHeader.getHeader("label"));
            if (firstHeader.getLabel() == null) {
                firstHeaderContainer.add(new AttributeModifier("class", new Model<String>("empty")));
            }

            // Add parent and grand parent headers
            String secondTitle = null;
            String thirdTitle = null;

            firstHeaderContainer.add(new AttributeModifier("title", new Model<String>(firstHeader.getTitle())));
            firstHeaderContainer.add(new AttributeModifier("rel", Model.of("tooltip")));
            firstHeaderContainer.add(new AttributeModifier("data-placement", Model.of(placement)));
            firstHeaderContainer.add(
                    new AttributeModifier("style", new Model<String>("font-size:12px; font-family:sans-serif;")));

            if (secondHeader != null) {
                secondTitle = secondHeader.getLabel();
            }
            if (thirdHeader != null) {
                thirdTitle = thirdHeader.getLabel();
            }

            if (secondHeaderContainer != null
                    && ((lastSecondHeaderTitle == null && secondTitle == null) || (lastSecondHeaderTitle != null
                            && secondTitle != null && lastSecondHeaderTitle.equals(secondTitle)))) {
                lastSecondHeaderColspan += 1;
                secondHeaderContainer.add(new AttributeModifier("colspan",
                        new Model<String>(Integer.toString(lastSecondHeaderColspan))));

            } else {

                // Add parentItem
                WebMarkupContainer parentItem = new WebMarkupContainer(headersParents.newChildId());
                headersParents.add(parentItem);
                secondHeaderContainer = new WebMarkupContainer("header");
                decorateSecondParentHeader(secondHeaderContainer, secondHeader, column);

                if (secondTitle == null) {
                    secondHeaderContainer.add(new AttributeModifier("class", new Model<String>("empty")));
                }

                if (secondHeader != null && secondHeader.getLabel() != null) {
                    secondHeaderContainer
                            .add(new AttributeModifier("title", new Model<String>(secondHeader.getTitle())));
                    secondHeaderContainer.add(new AttributeModifier("rel", Model.of("tooltip")));
                    secondHeaderContainer.add(new AttributeModifier("data-placement", Model.of(placement)));
                }

                secondHeaderContainer.add(new AttributeModifier("style",
                        new Model<String>("font-size:12px; font-family:sans-serif;")));
                parentItem.add(secondHeaderContainer);
                parentItem.setRenderBodyOnly(true);
                lastSecondHeaderTitle = secondTitle;
                lastSecondHeaderColspan = 1;
            }

            // GrandParents
            if (thirdHeaderContainer != null
                    && ((lastThirdHeaderTitle == null && thirdTitle == null) || (lastThirdHeaderTitle != null
                            && thirdTitle != null && lastThirdHeaderTitle.equals(thirdTitle)))) {
                lastThirdHeaderColspan += 1;
                thirdHeaderContainer.add(new AttributeModifier("colspan",
                        new Model<String>(Integer.toString(lastThirdHeaderColspan))));
            } else {
                // Add grandParentItem
                WebMarkupContainer grandParentItem = new WebMarkupContainer(headersGrandParents.newChildId());
                headersGrandParents.add(grandParentItem);
                thirdHeaderContainer = new WebMarkupContainer("header");

                if (thirdTitle == null) {
                    thirdHeaderContainer.add(new AttributeModifier("class", new Model<String>("empty")));
                }

                if (thirdHeader != null) {
                    thirdHeaderContainer.add(thirdHeader.getHeader("label"));

                    if (thirdHeader.getLabel() != null) {
                        thirdHeaderContainer
                                .add(new AttributeModifier("title", new Model<String>(thirdHeader.getTitle())));
                        thirdHeaderContainer.add(new AttributeModifier("rel", Model.of("tooltip")));
                        thirdHeaderContainer.add(new AttributeModifier("data-placement", Model.of(placement)));

                    }
                } else {
                    thirdHeaderContainer.add(new EmptyPanel("label"));
                }

                thirdHeaderContainer.add(new AttributeModifier("style",
                        new Model<String>("font-size:12px; font-family:sans-serif;")));
                grandParentItem.add(thirdHeaderContainer);
                grandParentItem.setRenderBodyOnly(true);
                lastThirdHeaderTitle = thirdTitle;
                lastThirdHeaderColspan = 1;

            }

            col++;

        }
    }

    protected WebMarkupContainer newSortableHeader(String borderId, String property, ISortStateLocator locator) {
        return new AjaxFallbackOrderByBorder(borderId, property, locator, getAjaxCallListener()) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void onAjaxClick(AjaxRequestTarget target) {
                target.add(getTable());

                send(getPage(), Broadcast.BREADTH, EventSortUpdate.EVENT);

            }

            @Override
            protected void onSortChanged() {
                super.onSortChanged();
                getTable().setCurrentPage(0);
            }
        };
    }

    protected IAjaxCallListener getAjaxCallListener() {
        return null;
    }

    private void decorateSecondParentHeader(final WebMarkupContainer headerComponent, IHeader secondHeader,
            CollectionColumn collectionColumn) {
        // Ini Label
        if (secondHeader != null) {
            headerComponent.add(secondHeader.getHeader("label"));
        } else {
            headerComponent.add(new EmptyPanel("label"));
        }

        if (collectionColumn != null && collectionColumn.getHeaderDecorator() != null
                && collectionColumn.getHeaderDecorator() instanceof FieldHeader) {

            FieldHeader fieldHeader = (FieldHeader) collectionColumn.getHeaderDecorator();
            String helpText = fieldHeader.getCollection().getProperty("HELP_DESCRIPTION");
            if (helpText == null) {
                headerComponent.addOrReplace(new EmptyPanel("help").setVisible(false));
            } else {
                headerComponent.addOrReplace(new HelpMark("help", secondHeader.getTitle(), helpText));
            }

        } else {
            headerComponent.addOrReplace(new EmptyPanel("help"));
        }
    }
}