### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.core Index: src/org/eclipse/mylyn/tasks/core/TaskComment.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskComment.java,v retrieving revision 1.8 diff -u -r1.8 TaskComment.java --- src/org/eclipse/mylyn/tasks/core/TaskComment.java 8 Oct 2007 05:11:05 -0000 1.8 +++ src/org/eclipse/mylyn/tasks/core/TaskComment.java 25 Jan 2008 20:40:46 -0000 @@ -21,7 +21,7 @@ private static final long serialVersionUID = 1076016406335550318L; /** Comment's number */ - private final int number; + private int number; private boolean hasAttachment; @@ -42,6 +42,15 @@ } /** + * Set the comment number + * + * @param number the number of the comment + */ + public void setNumber(int number) { + this.number = number; + } + + /** * Get the time that this comment was created * * @return The comments creation timestamp #P org.eclipse.mylyn.tasks.ui Index: src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java,v retrieving revision 1.262 diff -u -r1.262 AbstractRepositoryTaskEditor.java --- src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java 24 Jan 2008 04:11:11 -0000 1.262 +++ src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java 25 Jan 2008 20:41:35 -0000 @@ -290,6 +290,12 @@ protected TextViewer summaryTextViewer; + private ImageHyperlink sortHyperlink; + + private boolean commentSortIsDown = true; + + private Composite addCommentsComposite; + /** * WARNING: This is present for backward compatibility only. You can get and set text on this widget but all ui * related changes to this widget will have no affect as ui is now being presented with a StyledText widget. This @@ -323,6 +329,10 @@ private TaskComment selectedComment = null; + protected boolean supportsCommentSort() { + return true; + } + /** * @author Raphael Ackermann (bug 195514) */ @@ -343,8 +353,8 @@ // API-3.0 rename ATTRIBTUES_SECTION to ATTRIBUTES_SECTION (bug 208629) protected enum SECTION_NAME { ATTRIBTUES_SECTION("Attributes"), ATTACHMENTS_SECTION("Attachments"), DESCRIPTION_SECTION("Description"), COMMENTS_SECTION( - "Comments"), NEWCOMMENT_SECTION("New Comment"), ACTIONS_SECTION("Actions"), PEOPLE_SECTION("People"), RELATEDBUGS_SECTION( - "Related Tasks"); + "Comments"), NEWCOMMENT_SECTION("New Comment"), ACTIONS_SECTION("Actions"), PEOPLE_SECTION("People"), RELATEDBUGS_SECTION( + "Related Tasks"); private String prettyName; @@ -406,10 +416,10 @@ // changes."); parentEditor.setMessage("Task has incoming changes, synchronize to view", IMessageProvider.WARNING, new HyperlinkAdapter() { - public void linkActivated(HyperlinkEvent e) { - refreshEditor(); - } - }); + public void linkActivated(HyperlinkEvent e) { + refreshEditor(); + } + }); setSubmitEnabled(false); // updateContents(); @@ -521,7 +531,7 @@ repository = editorInput.getRepository(); taskData = editorInput.getTaskData(); connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(repository.getConnectorKind()); - + commentSortIsDown = TasksUiPlugin.getDefault().getPreferenceStore().getBoolean("org.eclipse.mylyn.editor.comments.sortDirectionDown."+repository.getConnectorKind()); setSite(site); setInput(input); @@ -610,7 +620,7 @@ if (summaryTextViewer != null) { summaryTextViewer.getTextWidget().setFocus(); } - + form.setRedraw(true); } @@ -922,17 +932,17 @@ TasksUiPlugin.getSynchronizationManager().synchronize(connector, repositoryTask, true, new JobChangeAdapter() { - @Override - public void done(IJobChangeEvent event) { - PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { - - public void run() { - refreshEditor(); - } - }); + @Override + public void done(IJobChangeEvent event) { + PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { + public void run() { + refreshEditor(); } }); + + } + }); } } catch (Exception e) { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @@ -1661,7 +1671,7 @@ || task.getSynchronizationState().equals(RepositoryTaskSyncState.OUTGOING)) { MessageDialog.openInformation(attachmentsComposite.getShell(), "Task not synchronized or dirty editor", - "Commit edits or synchronize task before deleting attachments."); + "Commit edits or synchronize task before deleting attachments."); return; } else { if (attachmentsTableViewer != null @@ -2042,6 +2052,19 @@ commentsSection.setText(commentsSection.getText() + " (" + taskData.getComments().size() + ")"); if (taskData.getComments().size() > 0) { commentsSection.setEnabled(true); + commentsSection.addExpansionListener(new ExpansionAdapter() { + public void expansionStateChanged(ExpansionEvent e) { + if (commentsSection.isExpanded()) { + if (supportsCommentSort()) { + sortHyperlink.setEnabled(true); + } + } else { + if (supportsCommentSort()) { + sortHyperlink.setEnabled(false); + } + } + } + }); final Composite commentsSectionClient = toolkit.createComposite(commentsSection); RowLayout rowLayout = new RowLayout(); @@ -2052,6 +2075,20 @@ commentsSectionClient.setLayout(rowLayout); commentsSectionClient.setBackground(null); + if (supportsCommentSort()) { + sortHyperlink = new ImageHyperlink(commentsSectionClient, SWT.NONE); + sortHyperlink.setToolTipText("Change Sortorder of Comments"); + toolkit.adapt(sortHyperlink, true, true); + sortHyperlink.setBackground(null); + + sortHyperlink.addHyperlinkListener(new HyperlinkAdapter() { + public void linkActivated(HyperlinkEvent e) { + sortComments(); + } + }); + sortHyperlink.setEnabled(false); + } + ImageHyperlink collapseAllHyperlink = new ImageHyperlink(commentsSectionClient, SWT.NONE); collapseAllHyperlink.setToolTipText("Collapse All Comments"); toolkit.adapt(collapseAllHyperlink, true, true); @@ -2073,6 +2110,9 @@ BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() { public void run() { revealAllComments(); + if (supportsCommentSort()) { + sortHyperlink.setEnabled(true); + } } }); } @@ -2083,7 +2123,7 @@ } // Additional (read-only) Comments Area - final Composite addCommentsComposite = toolkit.createComposite(commentsSection); + addCommentsComposite = toolkit.createComposite(commentsSection); commentsSection.setClient(addCommentsComposite); GridLayout addCommentsLayout = new GridLayout(); addCommentsLayout.numColumns = 1; @@ -2249,19 +2289,38 @@ toggleExpandableComposite(true, expandableComposite); foundNew = true; } - + + } + if (supportsCommentSort()) { + if (commentSortIsDown) { + sortHyperlink.setImage(TasksUiImages.getImage(TasksUiImages.SORT_COMMENT_DOWN)); + } else { + commentSortIsDown = !commentSortIsDown; + sortComments(); + } } if (foundNew) { commentsSection.setExpanded(true); + if (supportsCommentSort()) { + sortHyperlink.setEnabled(true); + } } else if (taskData.getComments() == null || taskData.getComments().size() == 0) { - //commentsSection.setExpanded(false); + if (supportsCommentSort()) { + sortHyperlink.setEnabled(false); + } } else if (editorInput.getTaskData() != null && editorInput.getOldTaskData() != null) { List newTaskComments = editorInput.getTaskData().getComments(); List oldTaskComments = editorInput.getOldTaskData().getComments(); if (newTaskComments == null || oldTaskComments == null) { commentsSection.setExpanded(true); + if (supportsCommentSort()) { + sortHyperlink.setEnabled(true); + } } else if (newTaskComments.size() != oldTaskComments.size()) { commentsSection.setExpanded(true); + if (supportsCommentSort()) { + sortHyperlink.setEnabled(true); + } } } } @@ -2594,7 +2653,7 @@ protected Section createSection(Composite composite, String title) { return createSection(composite, title, true); } - + /** * @Since 2.3 */ @@ -2734,6 +2793,7 @@ @Override public void dispose() { + TasksUiPlugin.getDefault().getPreferenceStore().setValue("org.eclipse.mylyn.editor.comments.sortDirectionDown."+repository.getConnectorKind(), commentSortIsDown); TasksUiPlugin.getTaskListManager().getTaskList().removeChangeListener(TASKLIST_CHANGE_LISTENER); getSite().getPage().removeSelectionListener(selectionListener); if (waitCursor != null) { @@ -2780,9 +2840,15 @@ try { form.setRedraw(false); refreshEnabled = false; + if (supportsCommentSort()) { + sortHyperlink.setEnabled(false); + } if (commentsSection != null && !commentsSection.isExpanded()) { commentsSection.setExpanded(true); + if (supportsCommentSort()) { + sortHyperlink.setEnabled(true); + } } for (ExpandableComposite composite : commentComposites) { if (composite.isDisposed()) @@ -2859,6 +2925,24 @@ resetLayout(); } + private void sortComments() { + if (addCommentsComposite != null) { + Control[] commentControlList = addCommentsComposite.getChildren(); + int commentControlListLength = commentControlList.length; + for (int i = 1; i < commentControlListLength; i++) + commentControlList[commentControlListLength-i].moveAbove(commentControlList[0]); + } + if (sortHyperlink != null) { + if (commentSortIsDown) { + sortHyperlink.setImage(TasksUiImages.getImage(TasksUiImages.SORT_COMMENT_UP)); + } else { + sortHyperlink.setImage(TasksUiImages.getImage(TasksUiImages.SORT_COMMENT_DOWN)); + } + } + commentSortIsDown = !commentSortIsDown; + resetLayout(); + } + /** * Selects the given object in the editor. * @@ -3387,7 +3471,7 @@ throw new CoreException( new RepositoryStatus(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, RepositoryStatus.ERROR_INTERNAL, - "Task could not be created. No additional information was provided by the connector.")); + "Task could not be created. No additional information was provided by the connector.")); } } else { modifiedTask = TasksUiPlugin.getTaskListManager().getTaskList().getTask(repository.getUrl(), @@ -3407,23 +3491,23 @@ TasksUiPlugin.getSynchronizationManager().synchronize(connector, modifiedTask, true, new JobChangeAdapter() { - @Override - public void done(IJobChangeEvent event) { + @Override + public void done(IJobChangeEvent event) { - if (isNew) { - close(); - TasksUiPlugin.getSynchronizationManager().setTaskRead(finalModifiedTask, - true); - TasksUiUtil.openEditor(finalModifiedTask, false); - } else { - PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { - public void run() { - refreshEditor(); - } - }); + if (isNew) { + close(); + TasksUiPlugin.getSynchronizationManager().setTaskRead(finalModifiedTask, + true); + TasksUiUtil.openEditor(finalModifiedTask, false); + } else { + PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { + public void run() { + refreshEditor(); } - } - }); + }); + } + } + }); TasksUiPlugin.getSynchronizationScheduler().synchNow(0, Collections.singletonList(repository), false); } else { Index: src/org/eclipse/mylyn/internal/tasks/ui/TasksUiImages.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiImages.java,v retrieving revision 1.57 diff -u -r1.57 TasksUiImages.java --- src/org/eclipse/mylyn/internal/tasks/ui/TasksUiImages.java 25 Jan 2008 16:49:32 -0000 1.57 +++ src/org/eclipse/mylyn/internal/tasks/ui/TasksUiImages.java 25 Jan 2008 20:40:54 -0000 @@ -73,6 +73,10 @@ public static final ImageDescriptor TASK_WORKING_SET = create(T_TOOL, "open-task.gif"); + public static final ImageDescriptor SORT_COMMENT_DOWN = create(T_TOOL, "sort-down.gif"); + + public static final ImageDescriptor SORT_COMMENT_UP = create(T_TOOL, "sort-up.gif"); + public static final ImageDescriptor TASKLIST = create("eview16", "task-list.gif"); public static final ImageDescriptor REPOSITORY = create("eview16", "repository.gif"); #P org.eclipse.mylyn.bugzilla.core Index: src/org/eclipse/mylyn/internal/bugzilla/core/SaxMultiBugReportContentHandler.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxMultiBugReportContentHandler.java,v retrieving revision 1.10 diff -u -r1.10 SaxMultiBugReportContentHandler.java --- src/org/eclipse/mylyn/internal/bugzilla/core/SaxMultiBugReportContentHandler.java 24 Jan 2008 05:26:31 -0000 1.10 +++ src/org/eclipse/mylyn/internal/bugzilla/core/SaxMultiBugReportContentHandler.java 25 Jan 2008 20:41:39 -0000 @@ -8,7 +8,9 @@ package org.eclipse.mylyn.internal.bugzilla.core; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; @@ -46,6 +48,8 @@ private RepositoryTaskData repositoryTaskData; + private List longDescs; + private String errorMessage = null; private AbstractAttributeFactory attributeFactory; @@ -102,6 +106,7 @@ attachIdToComment = new HashMap(); commentNum = 0; taskComment = null; + longDescs = new ArrayList(); break; case LONG_DESC: taskComment = new TaskComment(attributeFactory, commentNum++); @@ -215,11 +220,7 @@ break; case LONG_DESC: if (taskComment != null) { - if (taskComment.getNumber() == 0) { - repositoryTaskData.setAttributeValue(RepositoryTaskAttribute.DESCRIPTION, taskComment.getText()); - break; - } - repositoryTaskData.addComment(taskComment); + longDescs.add(taskComment); } break; @@ -264,6 +265,57 @@ case BUG: // Reached end of bug. Need to set LONGDESCLENGTH to number of // comments + int longDescsSize = longDescs.size() - 1; + if (longDescsSize == 0) { + repositoryTaskData.setAttributeValue(RepositoryTaskAttribute.DESCRIPTION, longDescs.get(0).getText()); + } else if (longDescsSize == 1) { + if (longDescs.get(0).getCreated().compareTo(longDescs.get(1).getCreated()) < 0) { + repositoryTaskData.setAttributeValue(RepositoryTaskAttribute.DESCRIPTION, longDescs.get(0) + .getText()); + repositoryTaskData.addComment(longDescs.get(1)); + } else { + repositoryTaskData.setAttributeValue(RepositoryTaskAttribute.DESCRIPTION, longDescs.get(1) + .getText()); + commentNum = 1; + longDescs.get(0).setNumber(commentNum); + repositoryTaskData.addComment(longDescs.get(0)); + } + } else if (longDescsSize > 1) { + String created_0 = longDescs.get(0).getCreated(); + String created_1 = longDescs.get(1).getCreated(); + String created_n = longDescs.get(longDescsSize).getCreated(); + commentNum = 1; + if (created_0.compareTo(created_1) < 0 && created_0.compareTo(created_n) < 0) { + repositoryTaskData.setAttributeValue(RepositoryTaskAttribute.DESCRIPTION, longDescs.get(0) + .getText()); + if (created_1.compareTo(created_n) < 0) { + for (int i = 1; i <= longDescsSize; i++) { + longDescs.get(i).setNumber(commentNum++); + repositoryTaskData.addComment(longDescs.get(i)); + } + } else { + for (int i = longDescsSize; i > 0; i--) { + longDescs.get(i).setNumber(commentNum++); + repositoryTaskData.addComment(longDescs.get(i)); + } + } + } else { + repositoryTaskData.setAttributeValue(RepositoryTaskAttribute.DESCRIPTION, longDescs.get( + longDescsSize).getText()); + if (created_0.compareTo(created_1) < 0) { + for (int i = 0; i < longDescsSize; i++) { + longDescs.get(i).setNumber(commentNum++); + repositoryTaskData.addComment(longDescs.get(i)); + } + } else { + for (int i = longDescsSize - 1; i >= 0; i--) { + longDescs.get(i).setNumber(commentNum++); + repositoryTaskData.addComment(longDescs.get(i)); + } + } + } + } + RepositoryTaskAttribute numCommentsAttribute = repositoryTaskData.getAttribute(BugzillaReportElement.LONGDESCLENGTH.getKeyString()); if (numCommentsAttribute == null) { numCommentsAttribute = attributeFactory.createAttribute(BugzillaReportElement.LONGDESCLENGTH.getKeyString());