blob: 5f6107b1c0623097d7ef065e73bdfc8014cf61b8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Kalray.eu and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Xavier Raynaud <xavier.raynaud@kalray.eu> - initial API and implementation
* Red Hat Inc. - fix #408543
*******************************************************************************/
package org.eclipse.linuxtools.internal.gprof.launch;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.linuxtools.profiling.ui.TitleAreaDialogWithRadioButtons;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;
/**
* Dialog displayed when no gmon.out is found. This happens after -pg flag options check,
* meaning that it's probably a makefile project or gmon.out is generated elesewhere.
* User is promted with Radio options whether he wants to browse the workspace, file system or cancle the launch.
* He/she can either recompile the project, or search gmon.out file in another location.
*/
public class GprofNoGmonDialog {
private String gmonExpected;
/**
* <h1>Construct a new dialogue for missing gprof file. </h1>
* <p>
* Prompt the user to browse workspace or file system if gprof file is not found. <br>
* Note, this should be instantiated inside a UI thread.
* </p>
*
* @param project The IProject that the user will browse if file is missing.
* @param shell the shell on top of which this dialogue will show.
*/
public GprofNoGmonDialog(IProject project, Shell shell) {
// Missing gmon.out logic:
// This point is reached if pg flags were not set. (e.g in an unmanaged makefile project.)
// or PG flag was set but gmon.out could not be found.
// Construct Dialog for user.
// Declare a list for the buttons.
List<Entry<String,String>> buttonList = new ArrayList<>();
// Add buttons:
buttonList.add(new SimpleEntry<>("browseWorkSpace", GprofLaunchMessages.GprofNoGmonOut_BrowseWorkSpace)); //$NON-NLS-1$
buttonList.add(new SimpleEntry<>("browseFileSystem",GprofLaunchMessages.GprofNoGmonOut_BrowseFileSystem)); //$NON-NLS-1$
buttonList.add(new SimpleEntry<>("cancleLaunch", GprofLaunchMessages.GprofNoGmonOut_CancleLaunch)); //$NON-NLS-1$
// Set Dialogue options.
String title = GprofLaunchMessages.GprofNoGmonOut_title;
String body = GprofLaunchMessages.GprofNoGmonOut_body;
int msgType = IMessageProvider.ERROR;
// Instantiate & open the dialogue.
TitleAreaDialogWithRadioButtons gmonMissingDialog =
new TitleAreaDialogWithRadioButtons(shell, title, body, buttonList, msgType);
int retVal = gmonMissingDialog.open();
// Handle user's selection. (OK/ Cancle)
switch (retVal) {
case Window.OK:
// Handle which button the user selected.
switch (gmonMissingDialog.getSelectedButton()) {
case "browseWorkSpace": //$NON-NLS-1$
gmonExpected = browseWorkspaceHandler(shell, project);
break;
case "browseFileSystem": //$NON-NLS-1$
gmonExpected = browseFileSystemHandler(shell, project);
//gmonExpected = browseFileSystemHandler(parent);
break;
default: // this can happen if the user pressed escape.
gmonExpected = null;
return;
}
case Window.CANCEL:
return; // Launch cancled if user clicked Cancle.
default:
return; // if somethign broke with the dialogue (manual kill, cancle launch).
}
}
/**
* Retrieve location of gmon.out file after dialogue(s) completed.
*/
public String getGmonExpected() {
return this.gmonExpected;
}
/**
* Browse file sytem to find gmon.out. Return null if bad input.
*/
private static String browseFileSystemHandler(Shell shell, IProject project) {
FileDialog dialog = new FileDialog((shell != null) ? shell : new Shell(), SWT.OPEN);
dialog.setText(GprofLaunchMessages.GprofNoGmonDialog_OpenGmon);
// Open Project path.
if (project != null) {
dialog.setFilterPath(project.getLocation().toOSString());
}
//return gmon.oot path string to caller. null if not selected or user pressed cancle.
return dialog.open(); //
}
/**
* Handle the case when the user browses the Workspace.
* @param parent
* @return gmon.out location or null if bad.
*/
private static String browseWorkspaceHandler(Shell shell, IProject project) {
//New tree Dialogue.
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(shell,
new WorkbenchLabelProvider(), new WorkbenchContentProvider());
//Set dialogue settings.
dialog.setTitle(GprofLaunchMessages.GprofNoGmonDialog_OpenGmon);
dialog.setMessage(GprofLaunchMessages.GprofNoGmonDialog_OpenGmon);
dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
dialog.setAllowMultiple(false);
dialog.setInitialSelection(project);
dialog.setValidator(selection -> {
if (selection.length != 1) {
return new Status(IStatus.ERROR, GprofLaunch.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
}
if (!(selection[0] instanceof IFile)) {
return new Status(IStatus.ERROR, GprofLaunch.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
}
return new Status(IStatus.OK, GprofLaunch.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
});
//Open dialogue.
if (dialog.open() == IDialogConstants.OK_ID) {
IResource resource = (IResource) dialog.getFirstResult();
return resource.getLocation().toOSString(); // If things were ok, return the gmon path.
} else {
return null;
}
}
}