diff options
author | Brandon Dong | 2016-03-10 23:53:09 +0000 |
---|---|---|
committer | Sam Davis | 2016-03-24 17:54:08 +0000 |
commit | 4de0e3b0ba052151709d1d52ce52cb21417b9a28 (patch) | |
tree | 158b2a11bacae14fca8109962fdc399aba014912 | |
parent | 85b9eb4498da5cf8b9b114c4a34971b5f6d94c1b (diff) | |
download | org.eclipse.mylyn.reviews-4de0e3b0ba052151709d1d52ce52cb21417b9a28.tar.gz org.eclipse.mylyn.reviews-4de0e3b0ba052151709d1d52ce52cb21417b9a28.tar.xz org.eclipse.mylyn.reviews-4de0e3b0ba052151709d1d52ce52cb21417b9a28.zip |
489395: Clicking on comments should bring you directly to that line
Change-Id: I4b3106f98d3385602959c0dbf013d97233d08853
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=489395
Signed-off-by: Brandon Dong <brandon.dong@tasktop.com>
4 files changed, 69 insertions, 12 deletions
diff --git a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/GerritCompareUi.java b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/GerritCompareUi.java index de3cfb899..cc5f7a804 100644 --- a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/GerritCompareUi.java +++ b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/GerritCompareUi.java @@ -16,11 +16,14 @@ import org.eclipse.compare.CompareEditorInput; import org.eclipse.compare.CompareUI; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.reviews.ui.compare.FileItemCompareEditorInput; +import org.eclipse.mylyn.internal.reviews.ui.compare.ReviewItemCompareEditorInput; import org.eclipse.mylyn.internal.reviews.ui.compare.ReviewItemSetCompareEditorInput; import org.eclipse.mylyn.reviews.core.model.IFileItem; import org.eclipse.mylyn.reviews.core.model.IReviewItemSet; +import org.eclipse.mylyn.reviews.internal.core.model.Comment; import org.eclipse.mylyn.reviews.ui.ReviewBehavior; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.PartInitException; @@ -44,9 +47,18 @@ public class GerritCompareUi { public static void openFileComparisonEditor(CompareConfiguration configuration, IFileItem item, ReviewBehavior behavior) { + openFileComparisonEditor(configuration, item, behavior, null); + } + + public static void openFileComparisonEditor(CompareConfiguration configuration, IFileItem item, + ReviewBehavior behavior, IStructuredSelection selection) { CompareEditorInput editorInput = new FileItemCompareEditorInput(configuration, item, behavior); CompareEditorInput newInput = getComparisonEditor(editorInput, getFileComparePredicate(item)); openCompareEditor(newInput); + if (selection != null && selection.getFirstElement() instanceof Comment + && newInput instanceof ReviewItemCompareEditorInput) { + ((ReviewItemCompareEditorInput) newInput).gotoComment((Comment) selection.getFirstElement()); + } } private static CompareEditorInput getComparisonEditor(CompareEditorInput editorInput, @@ -96,7 +108,8 @@ public class GerritCompareUi { @Override public boolean apply(CompareEditorInput existingEditorInput) { if (existingEditorInput instanceof ReviewItemSetCompareEditorInput) { - return (((ReviewItemSetCompareEditorInput) existingEditorInput).getName().equals(itemSet.getName()) && taskId.equals(((ReviewItemSetCompareEditorInput) existingEditorInput).getItemTaskId())); + return (((ReviewItemSetCompareEditorInput) existingEditorInput).getName().equals(itemSet.getName()) + && taskId.equals(((ReviewItemSetCompareEditorInput) existingEditorInput).getItemTaskId())); } return false; } diff --git a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/providers/OpenCompareEditorProvider.java b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/providers/OpenCompareEditorProvider.java index 89316f26b..dd39463d0 100644 --- a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/providers/OpenCompareEditorProvider.java +++ b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/providers/OpenCompareEditorProvider.java @@ -61,7 +61,8 @@ public class OpenCompareEditorProvider extends CommonActionProvider { TaskEditorInput input = (TaskEditorInput) part.getEditorInput(); GerritReviewBehavior behavior = new GerritReviewBehavior(input.getTask()); CompareConfiguration configuration = new CompareConfiguration(); - GerritCompareUi.openFileComparisonEditor(configuration, fileItem, behavior); + GerritCompareUi.openFileComparisonEditor(configuration, fileItem, behavior, + selection); } } } diff --git a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/ReviewCompareAnnotationSupport.java b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/ReviewCompareAnnotationSupport.java index ba8360e88..6d76a659d 100644 --- a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/ReviewCompareAnnotationSupport.java +++ b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/ReviewCompareAnnotationSupport.java @@ -47,6 +47,7 @@ import org.eclipse.mylyn.internal.reviews.ui.annotations.CommentPopupDialog; import org.eclipse.mylyn.internal.reviews.ui.annotations.ReviewAnnotationModel; import org.eclipse.mylyn.reviews.core.model.IFileItem; import org.eclipse.mylyn.reviews.core.model.IReviewItem; +import org.eclipse.mylyn.reviews.internal.core.model.Comment; import org.eclipse.mylyn.reviews.ui.ReviewBehavior; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; @@ -54,6 +55,10 @@ import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.texteditor.AbstractTextEditor; +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterators; + /** * Manages annotation models for compare viewers. * @@ -218,6 +223,32 @@ public class ReviewCompareAnnotationSupport { return null; } + public void gotoAnnotationWithComment(final Comment comment) { + CommentAnnotation rightAnnotation = findComment(rightAnnotationModel, comment); + if (rightAnnotation != null) { + selectAndReveal(rightSourceViewer, rightAnnotation.getPosition()); + } else { + CommentAnnotation leftAnnotation = findComment(leftAnnotationModel, comment); + if (leftAnnotation != null) { + selectAndReveal(leftSourceViewer, leftAnnotation.getPosition()); + } + } + } + + private CommentAnnotation findComment(ReviewAnnotationModel annotationModel, final Comment comment) { + Optional<Annotation> annotation = Iterators.tryFind(annotationModel.getAnnotationIterator(), + new Predicate<Annotation>() { + public boolean apply(Annotation annotation) { + return annotation instanceof CommentAnnotation + && ((CommentAnnotation) annotation).getComment().getId().equals(comment.getId()); + } + }); + if (annotation.isPresent()) { + return (CommentAnnotation) annotation.get(); + } + return null; + } + private int getLineOffset(ReviewAnnotationModel annotationModel, int offset) { try { int line = annotationModel.getDocument().getLineOfOffset(offset); @@ -340,11 +371,10 @@ public class ReviewCompareAnnotationSupport { commentPopupDialog.create(); commentPopupDialog.setInput(input); - commentPopupDialog.setHeightBasedOnMouse(Display.getCurrent().getCursorLocation().y); + commentPopupDialog.setHeightBasedOnMouse(sourceViewer.getSourceViewer().getControl().toDisplay(0, 0).y); - Point location = sourceViewer.getSourceViewer().getControl().getLocation(); - location = Display.getCurrent().getCursorLocation(); - location.y = location.y + (sourceViewer.getViewportHeight() / 2); + Point location = sourceViewer.getSourceViewer().getControl().toDisplay( + sourceViewer.getSourceViewer().getControl().getSize().x, sourceViewer.getViewportHeight() / 3); commentPopupDialog.setLocation(location); commentPopupDialog.open(); commentPopupDialog.setFocus(); diff --git a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/ReviewItemCompareEditorInput.java b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/ReviewItemCompareEditorInput.java index edb68b2d9..0d8ad6f9f 100644 --- a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/ReviewItemCompareEditorInput.java +++ b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/ReviewItemCompareEditorInput.java @@ -32,6 +32,7 @@ import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.reviews.ui.Messages; import org.eclipse.mylyn.internal.reviews.ui.ReviewsImages; import org.eclipse.mylyn.internal.reviews.ui.ReviewsUiPlugin; +import org.eclipse.mylyn.reviews.internal.core.model.Comment; import org.eclipse.mylyn.reviews.ui.ReviewBehavior; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; @@ -53,6 +54,8 @@ public abstract class ReviewItemCompareEditorInput extends CompareEditorInput { final ReviewBehavior behavior; + private ReviewCompareAnnotationSupport currentSupport; + public ReviewItemCompareEditorInput(CompareConfiguration configuration, ReviewBehavior behavior) { super(configuration); this.behavior = behavior; @@ -97,14 +100,20 @@ public abstract class ReviewItemCompareEditorInput extends CompareEditorInput { public Viewer findContentViewer(Viewer oldViewer, ICompareInput input, Composite parent) { Viewer contentViewer = super.findContentViewer(oldViewer, input, parent); if (input instanceof FileItemNode && ((FileItemNode) input).getFileItem() != null) { - ReviewCompareAnnotationSupport support = ReviewCompareAnnotationSupport.getAnnotationSupport(contentViewer); - support.setReviewItem(((FileItemNode) input).getFileItem(), behavior); - initializeGotoCommentHandlers(parent, support); + currentSupport = ReviewCompareAnnotationSupport.getAnnotationSupport(contentViewer); + currentSupport.setReviewItem(((FileItemNode) input).getFileItem(), behavior); + initializeGotoCommentHandlers(parent); } return contentViewer; } - private void initializeGotoCommentHandlers(Composite parent, final ReviewCompareAnnotationSupport support) { + public void gotoComment(Comment comment) { + if (currentSupport != null) { + currentSupport.gotoAnnotationWithComment(comment); + } + } + + private void initializeGotoCommentHandlers(Composite parent) { ToolBarManager tbm = CompareViewerPane.getToolBarManager(parent); if (tbm != null) { if (tbm.find(NAVIGATION_GROUP) != null) { @@ -112,7 +121,9 @@ public abstract class ReviewItemCompareEditorInput extends CompareEditorInput { Action goToNextAction = new Action(Messages.Reviews_NextComment, ReviewsImages.NEXT_COMMENT) { @Override public void run() { - support.gotoAnnotation(Direction.FORWARDS); + if (currentSupport != null) { + currentSupport.gotoAnnotation(Direction.FORWARDS); + } } }; goToNextAction.setId(ID_NEXT_COMMENT); @@ -125,7 +136,9 @@ public abstract class ReviewItemCompareEditorInput extends CompareEditorInput { ReviewsImages.PREVIOUS_COMMENT) { @Override public void run() { - support.gotoAnnotation(Direction.BACKWARDS); + if (currentSupport != null) { + currentSupport.gotoAnnotation(Direction.BACKWARDS); + } } }; goToPreviousAction.setId(ID_PREVIOUS_COMMENT); |