/* * Copyright (C) 2022 Alessandro Iezzi * * This file is part of commons-page. * * commons-page is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * commons-page is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with commons-page. If not, see . */ package it.alessandroiezzi.util; import java.util.*; public class PagedList extends ArrayList implements Page { private final int pageSize; private int pageNumber; private boolean pageChanged = false; private Page currentPage; public PagedList(Collection elements, int pageSize) { addAll(elements); this.pageSize = pageSize; this.pageNumber = 0; } public PagedList(Collection elements) { this(elements, 15); } public Page firstPage() { return toPage(0); } public Page lastPage() { return toPage(getTotalPages() - 1); } public Page previousPage() { return toPage(pageNumber - 1); } public Page nextPage() { return toPage(pageNumber + 1); } public Page toPage(int page) { if (page < 0) { page = 0; } else if (page >= getTotalPages()) { page = getTotalPages() - 1; } int totalElements = getNumberOfElements(); int startIndex = page * pageSize; if (startIndex > totalElements) { startIndex = totalElements; } int count = startIndex + pageSize; if (count > totalElements) { count = totalElements; } pageChanged = page != pageNumber; pageNumber = page; List subElements = subList(startIndex, count); currentPage = Page.of(subElements, pageSize); return currentPage; } public Page getCurrentPage() { return currentPage; } public int getCurrentPageNumber() { return pageNumber; } public boolean isPageChanged() { return pageChanged; } public int firstRowNumber() { return (pageNumber * pageSize) + 1; } public int lastRowNumber() { int currentSize = getContent().size(); return currentSize < pageSize ? getNumberOfElements() : (pageNumber + 1) * currentSize; } public List getContent() { return getCurrentPage().getContent(); } public int getPageSize() { return pageSize; } public int getNumberOfElements() { return size(); } public int getTotalPages() { double pages = (double) getNumberOfElements() / (double) getPageSize(); int pagesInt = (int) pages; if (pages > pagesInt) pagesInt++; return pagesInt; } }