nl.knaw.dans.common.wicket.components.pagebrowse.PageBrowsePanel.java Source code

Java tutorial

Introduction

Here is the source code for nl.knaw.dans.common.wicket.components.pagebrowse.PageBrowsePanel.java

Source

/*******************************************************************************
 * Copyright 2015 DANS - Data Archiving and Networked Services
 *
 * 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 nl.knaw.dans.common.wicket.components.pagebrowse;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import nl.knaw.dans.common.wicket.components.CommonGPanel;

import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;

/**
 * A panel for browsing through items on pages. A typical {@link PageBrowsePanel} looks like this:
 *
 * <pre>
 *      previous   |   1   |   ...   |   3   |   4   |   5   |   6   |   7   |   ...   |   9   |   next
 * </pre>
 *
 * @author ecco
 */
public class PageBrowsePanel extends CommonGPanel<PageBrowseData> {
    private static final long serialVersionUID = 4385883898867962693L;

    public static final String DEFAULT_SEPARATOR = "|";

    public static final String RK_PREVIOUS = "PageBrowsePanel.previous";

    public static final String RK_NEXT = "PageBrowsePanel.next";

    private Set<PageBrowseLinkListener> linkListeners = new HashSet<PageBrowseLinkListener>();

    public PageBrowsePanel(final String wicketId, final IModel<PageBrowseData> model) {
        this(wicketId, model, null);
    }

    public PageBrowsePanel(final String wicketId, final IModel<PageBrowseData> model,
            PageBrowseLinkListener listener) {
        super(wicketId, model);

        if (listener != null)
            linkListeners.add(listener);

        ListView<PageBrowseLink> pageBrowse = new ListView<PageBrowseLink>("pages",
                new AbstractReadOnlyModel<List<PageBrowseLink>>() {
                    private static final long serialVersionUID = -7716849873494368548L;

                    public List<PageBrowseLink> getObject() {
                        return computeLinks();
                    }
                }) {
            private static final long serialVersionUID = 0L;

            @Override
            protected void populateItem(ListItem<PageBrowseLink> item) {
                final int page = item.getIndex();
                if (page > 0) {
                    item.add(new Label("separator", DEFAULT_SEPARATOR));
                } else {
                    // no separator
                    item.add(new Label("separator", ""));
                }

                final PageBrowseLink plink = item.getModelObject();
                item.add(plink);
            }
        };
        add(pageBrowse);
    }

    public void addPageLinkListener(PageBrowseLinkListener listener) {
        linkListeners.add(listener);
    }

    public boolean removePageLinkListener(PageBrowseLinkListener listener) {
        return linkListeners.remove(listener);
    }

    @Override
    public boolean isVisible() {
        return !(getCurrentPage() == 1 && getLastPage() == 1);
    }

    public int getCurrentPage() {
        return getModelObject().getCurrentPage();
    }

    public int getLastPage() {
        return getModelObject().getLastPage();
    }

    public int getWindowSize() {
        return getModelObject().getWindowSize();
    }

    public int getWindowStart() {
        return getModelObject().getWindowStart();
    }

    public int getWindowEnd() {
        return getModelObject().getWindowEnd();
    }

    List<PageBrowseLink> computeLinks() {
        PageBrowseData model = getModelObject();
        List<PageBrowseLink> links = new ArrayList<PageBrowseLink>();
        if (model.hasPrevious()) {
            links.add(new PageBrowseLink(getCurrentPage() - 1, getPageSize(),
                    new ResourceModel(RK_PREVIOUS, "previous"), true, linkListeners));
        }
        if (getWindowStart() > 1) {
            links.add(new PageBrowseLink(1, getPageSize(), new Model<String>("" + 1), true, linkListeners));
        }
        if (getWindowStart() > 1 + 1) {
            links.add(new PageBrowseLink(-1, getPageSize(), new Model<String>("..."), false, linkListeners));
        }
        for (int i = getWindowStart(); i <= getWindowEnd(); i++) {
            links.add(new PageBrowseLink(i, getPageSize(), new Model<String>("" + i), i != getCurrentPage(),
                    linkListeners));
        }
        if (getWindowEnd() < getLastPage() - 1) {
            links.add(new PageBrowseLink(-1, getPageSize(), new Model<String>("..."), false, linkListeners));
        }
        if (getWindowEnd() < getLastPage()) {
            links.add(new PageBrowseLink(getLastPage(), getPageSize(), new Model<String>("" + getLastPage()), true,
                    linkListeners));
        }
        if (model.hasNext()) {
            links.add(new PageBrowseLink(getCurrentPage() + 1, getPageSize(), new ResourceModel(RK_NEXT, "next"),
                    true, linkListeners));
        }
        return links;
    }

    private int getPageSize() {
        return getModelObject().getPageSize();
    }

    // method for testing
    String printLinks() {
        StringBuilder sb = new StringBuilder();
        for (PageBrowseLink link : computeLinks()) {
            sb.append(link.printLink());
            sb.append(DEFAULT_SEPARATOR);
        }
        return sb.toString();
    }

    /**
     * A link for browsing through items on pages.
     *
     * @author ecco
     */
    public class PageBrowseLink extends Link<String> {

        public static final String WI_PAGELINK = "pageLink";

        public static final String WI_PAGELINKTEXT = "pageLinkText";

        private static final long serialVersionUID = -5052832307990433719L;
        private final int targetPage;
        private final int pageSize;
        private final IModel<String> labelModel;
        private final boolean enabled;
        private final Set<PageBrowseLinkListener> listeners;

        PageBrowseLink(int targetPage, int pageSize, IModel<String> labelModel, boolean enabled,
                Set<PageBrowseLinkListener> listeners) {
            super(WI_PAGELINK);
            this.pageSize = pageSize;
            this.targetPage = targetPage;
            this.labelModel = labelModel;
            this.enabled = enabled;
            this.listeners = listeners;
            add(new Label(WI_PAGELINKTEXT, labelModel));
        }

        public int getTargetPage() {
            return targetPage;
        }

        public int getTargetItemStart() {
            return ((targetPage * pageSize) - pageSize) + 1;
        }

        public IModel<String> getLabelModel() {
            return labelModel;
        }

        public boolean isEnabled() {
            return enabled;
        }

        @Override
        protected boolean getStatelessHint() {
            return false;
        }

        @Override
        public void onClick() {
            PageBrowseData pbModel = PageBrowsePanel.this.getModelObject();
            pbModel.setCurrentPage(targetPage);
            for (PageBrowseLinkListener listener : listeners) {
                listener.onClick(this);
            }
        }

        String printLink() {
            return targetPage + " " + enabled + " " + labelModel.getObject();
        }

    }

}