Skip to main content
summaryrefslogblamecommitdiffstats
blob: 10626e4e96dddfa5984751bdca0214cc2247882c (plain) (tree)
1
2
3
4
5
6
7
8
9
                                                                                
                                                                



                                                                        

                                                                                 
                                            









                                            
                                                              
                                                                       
                                                 
                                                          


                                                  









                                                                                
                                                                    




                                                                  


                                                                  


                                                                      
                                                                          

                                        
                                                                                                  

                                                                                           
 

                                                                                   
                                                                                                                                                                                                                                                        
 
                                                             
                                                   
                                                                                        
                                                                      


                                                                  
                                                                                                                   

                                                                                                                      
                                                                      
















                                                                                            
                                                                                                          
                                                                                                  
                                                                                                             




                                                                                                                             
                                                                      


                                                                                            

                                                                                                                               


                                                
                                                    

                                                                                   

                                                                                       






                                                                                                                    
                                                                                                          
                                                                                                                     
























                                                                                                                                     
                                                                                                  
                                                                                                             

                                                                                                               
                                                                                                                          



                                                
                                                                       









                                                                                                                   
                          


                                           
                                                                                                  
                                                                                                             
                                                                                                
                                                                                                                                         


                                 
                                                

                                                                                            














                                                                                                                       



                                           









                                                                                                                       






                                                           
                                                        

                                                             

                         
 









                                                                                                                       
                                                                           
                                                                                                          

                                                                   
                                                                                                          


                                                                                      






                                                                                                                                   

                                                                      





                                                                                            
                                                                                                  
                                                                                                             



                                                                                                       
                                                    
                                                                



                                                                                
                 




                                                        
                            
                                                     
                                  
                 


























                                                    
                                                                                                                  

                                                                                                          

                                                   
                 



                                                                                     
/*******************************************************************************
 * Copyright (c) 2004, 2007 Mylyn project committers 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
 *******************************************************************************/

package org.eclipse.mylyn.internal.tasks.ui;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.window.Window;
import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
import org.eclipse.mylyn.internal.tasks.ui.planner.DateSelectionDialog;
import org.eclipse.mylyn.tasks.core.AbstractTask;
import org.eclipse.mylyn.tasks.core.AbstractTaskContainer;
import org.eclipse.mylyn.tasks.ui.DatePicker;
import org.eclipse.mylyn.tasks.ui.TaskListManager;
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
import org.eclipse.ui.PlatformUI;

/**
 * TODO: this has bloated, refactor
 * 
 * @author Rob Elves
 * @author Mik Kersten
 */
public class ScheduleTaskMenuContributor implements IDynamicSubMenuContributor {

	private static final String LABEL_REMINDER = "Schedule for";

	private static final String LABEL_TODAY = "Today";

	private static final String LABEL_NEXT_WEEK = "Next Week";

	private static final String LABEL_TWO_WEEKS = "Two Weeks";

	private static final String LABEL_FUTURE = "Future";

	private static final String LABEL_CALENDAR = "Choose Date...";

	private static final String LABEL_NOT_SCHEDULED = "Not Scheduled";

