/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * 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: * Elliott Baron <ebaron@redhat.com> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.valgrind.ui; import java.util.HashMap; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.linuxtools.valgrind.ui.IValgrindToolView; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; /** * Base class for Valgrind UI plug-in. */ public class ValgrindUIPlugin extends AbstractUIPlugin { /** * The plug-in ID. */ public static final String PLUGIN_ID = "org.eclipse.linuxtools.valgrind.ui"; //$NON-NLS-1$ // Extension point constants private static final String VIEW_EXT_ID = "valgrindToolViews"; //$NON-NLS-1$ protected static final String EXT_ELEMENT = "view"; //$NON-NLS-1$ protected static final String EXT_ATTR_ID = "definitionId"; //$NON-NLS-1$ protected static final String EXT_ATTR_CLASS = "class"; //$NON-NLS-1$ private HashMap<String, IConfigurationElement> toolMap; // The shared instance private static ValgrindUIPlugin plugin; private ValgrindViewPart view; // The page containing the created Valgrind view private IWorkbenchPage activePage; // The last profiled project private IProject project; @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; } @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); } /** * Returns the shared instance * * @return the shared instance */ public static ValgrindUIPlugin getDefault() { return plugin; } /** * Creates the Valgrind view specialized of the valgrind tool. * * @param contentDescription the content description * @param toolID the valgrind tool identifier */ public void createView(final String contentDescription, final String toolID) { Display.getDefault().syncExec(() -> { try { activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); activePage.showView(IValgrindToolView.VIEW_ID, null, IWorkbenchPage.VIEW_CREATE); // Bug #366831 Need to show the view otherwise the toolbar is disposed. activePage.showView(IValgrindToolView.VIEW_ID); // create the view's tool specific controls and populate content description view.createDynamicContent(contentDescription, toolID); view.refreshView(); } catch (CoreException e) { e.printStackTrace(); } }); } /** * Shows the Valgrind view in the active page and gives it focus. */ public void showView() { Display.getDefault().syncExec(() -> { try { activePage.showView(IValgrindToolView.VIEW_ID); } catch (PartInitException e) { e.printStackTrace(); } }); } /** * Refreshes the Valgrind view */ public void refreshView() { if (view != null) { Display.getDefault().syncExec(() -> view.refreshView()); } } /** * Empties the contents of the view and restores its original state. */ public void resetView() { if (view != null) { Display.getDefault().syncExec(() -> { try { view.createDynamicContent(Messages.getString("ValgrindViewPart.No_Valgrind_output"), null); //$NON-NLS-1$ } catch (CoreException e) { e.printStackTrace(); } }); } } protected void setView(ValgrindViewPart view) { this.view = view; } /** * @return the Valgrind view */ public ValgrindViewPart getView() { return view; } private void initializeToolMap() { toolMap = new HashMap<>(); IExtensionPoint extPoint = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, VIEW_EXT_ID); IConfigurationElement[] configs = extPoint.getConfigurationElements(); for (IConfigurationElement config : configs) { if (config.getName().equals(EXT_ELEMENT)) { String id = config.getAttribute(EXT_ATTR_ID); if (id != null && config.getAttribute(EXT_ATTR_CLASS) != null) { toolMap.put(id, config); } } } } private HashMap<String, IConfigurationElement> getToolMap() { if (toolMap == null) { initializeToolMap(); } return toolMap; } /** * Returns the view specialized of a tool. * * @param id The valgrind view identifier * @return IValgrindToolView The valgrind view * @throws CoreException The view cannot be retrieved */ public IValgrindToolView getToolView(String id) throws CoreException { IValgrindToolView view = null; IConfigurationElement config = getToolMap().get(id); if (config != null) { Object obj = config.createExecutableExtension(EXT_ATTR_CLASS); if (obj instanceof IValgrindToolView) { view = (IValgrindToolView) obj; } } if (view == null) { throw new CoreException(new Status(IStatus.ERROR, PLUGIN_ID, Messages.getString("ValgrindUIPlugin.Cannot_retrieve_view"))); //$NON-NLS-1$ } return view; } /** * Set the project to be profiled * * @param project - project to be profiled */ public void setProfiledProject(IProject project) { this.project = project; } /** * Get the project to be profiled * * @return project */ public IProject getProfiledProject() { return project; } /** * log the status * @param status - Status to log * */ public static void log(IStatus status) { if (plugin != null) getDefault().getLog().log(status); else { // log on console when plugin is not loaded, can happen when run junit without osgi System.err.println(status.getMessage()); if (status.getException() != null) { status.getException().printStackTrace(System.err); } } } /** log string as error * @param string - String to log * */ public static void log(String string) { log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, string, null)); } /** log Throwable * @param e - Throwable to log * */ public static void log(Throwable e) { log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, e.getMessage(), e)); } }