diff options
author | sminto | 2005-07-26 20:35:28 +0000 |
---|---|---|
committer | sminto | 2005-07-26 20:35:28 +0000 |
commit | 8f76b92b996b0d9ce689f513be9585b394aecaa1 (patch) | |
tree | 6616f797593e368ae20989da42bb460c9c622798 /org.eclipse.mylyn.tasks.ui | |
parent | 2da02580b6bf11366663b415c01cfef6fac6ebc7 (diff) | |
download | org.eclipse.mylyn.tasks-8f76b92b996b0d9ce689f513be9585b394aecaa1.tar.gz org.eclipse.mylyn.tasks-8f76b92b996b0d9ce689f513be9585b394aecaa1.tar.xz org.eclipse.mylyn.tasks-8f76b92b996b0d9ce689f513be9585b394aecaa1.zip |
applied kens patch for Bug# 104265 create planning game report
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui')
15 files changed, 807 insertions, 67 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/plugin.xml b/org.eclipse.mylyn.tasks.ui/plugin.xml index 095784127..ac87ad372 100644 --- a/org.eclipse.mylyn.tasks.ui/plugin.xml +++ b/org.eclipse.mylyn.tasks.ui/plugin.xml @@ -30,6 +30,11 @@ class="org.eclipse.mylar.tasklist.ui.TaskEditor" name="Task Viewer" id="org.eclipse.mylar.tasklist.ui.taskEditor"/> + <editor + icon="icons/eview16/task.gif" + class="org.eclipse.mylar.tasklist.report.ui.PlanningGameEditorPart" + name="Planning Game Report" + id="org.eclipse.mylar.tasklist.report.ui.planning"/> </extension> <extension point="org.eclipse.ui.commands"> @@ -42,4 +47,13 @@ category="org.eclipse.mylar.ui.preferences"> </page> </extension> + <extension point="org.eclipse.ui.newWizards"> + <wizard + category="org.eclipse.mylar.wizards" + class="org.eclipse.mylar.tasklist.report.ui.PlanningGameWizard" + icon="icons/eview16/task.gif" + id="org.eclipse.mylar.tasklist.report.ui.planningGameWizard" + name="Planning Game Summary"> + </wizard> + </extension> </plugin> diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/ITask.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/ITask.java index 995041fac..9b021668a 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/ITask.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/ITask.java @@ -14,6 +14,7 @@ package org.eclipse.mylar.tasklist; import java.io.Serializable; +import java.util.Date; import java.util.List; import org.eclipse.mylar.tasklist.internal.TaskCategory; @@ -66,6 +67,8 @@ public interface ITask extends Serializable, ITaskListElement { public abstract String getElapsedTime(); + public abstract long getElapsedTimeLong(); + public abstract void setElapsedTime(String elapsed); public abstract String getEstimatedTime(); @@ -95,4 +98,10 @@ public interface ITask extends Serializable, ITaskListElement { public abstract String getElapsedTimeForDisplay(); public abstract boolean participatesInTaskHandles(); + + public abstract Date getEndDate(); + + public abstract void setEndDate(String date); + + public abstract String getEndDateString(); }
\ No newline at end of file diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTasklistPlugin.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTasklistPlugin.java index def8ded23..307b197ab 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTasklistPlugin.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTasklistPlugin.java @@ -45,13 +45,16 @@ public class MylarTasklistPlugin extends AbstractUIPlugin { private List<ITaskHandler> taskHandlers = new ArrayList<ITaskHandler>(); // TODO: use extension points public static final String TASK_CONTRIBUTER_EXTENSION_POINT_ID = "org.eclipse.mylar.tasklist.taskListContributor"; - public static final String TASK_HANDLER_ELEMENT = "taskHandler"; - public static final String EXTERNALIZER_CLASS_ID = "externalizerClass"; - public static final String ACTION_CONTRIBUTER_CLASS_ID = "taskHandlerClass"; - public static final String TASK_LISTENER_ELEMENT = "taskListener"; - public static final String TASK_LISTENER_CLASS_ID = "class"; - public static final String DYNAMIC_POPUP_ELEMENT = "dynamicPopupMenu"; - public static final String DYNAMIC_POPUP_CLASS_ID = "class"; + + public static final String PLANNING_GAME_WIZARD_ID = "org.eclipse.mylar.tasklist.report.ui.planningGameWizard"; + public static final String PLANNING_GAME_EDITOR_ID = "org.eclipse.mylar.tasklist.report.ui.planning"; + public static final String TASK_HANDLER_ELEMENT = "taskHandler"; + public static final String EXTERNALIZER_CLASS_ID = "externalizerClass"; + public static final String ACTION_CONTRIBUTER_CLASS_ID = "taskHandlerClass"; + public static final String TASK_LISTENER_ELEMENT = "taskListener"; + public static final String TASK_LISTENER_CLASS_ID = "class"; + public static final String DYNAMIC_POPUP_ELEMENT = "dynamicPopupMenu"; + public static final String DYNAMIC_POPUP_CLASS_ID = "class"; public static final String REPORT_OPEN_EDITOR = "org.eclipse.mylar.tasklist.report.open.editor"; public static final String REPORT_OPEN_INTERNAL = "org.eclipse.mylar.tasklist.report.open.internal"; diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/Task.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/Task.java index 112ceb4f4..12186f2f4 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/Task.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/Task.java @@ -13,11 +13,15 @@ */ package org.eclipse.mylar.tasklist; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Locale; import org.eclipse.mylar.core.MylarPlugin; +import org.eclipse.mylar.core.util.DateUtil; import org.eclipse.mylar.tasklist.internal.TaskCategory; import org.eclipse.mylar.tasklist.ui.TaskEditorInput; import org.eclipse.mylar.tasklist.ui.views.TaskListView; @@ -56,6 +60,7 @@ public class Task implements ITask { private TaskCategory parentCategory = null; private Date timeActivated = null; + private Date endDate = null; private long elapsed; /** * null if root @@ -213,6 +218,9 @@ public class Task implements ITask { return completed; } public void setCompleted(boolean completed) { + if (completed) { + endDate = new Date(); + } this.completed = completed; } @@ -271,6 +279,12 @@ public class Task implements ITask { return "" + elapsed; } + public long getElapsedTimeLong() { + if (isActive()) { + calculateElapsedTime(); + } + return elapsed; + } public void setElapsedTime(String elapsedString) { if (elapsedString.equals("")) { elapsed = 0; @@ -328,60 +342,7 @@ public class Task implements ITask { public String getElapsedTimeForDisplay() { calculateElapsedTime(); - long seconds = elapsed / 1000; - long minutes = 0; - long hours = 0; -// final long SECOND = 1000; - final long MIN = 60; - final long HOUR = MIN * 60; - - String hour = ""; - String min = ""; - String sec = ""; - if (seconds >= HOUR) { - hours = seconds / HOUR; - if (hours == 1) { - hour = hours + " hour "; - } else if (hours > 1) { - hour = hours + " hours "; - } - seconds -= hours * HOUR; - - minutes = seconds / MIN; - if (minutes == 1) { - min = minutes + " minute "; - } else if (minutes != 1) { - min = minutes + " minutes "; - } -// seconds -= minutes * MIN; -// if (seconds == 1) { -// sec = seconds + " second"; -// } else if (seconds > 1) { -// sec = seconds + " seconds"; -// } - return hour + min + sec; - } else if (seconds >= MIN) { - minutes = seconds / MIN; - if (minutes == 1) { - min = minutes + " minute "; - } else if (minutes != 1) { - min = minutes + " minutes "; - } -// seconds -= minutes * MIN; -// if (seconds == 1) { -// sec = seconds + " second"; -// } else if (seconds > 1) { -// sec = seconds + " seconds"; -// } - return min + sec; - } else { -// if (seconds == 1) { -// sec = seconds + " second"; -// } else if (seconds > 1) { -// sec = seconds + " seconds"; -// } - return "0 minutes"; - } + return DateUtil.getFormattedDuration(elapsed); } public boolean canEditDescription() { @@ -432,4 +393,35 @@ public class Task implements ITask { } return null; } + + public Date getEndDate() { + return endDate; + } + + public String getEndDateString() { + if (endDate != null) { + String f = "yyyy-MM-dd HH:mm:ss.S z"; + SimpleDateFormat format = new SimpleDateFormat(f, Locale.ENGLISH); + return format.format(endDate); + } else { + return ""; + } + } + + public void setEndDate(String date) { + if (!date.equals("")) { + String formatString = "yyyy-MM-dd HH:mm:ss.S z"; + SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH); + try { + endDate = format.parse(date); + } catch (ParseException e) { + MylarPlugin.log(e, "Could not parse end date"); + endDate = null; + } + } else { + if (isCompleted()) { + endDate = new Date(0); + } + } + } } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/DefaultTaskListExternalizer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/DefaultTaskListExternalizer.java index d44a2ff89..0775047e7 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/DefaultTaskListExternalizer.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/DefaultTaskListExternalizer.java @@ -48,6 +48,7 @@ public class DefaultTaskListExternalizer implements ITaskListExternalizer { public static final String FALSE = "false"; public static final String TRUE = "true"; public static final String NAME = "Name"; + public static final String END_DATE = "EndDate"; private List<ITaskListExternalizer> externalizers = new ArrayList<ITaskListExternalizer>(); @@ -105,6 +106,8 @@ public class DefaultTaskListExternalizer implements ITaskListExternalizer { node.setAttribute(NOTES, task.getNotes()); node.setAttribute(ELAPSED, task.getElapsedTime()); node.setAttribute(ESTIMATED, task.getEstimatedTime()); + node.setAttribute(END_DATE, task.getEndDateString()); + List<String> rl = task.getRelatedLinks().getLinks(); int i = 0; for (String link : rl) { @@ -191,12 +194,7 @@ public class DefaultTaskListExternalizer implements ITaskListExternalizer { new TaskActivateAction(task).run(); } else { task.setActive(false); - } - if (element.getAttribute(COMPLETE).compareTo(TRUE) == 0) { - task.setCompleted(true); - } else { - task.setCompleted(false); - } + } if (element.hasAttribute(NOTES)) { task.setNotes(element.getAttribute(NOTES)); } else { @@ -212,6 +210,17 @@ public class DefaultTaskListExternalizer implements ITaskListExternalizer { } else { task.setEstimatedTime(""); } + // NOTE: do not change the order of complete and end date!! + if (element.getAttribute(COMPLETE).compareTo(TRUE) == 0) { + task.setCompleted(true); + } else { + task.setCompleted(false); + } + if (element.hasAttribute(END_DATE)) { + task.setEndDate(element.getAttribute(END_DATE)); + } else { + task.setEndDate(""); + } int i = 0; while (element.hasAttribute(LINK+i)) { task.getRelatedLinks().add(element.getAttribute(LINK+i)); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/CompletedTaskCollector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/CompletedTaskCollector.java new file mode 100644 index 000000000..7724ee301 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/CompletedTaskCollector.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.internal; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.eclipse.mylar.tasklist.ITask; + +/** + * @author Ken Sueda + */ +public class CompletedTaskCollector implements ITasksCollector { + + private List<ITask> completedTasks = new ArrayList<ITask>(); + private Date cutOffDate = null; + private long DAY = 24*3600*1000; + + public CompletedTaskCollector(int prevDays) { + cutOffDate = new Date(new Date().getTime() - prevDays * DAY); + } + + public String getLabel() { + return "Completed Tasks"; + } + + public void consumeTask(ITask task) { + if (task.isCompleted() && task.getEndDate() != null && task.getEndDate().compareTo(cutOffDate) > 0) { + completedTasks.add(task); + } + } + + public List<ITask> getTasks() { + return completedTasks; + } +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/ITasksCollector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/ITasksCollector.java new file mode 100644 index 000000000..5197d9d10 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/ITasksCollector.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.internal; + +import java.util.List; + +import org.eclipse.mylar.tasklist.ITask; + +/** + * @author Ken Sueda + */ +public interface ITasksCollector { + + public abstract void consumeTask(ITask task); + + public abstract List<ITask> getTasks(); +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/TaskReportGenerator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/TaskReportGenerator.java new file mode 100644 index 000000000..06027ba07 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/TaskReportGenerator.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.internal; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.mylar.tasklist.ITask; +import org.eclipse.mylar.tasklist.ITaskListElement; +import org.eclipse.mylar.tasklist.internal.TaskCategory; +import org.eclipse.mylar.tasklist.internal.TaskList; + +/** + * @author Ken Sueda + */ +public class TaskReportGenerator { + // NOTE: might want a map of tasks instead of a flattened list of tasks + + private List<ITasksCollector> collectors = new ArrayList<ITasksCollector>(); + private List<ITask> tasks = new ArrayList<ITask>(); + private TaskList tasklist = null; + + public TaskReportGenerator(TaskList tlist, int prevDays) { + tasklist = tlist; + collectors.add(new CompletedTaskCollector(prevDays)); + getTasksForReport(); + } + + private void getTasksForReport() { + List<ITask> roots = tasklist.getRootTasks(); + for(int i = 0; i < roots.size(); i++) { + ITask t = (ITask) roots.get(i); + for (ITasksCollector collector : collectors) { + collector.consumeTask(t); + } + } + for (TaskCategory cat : tasklist.getTaskCategories()) { + List<? extends ITaskListElement> sub = cat.getChildren(); + for (int j = 0; j < sub.size(); j++) { + if (sub.get(j) instanceof ITaskListElement) { + ITaskListElement element = (ITaskListElement) sub.get(j); + if (element.hasCorrespondingActivatableTask()) { + for (ITasksCollector collector : collectors) { + collector.consumeTask(element.getOrCreateCorrespondingTask()); + } + } + } + } + } + for (ITasksCollector collector : collectors) { + tasks.addAll(collector.getTasks()); + } + } + + public List<ITask> getTasks() { + return tasks; + } +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameContentProvider.java new file mode 100644 index 000000000..11a6f0357 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameContentProvider.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.ui; + +import java.util.List; + +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.mylar.tasklist.ITask; + +/** + * @author Ken Sueda + */ +public class PlanningGameContentProvider implements IStructuredContentProvider { + + private List<ITask> tasks = null; + + public PlanningGameContentProvider(List<ITask> tasks) { + this.tasks = tasks; + } + public Object[] getElements(Object inputElement) { + return tasks.toArray(); + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameEditorInput.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameEditorInput.java new file mode 100644 index 000000000..72261b924 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameEditorInput.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.ui; + +import java.util.List; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.mylar.tasklist.ITask; +import org.eclipse.mylar.tasklist.internal.TaskList; +import org.eclipse.mylar.tasklist.report.internal.TaskReportGenerator; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IPersistableElement; + +/** + * @author Ken Sueda + */ +public class PlanningGameEditorInput implements IEditorInput { + private List<ITask> completedTasks = null; + private TaskReportGenerator parser = null; + + public PlanningGameEditorInput(int prevDays, TaskList tlist) { + parser = new TaskReportGenerator(tlist, prevDays); + completedTasks = parser.getTasks(); + } + + /** + * IEditorInput interface methods + */ + public boolean exists() { + return true; + } + + public ImageDescriptor getImageDescriptor() { + return null; + } + + public String getName() { + return "Planning Game Report"; + } + + public IPersistableElement getPersistable() { + return null; + } + + public String getToolTipText() { + return "Planning Game Report"; + } + + public Object getAdapter(Class adapter) { + return null; + } + + /** + * Methods + */ + public List<ITask> getTasks() { + return completedTasks; + } + + public int getListSize() { + return completedTasks.size(); + } + public long getTotalTimeSpent() { + long duration = 0; + for(ITask t : completedTasks) { + duration += t.getElapsedTimeLong(); + } + return duration; + } + + public TaskReportGenerator getReportGenerator() { + return parser; + } +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameEditorPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameEditorPart.java new file mode 100644 index 000000000..1f436c172 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameEditorPart.java @@ -0,0 +1,198 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.ui; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.viewers.TableLayout; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.mylar.core.util.DateUtil; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.forms.FormColors; +import org.eclipse.ui.forms.widgets.ExpandableComposite; +import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.forms.widgets.ScrolledForm; +import org.eclipse.ui.forms.widgets.Section; +import org.eclipse.ui.forms.widgets.TableWrapData; +import org.eclipse.ui.forms.widgets.TableWrapLayout; +import org.eclipse.ui.part.EditorPart; + +/** + * @author Ken Sueda + */ +public class PlanningGameEditorPart extends EditorPart { + + private PlanningGameEditorInput editorInput = null; + private Table table; + private TableViewer tableViewer; + private String[] columnNames = new String[] { "Description", "Priority", "Date Completed", "Duration"}; + + @Override + public void doSave(IProgressMonitor monitor) { + } + + @Override + public void doSaveAs() { + } + + @Override + public void init(IEditorSite site, IEditorInput input) + throws PartInitException { + setSite(site); + setInput(input); + editorInput = (PlanningGameEditorInput)input; + setPartName(editorInput.getName()); + setTitleToolTip(editorInput.getToolTipText()); + } + + @Override + public boolean isDirty() { + return false; + } + + @Override + public boolean isSaveAsAllowed() { + return false; + } + + @Override + public void createPartControl(Composite parent) { + FormToolkit toolkit = new FormToolkit(parent.getDisplay()); + ScrolledForm sform = toolkit.createScrolledForm(parent); + sform.getBody().setLayout(new TableWrapLayout()); + Composite editorComposite = sform.getBody(); + + createSummarySection(editorComposite, toolkit); + createDetailSection(editorComposite, toolkit); + } + + @Override + public void setFocus() { + } + + private void createSummarySection(Composite parent, FormToolkit toolkit) { + Section summarySection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR); + summarySection.setText("Planning Game Summary"); + summarySection.setLayout(new TableWrapLayout()); + summarySection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); + Composite summaryContainer = toolkit.createComposite(summarySection); + summarySection.setClient(summaryContainer); + TableWrapLayout layout = new TableWrapLayout(); + layout.numColumns = 1; + summaryContainer.setLayout(layout); + + int length = editorInput.getListSize(); + String numComplete = "Number of completed tasks: " + editorInput.getListSize(); + Label label = toolkit.createLabel(summaryContainer, numComplete, SWT.NULL); + label.setForeground(toolkit.getColors().getColor(FormColors.TITLE)); + String avgTime = "Average time spent: "; + if (length > 0) { + avgTime = avgTime + DateUtil.getFormattedDuration(editorInput.getTotalTimeSpent() / editorInput.getListSize()); + } else { + avgTime = avgTime + 0; + } + label = toolkit.createLabel(summaryContainer, avgTime, SWT.NULL); + label.setForeground(toolkit.getColors().getColor(FormColors.TITLE)); + String totalTime = "Total time spent: " + DateUtil.getFormattedDuration(editorInput.getTotalTimeSpent()); + label = toolkit.createLabel(summaryContainer, totalTime, SWT.NULL); + label.setForeground(toolkit.getColors().getColor(FormColors.TITLE)); + } + + private void createDetailSection(Composite parent, FormToolkit toolkit) { + Section detailSection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR); + detailSection.setText("Completed Tasks Details"); + detailSection.setLayout(new TableWrapLayout()); + detailSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); + Composite detailContainer = toolkit.createComposite(detailSection); + detailSection.setClient(detailContainer); + TableWrapLayout layout = new TableWrapLayout(); + layout.numColumns = 2; + detailContainer.setLayout(layout); + + createTable(detailContainer, toolkit); + createTableViewer(); + } + + private void createTable(Composite parent, FormToolkit toolkit) { + int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION; + table = toolkit.createTable(parent, style ); + TableLayout tlayout = new TableLayout(); + table.setLayout(tlayout); + TableWrapData wd = new TableWrapData(TableWrapData.FILL_GRAB); + wd.heightHint = 300; + wd.grabVertical = true; + table.setLayoutData(wd); + + table.setLinesVisible(true); + table.setHeaderVisible(true); + + TableColumn column = new TableColumn(table, SWT.LEFT, 0); + column.setText(columnNames[0]); + column.setWidth(300); + column.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + tableViewer.setSorter(new PlanningGameSorter(PlanningGameSorter.DESCRIPTION)); + + } + }); + + column = new TableColumn(table, SWT.LEFT, 1); + column.setText(columnNames[1]); + column.setWidth(50); + column.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + tableViewer.setSorter(new PlanningGameSorter(PlanningGameSorter.PRIORITY)); + } + }); + + column = new TableColumn(table, SWT.LEFT, 2); + column.setText(columnNames[2]); + column.setWidth(200); + column.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + tableViewer.setSorter(new PlanningGameSorter(PlanningGameSorter.DATE)); + } + }); + + + column = new TableColumn(table, SWT.LEFT, 3); + column.setText(columnNames[3]); + column.setWidth(100); + column.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + tableViewer.setSorter(new PlanningGameSorter(PlanningGameSorter.DURATION)); + } + }); + } + + private void createTableViewer() { + tableViewer = new TableViewer(table); + tableViewer.setUseHashlookup(true); + tableViewer.setColumnProperties(columnNames); + + tableViewer.setContentProvider(new PlanningGameContentProvider(editorInput.getTasks())); + tableViewer.setLabelProvider(new PlanningGameLabelProvider()); + tableViewer.setInput(editorInput); + } +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameLabelProvider.java new file mode 100644 index 000000000..80bfb92c9 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameLabelProvider.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.ui; + +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.mylar.tasklist.ITask; +import org.eclipse.swt.graphics.Image; + +/** + * @author Ken Sueda + */ +public class PlanningGameLabelProvider extends LabelProvider implements + ITableLabelProvider { + + //private String[] columnNames = new String[] { "Description", "Priority", "Date Completed", "Duration"}; + public Image getColumnImage(Object element, int columnIndex) { + return null; + } + + public String getColumnText(Object element, int columnIndex) { + if (element instanceof ITask) { + ITask task = (ITask) element; + switch(columnIndex) { + case 0: + return task.getDescription(true); + case 1: + return task.getPriority(); + case 2: + return task.getEndDateString(); + case 3: + return task.getElapsedTimeForDisplay(); + } + } + return null; + } + +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameSorter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameSorter.java new file mode 100644 index 000000000..a2869f358 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameSorter.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.ui; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.mylar.tasklist.ITask; + +/** + * @author Ken Sueda + */ +public class PlanningGameSorter extends ViewerSorter { + /** + * Constructor argument values that indicate to sort items by + * different columns. + */ + public final static int DESCRIPTION = 1; + public final static int PRIORITY = 2; + public final static int DATE = 3; + public final static int DURATION = 4; + + // Criteria that the instance uses + private int criteria; + + /** + * Creates a resource sorter that will use the given sort criteria. + * + * @param criteria the sort criterion to use: one of <code>NAME</code> or + * <code>TYPE</code> + */ + public PlanningGameSorter(int criteria) { + super(); + this.criteria = criteria; + } + + @Override + public int compare(Viewer viewer, Object obj1, Object obj2) { + ITask t1 = (ITask) obj1; + ITask t2 = (ITask) obj2; + + switch (criteria) { + case DESCRIPTION: + return compareDescription(t1, t2); + case PRIORITY: + return comparePriority(t1, t2); + case DATE: + return compareDate(t1, t2); + case DURATION: + return compareDuration(t1, t2); + default: + return 0; + } + } + + private int compareDescription(ITask task1, ITask task2) { + return task1.getLabel().compareTo(task2.getLabel()); + } + + private int comparePriority(ITask task1, ITask task2) { + return task1.getPriority().compareTo(task2.getPriority()); + } + + private int compareDate(ITask task1, ITask task2) { + return task2.getEndDate().compareTo(task1.getEndDate()); + } + + private int compareDuration(ITask task1, ITask task2) { + return task1.getElapsedTimeLong() < task2.getElapsedTimeLong() ? 1 : -1; + } +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameWizard.java new file mode 100644 index 000000000..c1e041778 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameWizard.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.ui; + +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.mylar.core.MylarPlugin; +import org.eclipse.mylar.tasklist.MylarTasklistPlugin; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.INewWizard; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; + +/** + * @author Ken Sueda + */ +public class PlanningGameWizard extends Wizard implements INewWizard { + + private PlanningGameWizardPage planningGamePage = null; + public PlanningGameWizard() { + super(); + init(); + } + + @Override + public boolean performFinish() { + try { + int numDays = planningGamePage.getNumDays(); + IWorkbenchPage page = MylarTasklistPlugin.getDefault() + .getWorkbench().getActiveWorkbenchWindow().getActivePage(); + if (page == null) + return false; + IEditorInput input = new PlanningGameEditorInput(numDays, + MylarTasklistPlugin.getTaskListManager().getTaskList()); + page.openEditor(input, MylarTasklistPlugin.PLANNING_GAME_EDITOR_ID); + } catch (PartInitException ex) { + MylarPlugin.log(ex, "coudln't open summary editor"); + } + return true; + } + + public void init(IWorkbench workbench, IStructuredSelection selection) { + } + + private void init() { + planningGamePage = new PlanningGameWizardPage(); + super.setForcePreviousAndNextButtons(true); + } + + @Override + public void addPages() { + addPage(planningGamePage); + } +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameWizardPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameWizardPage.java new file mode 100644 index 000000000..810616396 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameWizardPage.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 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.tasklist.report.ui; + +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +/** + * @author Ken Sueda + */ +public class PlanningGameWizardPage extends WizardPage { + + private Text numDays; + private int num = 0; + + public PlanningGameWizardPage() { + super("Planning Game Wizard"); + setTitle("Planning Game Report"); + setDescription("All tasks completed with the last selected date will be summarized into a report"); + } + + public void createControl(Composite parent) { + Composite container = new Composite(parent, SWT.NULL); + GridLayout layout = new GridLayout(); + container.setLayout(layout); + layout.numColumns = 2; + + + Label l = new Label(container, SWT.NULL); + l.setText("Number of days to compile reports over: "); + numDays = new Text(container, SWT.BORDER); + numDays.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + try{ + num = Integer.parseInt(numDays.getText()); + setErrorMessage(null); + } catch (Exception ex) { + setErrorMessage("Must be integer"); + num = 0; + } + } + }); + setControl(container); + } + + public int getNumDays() { + return num; + } +} |