blob: 9dd381cc6b052b8f3fbe0860ba017e465e8354c5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 - 2006 University Of British Columbia and others.
* 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.eclipse.org/legal/epl-v10.html
*
* Contributors:
* University Of British Columbia - initial API and implementation
*******************************************************************************/
package org.eclipse.mylar.internal.context.ui;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.mylar.internal.tasks.ui.views.TaskKeyComparator;
import org.eclipse.mylar.internal.tasks.ui.views.TaskListTableSorter;
import org.eclipse.mylar.tasks.core.AbstractQueryHit;
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
import org.eclipse.mylar.tasks.core.AbstractTaskContainer;
import org.eclipse.mylar.tasks.core.DateRangeContainer;
import org.eclipse.mylar.tasks.core.ITask;
import org.eclipse.mylar.tasks.core.ITaskListElement;
import org.eclipse.mylar.tasks.core.TaskArchive;
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
/**
* @author Mik Kersten
*/
public class TaskListInterestSorter extends ViewerSorter {
private TaskKeyComparator taskKeyComparator = new TaskKeyComparator();
@Override
public int compare(Viewer compareViewer, Object o1, Object o2) {
if (o1 instanceof AbstractTaskContainer && o2 instanceof TaskArchive) {
return -1;
} else if (o2 instanceof AbstractTaskContainer && o1 instanceof TaskArchive) {
return 1;
}
if (o1 instanceof DateRangeContainer) {
if (o2 instanceof DateRangeContainer) {
DateRangeContainer dateRangeTaskContainer1 = (DateRangeContainer) o1;
DateRangeContainer dateRangeTaskContainer2 = (DateRangeContainer) o2;
return -1*dateRangeTaskContainer2.getStart().compareTo(dateRangeTaskContainer1.getStart());
} else {
return -1;
}
}
if (o1 instanceof AbstractTaskContainer && o2 instanceof ITask) {
return 1;
}
if (o1 instanceof AbstractTaskContainer || o1 instanceof AbstractRepositoryQuery) {
if (o2 instanceof AbstractTaskContainer || o2 instanceof AbstractRepositoryQuery) {
return ((ITaskListElement) o1).getSummary().compareToIgnoreCase(((ITaskListElement) o2).getSummary());
} else {
return -1;
}
} else if (o1 instanceof ITaskListElement) {
if (o2 instanceof AbstractTaskContainer || o2 instanceof AbstractRepositoryQuery) {
return -1;
} else if (o2 instanceof ITaskListElement) {
ITaskListElement element1 = (ITaskListElement) o1;
ITaskListElement element2 = (ITaskListElement) o2;
ITask task1 = null;
ITask task2 = null;
if (element1 instanceof AbstractQueryHit) {
task1 = ((AbstractQueryHit) element1).getCorrespondingTask();
// if (task1 == null) {
// return 1;
// }
} else if (element1 instanceof ITask) {
task1 = (ITask) element1;
}
if (element2 instanceof AbstractQueryHit) {
task2 = ((AbstractQueryHit) element2).getCorrespondingTask();
// if (task2 == null) {
// return -1;
// }
} else if (element2 instanceof ITask) {
task2 = (ITask) element2;
}
if (task1 == null && task2 == null) {
return comparePrioritiesAndKeys(element1, element2);
} else if (task1 == null) {
return 1;
} else if (task2 == null) {
return -1;
}
int complete = compareCompleted(task1, task2);
if (complete != 0) {
return complete;
} else {
int overdue = compareOverdue(task1, task2);
if (overdue != 0) {
return overdue;
} else {
int thisWeek = compareThisWeek(task1, task2);
if (thisWeek != 0) {
return thisWeek;
} else {
int today = compareToday(task1, task2);
if (today != 0) {
return today;
} else {
// int hasChanges = compareChanges(task1, task2);
// if (hasChanges != 0) {
// return hasChanges;
// }
}
}
}
}
return comparePrioritiesAndKeys(element1, element2);
}
}
return 0;
}
private int compareOverdue(ITask task1, ITask task2) {
if (task1.isPastReminder() && !task2.isPastReminder()) {
return -1;
} else if (!task1.isPastReminder() && task2.isPastReminder()) {
return 1;
} else {
return 0;
}
}
private int compareToday(ITask task1, ITask task2) {
if (TasksUiPlugin.getTaskListManager().isScheduledForToday(task1)
&& !TasksUiPlugin.getTaskListManager().isScheduledForToday(task2)) {
return -1;
} else if (!TasksUiPlugin.getTaskListManager().isScheduledForToday(task1)
&& TasksUiPlugin.getTaskListManager().isScheduledForToday(task2)) {
return 1;
} else {
return 0;
}
}
// private int compareChanges(ITask task1, ITask task2) {
// if (TaskListInterestFilter.hasChanges(task1) && !TaskListInterestFilter.hasChanges(task2)) {
// return 1;
// } else if (!TaskListInterestFilter.hasChanges(task1) && TaskListInterestFilter.hasChanges(task2)) {
// return -1;
// } else {
// return 0;
// }
// }
private int compareThisWeek(ITask task1, ITask task2) {
if (TasksUiPlugin.getTaskListManager().isScheduledForThisWeek(task1)
&& !TasksUiPlugin.getTaskListManager().isScheduledForThisWeek(task2)) {
return 1;
} else if (!TasksUiPlugin.getTaskListManager().isScheduledForThisWeek(task1)
&& TasksUiPlugin.getTaskListManager().isScheduledForThisWeek(task2)) {
return -1;
} else {
return 0;
}
}
private int compareCompleted(ITask task1, ITask task2) {
if (task1.isCompleted() && !task2.isCompleted()) {
return 1;
} else if (!task1.isCompleted() && task2.isCompleted()) {
return -1;
} else {
return 0;
}
}
private int comparePrioritiesAndKeys(ITaskListElement element1, ITaskListElement element2) {
int priority = comparePriorities(element1, element2);
if (priority != 0) {
return priority;
}
int description = compareKeys(element1, element2);
if (description != 0) {
return description;
}
return 0;
}
private int compareKeys(ITaskListElement element1, ITaskListElement element2) {
String summary1 = TaskListTableSorter.getSortableSummaryFromElement(element1);
String summary2 = TaskListTableSorter.getSortableSummaryFromElement(element2);
return taskKeyComparator.compare(summary1, summary2);
}
private int comparePriorities(ITaskListElement element1, ITaskListElement element2) {
return element1.getPriority().compareTo(element2.getPriority());
}
}