/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/metaobj/trunk/metaobj-util/tool-lib/src/java/org/sakaiproject/metaobj/utils/mvc/impl/ListScrollIndexerImpl.java $
* $Id: ListScrollIndexerImpl.java 130481 2013-10-15 17:36:54Z dsobiera@indiana.edu $
***********************************************************************************
*
* Copyright (c) 2004, 2005, 2006, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.metaobj.utils.mvc.impl;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.metaobj.utils.mvc.intf.ListScroll;
import org.sakaiproject.metaobj.utils.mvc.intf.ListScrollIndexer;
import org.sakaiproject.metaobj.utils.mvc.intf.ListScrollResultsFilter;
import org.sakaiproject.metaobj.utils.mvc.intf.FilterableListScrollIndexer;
public class ListScrollIndexerImpl implements ListScrollIndexer, FilterableListScrollIndexer {
protected final transient Log logger = LogFactory.getLog(getClass());
private int perPage;
//private ListScrollPageProcessor pageProcessor;
public List indexList(Map request, Map model, List sourceList) {
return indexList( request, model, sourceList, false );
}
public List indexList(Map request, Map model, List sourceList, boolean hideOnePageScroll) {
return indexList( request, model, sourceList, false, null );
}
/**
** Create sublist from given list of items to allow paging (i.e. scrolling) through a list
**
** @param request (input) request parameters
** @param model (output) presentation parameters
** @param sourceList list of items
** @param hideOnePageScroll if true, do not display scroll buttons if not needed
**/
public List indexList(Map request, Map model, List sourceList, boolean hideOnePageScroll, ListScrollResultsFilter pageFilter) {
int startingIndex = 0;
int total = sourceList.size();
boolean hideRecCounts = false;
String ensureVisible = (String) request.get(ListScroll.ENSURE_VISIBLE_TAG);
if (ensureVisible != null) {
int visibleIndex = Integer.parseInt(ensureVisible);
int startingPage = (visibleIndex / perPage);
startingIndex = startingPage * perPage;
}
else {
String newStart = (String) request.get(ListScroll.STARTING_INDEX_TAG);
if (newStart != null) {
startingIndex = Integer.parseInt(newStart);
if (startingIndex < 0) {
startingIndex = 0;
}
}
}
if (startingIndex > total) {
int lastPage = (int) Math.ceil(((double) total) / ((double) perPage));
lastPage--;
startingIndex = lastPage * perPage;
}
int endingIndex = startingIndex + perPage;
if (endingIndex > sourceList.size()) {
endingIndex = sourceList.size();
}
int virtualPreviousIndex = ListScroll.NO_VIRTUAL_INDEX;
int virtualNextIndex = ListScroll.NO_VIRTUAL_INDEX;
boolean processPreviousFromEnd = false;
boolean processLastFromEnd = false;
List subList;
if (pageFilter != null){
String reverseList = (String)request.get(ListScroll.REVERSE_PROCESS_LIST_TAG);
boolean startAtFront = true;
if (reverseList != null && "true".equals(reverseList)) {
startAtFront = false;
}
ListScrollResultBean bean = pageFilter.process(request, model, sourceList, startingIndex, perPage, startAtFront);
subList = bean.getItemList();
logger.debug("Processed: " + bean.getRecordsProcessed());
logger.debug("Skipped: " + bean.getRecordsSkipped());
logger.debug("Returned: " + bean.getRecordsReturned());
logger.debug("Alt Starting Index: " + bean.getAltStartIndex());
startingIndex = bean.getAltStartIndex();
virtualNextIndex = startingIndex + bean.getRecordsProcessed();
if (!startAtFront) {
//need to account for switching to the other direction
virtualNextIndex++;
virtualPreviousIndex = startingIndex;
}
else {
virtualPreviousIndex = startingIndex - 1;
}
hideRecCounts = true;
processPreviousFromEnd = true;
processLastFromEnd = true;
logger.debug("Next previous will be: " + virtualPreviousIndex);
logger.debug("Next next will be: " + virtualNextIndex);
}
else
subList = sourceList.subList(startingIndex, endingIndex);
model.put("listScroll", new ListScroll(perPage, sourceList.size(), startingIndex, hideOnePageScroll, hideRecCounts,
virtualPreviousIndex, virtualNextIndex, processPreviousFromEnd, processLastFromEnd));
return subList;
}
public int getPerPage() {
return perPage;
}
public void setPerPage(int perPage) {
this.perPage = perPage;
}
//
// public ListScrollPageProcessor getPageProcessor() {
// return pageProcessor;
// }
//
// public void setPageProcessor(ListScrollPageProcessor pageProcessor) {
// this.pageProcessor = pageProcessor;
// }
}