/*******************************************************************************
* Copyright (c) 2009 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:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.callgraph.launch;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.window.Window;
import org.eclipse.linuxtools.internal.callgraph.core.PluginConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
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;
public class LaunchWizard extends SystemTapLaunchShortcut {
private Text scriptLocation;
private Text binaryLocation;
private Text argumentsLocation;
private String workspacePath;
private String mode;
private Shell sh;
private static final int WIDTH = 670;
private static final int HEIGHT = 630;
/**
* The following protected parameters are provided by SystemTapLaunchShortcut:
*
* Optional customization parameters:
* protected String name;
* protected String binaryPath;
* protected String arguments;
* protected String outputPath;
* protected String dirPath;
* protected String generatedScript;
* protected boolean needToGenerate;
* protected boolean overwrite;
*
* Mandatory:
* protected String scriptPath;
* protected ILaunchConfiguration config;
*/
/**
* Launch method for a generated script that executes on a binary
*
* MUST specify (String) scriptPath and call config = createConfiguration(bin)!
*
* Noteworthy defaults:
* name defaults to "", but please set it (for usability)
* overwrite defaults to true - don't change it unless you really have to.
*
* To create new launches:
* -Copy shortcut code in xml, changing class name and label accordingly
* -Create a class that extends SystemTapLaunchShortcut with a function
* launch(IBinary bin, String mode)
* -Call super.Init()
* -Set name (this is shortcut-specific)
* -If a binary is used, call binName = getName(bin)
* -Call createConfiguration(bin, name)
*
* -Specify whichever of the optional parameters you need
* -Set scriptPath
* -Set an ILaunchConfiguration
* -Call finishLaunch or finishLaunchWithoutBinary
*/
@Override
public void launch(IEditorPart ed, String mode) {
super.initialize();
promptForInputs();
this.mode = mode;
}
@Override
public void launch(ISelection selection, String mode) {
super.initialize();
promptForInputs();
this.mode = mode;
}
private void promptForInputs() {
InputDialog id = new InputDialog(new Shell(), Messages.getString("LaunchWizard.WelcomeWizard"), //$NON-NLS-1$
Messages.getString("LaunchWizard.Text1") + //$NON-NLS-1$
Messages.getString("LaunchWizard.Text2") + //$NON-NLS-1$
Messages.getString("LaunchWizard.Text3"), //$NON-NLS-1$
getLaunchManager().generateLaunchConfigurationName(
Messages.getString("LaunchWizard.NamePrefix")), null); //$NON-NLS-1$
id.open();
if (id.getReturnCode() == Window.CANCEL){
return;
}
name = id.getValue();
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
IPath location = root.getLocation();
workspacePath = location.toString();
sh = new Shell();
sh.setSize(WIDTH,HEIGHT);
sh.setLayout(new GridLayout(1, false));
sh.setText(name);
Image img = new Image(sh.getDisplay(), PluginConstants.getPluginLocation() + "systemtapbanner.png"); //$NON-NLS-1$
Composite imageCmp = new Composite(sh, SWT.BORDER);
imageCmp.setLayout(new FillLayout());
GridData imageData = new GridData(650, 157);
imageData.horizontalAlignment = SWT.CENTER;
imageCmp.setLayoutData(imageData);
imageCmp.setBackgroundImage(img);
Composite fileComp = new Composite(sh, SWT.NONE);
fileComp.setLayout(new GridLayout(2, false));
fileComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridDataFactory labelData = GridDataFactory.fillDefaults().grab(true, false)
.span(2,1);
Label scriptLabel = new Label(fileComp, SWT.HORIZONTAL);
scriptLabel.setText(Messages.getString("LaunchWizard.Script")); //$NON-NLS-1$
labelData.applyTo(scriptLabel);
GridDataFactory textData = GridDataFactory.fillDefaults().grab( true, false )
.hint(WIDTH, SWT.DEFAULT);
scriptLocation = new Text(fileComp, SWT.SINGLE | SWT.BORDER);
textData.applyTo(scriptLocation);
Button scriptButton = new Button(fileComp, SWT.PUSH);
scriptButton.setText(Messages.getString("SystemTapOptionsTab.BrowseFiles")); //$NON-NLS-1$
scriptButton.setLayoutData(new GridData());
scriptButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String filePath = scriptLocation.getText();
FileDialog dialog = new FileDialog(sh, SWT.SAVE);
filePath = dialog.open();
if (filePath != null) {
scriptLocation.setText(filePath);
}
}
});
GridData gd2 = new GridData();
gd2.horizontalSpan = 3;
Label binaryLabel= new Label(fileComp, SWT.HORIZONTAL);
binaryLabel.setText(Messages.getString("LaunchWizard.BinFile")); //$NON-NLS-1$
labelData.applyTo(binaryLabel);
binaryLocation = new Text(fileComp, SWT.SINGLE | SWT.BORDER);
textData.applyTo(binaryLocation);
Button binaryButton = new Button(fileComp, SWT.PUSH);
binaryButton.setText(Messages.getString("SystemTapOptionsTab.WorkspaceButton2")); //$NON-NLS-1$
binaryButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(sh, new WorkbenchLabelProvider(), new WorkbenchContentProvider());
dialog.setTitle(Messages.getString("SystemTapOptionsTab.SelectResource")); //$NON-NLS-1$
dialog.setMessage(Messages.getString("SystemTapOptionsTab.SelectSuppressions")); //$NON-NLS-1$
dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
if (dialog.open() == IDialogConstants.OK_ID) {
IResource resource = (IResource) dialog.getFirstResult();
String arg = resource.getFullPath().toString();
binaryLocation.setText(workspacePath + arg);
}
}
});
Composite argumentsComp = new Composite(sh, SWT.BORDER_DASH);
argumentsComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
argumentsComp.setLayout(new GridLayout(2, false));
Label argumentsLabel= new Label(argumentsComp, SWT.HORIZONTAL);
argumentsLabel.setText(Messages.getString("LaunchWizard.Args")); //$NON-NLS-1$
labelData.applyTo(argumentsLabel);
argumentsLocation = new Text(argumentsComp, SWT.MULTI | SWT.WRAP | SWT.BORDER);
GridData gd3 = new GridData(GridData.FILL_HORIZONTAL);
gd3.heightHint=200;
argumentsLocation.setLayoutData(gd3);
Button argumentsButton = new Button(argumentsComp, SWT.PUSH);
argumentsButton.setText(Messages.getString("LaunchWizard.Func")); //$NON-NLS-1$
argumentsButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
argumentsLocation.setText(
argumentsLocation.getText() + " process(\"" //$NON-NLS-1$
+ binaryLocation.getText() + "\").function(\"\")"); //$NON-NLS-1$
}
});
//TODO: Don't use blank labels to move button to the right column :P
Label blankLabel2 = new Label(argumentsComp, SWT.HORIZONTAL);
blankLabel2.setText(""); //$NON-NLS-1$
Button launch = new Button(sh, SWT.PUSH);
launch.setLayoutData(new GridData(GridData.CENTER, GridData.BEGINNING, false, false));
launch.setText(Messages.getString("LaunchWizard.Launch")); //$NON-NLS-1$
launch.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
scriptPath = scriptLocation.getText();
binaryPath = binaryLocation.getText();
arguments = argumentsLocation.getText();
ILaunchConfigurationWorkingCopy wc = createConfiguration(null, name);
try {
finishLaunch(scriptPath + ": " + binName, mode, wc);//$NON-NLS-1$
} catch (Exception e1) {
e1.printStackTrace();
}
sh.dispose();
}
});
//TODO: Verify that this works
Display.getCurrent().asyncExec(() -> sh.open());
}
@Override
public String setScriptPath() {
scriptPath = "IMPLEMENT"; //$NON-NLS-1$
return scriptPath;
}
@Override
public String setParserID() {
return null;
}
@Override
public String setViewID() {
return null;
}
}