org.eclipse.linuxtools.internal.gprof.launch.GprofNoGmonDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.linuxtools.internal.gprof.launch.GprofNoGmonDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Kalray.eu
 * 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@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;
        }
    }
}