org.apache.wicket.markup.html.navigation.paging.PagingNavigator.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.wicket.markup.html.navigation.paging.PagingNavigator.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.wicket.markup.html.navigation.paging;

import org.apache.wicket.Component;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.panel.Panel;

/**
 * A Wicket panel component to draw and maintain a complete page navigator, meant to be easily added
 * to any PageableListView. A navigation which contains links to the first and last page, the
 * current page +- some increment and which supports paged navigation bars (@see
 * PageableListViewNavigationWithMargin).
 * 
 * @author Juergen Donnerstag
 */
public class PagingNavigator extends Panel {
    private static final long serialVersionUID = 1L;

    /** The navigation bar to be printed, e.g. 1 | 2 | 3 etc. */
    private PagingNavigation pagingNavigation;
    private final IPageable pageable;
    private final IPagingLabelProvider labelProvider;

    /**
     * Constructor.
     * 
     * @param id
     *            See Component
     * @param pageable
     *            The pageable component the page links are referring to.
     */
    public PagingNavigator(final String id, final IPageable pageable) {
        this(id, pageable, null);
    }

    /**
     * Constructor.
     * 
     * @param id
     *            See Component
     * @param pageable
     *            The pageable component the page links are referring to.
     * @param labelProvider
     *            The label provider for the link text.
     */
    public PagingNavigator(final String id, final IPageable pageable, final IPagingLabelProvider labelProvider) {
        super(id);
        this.pageable = pageable;
        this.labelProvider = labelProvider;
    }

    /**
     * {@link IPageable} this navigator is linked with
     * 
     * @return {@link IPageable} instance
     */
    public final IPageable getPageable() {
        return pageable;
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();

        // Get the navigation bar and add it to the hierarchy
        pagingNavigation = newNavigation("navigation", pageable, labelProvider);
        add(pagingNavigation);

        // Add additional page links
        add(newPagingNavigationLink("first", pageable, 0).add(new TitleAppender("PagingNavigator.first")));
        add(newPagingNavigationIncrementLink("prev", pageable, -1)
                .add(new TitleAppender("PagingNavigator.previous")));
        add(newPagingNavigationIncrementLink("next", pageable, 1).add(new TitleAppender("PagingNavigator.next")));
        add(newPagingNavigationLink("last", pageable, -1).add(new TitleAppender("PagingNavigator.last")));
    }

    /**
     * Create a new increment link. May be subclassed to make use of specialized links, e.g. Ajaxian
     * links.
     * 
     * @param id
     *            the link id
     * @param pageable
     *            the pageable to control
     * @param increment
     *            the increment
     * @return the increment link
     */
    protected AbstractLink newPagingNavigationIncrementLink(String id, IPageable pageable, int increment) {
        return new PagingNavigationIncrementLink<Void>(id, pageable, increment);
    }

    /**
     * Create a new pagenumber link. May be subclassed to make use of specialized links, e.g.
     * Ajaxian links.
     * 
     * @param id
     *            the link id
     * @param pageable
     *            the pageable to control
     * @param pageNumber
     *            the page to jump to
     * @return the pagenumber link
     */
    protected AbstractLink newPagingNavigationLink(String id, IPageable pageable, int pageNumber) {
        return new PagingNavigationLink<Void>(id, pageable, pageNumber);
    }

    /**
     * Create a new PagingNavigation. May be subclassed to make us of specialized PagingNavigation.
     * 
     * @param id
     *            The id of the navigation component
     * @param pageable
     *            the pageable component
     * @param labelProvider
     *            The label provider for the link text.
     * @return the navigation object
     */
    protected PagingNavigation newNavigation(final String id, final IPageable pageable,
            final IPagingLabelProvider labelProvider) {
        return new PagingNavigation(id, pageable, labelProvider);
    }

    /**
     * Gets the pageable navigation component for configuration purposes.
     * 
     * @return the associated pageable navigation.
     */
    public final PagingNavigation getPagingNavigation() {
        return pagingNavigation;
    }

    /**
     * Appends title attribute to navigation links
     * 
     * @author igor.vaynberg
     */
    private final class TitleAppender extends Behavior {
        private static final long serialVersionUID = 1L;

        private final String resourceKey;

        /**
         * Constructor
         * 
         * @param resourceKey
         *            resource key of the message
         */
        public TitleAppender(String resourceKey) {
            this.resourceKey = resourceKey;
        }

        /** {@inheritDoc} */
        @Override
        public void onComponentTag(Component component, ComponentTag tag) {
            tag.put("title", PagingNavigator.this.getString(resourceKey));
        }
    }
}