/* ********************************************************************** **
** Copyright notice **
** **
** (c) 2005-2009 RSSOwl Development Team **
** http://www.rssowl.org/ **
** **
** All rights reserved **
** **
** This program and the accompanying materials are made available under **
** the terms of the Eclipse Public License v1.0 which accompanies this **
** distribution, and is available at: **
** http://www.rssowl.org/legal/epl-v10.html **
** **
** A copy is found in the file epl-v10.html and important notices to the **
** license from the team is found in the textfile LICENSE.txt distributed **
** in this package. **
** **
** This copyright notice MUST APPEAR in all copies of the file! **
** **
** Contributors: **
** RSSOwl Development Team - initial API and implementation **
** **
** ********************************************************************** */
package org.rssowl.ui.internal.views.explorer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.rssowl.core.persist.IFolder;
import org.rssowl.core.persist.IFolderChild;
import org.rssowl.core.persist.IMark;
import org.rssowl.ui.internal.EntityGroup;
import java.util.Date;
/**
* @author bpasero
*/
public class BookMarkSorter extends ViewerComparator {
/* Return this is the sort should be skipped for two elements */
private static final int SKIP_SORT = 0;
/** Sort Type */
public enum Type {
/** Apply Default Sorting */
DEFAULT_SORTING,
/** Sort by Name */
SORT_BY_NAME,
/** Sort by Popularity */
SORT_BY_POPULARITY,
/** Sort by Last Visit Date */
SORT_BY_LAST_VISIT_DATE
}
/* The current Sorter Type */
private Type fType = Type.DEFAULT_SORTING;
/**
* @param type the type of sorting as described by {@link BookMarkSorter.Type}
*/
public void setType(BookMarkSorter.Type type) {
fType = type;
}
BookMarkSorter.Type getType() {
return fType;
}
/*
* @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
*/
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
/* Skip Sort for two Folder Childs if default sorting */
if (fType == Type.DEFAULT_SORTING && e1 instanceof IFolderChild && e2 instanceof IFolderChild)
return SKIP_SORT;
/* Compare two Folders */
else if (e1 instanceof IFolder && e2 instanceof IFolder)
return compareFolders((IFolder) e1, (IFolder) e2);
/* Compare two Marks */
else if (e1 instanceof IMark && e2 instanceof IMark)
return compareMarks((IMark) e1, (IMark) e2);
/* Compare two EntityGroups */
else if (e1 instanceof EntityGroup && e2 instanceof EntityGroup)
return compareGroups((EntityGroup) e1, (EntityGroup) e2);
return super.compare(viewer, e1, e2);
}
/*
* @see org.eclipse.jface.viewers.ViewerComparator#category(java.lang.Object)
*/
@Override
public int category(Object element) {
/* Sort Folders to the Top */
if (element instanceof IFolder)
return 0;
return 1;
}
private int compareFolders(IFolder folder1, IFolder folder2) {
/* Sort by Name */
if (fType == Type.SORT_BY_NAME)
return folder1.getName().toLowerCase().compareTo(folder2.getName().toLowerCase());
return SKIP_SORT;
}
private int compareMarks(IMark mark1, IMark mark2) {
/* Sort by Name */
if (fType == Type.SORT_BY_NAME)
return mark1.getName().toLowerCase().compareTo(mark2.getName().toLowerCase());
/* Sort by Last Visit Date (descending) */
else if (fType == Type.SORT_BY_LAST_VISIT_DATE) {
Date d1 = mark1.getLastVisitDate();
Date d2 = mark2.getLastVisitDate();
if (d1 != null && d2 != null)
return d2.compareTo(d1);
else if (d2 != null)
return -1;
else if (d1 != null)
return 1;
}
/* Sort by Popularity (descending) */
else if (fType == Type.SORT_BY_POPULARITY) {
int p1 = mark1.getPopularity();
int p2 = mark2.getPopularity();
if (p1 != p2)
return p2 > p1 ? -1 : 1;
}
return SKIP_SORT;
}
private int compareGroups(EntityGroup g1, EntityGroup g2) {
return g1.getId() < g2.getId() ? -1 : 1;
}
}