PagingUtilImpl.java

/*
 * Copyright 2010-2024 James Pether Sörling
 *
 * 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.
 *
 *	$Id$
 *  $HeadURL$
*/
package com.hack23.cia.web.impl.ui.application.views.common.paging;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.hack23.cia.web.impl.ui.application.views.common.pagelinks.api.PageLinkFactory;
import com.hack23.cia.web.impl.ui.application.views.common.sizing.ContentRatio;
import com.vaadin.ui.AbstractOrderedLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Link;

/**
 * The Class PagingUtil.
 */
@Component
public final class PagingUtilImpl implements PagingUtil {

	/** The first page. */
	private static final String FIRST_PAGE = "first page";

	/** The last page. */
	private static final String LAST_PAGE = "last page";

	/** The limit for displaying start end links. */
	private static final int LIMIT_FOR_DISPLAYING_START_END_LINKS = 5;

	/** The next page. */
	private static final String NEXT_PAGE = "next page";

	/** The page header. */
	private static final String PAGE_HEADER = "Page: ";

	/** The page one. */
	private static final int PAGE_ONE = 1;

	/** The page separator. */
	private static final char PAGE_SEPARATOR = '/';

	/** The pages total results. */
	private static final String PAGES_TOTAL_RESULTS = " pages. Total results:";

	/** The previous page. */
	private static final String PREVIOUS_PAGE = "previous page";

	/** The results per page. */
	private static final String RESULTS_PER_PAGE = " results per page:";

	/** The show. */
	private static final String SHOW = " :: Show ";

	/** The page link factory. */
	@Autowired
	private PageLinkFactory pageLinkFactory;

	/**
	 * Default constructor for PagingUtilImpl.
	 */
	public PagingUtilImpl() {
		// Default constructor
	}

	/**
	 * Adds the paging link.
	 *
	 * @param label          the label
	 * @param name           the name
	 * @param pageId         the page id
	 * @param maxPages       the max pages
	 * @param pagingControls the paging controls
	 */
	private void addPagingLink(final String label, final String name, final String pageId, final long maxPages, final HorizontalLayout pagingControls) {
		final Link previousPageLink = pageLinkFactory.createAdminPagingLink(label,name, pageId, String.valueOf(maxPages));
		pagingControls.addComponent(previousPageLink);
		pagingControls.setExpandRatio(previousPageLink, ContentRatio.SMALL);
	}

	/**
	 * Creates the paging controls.
	 *
	 * @param content       the content
	 * @param name          the name
	 * @param pageId        the page id
	 * @param size          the size
	 * @param pageNr        the page nr
	 * @param resultPerPage the result per page
	 */
	@Override
	public void createPagingControls(final AbstractOrderedLayout content, final String name, final String pageId, final Long size, final int pageNr,
			final int resultPerPage) {
				final HorizontalLayout pagingControls = new HorizontalLayout();
				pagingControls.setSpacing(true);
				pagingControls.setMargin(true);

				final long maxPages = (size +resultPerPage-1) / resultPerPage;

				final StringBuilder stringBuilder = new StringBuilder();
				stringBuilder.append(PAGE_HEADER)
				.append(pageNr)
				.append(PAGE_SEPARATOR)
				.append(maxPages)
				.append(PAGES_TOTAL_RESULTS)
				.append(size)
				.append(RESULTS_PER_PAGE)
				.append(resultPerPage)
				.append(SHOW);
				final Label pageInfo = new Label(stringBuilder.toString());
				pagingControls.addComponent(pageInfo);
				pagingControls.setExpandRatio(pageInfo, ContentRatio.SMALL);


				if (pageNr > PAGE_ONE) {
					addPagingLink(PREVIOUS_PAGE,name, pageId, pageNr -1L,pagingControls);
				}

				if (maxPages > PAGE_ONE && pageNr < maxPages) {
					addPagingLink(NEXT_PAGE,name, pageId, pageNr +1L,pagingControls);
				}

				if (maxPages > LIMIT_FOR_DISPLAYING_START_END_LINKS && pageNr > PAGE_ONE) {
					addPagingLink(FIRST_PAGE,name, pageId, 1,pagingControls);
				}

				if (maxPages > LIMIT_FOR_DISPLAYING_START_END_LINKS && pageNr < maxPages) {
					addPagingLink(LAST_PAGE,name, pageId, maxPages,pagingControls);
				}

				content.addComponent(pagingControls);
				content.setExpandRatio(pagingControls, ContentRatio.SMALL2);

			}

}