/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package edu.harvard.iq.dataverse.mydata; import com.google.gson.JsonArray; import edu.harvard.iq.dataverse.search.SearchConstants; import java.io.IOException; import static java.lang.Math.max; import static java.lang.Math.min; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; import javax.json.Json; import javax.json.JsonArrayBuilder; import javax.json.JsonBuilderFactory; import javax.json.JsonObjectBuilder; import org.primefaces.json.JSONException; import org.primefaces.json.JSONObject; /** * * @author rmp553 */ public class Pager { public final int NUM_VISIBLE_PAGES_BUTTONS = 5; public int PAGE_BUTTONS_TO_SHOW = 5; /* inputs */ public int numResults; public int docsPerPage = SearchConstants.NUM_SOLR_DOCS_TO_RETRIEVE; public int selectedPageNumber = 1; /* calculated */ public int pageCount = 0; public int[] pageNumberList = null; public int previousPageNumber = 0; public int nextPageNumber = 0; public int startCardNumber = 0; public int endCardNumber = 0; public int remainingCards = 0; public int numberNextResults =0; public Pager(int numResults, int docsPerPage, int selectedPageNumber) { if (numResults < 0){ throw new IllegalArgumentException("numResults must be 0 or higher"); } if (docsPerPage < 1){ throw new IllegalArgumentException("docsPerPage must be 1 or higher"); } if (selectedPageNumber < 1){ throw new IllegalArgumentException("selectedPageNumber must be 1 or higher"); } this.numResults = numResults; this.docsPerPage = docsPerPage; this.selectedPageNumber = selectedPageNumber; makePageStats(); } private void makePageStats(){ if (numResults == 0){ this.selectedPageNumber = 0; return; } // page count this.pageCount = numResults / docsPerPage; if ((this.numResults % this.docsPerPage) > 0){ this.pageCount++; } // Sanity check for the selected page if (this.selectedPageNumber > this.pageCount){ this.selectedPageNumber = 1; } // page number list /*this.pageNumberList = new int[pageCount]; for(int i=0; i<this.pageCount; i++){ this.pageNumberList[i] = i + 1; }*/ makePageNumberList(); // prev/next page numbers this.previousPageNumber = max(this.selectedPageNumber-1, 1); // must be at least 1 this.nextPageNumber = min(this.selectedPageNumber+1, this.pageCount); // must be at least 1 this.nextPageNumber = max(this.nextPageNumber, 1); // start/end card numbers this.startCardNumber = (this.docsPerPage * (this.selectedPageNumber - 1)) + 1; if (this.numResults == 0){ this.endCardNumber = 0; }else{ this.endCardNumber = min(this.startCardNumber + (this.docsPerPage-1), this.numResults ); } this.remainingCards = this.numResults - this.endCardNumber; this.remainingCards = max(this.remainingCards, 0); if (this.remainingCards > 0){ if (this.remainingCards < this.docsPerPage){ this.numberNextResults = this.remainingCards; }else{ this.numberNextResults = this.docsPerPage; } } } public boolean isPagerNecessary(){ if (this.pageCount > 1){ return true; } return false; } public boolean hasPreviousPageNumber(){ return this.selectedPageNumber > 1; } public boolean hasNextPageNumber(){ if (this.pageCount > 1){ if (selectedPageNumber < this.pageCount){ return true; } } return false; } /** * get numResults * @return */ public int getNumResults(){ return this.numResults; } /** * @param numResults */ public void setNumResults(int numResults){ this.numResults = numResults; } /** * get docsPerPage * @return */ public int getDocsPerPage(){ return this.docsPerPage; } /** * @param docsPerPage */ public void setDocsPerPage(int docsPerPage){ this.docsPerPage = docsPerPage; } /** * get selectedPageNumber * @return */ public int getSelectedPageNumber(){ return this.selectedPageNumber; } /** * @param selectedPageNumber */ public void setSelectedPageNumber(int selectedPageNumber){ this.selectedPageNumber = selectedPageNumber; } /** * get pageCount * @return */ public int getPageCount(){ return this.pageCount; } /** * @param pageCount */ public void setPageCount(int pageCount){ this.pageCount = pageCount; } /** * get getPageNumberListAsStringList * @return */ public List<String> getPageNumberListAsStringList(){ List<String> newList = new ArrayList<String>(pageNumberList.length); for (int pgNum : pageNumberList) { newList.add(String.valueOf(pgNum)); } return newList; } /** * get pageNumberList * @return */ public int[] getPageNumberList(){ return this.pageNumberList; } /** * @param pageNumberList */ public void setPageNumberList(int[] pageNumberList){ this.pageNumberList = pageNumberList; } /** * get previousPageNumber * @return */ public int getPreviousPageNumber(){ return this.previousPageNumber; } /** * @param previousPageNumber */ public void setPreviousPageNumber(int previousPageNumber){ this.previousPageNumber = previousPageNumber; } /** * get nextPageNumber * @return */ public int getNextPageNumber(){ return this.nextPageNumber; } /** * @param nextPageNumber */ public void setNextPageNumber(int nextPageNumber){ this.nextPageNumber = nextPageNumber; } /** * get startCardNumber * @return */ public int getStartCardNumber(){ return this.startCardNumber; } /** * @param startCardNumber */ public void setStartCardNumber(int startCardNumber){ this.startCardNumber = startCardNumber; } /** * get endCardNumber * @return */ public int getEndCardNumber(){ return this.endCardNumber; } /** * @param endCardNumber */ public void setEndCardNumber(int endCardNumber){ this.endCardNumber = endCardNumber; } public void showClasspaths(){ ClassLoader cl = ClassLoader.getSystemClassLoader(); URL[] urls = ((URLClassLoader)cl).getURLs(); for(URL url: urls){ System.out.println(url.getFile()); } } public String asJSONString(){ return this.asJsonObjectBuilder().build().toString(); } public JsonObjectBuilder asJsonObjectBuilder(){ JsonObjectBuilder jsonPageInfo = Json.createObjectBuilder(); jsonPageInfo.add("isNecessary", this.isPagerNecessary()) .add("numResults", this.numResults) .add("docsPerPage", this.docsPerPage) .add("selectedPageNumber", this.selectedPageNumber) .add("pageCount", this.pageCount) .add("hasPreviousPageNumber", this.hasPreviousPageNumber()) .add("previousPageNumber", this.previousPageNumber) .add("hasNextPageNumber", this.hasNextPageNumber()) .add("nextPageNumber", this.nextPageNumber) .add("startCardNumber", this.startCardNumber) .add("endCardNumber", this.endCardNumber) .add("remainingCards", this.remainingCards) .add("numberNextResults", this.numberNextResults); // -------------------- // pageNumberList // -------------------- JsonArrayBuilder jsonPageNumberArrayBuilder = Json.createArrayBuilder(); for (int pg : this.pageNumberList){ jsonPageNumberArrayBuilder.add(pg); } jsonPageInfo.add("pageNumberList", jsonPageNumberArrayBuilder); // -------------------- return jsonPageInfo; } private void makePageNumberList(){ if (this.numResults < 1){ return; } // In this case, there are 1 to 5 pages // if ((this.pageCount <= NUM_VISIBLE_PAGES_BUTTONS)||(this.selectedPageNumber <= 3)){ int numButtons = min(this.pageCount, NUM_VISIBLE_PAGES_BUTTONS); this.pageNumberList = new int[numButtons]; for(int i=0; i < numButtons; i++){ this.pageNumberList[i] = i + 1; } return; } // In this case, there are more than 5 pages // // Example: page 7 of 8 // int defaultButtonsToRight = 2; this.pageNumberList = new int[NUM_VISIBLE_PAGES_BUTTONS]; // 8 - 7 = 1 int buttonsToRight = this.pageCount - this.selectedPageNumber; if (buttonsToRight < 0){ throw new IllegalStateException("Page count cannot be less than the selected page"); } int startPage; if (buttonsToRight >= defaultButtonsToRight){ startPage = this.selectedPageNumber - defaultButtonsToRight; }else{ // 7 -2 -1 = 4 - start on page 4 startPage = this.selectedPageNumber - (defaultButtonsToRight-buttonsToRight) - defaultButtonsToRight; } for(int i=0; i< NUM_VISIBLE_PAGES_BUTTONS; i++){ this.pageNumberList[i] = i + startPage; } } public static void main(String[] args) throws IOException { Pager pager = new Pager(100, 10, 1); } private void msg(String s){ //System.out.println(s); } private void msgt(String s){ msg("-------------------------------"); msg(s); msg("-------------------------------"); } }