	@SuppressWarnings("deprecation")
	public MenuManager getSubMenuManager(final List<AbstractTaskContainer> selectedElements) {

		final TaskListManager tasklistManager = TasksUiPlugin.getTaskListManager();

		final MenuManager subMenuManager = new MenuManager(LABEL_REMINDER);

		subMenuManager.setVisible(selectedElements.size() > 0 && selectedElements.get(0) instanceof AbstractTask);// !(selectedElements.get(0) instanceof AbstractTaskContainer || selectedElements.get(0) instanceof AbstractRepositoryQuery));

		AbstractTaskContainer singleSelection = null;
		if (selectedElements.size() == 1) {
			AbstractTaskContainer selectedElement = selectedElements.get(0);
			if (selectedElement instanceof AbstractTask) {
				singleSelection = selectedElement;
			}
		}
		final AbstractTask singleTaskSelection = tasklistManager.getTaskForElement(singleSelection, false);
		final List<AbstractTaskContainer> taskListElementsToSchedule = new ArrayList<AbstractTaskContainer>();
		for (AbstractTaskContainer selectedElement : selectedElements) {
			if (selectedElement instanceof AbstractTask) {
				taskListElementsToSchedule.add(selectedElement);
			}
			// if (selectedElement instanceof ITask) {
			// taskListElementsToSchedule.add((ITask) selectedElement);
			// } else if (selectedElement instanceof AbstractQueryHit) {
			// if (((AbstractQueryHit) selectedElement).getCorrespondingTask()
			// != null) {
			// taskListElementsToSchedule.add(((AbstractQueryHit)
			// selectedElement).getCorrespondingTask());
			// }
			// }
		}

		Action action = new Action() {
			@Override
			public void run() {
				Calendar reminderCalendar = GregorianCalendar.getInstance();
				TasksUiPlugin.getTaskListManager().setScheduledEndOfDay(reminderCalendar);
				for (AbstractTaskContainer element : taskListElementsToSchedule) {
					AbstractTask task = tasklistManager.getTaskForElement(element, true);
					TasksUiPlugin.getTaskListManager().setScheduledFor(task, reminderCalendar.getTime());
				}
			}
		};
		action.setText(LABEL_TODAY);
		action.setImageDescriptor(TasksUiImages.SCHEDULE_DAY);
		action.setEnabled(canSchedule(singleSelection, taskListElementsToSchedule));
		subMenuManager.add(action);

		if (singleTaskSelection != null && (TasksUiPlugin.getTaskListManager().isScheduledForToday(singleTaskSelection)
				|| singleTaskSelection.isPastReminder())) {
			action.setChecked(true);
		}

//		subMenuManager.add(new Separator());

		final int today = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
//		boolean reachedEndOfWeek = false;
		for (int i = today + 1; i <= today + 7/* && !reachedEndOfWeek*/; i++) {
			final int day = i;
			action = new Action() {
				@Override
				public void run() {
					Calendar reminderCalendar = GregorianCalendar.getInstance();
					int dueIn = day - today;
					TasksUiPlugin.getTaskListManager().setSecheduledIn(reminderCalendar, dueIn);
					for (AbstractTaskContainer element : taskListElementsToSchedule) {
						AbstractTask task = tasklistManager.getTaskForElement(element, true);
						TasksUiPlugin.getTaskListManager().setScheduledFor(task, reminderCalendar.getTime());
					}
				}
			};
			getDayLabel(i, action);
			if (singleTaskSelection != null && singleTaskSelection.getScheduledForDate() != null) {
				int tasksCheduledOn = singleTaskSelection.getScheduledForDate().getDay();
				if (TasksUiPlugin.getTaskListManager().isScheduledForThisWeek(singleTaskSelection)) {
					if (tasksCheduledOn + 1 == day) {
						action.setChecked(true);
					} else if (tasksCheduledOn == 0 && day == 8) {
						action.setChecked(true);
					}
				}
			}

			action.setEnabled(canSchedule(singleSelection, taskListElementsToSchedule));
			subMenuManager.add(action);
		}

		subMenuManager.add(new Separator());

		action = new Action() {
			@Override
			public void run() {
				for (AbstractTaskContainer element : taskListElementsToSchedule) {
					AbstractTask task = tasklistManager.getTaskForElement(element, true);
					Calendar startNextWeek = Calendar.getInstance();
					TasksUiPlugin.getTaskListManager().setScheduledNextWeek(startNextWeek);
					TasksUiPlugin.getTaskListManager().setScheduledFor(task, startNextWeek.getTime());
				}
			}
		};
		action.setText(LABEL_NEXT_WEEK);
		action.setImageDescriptor(TasksUiImages.SCHEDULE_WEEK);
		action.setEnabled(canSchedule(singleSelection, taskListElementsToSchedule));

		if (singleTaskSelection != null
				&& TasksUiPlugin.getTaskListManager().isScheduledAfterThisWeek(singleTaskSelection)
				&& !TasksUiPlugin.getTaskListManager().isScheduledForLater(singleTaskSelection)) {
			action.setChecked(true);
		}

		subMenuManager.add(action);

		// 2 weeks
		action = new Action() {
			@Override
			public void run() {
				for (AbstractTaskContainer element : taskListElementsToSchedule) {
					AbstractTask task = tasklistManager.getTaskForElement(element, true);
					TasksUiPlugin.getTaskListManager().setScheduledFor(task,
							TasksUiPlugin.getTaskActivityManager().getActivityFuture().getStart().getTime());
				}
			}
		};
		action.setText(LABEL_TWO_WEEKS);
		action.setEnabled(canSchedule(singleSelection, taskListElementsToSchedule));

		if (singleTaskSelection != null && singleTaskSelection.getScheduledForDate() != null) {

			Calendar time = TaskActivityUtil.getCalendar();
			time.setTime(singleTaskSelection.getScheduledForDate());

			Calendar start = TaskActivityUtil.getCalendar();
			start.setTime(TasksUiPlugin.getTaskActivityManager().getActivityFuture().getStart().getTime());

			Calendar end = TaskActivityUtil.getCalendar();
			end.setTime(TasksUiPlugin.getTaskActivityManager().getActivityFuture().getStart().getTime());
			TaskActivityUtil.snapEndOfWeek(end);

			if (TaskActivityUtil.isBetween(time, start, end)) {
				action.setChecked(true);
			}
		}

		subMenuManager.add(action);

		if (singleTaskSelection != null && singleTaskSelection.getScheduledForDate() != null) {

			Calendar time = TaskActivityUtil.getCalendar();
			time.setTime(singleTaskSelection.getScheduledForDate());

			Calendar start = TaskActivityUtil.getCalendar();
			start.setTime(TasksUiPlugin.getTaskActivityManager().getActivityFuture().getStart().getTime());
			start.add(Calendar.WEEK_OF_MONTH, 1);

			if (time.compareTo(start) >= 0) {
				// future
				action = new Action() {
					@Override
					public void run() {
						// ignore
					}
				};
				action.setChecked(true);
				action.setText(LABEL_FUTURE);
				subMenuManager.add(action);
			}
		}

		subMenuManager.add(new Separator());

		action = new Action() {
			@Override
			public void run() {
				Calendar theCalendar = GregorianCalendar.getInstance();
				if (singleTaskSelection != null && singleTaskSelection.getScheduledForDate() != null) {
					theCalendar.setTime(singleTaskSelection.getScheduledForDate());
				}
				DateSelectionDialog reminderDialog = new DateSelectionDialog(PlatformUI.getWorkbench()
						.getActiveWorkbenchWindow()
						.getShell(), theCalendar, DatePicker.TITLE_DIALOG, false);
				int result = reminderDialog.open();
				if (result == Window.OK) {
					for (AbstractTaskContainer element : taskListElementsToSchedule) {
						AbstractTask task = null;
						if (element instanceof AbstractTask) {
							task = (AbstractTask) element;
						}
						TasksUiPlugin.getTaskListManager().setScheduledFor(task, reminderDialog.getDate());
					}
				}
			}
		};
		action.setText(LABEL_CALENDAR);
//		action.setImageDescriptor(TasksUiImages.CALENDAR);
		action.setImageDescriptor(TasksUiImages.SCHEDULE_DAY);
		action.setEnabled(canSchedule(singleSelection, taskListElementsToSchedule));
		subMenuManager.add(action);

		action = new Action() {
			@Override
			public void run() {
				for (AbstractTaskContainer element : taskListElementsToSchedule) {
					AbstractTask task = tasklistManager.getTaskForElement(element, true);
					TasksUiPlugin.getTaskListManager().setScheduledFor(task, null);
				}
			}
		};
		action.setText(LABEL_NOT_SCHEDULED);
//		action.setImageDescriptor(TasksUiImages.REMOVE);
		if (singleTaskSelection != null) {
			if (singleTaskSelection.getScheduledForDate() == null) {
				action.setChecked(true);
			}
		}
		subMenuManager.add(action);
		return subMenuManager;
	}

	private void getDayLabel(int i, Action action) {
		if (i > 8) {
			// rotates up to 7 days ahead
			i = i - 7;
		}
		switch (i) {
		case Calendar.MONDAY:
			action.setText("Monday");
			break;
		case Calendar.TUESDAY:
			action.setText("Tuesday");
			break;
		case Calendar.WEDNESDAY:
			action.setText("Wednesday");
			break;
		case Calendar.THURSDAY:
			action.setText("Thursday");
			break;
		case Calendar.FRIDAY:
			action.setText("Friday");
			break;
		case Calendar.SATURDAY:
			action.setText("Saturday");
			break;
		case 8:
			action.setText("Sunday");
			break;
		default:
			break;
		}
	}

	private boolean canSchedule(AbstractTaskContainer singleSelection, List<AbstractTaskContainer> elements) {
		if (singleSelection instanceof AbstractTask) {
			return ((!((AbstractTask) singleSelection).isCompleted()) || elements.size() > 0);
		} else {
			return elements.size() > 0;
		}
		// return (singleSelection != null && !singleSelection.isCompleted())
		// || elements.size() > 0;
	}
}

Back to the top