/*******************************************************************************
* Copyright (c) 2009, 2014 Atlassian 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:
* Atlassian - initial API and implementation
******************************************************************************/
package org.eclipse.mylyn.internal.reviews.ui.actions;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.source.LineRange;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;
import org.eclipse.mylyn.internal.reviews.ui.ReviewUiUtil;
import org.eclipse.mylyn.internal.reviews.ui.ReviewsUiPlugin;
import org.eclipse.mylyn.internal.reviews.ui.annotations.IReviewCompareSourceViewer;
import org.eclipse.mylyn.internal.reviews.ui.dialogs.AddCommentDialog;
import org.eclipse.mylyn.reviews.core.model.ILineLocation;
import org.eclipse.mylyn.reviews.core.model.ILineRange;
import org.eclipse.mylyn.reviews.core.model.ILocation;
import org.eclipse.mylyn.reviews.core.model.IReviewItem;
import org.eclipse.mylyn.reviews.internal.core.model.ReviewsFactory;
import org.eclipse.mylyn.reviews.ui.ReviewBehavior;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
/**
* Action for adding a comment to a line in the active review
*
* @author Shawn Minto
* @author Miles Parker
*/
public class AddLineCommentToFileAction extends AbstractReviewAction {
private final IReviewCompareSourceViewer compareSourceViewer;
private IEditorInput editorInput;
private LineRange selectedRange;
public AddLineCommentToFileAction(IReviewCompareSourceViewer compareSourceViewer) {
super(Messages.AddLineCommentToFileAction_Add_Comment);
this.compareSourceViewer = compareSourceViewer;
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
super.selectionChanged(action, selection);
editorInput = getEditorInputFromSelection(selection);
}
@Override
protected boolean updateSelection(IStructuredSelection selection) {
if (compareSourceViewer != null) {
selectedRange = compareSourceViewer.getSelection();
if (selectedRange != null) {
return !ReviewUiUtil.isAnonymous(getItem());
}
}
return false;
}
private LineRange getJavaEditorSelection(IEditorInput editorInput) {
LineRange lines = null;
IEditorPart editorPart = getActiveEditor();
if (editorPart != null && editorInput != null) {
lines = ReviewUiUtil.getSelectedLineNumberRangeFromEditorInput(editorPart, editorInput);
if (lines == null) {
StatusHandler.log(new Status(IStatus.INFO, ReviewsUiPlugin.PLUGIN_ID,
"Editor is not an ITextEditor or there's no text selection available.")); //$NON-NLS-1$
}
}
return lines;
}
@Override
public String getToolTipText() {
return Messages.AddLineCommentToFileAction_Add_Comment_tooltip;
}
protected LineRange getSelectedRange() {
//if its the action from the compare editor, get currently selected lines
if (compareSourceViewer != null) {
LineRange selectedRange = compareSourceViewer.getSelection();
int maxNumberOfLines = compareSourceViewer.getAnnotationModel().getDocument().getNumberOfLines();
if (selectedRange.getStartLine() == maxNumberOfLines) {
selectedRange = new LineRange(maxNumberOfLines - 1, 1);
}
return selectedRange;
} else {
return getJavaEditorSelection(getEditorInput());
}
}
protected IEditorInput getEditorInput() {
return editorInput;
}
private ILocation getLocation() {
LineRange selectedRange = getSelectedRange();
ILineLocation location = ReviewsFactory.eINSTANCE.createLineLocation();
ILineRange range = ReviewsFactory.eINSTANCE.createLineRange();
range.setStart(selectedRange.getStartLine());
range.setEnd(selectedRange.getStartLine() + selectedRange.getNumberOfLines());
location.getRanges().add(range);
return location;
}
public void run(IAction action) {
IReviewItem item = getItem();
ReviewBehavior reviewBehavior = compareSourceViewer.getAnnotationModel().getBehavior();
AddCommentDialog dialog = new AddCommentDialog(WorkbenchUtil.getShell(), reviewBehavior, item, getLocation());
dialog.open();
}
public IReviewItem getItem() {
if (compareSourceViewer != null && compareSourceViewer.getAnnotationModel() != null) {
return compareSourceViewer.getAnnotationModel().getItem();
}
return null;
}
}