./codecover/src/org/codecover/eclipse/views/PickTestCaseView.java
/****************************************************************************** * Copyright (c) 2007 Stefan Franke, Robert Hanussek, Benjamin Keil, * * Steffen Kieß, Johannes Langauf, * * Christoph Marian Müller, Igor Podolskiy, * * Tilmann Scheller, Michael Starzmann, Markus Wittlinger * * 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 * ******************************************************************************/ package org.codecover.eclipse.views; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.codecover.eclipse.CodeCoverPlugin; import org.codecover.eclipse.Messages; import org.codecover.eclipse.actions.PickCodeActionDelegate; import org.codecover.eclipse.actions.PickTestCaseActionDelegate; import org.codecover.eclipse.actions.PickTestCaseActionDelegate.PickedTestCase; import org.codecover.eclipse.tscmanager.ActiveTSContainerInfo; import org.codecover.eclipse.utils.EclipseMASTLinkage; import org.codecover.model.TestCase; import org.codecover.model.TestSessionContainer; import org.codecover.model.mast.Location; import org.codecover.model.mast.MetaDataObject; import org.codecover.model.mast.SourceFile; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.ISelectionService; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.texteditor.ITextEditor; /** * Display the subset of test cases that cover the currently selected * MAST-Element. ** The logic of detecting which test case covers a selection is implemented in * {@link PickTestCaseActionDelegate}. * * @author Markus Wittlinger, Johannes Langauf * @version 1.0 ($Id: PickTestCaseView.java 1 2007-12-12 17:37:26Z t-scheller $) */ public class PickTestCaseView extends ViewPart { private static final String LABEL_PICKED_TEST_CASE = Messages .getString("PickTestCaseView.LABEL_PICKED_TEST_CASE"); //$NON-NLS-1$ private static final String LABEL_TEST_SESSION = Messages .getString("PickTestCaseView.LABEL_TEST_SESSION"); //$NON-NLS-1$ private TableViewer tableViewer; private ISelectionListener selectionListener; /** * (non-Javadoc) * * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) */ @Override public void createPartControl(Composite parent) { parent.setLayout(new GridLayout()); this.tableViewer = new TableViewer(parent, SWT.HIDE_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI); this.tableViewer.getTable().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); this.tableViewer.getTable().setHeaderVisible(true); this.tableViewer.setContentProvider(new PickTestCaseContentProvider()); this.tableViewer.setLabelProvider(new PickTestCaseLabelProvider()); createTableColumns(); /* register Listener to track current (text) selection */ selectionListener = new PickSelectionListener(this); ISelectionService selectionServ; selectionServ = getSite().getWorkbenchWindow().getSelectionService(); selectionServ.addPostSelectionListener(selectionListener); } @Override public void dispose() { /* unregister Listener to track current (text) selection */ ISelectionService selectionServ; selectionServ = getSite().getWorkbenchWindow().getSelectionService(); selectionServ.removePostSelectionListener(selectionListener); super.dispose(); /* clean up pointers */ selectionListener = null; tableViewer = null; } private void createTableColumns() { TableColumn testCaseColumn = new TableColumn(this.tableViewer .getTable(), SWT.NONE); testCaseColumn.setText(LABEL_PICKED_TEST_CASE); testCaseColumn.pack(); TableColumn testSessionColumn = new TableColumn(this.tableViewer .getTable(), SWT.NONE); testSessionColumn.setText(LABEL_TEST_SESSION); testSessionColumn.pack(); } /** * Refreshes the {@link TableViewer} with the given input and packs the * columns. * * @param input * the new input for the viewer. */ private final void refreshAndPackTable(Object input) { this.tableViewer.setInput(input); this.tableViewer.refresh(); for (TableColumn column : this.tableViewer.getTable().getColumns()) { column.pack(); } } /** * Displays the given {@link List} of {@link PickedTestCase}s in this view. * * @param pickedTestCases * the {@link List} of {@link PickedTestCase}s * @return true, if displayed; false on error */ public boolean displayPickedTestCases(List
pickedTestCases) { if (this.tableViewer.getTable().isDisposed()) { return false; } if (pickedTestCases == null) { throw new NullPointerException("pickedTestCases == null"); //$NON-NLS-1$ } refreshAndPackTable(pickedTestCases.toArray()); return true; } /** * (non-Javadoc) * * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { this.tableViewer.getTable().forceFocus(); } private final class PickTestCaseContentProvider implements IStructuredContentProvider { /** * (non-Javadoc) * * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object inputElement) { return (Object[]) inputElement; } /** * (non-Javadoc) * * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { // Do nothing here } /** * (non-Javadoc) * * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, * java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // Do nothing here } } private class PickSelectionListener implements ISelectionListener { PickTestCaseView view; /** * Constructor * * @param resultView * the view in which to display the results. */ public PickSelectionListener(PickTestCaseView resultView) { view = resultView; } public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (part instanceof ITextEditor) { ITextEditor editor = (ITextEditor) part; CodeCoverPlugin.getDefault().getLogger().debug( "selection: " + selection.toString()); //$NON-NLS-1$ Set pickResult = pickTestCase(editor); List pickResultList = new LinkedList (pickResult); view.displayPickedTestCases(pickResultList); } } /** * Pick the test cases that fully cover the current selection of * editor. Uses the currently active test cases. * * @param editor * @return The covering test cases. ** null if no test session container is active. An empty set if * nothing can be found at current selection. */ private Set
pickTestCase(ITextEditor editor) { CodeCoverPlugin plugin = CodeCoverPlugin.getDefault(); ActiveTSContainerInfo activeTSCI = plugin.getTSContainerManager() .getActiveTSContainer(); if (activeTSCI == null) { /* no tsc active */ } else { Collection activeTestCases = activeTSCI .getActiveTestCases(); TestSessionContainer tsc = activeTSCI.getTestSessionContainer(); Set pickedTestCases; if (activeTestCases.isEmpty()) { /* no test cases selected, therefore none can be picked */ pickedTestCases = Collections.emptySet(); } else { // XXX: improve performance by caching sourceFile until // editor changes SourceFile file = PickCodeActionDelegate.getSourceFile( editor, tsc); if (file == null) { /* found no matching source file */ pickedTestCases = Collections.emptySet(); } else { Location selection = EclipseMASTLinkage.getSelection( editor, file); MetaDataObject selectedElement; // XXX: improve performance by limiting search scope for // pickedElement selectedElement = new PickTestCaseActionDelegate() .findSurroundingElement(selection, tsc); if (selectedElement == null) { /* no element at selection */ pickedTestCases = Collections.emptySet(); } else { pickedTestCases = PickTestCaseActionDelegate .pickTestCases(activeTestCases, tsc, selectedElement); } } } return pickedTestCases; } return null; } } private final class PickTestCaseLabelProvider extends LabelProvider implements ITableLabelProvider { /** * (non-Javadoc) * * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, * int) */ public Image getColumnImage(Object element, int columnIndex) { switch (columnIndex) { case 0: return CodeCoverPlugin.getDefault().getImageRegistry().get( CodeCoverPlugin.Image.TEST_CASE.getPath()); default: return null; } } /** * (non-Javadoc) * * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, * int) */ public String getColumnText(Object element, int columnIndex) { if (element instanceof PickedTestCase) { PickedTestCase pickedTestCase = (PickedTestCase) element; switch (columnIndex) { case 0: return pickedTestCase.toString(); case 1: return pickedTestCase.getTestCase().getTestSession() .getName(); default: return null; } } return null; } } }