/*******************************************************************************
* Copyright (c) 2011, 2014 IBM Corporation
* 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:
* Otavio Busatto Pontes <obusatto@br.ibm.com> - initial API and implementation
* Rafael Peria de Sene <rpsene@br.ibm.com>
*******************************************************************************/
package org.eclipse.linuxtools.internal.tools.launch.ui.properties;
import java.util.LinkedList;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.linuxtools.tools.launch.core.LaunchCoreConstants;
import org.eclipse.linuxtools.tools.launch.core.properties.LinuxtoolsPathProperty;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Control;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
/**
* <p>
* Preference page and property page implementation for configuring the Linuxtools Path property.
* </p>
*
* <p>
* In this property page, it is possible to change the PATH used to run LinuxTools commands.
* This is necessary for users that want to use tools not located in system PATH.
* With this page you can, for example, have 2 different versions of valgrind installed in your
* system and select which one will be used to profile your application.
* </p>
*
* @author Otavio Pontes
*/
public class LinuxtoolsPathPropertyPage extends PropertyPage {
public static final String LINUXTOOLS_PATH_COMBO_NAME = LaunchCoreConstants.PLUGIN_ID + ".LinuxtoolsPathCombo"; //$NON-NLS-1$
private static final String LINUXTOOLS_PATH_EXT_POINT = "LinuxtoolsPathOptions"; //$NON-NLS-1$
private static final String LINUXTOOLS_PATH_OPTION = "option"; //$NON-NLS-1$
private static final String LINUXTOOLS_PATH_OPTION_NAME = "name"; //$NON-NLS-1$
private static final String LINUXTOOLS_PATH_OPTION_PATH = "path"; //$NON-NLS-1$
private static final String[][] DEFAULT_PATHS= {
{"Custom", ""}, //$NON-NLS-1$ //$NON-NLS-2$
};
private StringFieldEditor linuxtoolsPath;
private CustomComboFieldEditor linuxtoolsPathCombo;
private IAdaptable element = null;
private Composite result;
private Button systemEnvButton, customButton;
private boolean customSelected;
private String [][]fillPaths() {
LinkedList<String[]> list = new LinkedList<>();
for (String[] t : DEFAULT_PATHS) {
list.add(t);
}
IExtensionPoint extPoint = Platform.getExtensionRegistry().getExtensionPoint(LaunchCoreConstants.PLUGIN_ID, LINUXTOOLS_PATH_EXT_POINT);
IConfigurationElement[] configs = extPoint.getConfigurationElements();
for (IConfigurationElement config : configs)
if (config.getName().equals(LINUXTOOLS_PATH_OPTION)) {
String path = config.getAttribute(LINUXTOOLS_PATH_OPTION_PATH);
String name = config.getAttribute(LINUXTOOLS_PATH_OPTION_NAME);
list.add(new String[]{name, path});
}
return list.toArray(new String[0][0]);
}
@Override
protected Control createContents(Composite parent) {
initializeDialogUnits(parent);
result= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout();
layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth= 0;
layout.numColumns= 1;
result.setLayout(layout);
String paths[][] = fillPaths();
//defaults
getPreferenceStore().setDefault(LaunchCoreConstants.LINUXTOOLS_PATH_SYSTEM_NAME, LinuxtoolsPathProperty.getInstance().getLinuxtoolsPathSystemDefault());
getPreferenceStore().setDefault(LINUXTOOLS_PATH_COMBO_NAME, LinuxtoolsPathProperty.getInstance().getLinuxtoolsPathDefault());
// Add radio buttons
Composite radios = new Composite(result, SWT.NONE);
GridLayout layoutRadios= new GridLayout();
layoutRadios.marginWidth= 0;
layoutRadios.numColumns= 1;
GridData gridData = new GridData();
gridData.horizontalSpan = 2;
gridData.horizontalAlignment = SWT.FILL;
gridData.grabExcessHorizontalSpace = true;
radios.setLayout(layoutRadios);
radios.setLayoutData(gridData);
boolean systemPathSelected = getPreferenceStore().getBoolean(LaunchCoreConstants.LINUXTOOLS_PATH_SYSTEM_NAME);
systemEnvButton = new Button(radios, SWT.RADIO);
systemEnvButton.setText(Messages.LINUXTOOLS_PATH_SYSTEM_ENV);
systemEnvButton.setSelection(systemPathSelected);
systemEnvButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateOptionsEnable();
}
});
customButton = new Button(radios, SWT.RADIO);
customButton.setText(Messages.LINUXTOOLS_PATH_CUSTOM);
customButton.setToolTipText(Messages.LINUXTOOLS_PATH_CUSTOM_TOOLTIP);
customButton.setSelection(!systemPathSelected);
//Add combo box
linuxtoolsPathCombo = new CustomComboFieldEditor(
LINUXTOOLS_PATH_COMBO_NAME,
Messages.LINUXTOOLS_PATH_COMBO,
paths,
result);
linuxtoolsPathCombo.setPage(this);
linuxtoolsPathCombo.setPreferenceStore(getPreferenceStore());
linuxtoolsPathCombo.load();
linuxtoolsPathCombo.setPropertyChangeListener(event -> {
customSelected = event.getNewValue().toString().equals(""); //$NON-NLS-1$
if (!customSelected){
linuxtoolsPath.setStringValue(event.getNewValue().toString());
}
updateOptionsEnable();
});
//Add textbox
linuxtoolsPath = new StringFieldEditor(
LaunchCoreConstants.LINUXTOOLS_PATH_NAME,
Messages.LINUXTOOLS_PATH, result);
linuxtoolsPath.setPage(this);
linuxtoolsPath.setPreferenceStore(getPreferenceStore());
linuxtoolsPath.getTextControl(result).setToolTipText(Messages.LINUXTOOLS_PATH_TOOLTIP);
String selected = getPreferenceStore().getString(LINUXTOOLS_PATH_COMBO_NAME);
customSelected = selected.equals(""); //$NON-NLS-1$
getPreferenceStore().setDefault(LaunchCoreConstants.LINUXTOOLS_PATH_NAME, LinuxtoolsPathProperty.getInstance().getLinuxtoolsPathDefault());
linuxtoolsPath.load();
linuxtoolsPathCombo.setSelectedValue(linuxtoolsPath.getStringValue());
Dialog.applyDialogFont(result);
updateOptionsEnable();
return result;
}
private void updateOptionsEnable() {
if (systemEnvButton.getSelection()) {
linuxtoolsPath.setEnabled(false, result);
linuxtoolsPathCombo.setEnabled(false, result);
} else {
linuxtoolsPath.setEnabled(customSelected, result);
linuxtoolsPathCombo.setEnabled(true, result);
}
}
@Override
protected void performDefaults() {
linuxtoolsPath.loadDefault();
linuxtoolsPathCombo.loadDefault();
customButton.setSelection(!LinuxtoolsPathProperty.getInstance().getLinuxtoolsPathSystemDefault());
systemEnvButton.setSelection(LinuxtoolsPathProperty.getInstance().getLinuxtoolsPathSystemDefault());
updateOptionsEnable();
}
@Override
public boolean performOk() {
linuxtoolsPath.store();
linuxtoolsPathCombo.store();
getPreferenceStore().setValue(LaunchCoreConstants.LINUXTOOLS_PATH_SYSTEM_NAME, systemEnvButton.getSelection());
return super.performOk();
}
@Override
protected void performApply() {
linuxtoolsPath.store();
linuxtoolsPathCombo.store();
getPreferenceStore().setValue(LaunchCoreConstants.LINUXTOOLS_PATH_SYSTEM_NAME, systemEnvButton.getSelection());
super.performApply();
}
/**
* Receives the object that owns the properties shown in this property page.
*
* @see org.eclipse.ui.IWorkbenchPropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
*/
@Override
public void setElement(IAdaptable element) {
this.element = element;
IAdaptable e = getElement();
if (e != null) {
setPreferenceStore(
new ScopedPreferenceStore(new ProjectScope((IProject) e), LaunchCoreConstants.PLUGIN_ID));
}
}
/**
* Delivers the object that owns the properties shown in this property page.
*
* @see org.eclipse.ui.IWorkbenchPropertyPage#getElement()
*/
@Override
public IAdaptable getElement() {
if (element == null) {
return element;
}
if (!(element instanceof IProject)) {
return element.getAdapter(IProject.class);
}
return element;
}
}