Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsminto2005-07-26 20:35:28 +0000
committersminto2005-07-26 20:35:28 +0000
commit8f76b92b996b0d9ce689f513be9585b394aecaa1 (patch)
tree6616f797593e368ae20989da42bb460c9c622798 /org.eclipse.mylyn.tasks.ui
parent2da02580b6bf11366663b415c01cfef6fac6ebc7 (diff)
downloadorg.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')
-rw-r--r--org.eclipse.mylyn.tasks.ui/plugin.xml14
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/ITask.java9
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTasklistPlugin.java17
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/Task.java100
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/DefaultTaskListExternalizer.java21
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/CompletedTaskCollector.java46
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/ITasksCollector.java26
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/internal/TaskReportGenerator.java67
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameContentProvider.java39
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameEditorInput.java83
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameEditorPart.java198
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameLabelProvider.java47
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameSorter.java79
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameWizard.java64
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/report/ui/PlanningGameWizardPage.java64
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;
+ }
+}

Back to the top