001/* 002 * #%L 003 * Netarchivesuite - heritrix 3 monitor 004 * %% 005 * Copyright (C) 2005 - 2018 The Royal Danish Library, 006 * the National Library of France and the Austrian National Library. 007 * %% 008 * This program is free software: you can redistribute it and/or modify 009 * it under the terms of the GNU Lesser General Public License as 010 * published by the Free Software Foundation, either version 2.1 of the 011 * License, or (at your option) any later version. 012 * 013 * This program is distributed in the hope that it will be useful, 014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 016 * GNU General Lesser Public License for more details. 017 * 018 * You should have received a copy of the GNU General Lesser Public 019 * License along with this program. If not, see 020 * <http://www.gnu.org/licenses/lgpl-2.1.html>. 021 * #L% 022 */ 023 024package dk.netarkivet.heritrix3.monitor; 025 026/** 027 * Builds a pagination HTML text block using twitter-bootstrap styles. 028 * 029 * <div class="pagination pull-right"> 030 * <ul> 031 * <li class="disabled"><span>Previous</span></li> 032 * <li class="active"><span>1</span></li> 033 * <li><a href="#">2</a></li> 034 * <li><a href="#">3</a></li> 035 * <li class="disabled"><span>...</span></li> 036 * <li><a href="#">8</a></li> 037 * <li><a href="#">9</a></li> 038 * <li><a href="#">10</a></li> 039 * <li><a href="#">Next</a></li> 040 * </ul> 041 * </div> 042 */ 043public class Pagination { 044 045 /** 046 * Calculate the total number of pages. 047 * @param items total number of items 048 * @param itemsPerPage items displayed per page 049 * @return the total number of pages 050 */ 051 public static long getPages(long items, long itemsPerPage) { 052 long pages = (items + itemsPerPage - 1) / itemsPerPage; 053 if (pages == 0) { 054 pages = 1; 055 } 056 return pages; 057 } 058 059 /** 060 * Builds a pagination HTML text block. 061 * 062 * @param page current page 063 * @param itemsPerPage items displayed per page 064 * @param pages total number of pages 065 * @return HTML text block 066 */ 067 public static String getPagination(long page, long itemsPerPage, long pages, boolean bShowAll, String additionalParams) { 068 if (page < 1) { 069 page = 1; 070 } 071 if (pages == 0) { 072 pages = 1; 073 } 074 if (page > pages) { 075 page = pages; 076 } 077 StringBuilder sb = new StringBuilder(); 078 sb.append("<div class=\"pagination pull-right\">\n"); 079 sb.append("<ul>\n"); 080 // Previous 081 if (page > 1) { 082 sb.append("<li><a href=\"?page=" + (page - 1) + "&itemsperpage=" + itemsPerPage + additionalParams + "\">Previous</a></li>"); 083 } else { 084 sb.append("<li class=\"disabled\"><span>Previous</span></li>"); 085 } 086 // First. 087 if (page == 1) { 088 sb.append("<li class=\"active\"><span>" + 1 + "</span></li>"); 089 } else { 090 sb.append("<li><a href=\"?page=" + 1 + "&itemsperpage=" + itemsPerPage + additionalParams + "\">" + 1 + "</a></li>"); 091 } 092 // List. 093 long tmpPage = page - 3; 094 if (tmpPage > pages - 7) { 095 tmpPage = pages - 7; 096 } 097 if (tmpPage > 2) { 098 sb.append("<li class=\"disabled\"><span>...</span></li>"); 099 } else { 100 tmpPage = 2; 101 } 102 int show = 8; 103 while (show > 1 && tmpPage <= pages) { 104 if (tmpPage == page) { 105 sb.append("<li class=\"active\"><span>" + tmpPage + "</span></li>"); 106 } else { 107 sb.append("<li><a href=\"?page=" + tmpPage + "&itemsperpage=" + itemsPerPage + additionalParams + "\">" + tmpPage + "</a></li>"); 108 } 109 --show; 110 tmpPage++; 111 } 112 // Last 113 if (tmpPage <= pages) { 114 if (tmpPage < pages) { 115 sb.append("<li class=\"disabled\"><span>...</span></li>"); 116 } 117 if (tmpPage == page) { 118 sb.append("<li class=\"active\"><span>" + pages + "</span></li>"); 119 } else { 120 sb.append("<li><a href=\"?page=" + pages + "&itemsperpage=" + itemsPerPage + additionalParams + "\">" + pages + "</a></li>"); 121 } 122 } 123 // Next. 124 if (page < pages) { 125 sb.append("<li><a href=\"?page=" + (page + 1) + "&itemsperpage=" + itemsPerPage + additionalParams + "\">Next</a></li>"); 126 } else { 127 sb.append("<li class=\"disabled\"><span>Next</span></li>"); 128 } 129 // Items per page. 130 /* 131 sb.append("<li>"); 132 String[][] options = new String[][] {{"10", "10"}, {"25", "25"}, {"50", "50"}, {"100", "100"}, {"all", "Vis alle"}}; 133 int selected; 134 if (bShowAll) { 135 selected = options.length - 1; 136 } else { 137 switch ((int)itemsPerPage) { 138 case 10: 139 selected = 0; 140 break; 141 default: 142 case 25: 143 selected = 1; 144 break; 145 case 50: 146 selected = 2; 147 break; 148 case 100: 149 selected = 3; 150 break; 151 } 152 } 153 sb.append("<select name=\"itemsperpage\" class=\"input-mini\" onchange=\"this.form.submit();\">"); 154 for (int i=0; i<options.length; ++i) { 155 sb.append("<option value=\""); 156 sb.append(options[i][0]); 157 sb.append("\""); 158 if (i == selected) { 159 sb.append(" selected=\"1\""); 160 } 161 sb.append(">"); 162 sb.append(options[i][1]); 163 sb.append("</option>"); 164 } 165 sb.append("</select>"); 166 sb.append("</li>"); 167 */ 168 sb.append("</ul>\n"); 169 sb.append("</div>\n"); 170 return sb.toString(); 171 } 172 173}