/******************************************************************************* * 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.tasks.ui.internal.editors; import java.util.Collection; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.mylyn.reviews.tasks.core.ITaskProperties; import org.eclipse.mylyn.reviews.tasks.core.internal.ITreeNode; import org.eclipse.mylyn.reviews.tasks.core.internal.ReviewResultNode; import org.eclipse.mylyn.reviews.tasks.core.internal.TaskNode; import org.eclipse.mylyn.reviews.tasks.ui.internal.Images; import org.eclipse.mylyn.reviews.tasks.ui.internal.ReviewUiUtils; import org.eclipse.swt.SWT; 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.Composite; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; /* * @author Kilian Matt */ public class ReviewSummaryTaskEditorPart extends AbstractReviewTaskEditorPart { public static final String ID_PART_REVIEWSUMMARY = "org.eclipse.mylyn.reviews.ui.editors.parts.reviewsummary"; //$NON-NLS-1$ private TreeViewer reviewResults; private ScopeViewerFilter scopeViewerFilter = new ScopeViewerFilter(); public ReviewSummaryTaskEditorPart() { setPartName(Messages.ReviewSummaryTaskEditorPart_Partname); } @Override public void createControl(final Composite parent, FormToolkit toolkit) { 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)); Composite reviewResultsComposite = toolkit .createComposite(summarySection); toolkit.paintBordersFor(reviewResultsComposite); reviewResultsComposite.setLayout(new GridLayout(1, false)); reviewResults = createResultsViewer(reviewResultsComposite, toolkit); reviewResults.getControl().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); try { ITreeNode rootNode = getReviewPage().getReviewResults( new NullProgressMonitor()); reviewResults.setInput(new Object[] { rootNode }); reviewResults.expandAll(); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } summarySection.setText("Review Summary "); summarySection.setClient(reviewResultsComposite); setSection(toolkit, summarySection); } enum Column implements IColumnSpec<ITreeNode> { TASK("Task") { @Override public String getText(ITreeNode value) { return value.getTaskId(); } }, RESULT(Messages.ReviewSummaryTaskEditorPart_Header_Result) { @Override public String getText(ITreeNode value) { return value.getResult() != null ? value.getResult().name() : ""; } @Override public Image getImage(ITreeNode value) { if (value.getResult() == null) return null; switch (value.getResult()) { case FAIL: return Images.REVIEW_RESULT_FAILED.createImage(); case WARNING: return Images.REVIEW_RESULT_WARNING.createImage(); case PASSED: return Images.REVIEW_RESULT_PASSED.createImage(); case TODO: return Images.REVIEW_RESULT_NONE.createImage(); } return null; } }, DESCRIPTION("Description") { @Override public String getText(ITreeNode value) { return value.getDescription(); } }, WHO("Who") { @Override public String getText(ITreeNode value) { return value.getPerson(); } }; private String title; private Column(String title) { this.title = title; } public String getTitle() { return title; } public String getText(ITreeNode value) { return value != null ? value.toString() : ""; } public Image getImage(ITreeNode value) { return null; } } private TreeViewer createResultsViewer(Composite reviewResultsComposite, FormToolkit toolkit) { Tree tree = new Tree(reviewResultsComposite, SWT.SINGLE | SWT.FULL_SELECTION); tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); tree.setLinesVisible(true); tree.setHeaderVisible(true); for (int i = 0; i < tree.getColumnCount(); i++) { tree.getColumn(i).pack(); } tree.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TREE_BORDER); TreeViewer reviewResults = createTreeWithColumns(tree); reviewResults.setContentProvider(new ReviewResultContentProvider()); reviewResults.setLabelProvider(new ColumnLabelProvider<ITreeNode>( Column.values())); reviewResults.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { if (!event.getSelection().isEmpty()) { ITreeNode treeNode = (ITreeNode) ((IStructuredSelection) event .getSelection()).getFirstElement(); if (treeNode instanceof ReviewResultNode) { treeNode = treeNode.getParent(); } ITaskProperties task = treeNode.getTask(); ReviewUiUtils.openTaskInMylyn(task); } } }); return reviewResults; } private TreeViewer createTreeWithColumns(Tree tree) { TreeViewer reviewResults = new TreeViewer(tree); return TreeHelper.createColumns(reviewResults, Column.values()); } private static final class ScopeViewerFilter extends ViewerFilter { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof TaskNode) { return ((TaskNode) element).hasReviewSubTasks(); } return true; } } private static class ReviewResultContentProvider implements ITreeContentProvider { public Object[] getChildren(Object parentElement) { return ((ITreeNode) parentElement).getChildren().toArray(); } public Object getParent(Object element) { return ((ITreeNode) element).getParent(); } public boolean hasChildren(Object element) { return !((ITreeNode) element).getChildren().isEmpty(); } public void dispose() { // nothing to do } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // nothing to do } public Object[] getElements(Object inputElement) { if (inputElement instanceof Object[]) { return (Object[]) inputElement; } else if (inputElement instanceof Collection<?>) { return ((Collection<?>) inputElement).toArray(); } return new Object[0]; } } @Override protected void fillToolBar(ToolBarManager manager) { Action toggleFiltering = new Action("Filter", SWT.TOGGLE) { //$NON-NLS-1$ @Override public void run() { enableFiltering(!isFiltering()); } }; toggleFiltering.setImageDescriptor(Images.FILTER); toggleFiltering.setToolTipText("Toogle Filtering"); toggleFiltering.setChecked(true); enableFiltering(true); manager.add(toggleFiltering); super.fillToolBar(manager); } private boolean isFiltering() { return reviewResults.getFilters() != null && reviewResults.getFilters().length > 0; } private void enableFiltering(boolean enable) { if (enable) { reviewResults.setFilters(new ViewerFilter[] { scopeViewerFilter }); } else { reviewResults.setFilters(new ViewerFilter[0]); } } }