org.eclipse.mylyn.reviews.ui.editors.ReviewSummaryTaskEditorPart.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.reviews.ui.editors.ReviewSummaryTaskEditorPart.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Research Group for Industrial Software (INSO), Vienna University of Technology.
 * 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:
 *     Kilian Matt (Research Group for Industrial Software (INSO), Vienna University of Technology) - initial API and implementation
 *******************************************************************************/
package org.eclipse.mylyn.reviews.ui.editors;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
import org.eclipse.mylyn.reviews.core.ReviewSubTask;
import org.eclipse.mylyn.reviews.core.ReviewsUtil;
import org.eclipse.mylyn.reviews.core.model.review.Changeset;
import org.eclipse.mylyn.reviews.core.model.review.Rating;
import org.eclipse.mylyn.reviews.core.model.review.Review;
import org.eclipse.mylyn.reviews.core.model.review.ReviewFactory;
import org.eclipse.mylyn.reviews.core.model.review.ReviewResult;
import org.eclipse.mylyn.reviews.core.scm.TaskMapper;
import org.eclipse.mylyn.reviews.ui.Images;
import org.eclipse.mylyn.reviews.ui.UiUtil;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskContainer;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ListSelectionDialog;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

/**
 * Create part of review page that is capable to visualize the review summary
 * for the current task.
 * 
 * @author Kilian Matt
 * @author Stefan Reiterer
 */
@SuppressWarnings("restriction")
public class ReviewSummaryTaskEditorPart extends AbstractTaskEditorPart {
    public static final String ID_PART_REVIEWSUMMARY = "org.eclipse.mylyn.reviews.ui.editors.parts.reviewsummary"; //$NON-NLS-1$
    private static final int SUMMARY_REVIEWID_WIDTH = 75;
    private static final int SUMMARY_CHANGESETS_WIDTH = 75;
    private static final int SUMMARY_AUTHOR_WIDTH = 150;
    private static final int SUMMARY_REVIEWER_WIDTH = 150;
    private static final int SUMMARY_RESULT_WIDTH = 75;
    private static final int SUMMARY_COMMENT_WIDTH = 500;

    private List<ReviewSubTask> selectedReviews = new ArrayList<ReviewSubTask>();
    private Shell shell = null;
    private ProgressMonitorDialog monitor;

    /**
     * Default constructor.
     */
    public ReviewSummaryTaskEditorPart() {
        setPartName(Messages.ReviewSummaryTaskEditorPart_Partname);
    }

    /**
     * Create a list that contains all review tasks that are associated with the
     * current task.
     */
    public void createControl(Composite parent, FormToolkit toolkit) {
        shell = parent.getShell();
        monitor = new ProgressMonitorDialog(shell);

        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.horizontalSpan = 4;

        Section summarySection = createSection(parent, toolkit,
                ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
        summarySection.setLayout(new FillLayout(SWT.HORIZONTAL));
        summarySection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        summarySection.setText(Messages.ReviewSummaryTaskEditorPart_Partname);
        Composite reviewResultsComposite = toolkit.createComposite(summarySection);
        reviewResultsComposite.setLayout(new GridLayout(1, false));
        TableViewer reviewResults = createResultsTableViewer(reviewResultsComposite);

        reviewResults.getControl().setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
        summarySection.setClient(reviewResultsComposite);

        Composite buttonGroup = new Composite(reviewResultsComposite, SWT.NONE);
        buttonGroup.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, true));
        buttonGroup.setLayout(new GridLayout(5, true));

