summaryrefslogtreecommitdiff
path: root/src/main/java/it/alessandroiezzi/util
diff options
context:
space:
mode:
authorAlessandro Iezzi <aiezzi@alessandroiezzi.it>2022-11-30 16:54:34 +0100
committerAlessandro Iezzi <aiezzi@alessandroiezzi.it>2022-11-30 16:54:34 +0100
commit358de8292351521454ec574913da64f55c29302f (patch)
tree4e21fb2be73bbfb7781edda5145c46c342686d1f /src/main/java/it/alessandroiezzi/util
parentfbffd02a4fd94587b1bf8f9428fd4bc237b8973c (diff)
downloadcommons-page-358de8292351521454ec574913da64f55c29302f.tar.gz
commons-page-358de8292351521454ec574913da64f55c29302f.zip
Change package
Diffstat (limited to 'src/main/java/it/alessandroiezzi/util')
-rw-r--r--src/main/java/it/alessandroiezzi/util/page/PageAdapter.java172
-rw-r--r--src/main/java/it/alessandroiezzi/util/page/PageChangeListener.java26
2 files changed, 198 insertions, 0 deletions
diff --git a/src/main/java/it/alessandroiezzi/util/page/PageAdapter.java b/src/main/java/it/alessandroiezzi/util/page/PageAdapter.java
new file mode 100644
index 0000000..ab2e343
--- /dev/null
+++ b/src/main/java/it/alessandroiezzi/util/page/PageAdapter.java
@@ -0,0 +1,172 @@
+/*
+ * 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.page;
+
+import it.alessandroiezzi.util.*;
+
+import java.util.*;
+import java.util.function.*;
+
+public class PageAdapter<T> implements Pages<T> {
+ private final List<T> elements;
+ private final int pageSize;
+ private int pageNumber;
+ private PageChangeListener<T> pageChangeListener;
+ boolean pageChanged = false;
+ private Page<T> currentPage;
+
+ public PageAdapter(List<T> elements) {
+ this(elements, 15);
+ }
+
+ public PageAdapter(List<T> elements, int pageSize) {
+ this.elements = elements;
+ this.pageSize = pageSize;
+ this.pageNumber = 0;
+ }
+
+ @Override
+ public Page<T> firstPage() {
+ return toPage(0);
+ }
+
+ @Override
+ public Page<T> previousPage() {
+ return toPage(pageNumber - 1);
+ }
+
+ @Override
+ public Page<T> nextPage() {
+ return toPage(pageNumber + 1);
+ }
+
+ @Override
+ public Page<T> lastPage() {
+ return toPage(getTotalPages() - 1);
+ }
+
+ @Override
+ 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 = elements.subList(startIndex, count);
+ currentPage = Page.of(subElements, pageSize);
+
+ if (pageChangeListener != null && pageChanged) {
+ pageChangeListener.pageChanged(new ArrayList<>(subElements), pageSize);
+ }
+
+ return currentPage;
+ }
+
+ @Override
+ public Page<T> getCurrentPage() {
+ return currentPage;
+ }
+
+ @Override
+ public int getCurrentPageNumber() {
+ return pageNumber;
+ }
+
+ @Override
+ public List<T> getContent() {
+ return getCurrentPage().getContent();
+ }
+
+ @Override
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ @Override
+ public int getNumberOfElements() {
+ return elements.size();
+ }
+
+ @Override
+ public void addElement(T element) {
+ elements.add(element);
+ }
+
+ @Override
+ public void removeElement(T element) {
+ elements.remove(element);
+ }
+
+ @Override
+ public void removeElementIf(Predicate<T> predicate) {
+ elements.removeIf(predicate);
+ }
+
+ @Override
+ public int getTotalPages() {
+ double pages = (double) getNumberOfElements() / (double) getPageSize();
+ int pagesInt = (int) pages;
+
+ if (pages > pagesInt)
+ pagesInt++;
+
+ return pagesInt;
+ }
+
+ @Override
+ public void addPageChangeListener(PageChangeListener<T> pageChangeListener) {
+ this.pageChangeListener = pageChangeListener;
+ }
+
+ @Override
+ public List<T> getAllElements() {
+ return elements;
+ }
+
+ @Override
+ public boolean isPageChanged() {
+ return pageChanged;
+ }
+
+ @Override
+ public int from() {
+ return (pageNumber * pageSize) + 1;
+ }
+
+ @Override
+ public int to() {
+ int currentSize = getContent().size();
+ return currentSize < pageSize ? getNumberOfElements() : (pageNumber + 1) * currentSize;
+ }
+}
diff --git a/src/main/java/it/alessandroiezzi/util/page/PageChangeListener.java b/src/main/java/it/alessandroiezzi/util/page/PageChangeListener.java
new file mode 100644
index 0000000..35c0642
--- /dev/null
+++ b/src/main/java/it/alessandroiezzi/util/page/PageChangeListener.java
@@ -0,0 +1,26 @@
+/*
+ * 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.page;
+
+import java.util.*;
+
+public interface PageChangeListener<T> {
+ void pageChanged(List<T> elements, int pageSize);
+}