/******************************************************************************* * Copyright (c) 2012 Red Hat. * 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 - Sami Wagiaalla *******************************************************************************/ package org.eclipse.linuxtools.internal.systemtap.ui.ide.launcher; import static org.eclipse.linuxtools.internal.systemtap.ui.ide.preferences.IDEPreferenceConstants.KEY; import static org.eclipse.linuxtools.internal.systemtap.ui.ide.preferences.IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS; import static org.eclipse.linuxtools.internal.systemtap.ui.ide.preferences.IDEPreferenceConstants.STAP_CMD_OPTION; import org.eclipse.core.runtime.Platform; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.linuxtools.internal.systemtap.ui.ide.IDEPlugin; import org.eclipse.linuxtools.internal.systemtap.ui.ide.preferences.IDEPreferenceConstants; import org.eclipse.linuxtools.systemtap.graphing.ui.widgets.ExceptionErrorDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; 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.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; public class SystemTapScriptOptionsTab extends AbstractLaunchConfigurationTab { static final String MISC_COMMANDLINE_OPTIONS = "MiscComandLineOptions"; //$NON-NLS-1$ private Button checkBox[] = new Button[IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS.length]; private Text text[] = new Text[IDEPreferenceConstants.STAP_STRING_OPTIONS.length]; private Text targetProgramText; private ModifyListener modifyListener = e -> updateLaunchConfigurationDialog(); private FileDialog fileDialog; private Text miscCommandsText; private Button dyninstCheckBox; private Text targetPidText; @Override public void createControl(Composite parent) { GridLayout singleColumnGridLayout = new GridLayout(); singleColumnGridLayout.numColumns = 1; Composite comp = new Composite(parent, SWT.NONE); setControl(comp); comp.setLayout(singleColumnGridLayout); comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); this.fileDialog = new FileDialog(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), SWT.OPEN); fileDialog.setText(Messages.SystemTapScriptOptionsTab_selectExec); fileDialog.setFilterPath(Platform.getLocation().toOSString()); // Target Executable path Group targetExecutableGroup = new Group(comp, SWT.SHADOW_ETCHED_IN); targetExecutableGroup.setText(Messages.SystemTapScriptOptionsTab_targetExec); targetExecutableGroup .setToolTipText(Messages.SystemTapScriptOptionsTab_targetToolTip); targetExecutableGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); GridLayout twoColumnGridLayout = new GridLayout(); twoColumnGridLayout.numColumns = 2; targetExecutableGroup.setLayout(twoColumnGridLayout); this.targetProgramText = new Text(targetExecutableGroup, SWT.SINGLE | SWT.BORDER); targetProgramText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); targetProgramText.addModifyListener(modifyListener); Button selectTargetProgramButton = new Button(targetExecutableGroup, 0); GridData gridData = new GridData(); selectTargetProgramButton.setLayoutData(gridData); selectTargetProgramButton .setText(Messages.SystemTapScriptLaunchConfigurationTab_browse); selectTargetProgramButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String fileName = fileDialog.open(); if (fileName != null) { targetProgramText.setText(fileName); } } }); // Check boxes Composite cmpChkBoxes = new Composite(comp, SWT.NONE); cmpChkBoxes.setLayout(twoColumnGridLayout); cmpChkBoxes.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); for (int i = 0; i < IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS.length; i++) { checkBox[i] = new Button(cmpChkBoxes, SWT.CHECK); checkBox[i] .setText(IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS[i][IDEPreferenceConstants.LABEL] + " (" + IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS[i][IDEPreferenceConstants.FLAG] + ")"); //$NON-NLS-1$//$NON-NLS-2$ checkBox[i].addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { updateLaunchConfigurationDialog(); } @Override public void widgetDefaultSelected(SelectionEvent e) { updateLaunchConfigurationDialog(); } }); checkBox[i] .setToolTipText(IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS[i][IDEPreferenceConstants.TOOLTIP]); if (IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS[i][IDEPreferenceConstants.FLAG] .contains(Messages.SystemTapScriptOptionsTab_dyninst)) { this.dyninstCheckBox = checkBox[i]; } } // Labels and Text fields Composite cmpTxtBoxes = new Composite(comp, SWT.NONE); cmpTxtBoxes.setLayout(twoColumnGridLayout); cmpTxtBoxes.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); Label label; for (int i = 0; i < IDEPreferenceConstants.STAP_STRING_OPTIONS.length; i++) { label = new Label(cmpTxtBoxes, SWT.NONE); label.setText(IDEPreferenceConstants.STAP_STRING_OPTIONS[i][IDEPreferenceConstants.LABEL] + " (" + IDEPreferenceConstants.STAP_STRING_OPTIONS[i][IDEPreferenceConstants.FLAG] + ")"); //$NON-NLS-1$ //$NON-NLS-2$ label.setToolTipText(IDEPreferenceConstants.STAP_STRING_OPTIONS[i][IDEPreferenceConstants.TOOLTIP]); text[i] = new Text(cmpTxtBoxes, SWT.BORDER); text[i].setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, true)); text[i].addModifyListener(modifyListener); text[i].setToolTipText(IDEPreferenceConstants.STAP_STRING_OPTIONS[i][IDEPreferenceConstants.TOOLTIP]); if (IDEPreferenceConstants.STAP_STRING_OPTIONS[i][IDEPreferenceConstants.FLAG] .contains("-x")) { //$NON-NLS-1$ this.targetPidText = text[i]; } } label = new Label(cmpTxtBoxes, SWT.NONE); label.setText(Messages.SystemTapScriptOptionsTab_otherOptions); miscCommandsText = new Text(cmpTxtBoxes, SWT.BORDER); miscCommandsText.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, true)); miscCommandsText.addModifyListener(modifyListener); } @Override public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { IPreferenceStore store = IDEPlugin.getDefault().getPreferenceStore(); configuration.setAttribute(STAP_CMD_OPTION[KEY], store.getString(STAP_CMD_OPTION[IDEPreferenceConstants.KEY])); for (int i = 0; i < IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS.length; i++) { configuration .setAttribute( IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS[i][IDEPreferenceConstants.KEY], store.getBoolean(IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS[i][IDEPreferenceConstants.KEY])); } for (int i = 0; i < IDEPreferenceConstants.STAP_STRING_OPTIONS.length; i++) { configuration .setAttribute( IDEPreferenceConstants.STAP_STRING_OPTIONS[i][IDEPreferenceConstants.KEY], store.getString(IDEPreferenceConstants.STAP_STRING_OPTIONS[i][IDEPreferenceConstants.KEY])); } configuration.setAttribute(MISC_COMMANDLINE_OPTIONS, store.getString(MISC_COMMANDLINE_OPTIONS)); } @Override public void initializeFrom(ILaunchConfiguration configuration) { try { targetProgramText.setText(configuration.getAttribute( STAP_CMD_OPTION[KEY], "")); //$NON-NLS-1$ for (int i = 0; i < IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS.length; i++) { checkBox[i] .setSelection(configuration .getAttribute( IDEPreferenceConstants.STAP_BOOLEAN_OPTIONS[i][IDEPreferenceConstants.KEY], false)); } for (int i = 0; i < IDEPreferenceConstants.STAP_STRING_OPTIONS.length; i++) { text[i].setText(configuration .getAttribute( IDEPreferenceConstants.STAP_STRING_OPTIONS[i][IDEPreferenceConstants.KEY], "")); //$NON-NLS-1$ } miscCommandsText.setText(configuration.getAttribute( MISC_COMMANDLINE_OPTIONS, "")); //$NON-NLS-1$ } catch (Exception e) { ExceptionErrorDialog .openError( Messages.SystemTapScriptOptionsTab_initializeConfigurationFailed, e); } } @Override public void performApply(ILaunchConfigurationWorkingCopy configuration) { configuration.setAttribute(STAP_CMD_OPTION[KEY], targetProgramText.getText()); for (int i = 0; i < STAP_BOOLEAN_OPTIONS.length; i++) { configuration.setAttribute(STAP_BOOLEAN_OPTIONS[i][KEY], checkBox[i].getSelection()); } for (int i = 0; i < IDEPreferenceConstants.STAP_STRING_OPTIONS.length; i++) { configuration.setAttribute( IDEPreferenceConstants.STAP_STRING_OPTIONS[i][KEY], text[i].getText()); } configuration.setAttribute(MISC_COMMANDLINE_OPTIONS, miscCommandsText.getText()); } @Override public String getName() { return Messages.SystemTapScriptLaunchConfigurationTab_tabName; } @Override public boolean isValid(ILaunchConfiguration launchConfig) { setErrorMessage(null); // If dyninst is being used a pid or a target executable must be // specified. if (this.dyninstCheckBox.getSelection() && this.targetProgramText.getText().isEmpty() && this.targetPidText.getText().isEmpty()) { setErrorMessage(Messages.SystemTapScriptOptionsTab_dyninstError); return false; } if (!this.targetPidText.getText().isEmpty() && !this.targetPidText.getText().matches("[0-9]*")) { //$NON-NLS-1$ setErrorMessage(Messages.SystemTapScriptOptionsTab_pidError); return false; } return true; } @Override public Image getImage() { return AbstractUIPlugin.imageDescriptorFromPlugin(IDEPlugin.PLUGIN_ID, "icons/smileytap_small.gif").createImage(); //$NON-NLS-1$ } }