Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcvs2git2006-03-17 18:50:26 +0000
committercvs2git2006-03-17 18:50:26 +0000
commit67a70de8da422c8c6dee91d6ed80a2f7eb0f246f (patch)
tree04f12312a291e5abdece9c10afaf1ed0d93c9d33 /org.eclipse.mylyn.tasks.ui
parent3238989443355ffd5e874ddcdf93fbb52b8a66b0 (diff)
downloadorg.eclipse.mylyn.tasks-67a70de8da422c8c6dee91d6ed80a2f7eb0f246f.tar.gz
org.eclipse.mylyn.tasks-67a70de8da422c8c6dee91d6ed80a2f7eb0f246f.tar.xz
org.eclipse.mylyn.tasks-67a70de8da422c8c6dee91d6ed80a2f7eb0f246f.zip
This commit was manufactured by cvs2svn to create branch 'e_3_1'.
Cherrypick from master 2006-03-17 18:50:25 UTC mkersten 'Version update': org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/NewBugWizardTest.java org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RegularExpressionMatchTest.java org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bug.gif org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-feature.gif org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaImages.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiPlugin.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/NewBugEditor.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCategorySearchOperation.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaQueryHit.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryQuery.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/WizardAttributesPage.java org.eclipse.mylyn.help.ui/doc/images/0.4.9/jira-query.gif org.eclipse.mylyn.help.ui/doc/images/0.4.9/jira-select-type.gif org.eclipse.mylyn.help.ui/doc/images/0.4.9/tasklist-import.gif org.eclipse.mylyn.help.ui/doc/images/0.4.9/tasklist-indication-active.gif org.eclipse.mylyn.help.ui/doc/images/0.4.9/tasklist-notification.gif org.eclipse.mylyn.help.ui/doc/images/reference/book-allen-gettingThingsDone.gif org.eclipse.mylyn.help.ui/doc/images/reference/book-beck-xp.gif org.eclipse.mylyn.help.ui/doc/images/reference/book-bloch-effectiveJava.gif org.eclipse.mylyn.help.ui/doc/images/reference/book-gamma-eclipse.gif org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaStructureBridge.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaUiBridge.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/BugzillaHyperLink.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearchOperation.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaReferencesProvider.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/ui/actions/OpenCorrespondingTaskAction.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TableSorterTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskActivityViewTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskKeyComparatorTest.java org.eclipse.mylyn.tasks.ui/build.xml org.eclipse.mylyn.tasks.ui/icons/elcl16/expandall.gif org.eclipse.mylyn.tasks.ui/icons/elcl16/filter-archive.gif org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-notes.gif org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-synchronizing.gif org.eclipse.mylyn.tasks.ui/icons/eview16/priority-1.gif org.eclipse.mylyn.tasks.ui/icons/eview16/priority-2.gif org.eclipse.mylyn.tasks.ui/icons/eview16/priority-3.gif org.eclipse.mylyn.tasks.ui/icons/eview16/priority-4.gif org.eclipse.mylyn.tasks.ui/icons/eview16/priority-5.gif org.eclipse.mylyn.tasks.ui/icons/eview16/status-conflict.gif org.eclipse.mylyn.tasks.ui/icons/eview16/status-normal.gif org.eclipse.mylyn.tasks.ui/icons/eview16/status-server-context.gif org.eclipse.mylyn.tasks.ui/icons/eview16/task-activity.gif org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerLabelProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/PlanningPerspectiveFactory.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskArchiveFilter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompletionFilter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListColorsAndFonts.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImageDescriptor.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ExpandAllAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/FilterArchiveContainerAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityContentProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityLabelProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityView.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityViewSorter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskKeyComparator.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableSorter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractTaskContainer.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeActivityDelegate.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeContainer.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListChangeListener.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskArchive.java
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui')
-rw-r--r--org.eclipse.mylyn.tasks.ui/build.xml70
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/elcl16/expandall.gifbin0 -> 164 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/elcl16/filter-archive.gifbin0 -> 350 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gifbin0 -> 220 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-notes.gifbin0 -> 337 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-synchronizing.gifbin0 -> 179 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/priority-1.gifbin0 -> 154 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/priority-2.gifbin0 -> 133 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/priority-3.gifbin0 -> 55 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/priority-4.gifbin0 -> 190 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/priority-5.gifbin0 -> 199 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/status-conflict.gifbin0 -> 202 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/status-normal.gifbin0 -> 55 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/status-server-context.gifbin0 -> 175 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/task-activity.gifbin0 -> 581 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gifbin0 -> 2749 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerLabelProvider.java83
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/PlanningPerspectiveFactory.java59
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskArchiveFilter.java26
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompletionFilter.java42
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListColorsAndFonts.java54
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImageDescriptor.java95
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ExpandAllAction.java42
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/FilterArchiveContainerAction.java50
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityContentProvider.java84
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityLabelProvider.java142
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityView.java580
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityViewSorter.java193
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskKeyComparator.java58
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableSorter.java90
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractTaskContainer.java100
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeActivityDelegate.java259
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeContainer.java212
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListChangeListener.java42
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskArchive.java45
35 files changed, 2326 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/build.xml b/org.eclipse.mylyn.tasks.ui/build.xml
new file mode 100644
index 000000000..9e71711ee
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/build.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- WARNING: Eclipse auto-generated file.
+ Any modifications will be overwritten.
+ To include a user specific buildfile here, simply create one in the same
+ directory with the processing instruction <?eclipse.ant.import?>
+ as the first entry and export the buildfile again. -->
+<project basedir="." default="build" name="org.eclipse.mylar.tasklist">
+ <property environment="env"/>
+ <property name="ECLIPSE_HOME" value="../../../Apps/eclipse-3.2M5"/>
+ <property name="debuglevel" value="source,lines,vars"/>
+ <property name="target" value="1.5"/>
+ <property name="source" value="1.5"/>
+ <path id="Plug-in Dependencies.libraryclasspath">
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.ui_3.2.0.I20060216-1600.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.swt_3.2.0.v3224m.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.swt.win32.win32.x86_3.2.0.v3224.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.jface_3.2.0.I20060216-1600.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.core.commands_3.2.0.I20060214-1600.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.ui.workbench_3.2.0.I20060216-1600.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.core.runtime_3.2.0.v20060216.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.core.runtime.compatibility.registry_3.2.0.v20060215a/runtime_registry_compatibility.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.equinox.registry_3.2.0.v20060217.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.core.jobs_3.2.0.v20060206.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.equinox.preferences_1.0.0.v20060215a.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.core.contenttype_3.2.0.v20060215a.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.equinox.common_1.0.0.v20060215a.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.osgi_3.2.0.v20060214.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.core.resources_3.2.0.v20060214.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.ui.browser_3.2.0.v20060212.jar"/>
+ <pathelement location="${ECLIPSE_HOME}/plugins/org.eclipse.ui.forms_3.2.0.v20060212b.jar"/>
+ <pathelement location="../../../org.eclipse.mylar.core"/>
+ </path>
+ <path id="org.eclipse.mylar.tasklist.classpath">
+ <path refid="Plug-in Dependencies.libraryclasspath"/>
+ <pathelement location="bin"/>
+ </path>
+ <target name="init">
+ <mkdir dir="bin"/>
+ <copy includeemptydirs="false" todir="bin">
+ <fileset dir="src" excludes="**/*.launch, **/*.java"/>
+ </copy>
+ </target>
+ <target name="clean">
+ <delete dir="bin"/>
+ </target>
+ <target depends="clean" name="cleanall"/>
+ <target depends="build-subprojects,build-project" name="build"/>
+ <target name="build-subprojects"/>
+ <target depends="init" name="build-project">
+ <echo message="${ant.project.name}: ${ant.file}"/>
+ <javac debug="true" debuglevel="${debuglevel}" destdir="bin" source="${source}" target="${target}">
+ <src path="src"/>
+ <classpath refid="org.eclipse.mylar.tasklist.classpath"/>
+ </javac>
+ </target>
+ <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/>
+ <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
+ <copy todir="${ant.library.dir}">
+ <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
+ </copy>
+ <unzip dest="${ant.library.dir}">
+ <patternset includes="jdtCompilerAdapter.jar"/>
+ <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
+ </unzip>
+ </target>
+ <target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
+ <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+ <antcall target="build"/>
+ </target>
+</project>
diff --git a/org.eclipse.mylyn.tasks.ui/icons/elcl16/expandall.gif b/org.eclipse.mylyn.tasks.ui/icons/elcl16/expandall.gif
new file mode 100644
index 000000000..0205b2917
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/elcl16/expandall.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/elcl16/filter-archive.gif b/org.eclipse.mylyn.tasks.ui/icons/elcl16/filter-archive.gif
new file mode 100644
index 000000000..8a1fd4734
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/elcl16/filter-archive.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif
new file mode 100644
index 000000000..fd01f49e0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-notes.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-notes.gif
new file mode 100644
index 000000000..77b112185
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-notes.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-synchronizing.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-synchronizing.gif
new file mode 100644
index 000000000..7fe247650
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-synchronizing.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-1.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-1.gif
new file mode 100644
index 000000000..d98c0701d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-1.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-2.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-2.gif
new file mode 100644
index 000000000..17118d84b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-2.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-3.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-3.gif
new file mode 100644
index 000000000..45b759436
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-3.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-4.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-4.gif
new file mode 100644
index 000000000..3313cd5ff
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-4.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-5.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-5.gif
new file mode 100644
index 000000000..8c5125e46
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-5.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/status-conflict.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-conflict.gif
new file mode 100644
index 000000000..1e364acb5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-conflict.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/status-normal.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-normal.gif
new file mode 100644
index 000000000..45b759436
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-normal.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/status-server-context.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-server-context.gif
new file mode 100644
index 000000000..7323d9601
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-server-context.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/task-activity.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/task-activity.gif
new file mode 100644
index 000000000..44ed28d04
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/task-activity.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif
new file mode 100644
index 000000000..08e472ad6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerLabelProvider.java
new file mode 100644
index 000000000..50f9985c3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerLabelProvider.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.planner.ui;
+
+import java.text.DateFormat;
+
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.mylar.internal.core.util.DateUtil;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ken Sueda
+ */
+public class TaskPlannerLabelProvider extends TaskElementLabelProvider implements ITableLabelProvider, IColorProvider {
+
+ private TaskElementLabelProvider taskListLabelProvider = new TaskElementLabelProvider();
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex == 0) {
+ return super.getImage(element);
+ } else {
+ return null;
+ }
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ try {
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ switch (columnIndex) {
+ case 1:
+ return task.getPriority();
+ case 2:
+ return task.getDescription();
+ case 3:
+ if (task.getCreationDate() != null) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getCreationDate());
+ } else {
+ MylarStatusHandler.log("Task has no creation date: " + task.getDescription(), this);
+ return "[unknown]";
+ }
+ case 4:
+ if (task.getCompletionDate() != null) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getCompletionDate());
+ } else {
+ return "";
+ }
+ case 5:
+ return DateUtil.getFormattedDurationShort(task.getElapsedTime());
+ case 6:
+ return task.getEstimateTimeHours() + " hours";
+ }
+ }
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not produce completed task label", false);
+ return "";
+ }
+ return null;
+ }
+
+ public Color getForeground(Object element) {
+ return taskListLabelProvider.getForeground(element);
+ }
+
+ public Color getBackground(Object element) {
+ return taskListLabelProvider.getBackground(element);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/PlanningPerspectiveFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/PlanningPerspectiveFactory.java
new file mode 100644
index 000000000..03a6ee7a7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/PlanningPerspectiveFactory.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui;
+
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskActivityView;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+/**
+ * @author Mik Kersten
+ */
+public class PlanningPerspectiveFactory implements IPerspectiveFactory {
+
+ public void createInitialLayout(IPageLayout layout) {
+ defineActions(layout);
+ defineLayout(layout);
+ }
+
+ public void defineActions(IPageLayout layout) {
+ layout.addShowViewShortcut(IPageLayout.ID_RES_NAV);
+ layout.addShowViewShortcut(IPageLayout.ID_PROP_SHEET);
+ layout.addShowViewShortcut(TaskListView.ID);
+ layout.addShowViewShortcut(TaskActivityView.ID);
+
+ layout.addActionSet(IPageLayout.ID_NAVIGATE_ACTION_SET);
+ }
+
+ public void defineLayout(IPageLayout layout) {
+ String editorArea = layout.getEditorArea();
+
+ IFolderLayout topLeft = layout.createFolder(
+ "topLeft", IPageLayout.LEFT, (float) 0.4, editorArea);//$NON-NLS-1$
+ topLeft.addView(TaskListView.ID);
+
+ IFolderLayout bottomLeft = layout.createFolder(
+ "bottomLeft", IPageLayout.BOTTOM, (float) 0.50,//$NON-NLS-1$
+ "topLeft");//$NON-NLS-1$
+ bottomLeft.addView(TaskActivityView.ID);
+ topLeft.addPlaceholder(IPageLayout.ID_RES_NAV);
+
+// IFolderLayout bottomRight = layout.createFolder(
+// "bottomRight", IPageLayout.BOTTOM, (float) 0.66,//$NON-NLS-1$
+// editorArea);
+//
+// bottomRight.addView(IPageLayout.ID_TASK_LIST);
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskArchiveFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskArchiveFilter.java
new file mode 100644
index 000000000..55d91b855
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskArchiveFilter.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylar.internal.tasklist.ui;
+
+import org.eclipse.mylar.provisional.tasklist.TaskArchive;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskArchiveFilter extends AbstractTaskFilter {
+
+ public boolean select(Object element) {
+ if (element instanceof TaskArchive) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompletionFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompletionFilter.java
new file mode 100644
index 000000000..1fc94d074
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompletionFilter.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylar.internal.tasklist.ui;
+
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskCompletionFilter extends AbstractTaskFilter {
+
+ public boolean select(Object element) {
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ if (shouldAlwaysShow(task)) {
+ return true;
+ }
+ return !task.isCompleted();
+ } else if (element instanceof AbstractQueryHit) {
+ AbstractQueryHit hit = (AbstractQueryHit) element;
+ if (hit.getCorrespondingTask() != null) {
+ if (shouldAlwaysShow(hit.getCorrespondingTask())) {
+ return true;
+ } else {
+ return !hit.getCorrespondingTask().isCompleted();
+ }
+ } else {
+ return true;
+ }
+ }
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListColorsAndFonts.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListColorsAndFonts.java
new file mode 100644
index 000000000..eb7714308
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListColorsAndFonts.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListColorsAndFonts {
+
+ public static final Color BACKGROUND_ARCHIVE = new Color(Display.getDefault(), 225, 226, 246);
+
+ public static final Color COLOR_GRAY_LIGHT = new Color(Display.getDefault(), 170, 170, 170);
+
+ public static final Color COLOR_TASK_COMPLETED = new Color(Display.getDefault(), 170, 170, 170);
+
+ public static final Color COLOR_TASK_ACTIVE = new Color(Display.getDefault(), 36, 22, 50);
+
+ public static final Color COLOR_TASK_OVERDUE = new Color(Display.getDefault(), 200, 10, 30);
+
+ public static final Color COLOR_HYPERLINK = new Color(Display.getDefault(), 0, 0, 255);
+
+ public static final Font BOLD = JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);
+
+ public static final Font ITALIC = JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT);
+
+ /**
+ * NOTE: disposal of JFaceResources fonts handled by registry.
+ */
+ public static void dispose() {
+ BACKGROUND_ARCHIVE.dispose();
+ COLOR_GRAY_LIGHT.dispose();
+ COLOR_TASK_COMPLETED.dispose();
+ COLOR_TASK_ACTIVE.dispose();
+ COLOR_TASK_OVERDUE.dispose();
+ COLOR_HYPERLINK.dispose();
+ }
+
+ public static final String THEME_COLOR_ID_TASKLIST_CATEGORY = "org.eclipse.mylar.tasklist.ui.colors.background.category";
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImageDescriptor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImageDescriptor.java
new file mode 100644
index 000000000..1d74525b2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImageDescriptor.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2006 - 2006 Mylar eclipse.org project 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:
+ * Mylar project committers - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListImageDescriptor extends CompositeImageDescriptor {
+
+ private ImageData base;
+
+ private ImageData overlay;
+
+ private Point fSize;
+
+ private boolean top;
+
+ private boolean left;
+
+ public TaskListImageDescriptor(ImageDescriptor baseDesc, ImageDescriptor overlayDesc, boolean top,
+ boolean left) {
+ this.base = getImageData(baseDesc);
+ this.top = top;
+ this.left = left;
+ if (overlayDesc != null)
+ this.overlay = getImageData(overlayDesc);
+ Point size = new Point(base.width, base.height);
+ setImageSize(size);
+ }
+
+ public TaskListImageDescriptor(ImageDescriptor baseDesc, Point size) {
+ this.base = getImageData(baseDesc);
+ setImageSize(size);
+ }
+
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ drawImage(base, 0, 0);
+ int x = 0;
+ int y = 0;
+ if (!left)
+ x = 8;// base.width - overlay.width;
+ if (!top)
+ y = 8;// base.height - overlay.height;
+ if (overlay != null) {
+ drawImage(overlay, x, y);
+ }
+ }
+
+ private ImageData getImageData(ImageDescriptor descriptor) {
+ ImageData data = descriptor.getImageData(); // see bug 51965:
+ // getImageData can
+ // return null
+ if (data == null) {
+ data = DEFAULT_IMAGE_DATA;
+ }
+ return data;
+ }
+
+ /**
+ * Sets the size of the image created by calling
+ * <code>createImage()</code>.
+ *
+ * @param size
+ * the size of the image returned from calling
+ * <code>createImage()</code>
+ * @see ImageDescriptor#createImage()
+ */
+ public void setImageSize(Point size) {
+ Assert.isNotNull(size);
+ Assert.isTrue(size.x >= 0 && size.y >= 0);
+ fSize = size;
+ }
+
+ @Override
+ protected Point getSize() {
+ return new Point(fSize.x, fSize.y);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ExpandAllAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ExpandAllAction.java
new file mode 100644
index 000000000..2ae9a6d1f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ExpandAllAction.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+
+/**
+ * @author Mik Kersten
+ */
+public class ExpandAllAction extends Action {
+
+ private static final String LABEL = "Expand All";
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.expand.all";
+
+ private TaskListView taskListView;
+
+ public ExpandAllAction(TaskListView taskListView) {
+ super(LABEL);
+ this.taskListView = taskListView;
+ setId(ID);
+ setText(LABEL);
+ setToolTipText(LABEL);
+ setImageDescriptor(TaskListImages.EXPAND_ALL);
+ }
+
+ public void run() {
+ if (taskListView.getViewer() != null)
+ taskListView.getViewer().expandAll();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/FilterArchiveContainerAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/FilterArchiveContainerAction.java
new file mode 100644
index 000000000..3fc809151
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/FilterArchiveContainerAction.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class FilterArchiveContainerAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.filter.archive";
+
+ private static final String LABEL = "Filter Archive Category";
+
+ private final TaskListView view;
+
+ public FilterArchiveContainerAction(TaskListView view) {
+ this.view = view;
+ setText(LABEL);
+ setToolTipText(LABEL);
+ setId(ID);
+ setImageDescriptor(TaskListImages.FILTER_ARCHIVE);
+ setChecked(MylarTaskListPlugin.getMylarCorePrefs().contains(TaskListPreferenceConstants.FILTER_ARCHIVE_MODE));
+ }
+
+ @Override
+ public void run() {
+ MylarTaskListPlugin.getMylarCorePrefs().setValue(TaskListPreferenceConstants.FILTER_ARCHIVE_MODE, isChecked());
+ if (isChecked()) {
+ view.addFilter(view.getArchiveFilter());
+ } else {
+ view.removeFilter(view.getArchiveFilter());
+ }
+ this.view.getViewer().refresh();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityContentProvider.java
new file mode 100644
index 000000000..e10eccc0e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityContentProvider.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui.views;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylar.provisional.tasklist.DateRangeContainer;
+import org.eclipse.mylar.provisional.tasklist.DateRangeActivityDelegate;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class TaskActivityContentProvider implements IStructuredContentProvider, ITreeContentProvider {
+
+// private TreeViewer treeViewer;
+
+ private TaskListManager taskListManager;
+
+ public TaskActivityContentProvider(TaskListManager taskActivityManager) {
+ this.taskListManager = taskActivityManager;
+// this.treeViewer = viewer;
+ }
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+// treeViewer = (TreeViewer)v;
+// taskActivityManager = MylarTaskListPlugin.getTaskActivityManager();
+// taskActivityManager.addListener(this);
+ }
+
+ public void dispose() {
+// taskActivityManager.removeListener(this);
+ }
+
+ public Object[] getElements(Object parent) {
+ return taskListManager.getDateRanges();
+ }
+
+ public Object getParent(Object child) {
+ if (child instanceof DateRangeActivityDelegate) {
+ DateRangeActivityDelegate dateRangeTaskWrapper = (DateRangeActivityDelegate) child;
+ return dateRangeTaskWrapper.getParent();
+ } else {
+ return new Object[0];
+ }
+ }
+
+ public Object[] getChildren(Object parent) {
+ if (parent instanceof DateRangeContainer) {
+ DateRangeContainer taskContainer = (DateRangeContainer) parent;
+ return taskContainer.getChildren().toArray();
+ } else {
+ return new Object[0];
+ }
+ }
+
+ public boolean hasChildren(Object parent) {
+ if (parent instanceof DateRangeContainer) {
+ DateRangeContainer dateRangeTaskCategory = (DateRangeContainer) parent;
+ return dateRangeTaskCategory.getChildren() != null && dateRangeTaskCategory.getChildren().size() > 0;
+ } else {
+ return false;
+ }
+ }
+
+// public void changed(Object o) {
+// if (o != null) {
+// treeViewer.refresh(o);
+// } else {
+// treeViewer.refresh();
+// }
+// }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityLabelProvider.java
new file mode 100644
index 000000000..441af1185
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityLabelProvider.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui.views;
+
+import java.text.DateFormat;
+
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.IFontProvider;
+import org.eclipse.jface.viewers.ILabelDecorator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.mylar.internal.core.util.DateUtil;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil;
+import org.eclipse.mylar.provisional.tasklist.DateRangeActivityDelegate;
+import org.eclipse.mylar.provisional.tasklist.DateRangeContainer;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer;
+import org.eclipse.mylar.provisional.tasklist.Task.PriorityLevel;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskActivityLabelProvider extends DecoratingLabelProvider implements ITableLabelProvider, IColorProvider,
+ IFontProvider {
+
+ private static final String UNITS_HOURS = " hours";
+
+ private static final String NO_MINUTES = "0 minutes";
+
+ private Color categoryBackgroundColor;
+
+ public TaskActivityLabelProvider(ILabelProvider provider, ILabelDecorator decorator, Color parentBacground) {
+ super(provider, decorator);
+ this.categoryBackgroundColor = parentBacground;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex == 0) {
+ if (element instanceof DateRangeContainer) {
+ return TaskListImages.getImage(TaskListImages.CALENDAR);
+ } else if (element instanceof DateRangeActivityDelegate) {
+ return super.getImage(((DateRangeActivityDelegate) element).getCorrespondingTask());
+ } else {
+ return super.getImage(element);
+ }
+ } else if (columnIndex == 1) {
+ if (element instanceof DateRangeActivityDelegate) {
+ DateRangeActivityDelegate taskElement = (DateRangeActivityDelegate) element;
+ return TaskListUiUtil.getImageForPriority(PriorityLevel.fromString(taskElement.getPriority()));
+ }
+ }
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ if (element instanceof DateRangeActivityDelegate) {
+ DateRangeActivityDelegate activityDelegate = (DateRangeActivityDelegate) element;
+ ITask task = activityDelegate.getCorrespondingTask();
+ switch (columnIndex) {
+ case 2:
+ return task.getDescription();
+ case 3:
+ return DateUtil.getFormattedDurationShort(activityDelegate.getDateRangeContainer().getElapsed(activityDelegate));
+ case 4:
+ return task.getEstimateTimeHours() + UNITS_HOURS;
+ case 5:
+ if (task.getReminderDate() != null) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getReminderDate());
+ } else {
+ return "";
+ }
+ case 6:
+ if (activityDelegate.getStart() > 0) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(activityDelegate.getStart());
+ } else {
+ return "";
+ }
+ }
+ } else if (element instanceof DateRangeContainer) {
+ DateRangeContainer taskCategory = (DateRangeContainer) element;
+ switch (columnIndex) {
+ case 2:
+ return taskCategory.getDescription();
+ case 3:
+ String elapsedTimeString = NO_MINUTES;
+ try {
+ elapsedTimeString = DateUtil.getFormattedDurationShort(taskCategory.getTotalElapsed());
+ if (elapsedTimeString.equals(""))
+ elapsedTimeString = NO_MINUTES;
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not format elapsed time", true);
+ }
+ return elapsedTimeString;
+ case 4:
+ return taskCategory.getTotalEstimated() + UNITS_HOURS;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Color getBackground(Object element) {
+ if (element instanceof AbstractTaskContainer) {
+ return categoryBackgroundColor;
+ } else {
+ return super.getBackground(element);
+ }
+ }
+
+ public Font getFont(Object element) {
+ if (element instanceof DateRangeContainer) {
+ DateRangeContainer container = (DateRangeContainer) element;
+ if (container.isPresent()) {
+ return TaskListColorsAndFonts.BOLD;
+ }
+ } else if (element instanceof DateRangeActivityDelegate) {
+ DateRangeActivityDelegate durationDelegate = (DateRangeActivityDelegate) element;
+ return super.getFont(durationDelegate.getCorrespondingTask());
+ }
+ return super.getFont(element);
+ }
+
+ public void setCategoryBackgroundColor(Color categoryBackgroundColor) {
+ this.categoryBackgroundColor = categoryBackgroundColor;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityView.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityView.java
new file mode 100644
index 000000000..50a0c1b0f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityView.java
@@ -0,0 +1,580 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui.views;
+
+import java.text.DateFormat;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.ICellEditorListener;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.mylar.internal.core.dt.MylarWebRef;
+import org.eclipse.mylar.internal.tasklist.planner.ui.ReminderCellEditor;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts;
+import org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskListElementAction;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer;
+import org.eclipse.mylar.provisional.tasklist.DateRangeActivityDelegate;
+import org.eclipse.mylar.provisional.tasklist.DateRangeContainer;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskActivityListener;
+import org.eclipse.mylar.provisional.tasklist.ITaskListChangeListener;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskActivityView extends ViewPart {
+
+ private static final String MEMENTO_KEY_WIDTH = "colwidth";
+
+ public static final String ID = "org.eclipse.mylar.tasklist.activity";
+
+ public static final String columnWidthIdentifier = "org.eclipse.mylar.tasklist.ui.views.taskactivity.columnwidth";
+
+ public static final String tableSortIdentifier = "org.eclipse.mylar.tasklist.ui.views.taskactivity.sortIndex";
+
+ private static TaskActivityView INSTANCE;
+
+ private IMemento taskActivityMemento;
+
+ private OpenTaskListElementAction openTaskEditor;
+
+ private String[] columnNames = new String[] { " ", " !", "Description", "Elapsed", "Estimated", "Reminder",
+ "Last Active" };
+
+ private int[] columnWidths = new int[] { 60, 12, 160, 60, 70, 100, 100 };
+
+ private TreeColumn[] columns;
+
+ private TaskActivityLabelProvider taskHistoryTreeLabelProvider;
+
+ private TreeViewer treeViewer;
+
+ private TaskActivityContentProvider taskActivityTableContentProvider;
+
+ private IThemeManager themeManager;
+
+ private final IPropertyChangeListener THEME_CHANGE_LISTENER = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME)
+ || event.getProperty().equals(TaskListColorsAndFonts.THEME_COLOR_ID_TASKLIST_CATEGORY)) {
+ taskHistoryTreeLabelProvider.setCategoryBackgroundColor(themeManager.getCurrentTheme()
+ .getColorRegistry().get(TaskListColorsAndFonts.THEME_COLOR_ID_TASKLIST_CATEGORY));
+ refresh();
+ }
+ }
+ };
+
+ /**
+ * TODO: need lazier refresh policy.
+ */
+ private final ITaskActivityListener ACTIVITY_LISTENER = new ITaskActivityListener() {
+
+ public void taskActivated(ITask task) {
+ refresh();
+ // TaskActivityView.this.treeViewer.refresh(task);
+ }
+
+ public void tasksActivated(List<ITask> tasks) {
+ for (ITask task : tasks) {
+ taskActivated(task);
+ }
+ }
+
+ public void taskDeactivated(ITask task) {
+ // don't need to refresh here
+ // TaskActivityView.this.treeViewer.refresh(task);
+ }
+
+ public void activityChanged(DateRangeContainer week) {
+ refresh();
+ // TaskActivityView.this.treeViewer.refresh(week);
+ }
+
+ public void tasklistRead() {
+ refresh();
+ }
+ };
+
+ private ITaskListChangeListener TASK_CHANGE_LISTENER = new ITaskListChangeListener() {
+
+ public void localInfoChanged(final ITask updateTask) {
+ refresh();
+ }
+
+ public void repositoryInfoChanged(ITask task) {
+ localInfoChanged(task);
+ }
+
+ public void taskMoved(ITask task, AbstractTaskContainer fromContainer, AbstractTaskContainer toContainer) {
+ // ignore
+ }
+
+ public void taskDeleted(ITask task) {
+ // ignore
+ }
+
+ public void containerAdded(AbstractTaskContainer container) {
+ // ignore
+ }
+
+ public void containerDeleted(AbstractTaskContainer container) {
+ // ignore
+ }
+
+ public void taskAdded(ITask task) {
+ // ignore
+ }
+
+ public void containerInfoChanged(AbstractTaskContainer container) {
+ // ignore
+ }
+ };
+
+ private TaskActivityViewSorter sorter;
+
+ public static TaskActivityView openInActivePerspective() {
+ try {
+ return (TaskActivityView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(ID);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public TaskActivityView() {
+ INSTANCE = this;
+ MylarTaskListPlugin.getTaskListManager().addActivityListener(ACTIVITY_LISTENER);
+ MylarTaskListPlugin.getTaskListManager().getTaskList().addChangeListener(TASK_CHANGE_LISTENER);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ MylarTaskListPlugin.getTaskListManager().removeActivityListener(ACTIVITY_LISTENER);
+ MylarTaskListPlugin.getTaskListManager().getTaskList().removeChangeListener(TASK_CHANGE_LISTENER);
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+ themeManager.addPropertyChangeListener(THEME_CHANGE_LISTENER);
+
+ int treeStyle = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION;
+ treeViewer = new TreeViewer(parent, treeStyle);
+
+ getViewer().getTree().setHeaderVisible(true);
+ getViewer().getTree().setLinesVisible(true);
+ getViewer().setColumnProperties(columnNames);
+ getViewer().setUseHashlookup(true);
+
+ columns = new TreeColumn[columnNames.length];
+ for (int i = 0; i < columnNames.length; i++) {
+ columns[i] = new TreeColumn(getViewer().getTree(), SWT.LEFT);
+ columns[i].setText(columnNames[i]);
+ columns[i].setWidth(columnWidths[i]);
+
+ final int index = i;
+ columns[i].addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ int column = index - 1;
+ if (column == sorter.getSortColumn()) {
+ sorter.reverseDirection();
+ } else {
+ sorter.setSortColumn(column);
+ }
+ getViewer().refresh();
+ // if(taskActivityMemento != null) {
+ // sorter.saveState(taskActivityMemento);
+ // }
+
+ }
+ });
+
+ columns[i].addControlListener(new ControlListener() {
+ public void controlResized(ControlEvent e) {
+ for (int j = 0; j < columnWidths.length; j++) {
+ if (columns[j].equals(e.getSource())) {
+ columnWidths[j] = columns[j].getWidth();
+ }
+ }
+ }
+
+ public void controlMoved(ControlEvent e) {
+ // don't care if the control is moved
+ }
+ });
+ }
+
+ IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+ Color categoryBackground = themeManager.getCurrentTheme().getColorRegistry().get(
+ TaskListColorsAndFonts.THEME_COLOR_ID_TASKLIST_CATEGORY);
+
+ taskHistoryTreeLabelProvider = new TaskActivityLabelProvider(new TaskElementLabelProvider(), PlatformUI
+ .getWorkbench().getDecoratorManager().getLabelDecorator(), categoryBackground);
+
+ sorter = new TaskActivityViewSorter();
+ getViewer().setSorter(sorter);
+ taskActivityTableContentProvider = new TaskActivityContentProvider(MylarTaskListPlugin.getTaskListManager());
+
+ getViewer().setContentProvider(taskActivityTableContentProvider);
+ getViewer().setLabelProvider(taskHistoryTreeLabelProvider);
+ getViewer().setInput(getViewSite());
+ restoreState();
+ createCellEditorListener();
+ makeActions();
+ initDrop();
+ hookOpenAction();
+
+ }
+
+ @MylarWebRef(name = "Drag and drop article", url = "http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html")
+ private void initDrop() {
+ Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
+
+ treeViewer.addDropSupport(DND.DROP_MOVE, types, new ViewerDropAdapter(treeViewer) {
+ {
+ setFeedbackEnabled(false);
+ }
+
+ @Override
+ public boolean performDrop(Object data) {
+
+ IStructuredSelection selection = ((IStructuredSelection) TaskListView.getDefault().getViewer()
+ .getSelection());
+
+ Object target = getCurrentTarget();
+ DateRangeContainer container;
+ Calendar reminderCalendar;
+ if (target instanceof DateRangeContainer) {
+ container = (DateRangeContainer) target;
+ reminderCalendar = container.getStart();
+
+ } else if (target instanceof DateRangeActivityDelegate) {
+ DateRangeActivityDelegate dateRangeActivityDelegate = (DateRangeActivityDelegate) target;
+ reminderCalendar = dateRangeActivityDelegate.getDateRangeContainer().getStart();
+ } else {
+ return false;
+ }
+
+ for (Iterator iter = selection.iterator(); iter.hasNext();) {
+ Object selectedObject = iter.next();
+ ITask task = null;
+ if (selectedObject instanceof ITask) {
+ task = (ITask) selectedObject;
+ } else if (selectedObject instanceof AbstractQueryHit) {
+ task = ((AbstractQueryHit) selectedObject).getOrCreateCorrespondingTask();
+ }
+ if (task != null) {
+ MylarTaskListPlugin.getTaskListManager().setReminder(task, reminderCalendar.getTime());
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean validateDrop(Object targetObject, int operation, TransferData transferType) {
+ Object selectedObject = ((IStructuredSelection) TaskListView.getDefault().getViewer().getSelection())
+ .getFirstElement();
+
+ if (selectedObject instanceof AbstractTaskContainer) {
+ return false;
+ }
+
+ Object target = getCurrentTarget();
+ DateRangeContainer dateRangeContainer = null;
+ if (target instanceof DateRangeContainer) {
+ dateRangeContainer = (DateRangeContainer) target;
+ } else if (target instanceof DateRangeActivityDelegate) {
+ DateRangeActivityDelegate dateRangeActivityDelegate = (DateRangeActivityDelegate) target;
+ dateRangeContainer = dateRangeActivityDelegate.getDateRangeContainer();
+ }
+
+ if (dateRangeContainer != null && (dateRangeContainer.isPresent() || dateRangeContainer.isFuture())) {
+ return true;
+ }
+ return false;
+ }
+ });
+ }
+
+ private void makeActions() {
+ openTaskEditor = new OpenTaskListElementAction(this.getViewer());
+ // openUrlInExternal = new OpenTaskInExternalBrowserAction();
+ }
+
+ private void hookOpenAction() {
+ getViewer().addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ openTaskEditor.run();
+ }
+ });
+ }
+
+ public static TaskActivityView getDefault() {
+ return INSTANCE;
+ }
+
+ private TreeViewer getViewer() {
+ return treeViewer;
+ }
+
+ private void refresh() {
+ if (PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (getViewer().getControl() != null && !getViewer().getControl().isDisposed()) {
+ TaskActivityView.this.treeViewer.refresh();
+ }
+ }
+ });
+ }
+ }
+
+ public ITask getSelectedTask() {
+ ISelection selection = getViewer().getSelection();
+ if (selection.isEmpty())
+ return null;
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection) selection;
+ Object element = structuredSelection.getFirstElement();
+ if (element instanceof ITask) {
+ return (ITask) structuredSelection.getFirstElement();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void setFocus() {
+ // ignore
+ }
+
+ private void createCellEditorListener() {
+ CellEditor[] editors = new CellEditor[columnNames.length];
+ final ComboBoxCellEditor estimateEditor = new ComboBoxCellEditor(treeViewer.getTree(),
+ TaskListManager.ESTIMATE_TIMES, SWT.READ_ONLY);
+ final ReminderCellEditor reminderEditor = new ReminderCellEditor(treeViewer.getTree());
+ editors[0] = null; // not used
+ editors[1] = null;// not used
+ editors[2] = null;// not used
+ editors[3] = null;// not used
+ editors[4] = estimateEditor;
+ editors[5] = reminderEditor;
+ reminderEditor.addListener(new ICellEditorListener() {
+ public void applyEditorValue() {
+ Object selection = ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
+ if (selection instanceof DateRangeActivityDelegate) {
+ // ((ITask)
+ // selection).setReminderDate(reminderEditor.getReminderDate());
+ // treeViewer.refresh();
+ DateRangeActivityDelegate dateRangeActivityDelegate = (DateRangeActivityDelegate) selection;
+ MylarTaskListPlugin.getTaskListManager().setReminder(
+ dateRangeActivityDelegate.getCorrespondingTask(), reminderEditor.getReminderDate());
+ // MylarTaskListPlugin.getTaskListManager().notifyLocalInfoChanged((ITask)
+ // selection);
+ }
+ }
+
+ public void cancelEditor() {
+ }
+
+ public void editorValueChanged(boolean oldValidState, boolean newValidState) {
+ }
+
+ });
+ estimateEditor.addListener(new ICellEditorListener() {
+ public void applyEditorValue() {
+ Object selection = ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
+ if (selection instanceof ITask) {
+ ITask task = (ITask) selection;
+ int estimate = (Integer) estimateEditor.getValue();
+ if (estimate == -1) {
+ estimate = 0;
+ }
+ task.setEstimatedTimeHours(estimate);
+ // updateLabels();
+ refresh();
+ // treeViewer.refresh();
+ }
+ }
+
+ public void cancelEditor() {
+ }
+
+ public void editorValueChanged(boolean oldValidState, boolean newValidState) {
+ }
+
+ });
+ treeViewer.setCellEditors(editors);
+ getViewer().setCellModifier(new TaskActivityCellModifier(treeViewer));
+ }
+
+ private class TaskActivityCellModifier implements ICellModifier {
+
+ private TreeViewer treeViewer;
+
+ public TaskActivityCellModifier(TreeViewer tableViewer) {
+ this.treeViewer = tableViewer;
+ }
+
+ public boolean canModify(Object element, String property) {
+ int columnIndex = Arrays.asList(columnNames).indexOf(property);
+ if (columnIndex == 4 || columnIndex == 5) {
+ return true;
+ }
+ return false;
+ }
+
+ public Object getValue(Object element, String property) {
+ if (element instanceof ITask) {
+ int columnIndex = Arrays.asList(columnNames).indexOf(property);
+ if (element instanceof ITask) {
+ if (columnIndex == 5) {
+ if (((ITask) element).getReminderDate() != null) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(
+ ((ITask) element).getReminderDate());
+ } else {
+ return null;
+ }
+ } else if (columnIndex == 4) {
+ return new Integer(Arrays.asList(TaskListManager.ESTIMATE_TIMES).indexOf(
+ ((ITask) element).getEstimateTimeHours()));
+ }
+ }
+ }
+ return null;
+ }
+
+ public void modify(Object element, String property, Object value) {
+ int columnIndex = Arrays.asList(columnNames).indexOf(property);
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ if (columnIndex == 4) {
+ if (value instanceof Integer) {
+ task.setEstimatedTimeHours(((Integer) value).intValue() * 10);
+ treeViewer.refresh();
+ }
+ }
+ }
+ }
+ }
+
+ // OLD SORTER
+ // private class TaskActivityTableSorter extends ViewerSorter {
+ //
+ // public TaskActivityTableSorter() {
+ // super();
+ // }
+ //
+ // @Override
+ // public int compare(Viewer compareViewer, Object o1, Object o2) {
+ // if (o1 instanceof DateRangeContainer) {
+ // if (o2 instanceof DateRangeContainer) {
+ // DateRangeContainer dateRangeTaskContainer1 = (DateRangeContainer) o1;
+ // DateRangeContainer dateRangeTaskContainer2 = (DateRangeContainer) o2;
+ // return
+ // dateRangeTaskContainer2.getStart().compareTo(dateRangeTaskContainer1.getStart());
+ // } else {
+ // return 1;
+ // }
+ // } else if (o1 instanceof ITask) {
+ // if (o2 instanceof AbstractTaskContainer) {
+ // return -1;
+ // } else if (o2 instanceof DateRangeActivityDelegate) {
+ // DateRangeActivityDelegate task1 = (DateRangeActivityDelegate) o1;
+ // DateRangeActivityDelegate task2 = (DateRangeActivityDelegate) o2;
+ // Calendar calendar1 = task1.getStart();//
+ // MylarTaskListPlugin.getTaskActivityManager().getLastOccurrence(task1.getHandleIdentifier());
+ // Calendar calendar2 = task2.getStart();//
+ // MylarTaskListPlugin.getTaskActivityManager().getLastOccurrence(task2.getHandleIdentifier());
+ // if (calendar1 != null && calendar2 != null) {
+ // return calendar2.compareTo(calendar1);
+ // }
+ // }
+ // }
+ // return 0;
+ // }
+ // }
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ super.init(site, memento);
+ this.taskActivityMemento = memento;
+ }
+
+ @Override
+ public void saveState(IMemento memento) {
+ IMemento colMemento = memento.createChild(columnWidthIdentifier);
+ for (int i = 0; i < columnWidths.length; i++) {
+ IMemento m = colMemento.createChild("col" + i);
+ m.putInteger(MEMENTO_KEY_WIDTH, columnWidths[i]);
+ }
+
+ sorter.saveState(memento);
+ }
+
+ private void restoreState() {
+
+ if (taskActivityMemento != null) {
+ IMemento taskActivityWidth = taskActivityMemento.getChild(columnWidthIdentifier);
+ if (taskActivityWidth != null) {
+ for (int i = 0; i < columnWidths.length; i++) {
+ IMemento m = taskActivityWidth.getChild("col" + i);
+ if (m != null) {
+ int width = m.getInteger(MEMENTO_KEY_WIDTH);
+ columnWidths[i] = width;
+ columns[i].setWidth(width);
+ }
+ }
+ }
+
+ sorter.restoreState(taskActivityMemento);
+
+ }
+ getViewer().refresh();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityViewSorter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityViewSorter.java
new file mode 100644
index 000000000..e5a3a9ad5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivityViewSorter.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui.views;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer;
+import org.eclipse.mylar.provisional.tasklist.DateRangeActivityDelegate;
+import org.eclipse.mylar.provisional.tasklist.DateRangeContainer;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.Task.PriorityLevel;
+import org.eclipse.ui.IMemento;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskActivityViewSorter extends ViewerSorter {
+
+ private static final String activitySortColumn = "org.eclipse.mylar.tasklist.ui.views.taskactivitysorter.sortcolumn";
+
+ private static final String activityViewSorterSettings = "org.eclipse.mylar.tasklist.ui.views.taskactivitysorter.sortsettings";
+
+ private int[] directions;
+
+ private final static int ASCENDING = 1;
+
+ private final static int DESCENDING = -1;
+
+ private final static int PRIORITY = 0;
+
+ private final static int DESCRIPTION = 1;
+
+ private final static int ELAPSED = 2;
+
+ private final static int ESTIMATED = 3;
+
+ private final static int REMINDER = 4;
+
+ private final static int LAST_ACTIVE = 5;
+
+ private int sortColumn = LAST_ACTIVE;
+
+ final static int[] DEFAULT_DIRECTIONS = { ASCENDING, ASCENDING, ASCENDING, DESCENDING, DESCENDING, DESCENDING,
+ DESCENDING };
+
+ public TaskActivityViewSorter() {
+ resetState();
+ }
+
+ public void reverseDirection() {
+ directions[sortColumn] *= -1;
+ }
+
+ public void setSortDirection(int direction) {
+ if (direction == ASCENDING || direction == DESCENDING)
+ directions[sortColumn] = direction;
+ }
+
+ public int getDirection() {
+ return directions[sortColumn];
+ }
+
+ public int getSortColumn() {
+ return sortColumn;
+ }
+
+ public void setSortColumn(int col) {
+ if (col < 0 || col >= directions.length) {
+ sortColumn = LAST_ACTIVE;
+ } else {
+ sortColumn = col;
+ }
+ }
+
+ public void resetState() {
+ directions = new int[DEFAULT_DIRECTIONS.length];
+ System.arraycopy(DEFAULT_DIRECTIONS, 0, directions, 0, directions.length);
+ }
+
+ private int compare(DateRangeActivityDelegate task1, DateRangeActivityDelegate task2) {
+ if (sortColumn >= directions.length)
+ return 0;
+
+ switch (sortColumn) {
+ case PRIORITY: {
+ PriorityLevel a = Task.PriorityLevel.fromString(task1.getPriority());
+ PriorityLevel b = Task.PriorityLevel.fromString(task2.getPriority());
+ int result = a.compareTo(b);
+ return result * directions[sortColumn];
+ }
+ case DESCRIPTION: {
+ String description1 = task1.getDescription();
+ String description2 = task2.getDescription();
+ int result = collator.compare(description1, description2);
+ return result * directions[sortColumn];
+ }
+ case ELAPSED: {
+ long elapsed1 = task1.getDateRangeContainer().getElapsed(task1);
+ long elapsed2 = task2.getDateRangeContainer().getElapsed(task2);
+ int result = new Long(elapsed1).compareTo(new Long(elapsed2));
+ return result * directions[sortColumn];
+ }
+ case ESTIMATED: {
+ int estimate1 = task1.getEstimateTimeHours();
+ int estimate2 = task2.getEstimateTimeHours();
+ int result = estimate1 - estimate2;
+ return result * directions[sortColumn];
+ }
+ case REMINDER: {
+ int result = 0;
+ if (task1.getReminderDate() != null && task2.getReminderDate() != null) {
+ long reminder1 = task1.getReminderDate().getTime();
+ long reminder2 = task2.getReminderDate().getTime();
+ result = new Long(reminder1).compareTo(new Long(reminder2));
+ } else if (task1.getReminderDate() != null) {
+ result = 1;
+ } else if (task2.getReminderDate() != null) {
+ result = -1;
+ }
+ return result * directions[sortColumn];
+ }
+ case LAST_ACTIVE: {
+ long active1 = task1.getStart();
+ long active2 = task2.getStart();
+ int result = new Long(active1).compareTo(new Long(active2));
+ return result * directions[sortColumn];
+ }
+ }
+ return 0;
+ }
+
+ public int compare(Viewer viewer, Object o1, Object o2) {
+ if (o1 instanceof DateRangeContainer) {
+ if (o2 instanceof DateRangeContainer) {
+ DateRangeContainer dateRangeTaskContainer1 = (DateRangeContainer) o1;
+ DateRangeContainer dateRangeTaskContainer2 = (DateRangeContainer) o2;
+ return dateRangeTaskContainer2.getStart().compareTo(dateRangeTaskContainer1.getStart());
+ } else {
+ return 1;
+ }
+ } else if (o1 instanceof ITask) {
+ if (o2 instanceof AbstractTaskContainer) {
+ return -1;
+ } else if (o2 instanceof DateRangeActivityDelegate) {
+ DateRangeActivityDelegate task1 = (DateRangeActivityDelegate) o1;
+ DateRangeActivityDelegate task2 = (DateRangeActivityDelegate) o2;
+ return compare(task1, task2);
+ }
+ }
+ return 0;
+ }
+
+ public void saveState(IMemento memento) {
+ if (memento == null)
+ return;
+ IMemento sortingMemento = memento.createChild(activityViewSorterSettings);
+ if (sortingMemento != null) {
+
+ for (int i = 0; i < directions.length; i++) {
+ sortingMemento.putInteger("direction" + i, directions[i]);
+ }
+ sortingMemento.putInteger(activitySortColumn, sortColumn);
+ }
+ }
+
+ public void restoreState(IMemento memento) {
+ if (memento == null)
+ return;
+
+ IMemento sortingMemento = memento.getChild(activityViewSorterSettings);
+ if (sortingMemento != null) {
+ try {
+ for (int i = 0; i < directions.length; i++) {
+ directions[i] = sortingMemento.getInteger("direction" + i);
+ }
+ sortColumn = sortingMemento.getInteger(activitySortColumn);
+ } catch (NumberFormatException e) {
+ resetState();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskKeyComparator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskKeyComparator.java
new file mode 100644
index 000000000..5025e4fc5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskKeyComparator.java
@@ -0,0 +1,58 @@
+package org.eclipse.mylar.internal.tasklist.ui.views;
+
+import java.util.Comparator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Eugene Kuleshov (https://bugs.eclipse.org/bugs/show_bug.cgi?id=129511)
+ */
+public class TaskKeyComparator implements Comparator {
+
+ public static final Pattern PATTERN = Pattern.compile("(?:([A-Za-z]*[:_\\-]?)(\\d+))?(.*)");
+
+ public int compare(Object o1, Object o2) {
+ String[] a1 = split((String) o1);
+ String[] a2 = split((String) o2);
+
+ String s1 = a1[0];
+ String s2 = a2[0];
+ if (s1 == null && s2 != null)
+ return -1;
+ if (s1 != null && s2 == null)
+ return 1;
+
+ if (s1 != null && s2 != null) {
+ int n = s1.compareTo(s2);
+ if (n != 0)
+ return n;
+
+ s1 = a1[1];
+ s2 = a2[1];
+ if (s1.length() == s2.length() || s1.length() == 0 || s2.length() == 0) {
+ n = s1.compareTo(s2);
+ } else {
+ n = Integer.valueOf(s1).compareTo(Integer.valueOf(s2));
+ }
+ if (n != 0)
+ return n;
+ }
+
+ return a1[2].compareTo(a2[2]);
+ }
+
+ public String[] split(String s) {
+ Matcher matcher = PATTERN.matcher(s);
+
+ if (!matcher.find()) {
+ return new String[] { null, null, s };
+ }
+
+ int n = matcher.groupCount();
+ String[] res = new String[n];
+ for (int i = 1; i < n + 1; i++) {
+ res[i - 1] = matcher.group(i);
+ }
+ return res;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableSorter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableSorter.java
new file mode 100644
index 000000000..3f0a835ed
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableSorter.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.tasklist.ui.views;
+
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.TaskArchive;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListTableSorter extends ViewerSorter {
+
+ private final TaskListView view;
+
+ private String column;
+
+ private TaskKeyComparator taskKeyComparator = new TaskKeyComparator();
+
+ public TaskListTableSorter(TaskListView view, String column) {
+ super();
+ this.view = view;
+ this.column = column;
+ }
+
+ /**
+ * compare - invoked when column is selected calls the actual comparison
+ * method for particular criteria
+ */
+ @Override
+ public int compare(Viewer compareViewer, Object o1, Object o2) {
+ if (o1 instanceof AbstractTaskContainer && o2 instanceof TaskArchive) {
+ return -1;
+ } else if (o2 instanceof AbstractTaskContainer && o1 instanceof TaskArchive) {
+ return 1;
+ }
+
+ if (o1 instanceof AbstractTaskContainer && o2 instanceof ITask) {
+ return 1;
+ }
+ if (o1 instanceof AbstractTaskContainer || o1 instanceof AbstractRepositoryQuery) {
+ if (o2 instanceof AbstractTaskContainer || o2 instanceof AbstractRepositoryQuery) {
+ return this.view.sortDirection
+ * ((ITaskListElement) o1).getDescription().compareTo(((ITaskListElement) o2).getDescription());
+ } else {
+ return -1;
+ }
+ } else if (o1 instanceof ITaskListElement) {
+ if (o2 instanceof AbstractTaskContainer || o2 instanceof AbstractRepositoryQuery) {
+ return -1;
+ } else if (o2 instanceof ITaskListElement) {
+ ITaskListElement element1 = (ITaskListElement) o1;
+ ITaskListElement element2 = (ITaskListElement) o2;
+
+ return compareElements(element1, element2);
+ }
+ } else {
+ return 0;
+ }
+ return 0;
+ }
+
+ private int compareElements(ITaskListElement element1, ITaskListElement element2) {
+ if (column != null && column.equals(this.view.columnNames[1])) {
+ return 0;
+ } else if (column == this.view.columnNames[2]) {
+ return this.view.sortDirection * element1.getPriority().compareTo(element2.getPriority());
+ } else if (column == this.view.columnNames[4]) {
+ String c1 = element1.getDescription();
+ String c2 = element2.getDescription();
+ return this.view.sortDirection * taskKeyComparator.compare(c1, c2);
+ } else {
+ return 0;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractTaskContainer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractTaskContainer.java
new file mode 100644
index 000000000..7a8050b8f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractTaskContainer.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylar.provisional.tasklist;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Manipulate containers via TaskListManager
+ *
+ * @author Mik Kersten
+ */
+public abstract class AbstractTaskContainer implements ITaskListElement {
+
+ private String handle = "";
+
+ private Set<String> childHandles = new HashSet<String>();
+
+ private TaskList taskList;
+
+// public abstract boolean isArchive();
+//
+// public abstract void setIsArchive(boolean isArchive);
+
+ public AbstractTaskContainer(String handleAndDescription, TaskList taskList) {
+ assert handle != null;
+ this.handle = handleAndDescription;
+ this.taskList = taskList;
+ }
+
+ public abstract boolean isLocal();
+
+ public Set<ITask> getChildren() {
+ Set<ITask> children = new HashSet<ITask>();
+ for (String childHandle : childHandles) {
+ ITask task = taskList.getTask(childHandle);
+ if (task != null) {
+ children.add(task);
+ }
+ }
+ return children;
+ }
+
+ public String getDescription() {
+ return handle;
+ }
+
+ public String getHandleIdentifier() {
+ return handle;
+ }
+
+ void setDescription(String description) {
+ this.handle = description;
+ }
+
+ public void setHandleIdentifier(String handle) {
+ this.handle = handle;
+ }
+
+ void add(ITask task) {
+ childHandles.add(task.getHandleIdentifier());
+ }
+
+ void remove(ITask task) {
+ childHandles.remove(task.getHandleIdentifier());
+ }
+
+ public boolean isCompleted() {
+ return false;
+ }
+
+ public int hashCode() {
+ return handle.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object == null)
+ return false;
+ if (object instanceof AbstractTaskContainer) {
+ AbstractTaskContainer compare = (AbstractTaskContainer) object;
+ return this.getHandleIdentifier().equals(compare.getHandleIdentifier());
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "container: " + handle;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeActivityDelegate.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeActivityDelegate.java
new file mode 100644
index 000000000..b09740dd5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeActivityDelegate.java
@@ -0,0 +1,259 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.provisional.tasklist;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class DateRangeActivityDelegate implements ITask {
+
+ private ITask task = null;
+
+// private Calendar start = null;
+//
+// private Calendar end = null;
+
+ private DateRangeContainer parent;
+
+ private long startMili = 0;
+ private long endMili = 0;
+ private long inactivity = 0;
+
+ public DateRangeActivityDelegate(DateRangeContainer parent, ITask task, Calendar start, Calendar end) {
+ this(parent, task, start, end, 0);
+ }
+
+ public DateRangeActivityDelegate(DateRangeContainer parent, ITask task, Calendar start, Calendar end, long inactivity) {
+ if (task == null) {
+ throw new RuntimeException("attempted to instantiated with null task: " + parent);
+ }
+ this.task = task;
+ if(start != null) {
+ this.startMili = start.getTimeInMillis();
+ }
+ if(end != null) {
+ this.endMili = end.getTimeInMillis();
+ }
+// this.start = start;
+// this.end = end;
+ this.parent = parent;
+ this.inactivity = inactivity;
+ }
+
+ public long getEnd() {
+ return endMili;
+ }
+
+ public long getStart() {
+ return startMili;
+ }
+
+ public long getInactivity() {
+ return inactivity;
+ }
+
+ public long getActivity() {
+ return (endMili - startMili) - inactivity;
+ }
+
+ public ITask getCorrespondingTask() {
+ return task;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ((task == null) ? 0 : task.hashCode());
+ result = PRIME * result + ((parent == null) ? 0 : parent.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final DateRangeActivityDelegate other = (DateRangeActivityDelegate) obj;
+ if (task == null) {
+ if (other.task != null)
+ return false;
+ } else if (!task.equals(other.task))
+ return false;
+ if (parent == null) {
+ if (other.parent != null)
+ return false;
+ } else if (!parent.equals(other.parent))
+ return false;
+ return true;
+ }
+
+ public DateRangeContainer getDateRangeContainer() {
+ return parent;
+ }
+
+ public void addSubTask(ITask task) {
+ task.addSubTask(task);
+ }
+
+ public AbstractTaskContainer getContainer() {
+ return task.getContainer();
+ }
+
+ public Set<ITask> getChildren() {
+ return task.getChildren();
+ }
+
+ public Date getCompletionDate() {
+ return task.getCompletionDate();
+ }
+
+ public Date getCreationDate() {
+ return task.getCreationDate();
+ }
+
+ public String getDescription() {
+ return task.getDescription();
+ }
+
+ public long getElapsedTime() {
+ return task.getElapsedTime();
+ }
+
+ public int getEstimateTimeHours() {
+ return task.getEstimateTimeHours();
+ }
+
+ public String getHandleIdentifier() {
+ return task.getHandleIdentifier();
+ }
+
+ public String getKind() {
+ return task.getKind();
+ }
+
+ public String getNotes() {
+ return task.getNotes();
+ }
+
+ public ITask getParent() {
+ return task.getParent();
+ }
+
+ public String getPriority() {
+ return task.getPriority();
+ }
+
+ public Date getReminderDate() {
+ return task.getReminderDate();
+ }
+
+ public String getUrl() {
+ return task.getUrl();
+ }
+
+ public boolean hasBeenReminded() {
+ return task.hasBeenReminded();
+ }
+
+ public boolean hasValidUrl() {
+ return task.hasValidUrl();
+ }
+
+ public boolean isActive() {
+ return task.isActive();
+ }
+
+ public boolean isCompleted() {
+ return task.isCompleted();
+ }
+
+ public boolean isPastReminder() {
+ return task.isPastReminder();
+ }
+
+ public void removeSubTask(ITask task) {
+ task.removeSubTask(task);
+ }
+
+ public void setActive(boolean active) {
+ task.setActive(active);
+ }
+
+ public void setContainer(AbstractTaskContainer category) {
+ task.setContainer(category);
+ }
+
+ public void setCompleted(boolean completed) {
+ task.setCompleted(completed);
+ }
+
+ public void setCompletionDate(Date date) {
+ task.setCompletionDate(date);
+ }
+
+ public void setCreationDate(Date date) {
+ task.setCreationDate(date);
+ }
+
+// public void setDescription(String description) {
+// task.setDescription(description);
+// }
+
+ public void setElapsedTime(long elapsed) {
+ task.setElapsedTime(elapsed);
+ }
+
+ public void setEstimatedTimeHours(int estimated) {
+ task.setEstimatedTimeHours(estimated);
+ }
+
+ public void setHandleIdentifier(String id) {
+ task.setHandleIdentifier(id);
+ }
+
+ public void setKind(String kind) {
+ task.setKind(kind);
+ }
+
+ public void setNotes(String notes) {
+ task.setNotes(notes);
+ }
+
+ public void setParent(ITask parent) {
+ task.setParent(parent);
+ }
+
+ public void setPriority(String priority) {
+ task.setPriority(priority);
+ }
+
+ public void setReminded(boolean reminded) {
+ task.setReminded(reminded);
+ }
+
+ public void setReminderDate(Date date) {
+ task.setReminderDate(date);
+ }
+
+ public void setUrl(String url) {
+ task.setUrl(url);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeContainer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeContainer.java
new file mode 100644
index 000000000..c985e9405
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DateRangeContainer.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.provisional.tasklist;
+
+import java.text.DateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class DateRangeContainer extends AbstractTaskContainer {
+
+ private Set<ITask> children = new HashSet<ITask>();
+
+ private Map<DateRangeActivityDelegate, Long> taskToDuration = new HashMap<DateRangeActivityDelegate, Long>();
+
+ private Calendar startDate;
+
+ private Calendar endDate;
+
+ private long totalElapsed = 0;
+
+ private long totalEstimated = 0;
+
+// private String description;
+
+ public DateRangeContainer(GregorianCalendar startDate, GregorianCalendar endDate, String description, TaskList taskList) {
+ super(description, taskList);
+ this.startDate = startDate;
+ this.endDate = endDate;
+ }
+
+ public DateRangeContainer(Calendar startDate, Calendar endDate, String description, TaskList taskList) {
+ super(description, taskList);
+ this.startDate = startDate;
+ this.endDate = endDate;
+ }
+
+ public DateRangeContainer(GregorianCalendar startDate, GregorianCalendar endDate, TaskList taskList) {
+ super(DateFormat.getDateInstance(DateFormat.FULL).format(startDate.getTime())
+ + " to "
+ + DateFormat.getDateInstance(DateFormat.FULL).format(endDate.getTime()),
+ taskList);
+ // super(startDate.hashCode() + endDate.hashCode() + "");
+// String start = DateFormat.getDateInstance(DateFormat.FULL).format(startDate.getTime());
+// String end = DateFormat.getDateInstance(DateFormat.FULL).format(endDate.getTime());
+// this.description = start + " to " + end;
+ this.startDate = startDate;
+ this.endDate = endDate;
+ }
+
+ public DateRangeContainer(Date time, Date time2, String description, TaskList taskList) {
+ super(description, taskList);
+ startDate = new GregorianCalendar();
+ startDate.setTime(time);
+ endDate = new GregorianCalendar();
+ endDate.setTime(time2);
+// this.description = description;
+ }
+
+ public boolean includes(Calendar cal) {
+ return (startDate.getTimeInMillis() <= cal.getTimeInMillis())
+ && (endDate.getTimeInMillis() >= cal.getTimeInMillis());
+ }
+
+ public void clear() {
+ children.clear();
+ }
+
+ public void addTask(DateRangeActivityDelegate taskWrapper) {
+ long taskActivity = taskWrapper.getActivity();
+ if(taskActivity < 0) taskActivity = 0;
+ totalElapsed += taskActivity;
+ children.remove(taskWrapper);
+ children.add(taskWrapper);
+ if (taskToDuration.containsKey(taskWrapper)) {
+ long previous = taskToDuration.get(taskWrapper);
+ long newDuration = previous + taskActivity;
+ taskToDuration.put(taskWrapper, newDuration);
+ } else {
+ taskToDuration.put(taskWrapper, taskActivity);
+ }
+ }
+
+ public Calendar getStart() {
+ return startDate;
+ }
+
+ public Calendar getEnd() {
+ return endDate;
+ }
+
+ public long getTotalElapsed() {
+ return totalElapsed;
+ }
+
+ public long getElapsed(DateRangeActivityDelegate taskWrapper) {
+ if (taskToDuration.containsKey(taskWrapper)) {
+ return taskToDuration.get(taskWrapper);
+ } else {
+ return 0;
+ }
+ }
+
+ public long getTotalEstimated() {
+ totalEstimated = 0;
+ for (ITask task : children) {
+ totalEstimated += task.getEstimateTimeHours();
+ }
+ return totalEstimated;
+ }
+
+// public Set<TaskActivityDurationDelegate> getElements() {
+// return tasks;
+// }
+
+ public boolean isArchive() {
+ return false;
+ }
+
+ public void setIsArchive(boolean isArchive) {
+ // ignore
+ }
+
+ public String getPriority() {
+ return "";
+ }
+
+// public String getDescription() {
+// return description;
+// }
+
+// public void setDescription(String description) {
+// this.description = description;
+// }
+
+// public String getHandleIdentifier() {
+// return description;
+// }
+
+ public void setHandleIdentifier(String id) {
+ // ignore
+ }
+
+ public Set<ITask> getChildren() {
+// Set<ITask> taskSet = new HashSet<ITask>();
+// taskSet.addAll(tasks);
+ return children;
+// Set<ITask> emptySet = Collections.emptySet();
+// return emptySet;
+ }
+
+ public boolean isFuture() {
+ return !isPresent() && getStart().after(Calendar.getInstance());
+ }
+
+ public boolean isPresent() {
+ return getStart().before(Calendar.getInstance()) && getEnd().after(Calendar.getInstance());
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ((startDate == null) ? 0 : startDate.hashCode());
+ result = PRIME * result + ((endDate == null) ? 0 : endDate.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final DateRangeContainer other = (DateRangeContainer) obj;
+ if (startDate == null) {
+ if (other.startDate != null)
+ return false;
+ } else if (!startDate.equals(other.startDate))
+ return false;
+ if (endDate == null) {
+ if (other.endDate != null)
+ return false;
+ } else if (!endDate.equals(other.endDate))
+ return false;
+ return true;
+ }
+
+ @Override
+ public boolean isLocal() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListChangeListener.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListChangeListener.java
new file mode 100644
index 000000000..9f4151b43
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListChangeListener.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.provisional.tasklist;
+
+/**
+ * Listener for task list modifications and task content modifications.
+ *
+ * @author Mik Kersten
+ */
+public interface ITaskListChangeListener {
+
+ public abstract void localInfoChanged(ITask task);
+
+ public abstract void repositoryInfoChanged(ITask task);
+
+ public abstract void taskDeleted(ITask task);
+
+ public abstract void containerAdded(AbstractTaskContainer container);
+
+ public abstract void containerDeleted(AbstractTaskContainer container);
+
+ public abstract void containerInfoChanged(AbstractTaskContainer container);
+
+ /**
+ * @param task
+ * @param fromContainer can be null
+ * @param toContainer can be null
+ */
+ public abstract void taskMoved(ITask task, AbstractTaskContainer fromContainer, AbstractTaskContainer toContainer);
+
+ public abstract void taskAdded(ITask task);
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskArchive.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskArchive.java
new file mode 100644
index 000000000..dabc7b95e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskArchive.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.provisional.tasklist;
+
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskArchive extends AbstractTaskContainer {
+
+ public static final String HANDLE = "archive";
+
+ public static final String LABEL_ARCHIVE = "Archive (all tasks)";
+
+ public TaskArchive(TaskList taskList) {
+ super(HANDLE, taskList);
+ }
+
+ public String getPriority() {
+ return Task.PriorityLevel.P1.toString();
+ }
+
+ @Override
+ public String getHandleIdentifier() {
+ return HANDLE;
+ }
+
+ public String getDescription() {
+ return LABEL_ARCHIVE;
+ }
+
+ @Override
+ public boolean isLocal() {
+ return true;
+ }
+}

Back to the top