【Java开源代码栏目提醒】:网学会员为需要Java开源代码的朋友们搜集整理了ArchiveEditorSorter.java相关资料,希望对各位网友有所帮助!
package cn.com.chengang.sms.archive;
import java.util.Date;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import cn.com.chengang.sms.model.IUser;
import cn.com.chengang.sms.model.SchoolClass;
import cn.com.chengang.sms.model.Student;
public class ArchiveEditorSorter extends ViewerSorter {
// 每列对应一个不同的常量,正数表示要升序、相反数表示要降序
public static final int ID = 1;
public static final int USERID = 2;
public static final int LATEST_ONLINE = 3;
public static final int SCHOOLCLASS = 4;
// 给外界使用排序器对象
public static final ViewerSorter ID_ASC = new ArchiveEditorSorter(ID);
public static final ViewerSorter ID_DESC = new ArchiveEditorSorter(-ID);
public static final ViewerSorter USERID_ASC = new ArchiveEditorSorter(USERID);
public static final ViewerSorter USERID_DESC = new ArchiveEditorSorter(-USERID);
public static final ViewerSorter LATESTONLINE_ASC = new ArchiveEditorSorter(LATEST_ONLINE);
public static final ViewerSorter LATESTONLINE_DESC = new ArchiveEditorSorter(-LATEST_ONLINE);
public static final ViewerSorter SCHOOLCLASS_ASC = new ArchiveEditorSorter(SCHOOLCLASS);
public static final ViewerSorter SCHOOLCLASS_DESC = new ArchiveEditorSorter(-SCHOOLCLASS);
private int sortType;// 当前所要排序的列,取自上面的ID、USERID两值或其相反数
// 构造函数用private,表示不能在外部创建ArchiveEditorSorter对象
private ArchiveEditorSorter(int sortType) {
this.sortType = sortType;
}
// 最关键的比较方法compare,改写自ViewerSorter。方法返回值是一个int值:正数则
// obj1移到obj2之前;零则obj1和obj2的位置不动;负数则obj1移到obj2之后
public int compare(Viewer viewer, Object obj1, Object obj2) {
IUser o1 = (IUser) obj1;
IUser o2 = (IUser) obj2;
switch (sortType) {
case ID:
return o1.getId().compareTo(o2.getId());
case -ID:
return o2.getId().compareTo(o1.getId());
case USERID:
return o1.getUserId().compareTo(o2.getUserId());
case -USERID:
return o2.getUserId().compareTo(o1.getUserId());
case LATEST_ONLINE:
return compareLatestOnline(o1, o2);
case -LATEST_ONLINE:
return compareLatestOnline(o2, o1);
case SCHOOLCLASS:
// 因为此字段存在空值,所以排序算法要麻烦一些。不处理会出现空值记录原地不动的情况
return compareSchoolClass(o1, o2);
case -SCHOOLCLASS:
return compareSchoolClass(o2, o1);
}
return 0;
}
// 最后登录时间的比较
private int compareLatestOnline(IUser o1, IUser o2) {
Date d1 = o1.getLatestOnline();
Date d2 = o2.getLatestOnline();
if (d1 == null)
d1 = new Date(1);
if (d2 == null)
d2 = new Date(1);
return d1.compareTo(d2);
}
// 班级的比较
private int compareSchoolClass(IUser o1, IUser o2) {
Long l1 = new Long(-1);
Long l2 = new Long(-1);
if (o1 instanceof Student) {// 教师型用户没有班级属性
SchoolClass class1 = ((Student) o1).getSchoolclass();
l1 = (class1 == null ? new Long(0) : class1.getId());
}
if (o2 instanceof Student) {
SchoolClass class2 = ((Student) o2).getSchoolclass();
l2 = (class2 == null ? new Long(0) : class2.getId());
}
return l1.compareTo(l2);
}
}