summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/it/alessandroiezzi/util/PagedList.java135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/main/java/it/alessandroiezzi/util/PagedList.java b/src/main/java/it/alessandroiezzi/util/PagedList.java
new file mode 100644
index 0000000..5cfbe9b
--- /dev/null
+++ b/src/main/java/it/alessandroiezzi/util/PagedList.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2022 Alessandro Iezzi <aiezzi AT alessandroiezzi PERIOD it>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+package it.alessandroiezzi.util;
+
+import it.alessandroiezzi.commons.page.*;
+
+import java.util.*;
+
+public class PagedList<T> extends ArrayList<T> implements Page<T> {
+ private final int pageSize;
+ private int pageNumber;
+ private PageChangeListener<T> pageChangeListener;
+ boolean pageChanged = false;
+ private Page<T> currentPage;
+
+ public PagedList(List<T> elements, int pageSize) {
+ addAll(elements);
+ this.pageSize = pageSize;
+ this.pageNumber = 0;
+ }
+
+ public PagedList(List<T> elements) {
+ this(elements, 15);
+ }
+
+ public Page<T> firstPage() {
+ return toPage(0);
+ }
+
+ public Page<T> lastPage() {
+ return toPage(getTotalPages() - 1);
+ }
+
+ public Page<T> previousPage() {
+ return toPage(pageNumber - 1);
+ }
+
+ public Page<T> nextPage() {
+ return toPage(pageNumber + 1);
+ }
+
+ public Page<T> 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<T> subElements = subList(startIndex, count);
+ currentPage = Page.of(subElements, pageSize);
+
+ if (pageChangeListener != null && pageChanged) {
+ pageChangeListener.pageChanged(new ArrayList<>(subElements), pageSize);
+ }
+
+ return currentPage;
+ }
+
+ public Page<T> getCurrentPage() {
+ return currentPage;
+ }
+
+ public int getCurrentPageNumber() {
+ return pageNumber;
+ }
+
+ public void addPageChangeListener(PageChangeListener<T> pageChangeListener) {
+ this.pageChangeListener = pageChangeListener;
+ }
+
+ 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<T> 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;
+ }
+}