        Button removeChangesets = toolkit.createButton(buttonGroup, "Remove Changeset(s)", SWT.NONE);
        removeChangesets.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 1, 1));
        removeChangesets.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent arg0) {
                // TODO Auto-generated method stub

            }

            public void widgetSelected(SelectionEvent arg0) {
                removeChangesetFromTask();
            }
        });
        Label empty2 = new Label(buttonGroup, SWT.NONE);
        empty2.setText("");

        // create context menue
        Menu contextMenue = new Menu(reviewResults.getControl());
        org.eclipse.swt.widgets.MenuItem menueItem = new org.eclipse.swt.widgets.MenuItem(contextMenue, SWT.PUSH);
        menueItem.setText("remove changeset ...");
        menueItem.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent arg0) {
            }

            public void widgetSelected(SelectionEvent arg0) {
                removeChangesetFromTask();
            }
        });
        reviewResults.getTable().setMenu(contextMenue);

    }

    /**
     * Remove changesets from selected task.
     */
    protected void removeChangesetFromTask() {
        if (selectedReviews.size() != 0) {
            openEditReviewDialog();
        } else {
            MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                    "No review selected",
                    "Please select a review from which one or more changesets should be removed!");
        }
    }

    /**
     * Opens a dialog that shows the changesets that can be removed from the
     * review task. Selected changesets will be removed.
     */
    @SuppressWarnings("deprecation")
    protected void openEditReviewDialog() {
        @SuppressWarnings("unused")
        TaskMapper mapper = new TaskMapper(getTaskEditorPage().getTaskRepository());

        TaskDataManager taskDataManager = (TaskDataManager) TasksUi.getTaskDataManager();
        try {
            List<Review> reviews = ReviewsUtil.getReviewAttachmentFromTask(taskDataManager,
                    TasksUi.getRepositoryModel(), getTaskEditorPage().getTaskRepository(),
                    selectedReviews.get(0).getTask());

            Review review = reviews.get(0);

            ListSelectionDialog dlg = UiUtil.createScopeItemListDialog(shell, review.getScope(),
                    "please select the changesets that should be removed.");

            if (dlg.open() == IStatus.OK) {
                List<Changeset> del = getChangesetsFromDlgResult(dlg);
                final Review newReview = UiUtil.removeChangesetsFromReview(review, del);

                // update review task attachment
                try {
                    monitor.run(true, true, new IRunnableWithProgress() {

                        public void run(IProgressMonitor prog)
                                throws InvocationTargetException, InterruptedException {

                            try {
                                // update datastructure
                                ReviewSubTask reviewSubTask = selectedReviews.get(0);
                                ReviewResult result = newReview.getResult();
                                if (result == null) {
                                    result = ReviewFactory.eINSTANCE.createReviewResult();
                                    result.setText("");
                                }
                                result.setRating(Rating.REASSIGNED);
                                reviewSubTask.setResult(Rating.REASSIGNED);
                                newReview.setResult(result);
                                reviewSubTask.setReview(newReview);

                                UiUtil.updateReview(reviewSubTask, getModel(), prog);
                            } catch (CoreException e) {
                                e.printStackTrace();
                            }
                        }

                    });

                    getTaskEditorPage().refreshFormContent();
                } catch (Exception e) {
                    MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                            "Cannot update task", "A problem occurred while updating the task: " + e.getMessage());
                }
            }
        } catch (CoreException e) {
            e.printStackTrace();
        }

    }

    private List<Changeset> getChangesetsFromDlgResult(ListSelectionDialog dlg) {
        List<Changeset> ret = new ArrayList<Changeset>();

        for (Object c : dlg.getResult()) {
            Changeset changeset = (Changeset) c;
            ret.add(changeset);
        }

        return ret;
    }

    private TableViewer createResultsTableViewer(Composite reviewResultsComposite) {
        TableViewer reviewResults = new TableViewer(reviewResultsComposite, SWT.FULL_SELECTION);
        reviewResults.getTable().setHeaderVisible(true);
        UiUtil.createColumn(reviewResults, Messages.ReviewSummaryTaskEditorPart_Header_ReviewId,
                SUMMARY_REVIEWID_WIDTH);
        UiUtil.createColumn(reviewResults, Messages.ReviewSummaryTaskEditorPart_Header_Changesets,
                SUMMARY_CHANGESETS_WIDTH);
        UiUtil.createColumn(reviewResults, Messages.ReviewSummaryTaskEditorPart_Header_Author,
                SUMMARY_AUTHOR_WIDTH);
        UiUtil.createColumn(reviewResults, Messages.ReviewSummaryTaskEditorPart_Header_Reviewer,
                SUMMARY_REVIEWER_WIDTH);
        UiUtil.createColumn(reviewResults, Messages.ReviewSummaryTaskEditorPart_Header_Result,
                SUMMARY_RESULT_WIDTH);
        UiUtil.createColumn(reviewResults, Messages.ReviewSummaryTaskEditorPart_Header_Comment,
                SUMMARY_COMMENT_WIDTH);

        reviewResults.setContentProvider(new IStructuredContentProvider() {

            public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
            }

            public void dispose() {
            }

            public Object[] getElements(Object inputElement) {
                if (inputElement instanceof ITaskContainer) {
                    ITaskContainer taskContainer = (ITaskContainer) inputElement;

                    List<ReviewSubTask> reviewSubTasks = ReviewsUtil.getReviewSubTasksFor(taskContainer,
                            TasksUi.getTaskDataManager(), TasksUi.getRepositoryModel(),
                            getModel().getTaskRepository(), new NullProgressMonitor());

                    return reviewSubTasks.toArray(new ReviewSubTask[reviewSubTasks.size()]);

                }
                return null;
            }
        });

        reviewResults.setLabelProvider(new TableLabelProvider() {
            private static final int COLUMN_ID = 0;
            private static final int COLUMN_REVISIONS = 1;
            private static final int COLUMN_AUTHOR = 2;
            private static final int COLUMN_REVIEWER = 3;
            private static final int COLUMN_RESULT = 4;
            private static final int COLUMN_COMMENT = 5;

            public Image getColumnImage(Object element, int columnIndex) {
                if (columnIndex == COLUMN_RESULT) {
                    ReviewSubTask subtask = (ReviewSubTask) element;
                    switch (subtask.getResult()) {
                    case FAILED:
                        return Images.REVIEW_RESULT_FAILED.createImage();
                    case WARNING:
                        return Images.REVIEW_RESULT_WARNING.createImage();
                    case PASSED:
                        return Images.REVIEW_RESULT_PASSED.createImage();
                    case NONE:
                        return Images.REVIEW_RESULT_NONE.createImage();
                    case REASSIGNED:
                        return Images.REVIEW_RESULT_NONE.createImage();
                    }
                }
                return null;
            }

            public String getColumnText(Object element, int columnIndex) {
                ReviewSubTask subtask = (ReviewSubTask) element;
                switch (columnIndex) {
                case COLUMN_ID:
                    return subtask.getTask().getTaskId();
                case COLUMN_REVISIONS:
                    return subtask.getChangesets();
                case COLUMN_AUTHOR:
                    return subtask.getAuthor();
                case COLUMN_REVIEWER:
                    return subtask.getReviewer();
                case COLUMN_RESULT:
                    return subtask.getResult().getName();
                case COLUMN_COMMENT:
                    return subtask.getComment();
                default:
                    return null;
                }
            }
        });
        reviewResults.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                if (selection.getFirstElement() instanceof ReviewSubTask) {
                    Object[] oSelectedChs = selection.toArray();
                    selectedReviews = new ArrayList<ReviewSubTask>();
                    for (int i = 0; i < oSelectedChs.length; i++)
                        selectedReviews.add((ReviewSubTask) oSelectedChs[i]);

                }
            }
        });

        reviewResults.setInput(getModel().getTask());
        reviewResults.addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(DoubleClickEvent event) {
                if (!event.getSelection().isEmpty()) {
                    ITask task = ((ReviewSubTask) ((IStructuredSelection) event.getSelection()).getFirstElement())
                            .getTask();
                    TasksUiUtil.openTask(task);
                }
            }
        });
        return reviewResults;
    }

}