/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/assignment/trunk/assignment-tool/tool/src/java/org/sakaiproject/assignment/taggable/tool/DecoratedTaggingProvider.java $ * $Id: DecoratedTaggingProvider.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2007, 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.assignment.taggable.tool; import java.util.ArrayList; import java.util.List; import org.sakaiproject.taggable.api.Tag; import org.sakaiproject.taggable.api.TagColumn; import org.sakaiproject.taggable.api.TagList; import org.sakaiproject.taggable.api.TaggableActivity; import org.sakaiproject.taggable.api.TaggingProvider; /** * Wrapper around {@link TaggingProvider} for displaying a pageable/sortable * list of tags for an activity or item. Since there may be multiple providers * each with a list of tags displayed on a single page, this class enables each * provider to maintain the page/sort state of its list separate from others. * * @author The Sakai Foundation. */ public class DecoratedTaggingProvider { TaggingProvider provider; Sort sort; Pager pager; TaggableActivity lastActivity; TagList tagList; protected final static int[] PAGESIZES = { 5, 10, 20, 50, 100, 200 }; public DecoratedTaggingProvider(TaggingProvider provider) { this.provider = provider; sort = new Sort("", true); } public TaggingProvider getProvider() { return provider; } public Sort getSort() { return sort; } public Pager getPager() { return pager; } protected TagList getTagList(TaggableActivity activity) { if (!activity.equals(lastActivity)) { sort = new Sort("", true); pager = null; tagList = null; lastActivity = activity; } if (tagList == null) { tagList = provider.getTags(activity); } return tagList; } public List<TagColumn> getColumns(TaggableActivity activity) { return getTagList(activity).getColumns(); } public List<Tag> getTags(TaggableActivity activity) { TagList list = getTagList(activity); List<Tag> tags = new ArrayList<Tag>(); if (pager == null) { pager = new Pager((list == null) ? 0 : list.size(), 0, 20); } if (list != null) { list.sort(list.getColumn(sort.getSort()), sort.isAscending()); tags = list .subList(pager.getFirstItem(), pager.getLastItemNumber()); } return tags; } public class Sort { protected String sortString = ""; protected boolean ascending = true; public Sort(String sort, boolean ascending) { sortString = sort; this.ascending = ascending; } public boolean isAscending() { return ascending; } public void setAscending(boolean ascending) { this.ascending = ascending; } public String getSort() { return sortString; } public void setSort(String sort) { sortString = sort; } } public class Pager { protected int totalItems; protected int firstItem; protected int pageSize; public static final String FIRST = "|<", PREVIOUS = "<", NEXT = ">", LAST = ">|"; public Pager(int totalItems, int firstItem, int pageSize) { this.totalItems = totalItems; this.firstItem = firstItem; this.pageSize = pageSize; } public int getFirstItemNumber() { return firstItem + 1; } public int getLastItemNumber() { int n = firstItem + pageSize; return (totalItems < n ? totalItems : n); } public boolean canFirst() { return firstItem > 0; } public boolean canPrevious() { return canFirst(); } public boolean canNext() { return getLastItemNumber() < totalItems; } public boolean canLast() { return canNext(); } public int[] getPageSizes() { return PAGESIZES; } public int getFirstItem() { return firstItem; } public void setFirstItem(int firstItem) { this.firstItem = firstItem; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalItems() { return totalItems; } public void setTotalItems(int totalItems) { this.totalItems = totalItems; } } }