diff options
author | cvs2git | 2006-03-17 18:50:26 +0000 |
---|---|---|
committer | cvs2git | 2006-03-17 18:50:26 +0000 |
commit | 67a70de8da422c8c6dee91d6ed80a2f7eb0f246f (patch) | |
tree | 04f12312a291e5abdece9c10afaf1ed0d93c9d33 /org.eclipse.mylyn.tasks.ui | |
parent | 3238989443355ffd5e874ddcdf93fbb52b8a66b0 (diff) | |
download | org.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')
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 Binary files differnew file mode 100644 index 000000000..0205b2917 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/elcl16/expandall.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/elcl16/filter-archive.gif b/org.eclipse.mylyn.tasks.ui/icons/elcl16/filter-archive.gif Binary files differnew file mode 100644 index 000000000..8a1fd4734 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/elcl16/filter-archive.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif Binary files differnew file mode 100644 index 000000000..fd01f49e0 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif 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 Binary files differnew file mode 100644 index 000000000..77b112185 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-notes.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-synchronizing.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-synchronizing.gif Binary files differnew file mode 100644 index 000000000..7fe247650 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-synchronizing.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-1.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-1.gif Binary files differnew file mode 100644 index 000000000..d98c0701d --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-1.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-2.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-2.gif Binary files differnew file mode 100644 index 000000000..17118d84b --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-2.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-3.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-3.gif Binary files differnew file mode 100644 index 000000000..45b759436 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-3.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-4.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-4.gif Binary files differnew file mode 100644 index 000000000..3313cd5ff --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-4.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-5.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-5.gif Binary files differnew file mode 100644 index 000000000..8c5125e46 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/priority-5.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/status-conflict.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-conflict.gif Binary files differnew file mode 100644 index 000000000..1e364acb5 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-conflict.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/status-normal.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-normal.gif Binary files differnew file mode 100644 index 000000000..45b759436 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-normal.gif 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 Binary files differnew file mode 100644 index 000000000..7323d9601 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/status-server-context.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/task-activity.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/task-activity.gif Binary files differnew file mode 100644 index 000000000..44ed28d04 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/task-activity.gif diff --git a/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif Binary files differnew file mode 100644 index 000000000..08e472ad6 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif 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; + } +} |