/******************************************************************************* * Copyright (c) 2009-2015 STMicroelectronics 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: * Xavier Raynaud <xavier.raynaud@st.com> - initial API and implementation * Red Hat Inc. - ongoing maintenance *******************************************************************************/ package org.eclipse.linuxtools.internal.gcov.view; import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.util.Date; import java.util.LinkedList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.linuxtools.dataviewers.abstractview.AbstractSTDataView; import org.eclipse.linuxtools.dataviewers.abstractviewers.AbstractSTViewer; import org.eclipse.linuxtools.dataviewers.abstractviewers.TreeColumnViewerFilter; import org.eclipse.linuxtools.dataviewers.actions.STExportToCSVAction; import org.eclipse.linuxtools.dataviewers.charts.actions.ChartAction; import org.eclipse.linuxtools.internal.gcov.Activator; import org.eclipse.linuxtools.internal.gcov.action.SwitchContentProviderAction; import org.eclipse.linuxtools.internal.gcov.parser.CovManager; import org.eclipse.linuxtools.internal.gcov.parser.SourceFile; import org.eclipse.linuxtools.internal.gcov.view.annotatedsource.OpenSourceFileAction; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; /** * @author Xavier Raynaud <xavier.raynaud@st.com> */ public class CovView extends AbstractSTDataView { private String defaultCSVPath = "gcov.csv"; //$NON-NLS-1$ private Label label; private Text fFilterText; private TreeColumnViewerFilter fViewerFilter; private Action folderAction; private Action fileAction; private Action functionAction; @Override protected AbstractSTViewer createAbstractSTViewer(Composite parent) { return new CovViewer(parent); } @Override protected void contributeToToolbar(IToolBarManager manager) { manager.add(new Separator()); manager.add(new Separator()); manager.add(folderAction); manager.add(fileAction); manager.add(functionAction); manager.add(new Separator()); manager.add(new ChartAction(getViewSite().getShell(), getSTViewer())); } @Override protected void createActions() { super.createActions(); folderAction = new SwitchContentProviderAction(Messages.CovView_sort_coverage_per_folder, "icons/directory_obj.gif", //$NON-NLS-1$ getSTViewer().getViewer(), CovFolderContentProvider.sharedInstance); fileAction = new SwitchContentProviderAction(Messages.CovView_sort_coverage_per_file, "icons/c_file_obj.gif", //$NON-NLS-1$ getSTViewer().getViewer(), CovFileContentProvider.sharedInstance); fileAction.setChecked(true); functionAction = new SwitchContentProviderAction(Messages.CovView_sort_coverage_per_function, "icons/function_obj.gif", //$NON-NLS-1$ getSTViewer().getViewer(), CovFunctionContentProvider.sharedInstance); } /** * This is a callback that will allow us to create the viewer and initialize it. */ @Override public void createPartControl(Composite parent) { super.createPartControl(parent); GridLayout l = (GridLayout) parent.getLayout(); l.horizontalSpacing = 0; l.verticalSpacing = 0; l.marginHeight = 0; l.marginWidth = 0; fViewerFilter = new TreeColumnViewerFilter((TreeViewer) getSTViewer().getViewer(), getSTViewer().getAllFields()[0], true); getSTViewer().getViewer().addFilter(fViewerFilter); } @Override protected void createTitle(Composite parent) { label = new Label(parent, SWT.WRAP); GridData data = new GridData(SWT.FILL, SWT.BEGINNING, true, false, 1, 1); label.setLayoutData(data); fFilterText = new Text(parent, SWT.BORDER | SWT.SINGLE | SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL); fFilterText.setMessage(Messages.CovView_type_filter_text); fFilterText.setToolTipText(Messages.CovView_filter_by_name); fFilterText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); fFilterText.addModifyListener(e -> { String text = fFilterText.getText(); fViewerFilter.setMatchingText(text); }); } private static void setCovViewTitle(CovView view, String title, String binaryPath, String timestamp) { String viewText = NLS.bind(Messages.CovView_view_title, new Object[] { title, binaryPath, timestamp }); view.label.setText(viewText); view.label.getParent().layout(true); } public static void displayCovDetailedResult(String binaryPath, String gcda) { try { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IFile binary = root.getFileForLocation(new Path(binaryPath)); IProject project = null; if (binary != null) { project = binary.getProject(); } // parse and process coverage data CovManager cvrgeMnger = new CovManager(binaryPath, project); List<String> gcdaPaths = new LinkedList<>(); gcdaPaths.add(gcda); cvrgeMnger.processCovFiles(gcdaPaths, gcda); // generate model for view cvrgeMnger.fillGcovView(); for (SourceFile sf : cvrgeMnger.getSourceMap().values()) { OpenSourceFileAction.openAnnotatedSourceFile(project, binary, sf, 0); } } catch (CoreException|IOException e) { reportError(e); } } public static CovView displayCovResults(String binaryPath, String gcda) { try { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IFile binary = root.getFileForLocation(new Path(binaryPath)); IProject project = null; if (binary != null) { project = binary.getProject(); } // parse and process coverage data CovManager cvrgeMnger = new CovManager(binaryPath, project); List<String> gcdaPaths = cvrgeMnger.getGCDALocations(); cvrgeMnger.processCovFiles(gcdaPaths, gcda); // generate model for view cvrgeMnger.fillGcovView(); // load an Eclipse view Date date = new Date(0); Date dateCandidate; for (String file : gcdaPaths) { dateCandidate = new Date(new File(file).lastModified()); if (dateCandidate.after(date)) { date = dateCandidate; } } String timestamp = DateFormat.getInstance().format(date); return displayCovResults(cvrgeMnger, timestamp); } catch (InterruptedException|IOException|CoreException e) { reportError(e); } return null; } private static void reportError(Exception ex) { final String message = NLS.bind(Messages.CovView_error_message, ex.getMessage()); Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, message, ex); Activator.getDefault().getLog().log(status); PlatformUI.getWorkbench().getDisplay().asyncExec(() -> { Shell s = PlatformUI.getWorkbench().getDisplay().getActiveShell(); MessageDialog.openError(s, Messages.CovView_parsing_error, message); }); } /** * Used by Test engine and OpenSerAction * @param cvrgeMnger * @throws PartInitException */ private static CovView displayCovResults(CovManager cvrgeMnger, String timestamp) throws PartInitException { // load an Eclipse view IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); IWorkbenchPage page = window.getActivePage(); CovView cvrgeView = (CovView) page.showView("org.eclipse.linuxtools.gcov.view"); //$NON-NLS-1$ // view title CovView.setCovViewTitle(cvrgeView, Integer.toString((int) cvrgeMnger.getNbrPgmRuns()), cvrgeMnger.getBinaryPath(), timestamp); // load the controller cvrgeView.setInput(cvrgeMnger); CovViewer stviewer = (CovViewer) cvrgeView.getSTViewer(); stviewer.getViewer().expandToLevel(2); return cvrgeView; } @Override protected IAction createExportToCSVAction() { IAction action = new STExportToCSVAction(this.getSTViewer()) { @Override public void run() { Object o = getSTViewer().getInput(); if (o instanceof CovManager) { getExporter().setFilePath(defaultCSVPath); } super.run(); } }; return action; } }