/******************************************************************************* * Copyright (c) 2004, 2010 Tasktop Technologies 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: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.internal.tasks.core; import java.util.Calendar; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.eclipse.mylyn.tasks.core.IRepositoryElement; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.osgi.util.NLS; /** * @author Rob Elves * @author Mik Kersten * @author Sam Davis */ public class ScheduledTaskContainer extends AbstractTaskContainer { private final TaskActivityManager activityManager; private final String summary; private final DateRange range; private String shortSummary; public ScheduledTaskContainer(TaskActivityManager activityManager, DateRange range, String summary) { super(summary == null ? range.toString(false) : summary); this.activityManager = activityManager; this.range = range; if (summary == null) { if (range instanceof DayDateRange && TaskActivityUtil.getNextWeek().includes(range)) { DayDateRange dayRange = (DayDateRange) range; String day = NLS.bind(Messages.ScheduledTaskContainer_Next_Day, dayRange.getDayOfWeek()); // String shortDate = DateFormat.getDateInstance(DateFormat.SHORT).format( // dayRange.getStartDate().getTime()); // this.summary = NLS.bind(Messages.ScheduledTaskContainer_Dash_Pattern, day, shortDate); this.summary = day; this.shortSummary = day; } else { this.summary = range.toString(false); this.shortSummary = this.summary; } } else { this.summary = summary; } } public ScheduledTaskContainer(TaskActivityManager taskActivityManager, DateRange day) { this(taskActivityManager, day, null); } public boolean isFuture() { return !isPresent() && range.getStartDate().after(Calendar.getInstance()); } public boolean isPresent() { return range.getStartDate().before(Calendar.getInstance()) && range.getEndDate().after(Calendar.getInstance()); } // public boolean isWeekDay() { // return TaskActivityUtil.getCurrentWeek().isCurrentWeekDay(range); // } // public boolean isToday() { // if (range instanceof DayDateRange) { // return ((DayDateRange) range).isToday(); // } // return false; // } // public Collection<ITask> getChildren() { // Set<ITask> children = new HashSet<ITask>(); // Calendar beginning = TaskActivityUtil.getCalendar(); // beginning.setTimeInMillis(0); // if (isFloating() && !isFuture()) { // for (ITask task : activityManager.getScheduledTasks(rangebeginning, getEndDate())) { // if (task.internalIsFloatingScheduledDate()) { // children.add(task); // } // } // } else if (isPresent()) { // // add all due/overdue // Calendar end = TaskActivityUtil.getCalendar(); // end.set(5000, 12, 1); // for (ITask task : activityManager.getDueTasks(beginning, getEndDate())) { // if (activityManager.isOwnedByUser(task)) { // children.add(task); // } // } // // // add all scheduled/overscheduled // for (ITask task : activityManager.getScheduledTasks(beginning, getEndDate())) { // if (!task.internalIsFloatingScheduledDate() && !task.isCompleted()) { // children.add(task); // } // } // // // if not scheduled or due in future, and is active, place in today bin // ITask activeTask = activityManager.getActiveTask(); // if (activeTask != null && !children.contains(activeTask)) { // Set<ITask> futureScheduled = activityManager.getScheduledTasks(getStartDate(), end); // for (ITask task : activityManager.getDueTasks(getStartDate(), end)) { // if (activityManager.isOwnedByUser(task)) { // futureScheduled.add(task); // } // } // if (!futureScheduled.contains(activeTask)) { // children.add(activeTask); // } // } // } else if (isFuture()) { // children.addAll(activityManager.getScheduledTasks(getStartDate(), getEndDate())); // for (ITask task : activityManager.getDueTasks(getStartDate(), getEndDate())) { // if (activityManager.isOwnedByUser(task)) { // children.add(task); // } // } // } else { // children.addAll(activityManager.getActiveTasks(range.getStartDate(), range.getEndDate())); // } // return children; // } @Override public Collection<ITask> getChildren() { // TODO: Cache this information until the next modification to pertinent data Set<ITask> children = new HashSet<ITask>(); Calendar cal = TaskActivityUtil.getCalendar(); // All tasks scheduled for this date range for (ITask task : activityManager.getScheduledTasks(range)) { if (!task.isCompleted() || isCompletedToday(task)) { if (isDueBeforeScheduled(task) && activityManager.isOwnedByUser(task)) { continue; } if (isThisWeekBin() && isScheduledForAWeek(task)) { // is due this week if (task.getDueDate() != null) { cal.setTime(task.getDueDate()); if (range.includes(cal) && activityManager.isOwnedByUser(task)) { continue; } } addChild(children, task); } addChild(children, task); } } // Add due tasks if not the This Week container, and not scheduled for earlier date if (!TaskActivityUtil.getCurrentWeek().equals(range) && !TaskActivityUtil.getNextWeek().equals(range)) { for (ITask task : getTasksDueThisWeek()) { if (isScheduledBeforeDue(task)) { continue; } if (activityManager.isOwnedByUser(task)) { addChild(children, task); } } } // All over due/scheduled tasks are present in the Today folder if (isTodayBin()) { for (ITask task : activityManager.getOverScheduledTasks()) { if (isScheduledForADay(task)) { addChild(children, task); } } for (ITask task : activityManager.getOverDueTasks()) { addChild(children, task); } // if not scheduled or due in future, and is active, place in today bin ITask activeTask = activityManager.getActiveTask(); if (activeTask != null && !children.contains(activeTask)) { addChild(children, activeTask); } } if (range instanceof WeekDateRange && ((WeekDateRange) range).isThisWeek()) { for (ITask task : activityManager.getOverScheduledTasks()) { if (isScheduledForAWeek(task)) { addChild(children, task); } } } return children; } private boolean isTodayBin() { return range instanceof DayDateRange && ((DayDateRange) range).isPresent(); } private boolean isThisWeekBin() { return range instanceof WeekDateRange && ((WeekDateRange) range).isThisWeek(); } private Set<ITask> getTasksDueThisWeek() { return activityManager.getDueTasks(range.getStartDate(), range.getEndDate()); } private boolean isScheduledForAWeek(ITask task) { return task instanceof AbstractTask && ((AbstractTask) task).getScheduledForDate() instanceof WeekDateRange; } public boolean isDueBeforeScheduled(ITask task) { return task.getDueDate() != null && task.getDueDate().before(((AbstractTask) task).getScheduledForDate().getEndDate().getTime()); } private boolean isScheduledForADay(ITask task) { return task instanceof AbstractTask && !(((AbstractTask) task).getScheduledForDate() instanceof WeekDateRange); } private boolean isScheduledBeforeDue(ITask task) { return ((AbstractTask) task).getScheduledForDate() != null && ((AbstractTask) task).getScheduledForDate().before(range.getStartDate()); } private boolean isCompletedToday(ITask task) { return (task.isCompleted() && TaskActivityUtil.getDayOf(task.getCompletionDate()).isPresent()); } private void addChild(Set<ITask> collection, ITask task) { // if (task.getSynchronizationState().isOutgoing()) { // return; // } collection.add(task); } @Override public String getSummary() { if (summary != null) { return summary; } return range.toString(); } public String getShortSummary() { if (shortSummary != null) { return shortSummary; } return range.toString(); } @Override public String getHandleIdentifier() { return summary; } @Override public String getPriority() { return ""; //$NON-NLS-1$ } @Override public String getUrl() { return ""; //$NON-NLS-1$ } @Override public int compareTo(IRepositoryElement element) { if (element instanceof ScheduledTaskContainer) { ScheduledTaskContainer container = ((ScheduledTaskContainer) element); return range.compareTo(container.getDateRange()); } return 0; } public DateRange getDateRange() { return range; } public Calendar getEnd() { return range.getEndDate(); } public Calendar getStart() { return range.getStartDate(); } public boolean includes(Calendar pastWeeksTaskStart) { return range.includes(pastWeeksTaskStart); } }