### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.core Index: src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataDiff.java =================================================================== RCS file: /cvsroot/mylyn/org.eclipse.mylyn.tasks/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataDiff.java,v retrieving revision 1.1 diff -u -r1.1 TaskDataDiff.java --- src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataDiff.java 1 Mar 2011 09:08:47 -0000 1.1 +++ src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataDiff.java 18 Apr 2011 04:14:22 -0000 @@ -92,7 +92,7 @@ if (oldTaskData != null) { oldAttribute = oldTaskData.getRoot().getMappedAttribute(attributeId); } - if (oldAttribute == null && newAttribute == null) { + if ((newTaskData.isPartial() && newAttribute == null) || (oldAttribute == null && newAttribute == null)) { continue; } addChangedAttribute(oldAttribute, newAttribute, true); @@ -110,7 +110,7 @@ if (oldTaskData != null) { for (TaskAttribute oldAttribute : oldTaskData.getRoot().getAttributes().values()) { TaskAttribute newAttribute = newTaskData.getRoot().getMappedAttribute(oldAttribute.getPath()); - if (newAttribute == null) { + if (newAttribute == null && !newTaskData.isPartial()) { addChangedAttribute(oldAttribute, newAttribute, false); } } Index: src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataState.java =================================================================== RCS file: /cvsroot/mylyn/org.eclipse.mylyn.tasks/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataState.java,v retrieving revision 1.16 diff -u -r1.16 TaskDataState.java --- src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataState.java 10 Apr 2011 17:08:02 -0000 1.16 +++ src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataState.java 18 Apr 2011 04:14:22 -0000 @@ -165,6 +165,7 @@ public void setEditsData(TaskData editsTaskData) { this.editsTaskData = editsTaskData; + this.editsTaskData.setPartial(true); } public void setLastReadData(TaskData oldTaskData) { #P org.eclipse.mylyn.tasks.tests Index: src/org/eclipse/mylyn/tasks/tests/TaskDiffUtilTest.java =================================================================== RCS file: /cvsroot/mylyn/org.eclipse.mylyn.tasks/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDiffUtilTest.java,v retrieving revision 1.5 diff -u -r1.5 TaskDiffUtilTest.java --- src/org/eclipse/mylyn/tasks/tests/TaskDiffUtilTest.java 1 Mar 2011 09:50:20 -0000 1.5 +++ src/org/eclipse/mylyn/tasks/tests/TaskDiffUtilTest.java 18 Apr 2011 04:14:24 -0000 @@ -28,6 +28,8 @@ import org.eclipse.mylyn.tasks.core.data.TaskAttribute; import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper; import org.eclipse.mylyn.tasks.core.data.TaskData; +import org.eclipse.mylyn.tasks.core.data.TaskMapper; +import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector; /** * @author Eugene Kuleshov @@ -91,6 +93,37 @@ assertEquals(" someDate: 2010/02/01 -> 2010/05/28", TaskDiffUtil.toString(diff)); } + public void testPartialNewTaskData() { + TaskData dataA = new TaskData(new TaskAttributeMapper(new TaskRepository("mock", "url")), + MockRepositoryConnector.CONNECTOR_KIND, MockRepositoryConnector.REPOSITORY_URL, "1"); + dataA.setPartial(true); + TaskMapper mapperA = new TaskMapper(dataA, true); + mapperA.setDescription("descriptionA"); + TaskAttribute attributeA = mapperA.getTaskData().getRoot().createAttribute("attributeKey1"); + attributeA.getMetaData().setKind(TaskAttribute.KIND_DEFAULT); + attributeA.getMetaData().setLabel("attributeKey1"); + attributeA.setValue("attValueA"); + + TaskData dataB = new TaskData(new TaskAttributeMapper(new TaskRepository("mock", "url")), + MockRepositoryConnector.CONNECTOR_KIND, MockRepositoryConnector.REPOSITORY_URL, "1"); + TaskMapper mapperB = new TaskMapper(dataB, true); + mapperB.setDescription("descriptionB"); + mapperB.setSummary("summary"); + TaskAttribute attributeB = mapperB.getTaskData().getRoot().createAttribute("attributeKey1"); + attributeB.getMetaData().setKind(TaskAttribute.KIND_DEFAULT); + attributeB.getMetaData().setLabel("attributeKey1"); + attributeB.setValue("attValueB"); + attributeB = mapperB.getTaskData().getRoot().createAttribute("attributeKey2"); + attributeB.getMetaData().setKind(TaskAttribute.KIND_DEFAULT); + attributeB.getMetaData().setLabel("attributeKey2"); + attributeB.setValue("attValue!"); + + TaskDataDiff diff = new TaskDataDiff(new RepositoryModel(new TaskList(), new TaskRepositoryManager()), dataA, + dataB); + assertEquals(" Description descriptionB -> descriptionA\n attributeKey1 attValueB -> attValueA", + TaskDiffUtil.toString(diff)); + } + static class MyTaskAttributeMapper extends TaskAttributeMapper { public MyTaskAttributeMapper(TaskRepository taskRepository) { #P org.eclipse.mylyn.tasks.ui Index: src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java =================================================================== RCS file: /cvsroot/mylyn/org.eclipse.mylyn.tasks/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java,v retrieving revision 1.15 diff -u -r1.15 TaskListNotifier.java --- src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java 4 Mar 2011 08:17:01 -0000 1.15 +++ src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java 18 Apr 2011 04:14:27 -0000 @@ -35,6 +35,7 @@ import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState; import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy; +import org.eclipse.mylyn.tasks.core.data.TaskData; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.TasksUi; @@ -80,10 +81,21 @@ ITaskDataWorkingCopy workingCopy; try { workingCopy = taskDataManager.getTaskDataState(task); - if (workingCopy != null) { - return synchronizationManger.createDiff(workingCopy.getRepositoryData(), workingCopy.getLastReadData(), - new NullProgressMonitor()); + if (workingCopy == null) { + return null; } + + TaskData newTaskData = null; + TaskData oldTaskData = null; + if (task.getSynchronizationState() == SynchronizationState.INCOMING) { + newTaskData = workingCopy.getRepositoryData(); + oldTaskData = workingCopy.getLastReadData(); + } else if (task.getSynchronizationState() == SynchronizationState.OUTGOING) { + newTaskData = workingCopy.getEditsData(); + oldTaskData = workingCopy.getRepositoryData(); + } + return synchronizationManger.createDiff(newTaskData, oldTaskData, new NullProgressMonitor()); + } catch (CoreException e) { StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to get task data for task: \"" //$NON-NLS-1$ + task + "\"", e)); //$NON-NLS-1$ Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java =================================================================== RCS file: /cvsroot/mylyn/org.eclipse.mylyn.tasks/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java,v retrieving revision 1.86 diff -u -r1.86 TaskListToolTip.java --- src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java 2 Mar 2011 23:13:15 -0000 1.86 +++ src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java 18 Apr 2011 04:14:29 -0000 @@ -50,7 +50,6 @@ import org.eclipse.mylyn.tasks.core.IRepositoryElement; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITask; -import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState; import org.eclipse.mylyn.tasks.core.ITaskContainer; import org.eclipse.mylyn.tasks.core.RepositoryStatus; import org.eclipse.mylyn.tasks.core.TaskRepository; @@ -292,10 +291,10 @@ return null; } - private String getIncommingText(IRepositoryElement element) { + private String getIncommingOutcommingText(IRepositoryElement element) { if (element instanceof ITask) { ITask task = (ITask) element; - if (task.getSynchronizationState().isIncoming()) { + if (!task.getSynchronizationState().isSynchronized()) { String text = null; TaskListNotifier notifier = new TaskListNotifier(TasksUiPlugin.getRepositoryModel(), TasksUiPlugin.getTaskDataManager(), TasksUiPlugin.getDefault().getSynchronizationManger()); @@ -482,18 +481,30 @@ addIconAndLabel(composite, CommonImages.getImage(CommonImages.CALENDAR), activityText); } - String incommingText = getIncommingText(currentTipElement); - if (incommingText != null) { - Image image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING); + String incommingOutcommingText = getIncommingOutcommingText(currentTipElement); + if (incommingOutcommingText != null) { + Image image = null; if (currentTipElement instanceof ITask) { ITask task = (ITask) currentTipElement; - if (task.getSynchronizationState() == SynchronizationState.INCOMING_NEW) { + switch (task.getSynchronizationState()) { + case INCOMING: + image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING); + break; + case INCOMING_NEW: image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING_NEW); - } else if (task.getSynchronizationState() == SynchronizationState.OUTGOING_NEW) { + break; + case OUTGOING: + image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_OUTGOING); + break; + case OUTGOING_NEW: image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_OUTGOING_NEW); + break; + default: + image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING); + break; } } - addIconAndLabel(composite, image, incommingText); + addIconAndLabel(composite, image, incommingOutcommingText); } ProgressData progress = getProgressData(currentTipElement);