blob: 58dcbc3c02888e919b8334827e66938b442ef691 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.cdt.build.gcc.ui.internal;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.cdt.core.build.IToolChain;
import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
public class ToolChainEnvironmentPage extends WizardPage {
private TableViewer tableViewer;
private Button editButton;
private Button removeButton;
private List<IEnvironmentVariable> envvars;
public ToolChainEnvironmentPage(IToolChain toolChain) {
super(ToolChainEnvironmentPage.class.getName());
setTitle(Messages.ToolChainEnvironmentPage_Title);
setDescription(Messages.ToolChainEnvironmentPage_Description);
if (toolChain != null && toolChain.getVariables() != null) {
this.envvars = new LinkedList<>(Arrays.asList(toolChain.getVariables()));
} else {
this.envvars = new LinkedList<>();
}
}
private static abstract class TableLabelProvider extends BaseLabelProvider implements ITableLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
}
@Override
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout(2, false));
Table table = new Table(comp, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.FULL_SELECTION);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumn column = new TableColumn(table, SWT.LEFT);
column.setText(Messages.ToolChainEnvironmentPage_Name);
column.setWidth(150);
column = new TableColumn(table, SWT.LEFT);
column.setText(Messages.ToolChainEnvironmentPage_Value);
column.setWidth(150);
column = new TableColumn(table, SWT.LEFT);
column.setText(Messages.ToolChainEnvironmentPage_Operation);
column.setWidth(75);
tableViewer = new TableViewer(table);
tableViewer.setContentProvider(new IStructuredContentProvider() {
@Override
public Object[] getElements(Object inputElement) {
return envvars.toArray();
}
});
tableViewer.setLabelProvider(new TableLabelProvider() {
@Override
public String getColumnText(Object element, int columnIndex) {
IEnvironmentVariable var = (IEnvironmentVariable) element;
switch (columnIndex) {
case 0:
return var.getName();
case 1:
return var.getValue();
case 2:
switch (var.getOperation()) {
case IEnvironmentVariable.ENVVAR_REPLACE:
return Messages.ToolChainEnvironmentPage_Replace;
case IEnvironmentVariable.ENVVAR_PREPEND:
return Messages.ToolChainEnvironmentPage_Prepend;
case IEnvironmentVariable.ENVVAR_APPEND:
return Messages.ToolChainEnvironmentPage_Append;
case IEnvironmentVariable.ENVVAR_REMOVE:
return Messages.ToolChainEnvironmentPage_Unset;
}
}
return null;
}
});
Composite buttonComp = new Composite(comp, SWT.NONE);
buttonComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
buttonComp.setLayout(new GridLayout());
Button addButton = new Button(buttonComp, SWT.PUSH);
addButton.setText(Messages.ToolChainEnvironmentPage_Add);
addButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
NewEnvVarDialog dialog = new NewEnvVarDialog(getShell());
if (dialog.open() == Window.OK) {
envvars.add(dialog.getEnvVar());
tableViewer.refresh();
}
}
});
editButton = new Button(buttonComp, SWT.PUSH);
editButton.setText(Messages.ToolChainEnvironmentPage_Edit);
editButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
editButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleEdit();
}
});
removeButton = new Button(buttonComp, SWT.PUSH);
removeButton.setText(Messages.ToolChainEnvironmentPage_Remove);
removeButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (MessageDialog.openConfirm(getShell(), Messages.ToolChainEnvironmentPage_RemoveTitle,
Messages.ToolChainEnvironmentPage_RemoveMessage)) {
@SuppressWarnings("rawtypes")
Iterator i = tableViewer.getStructuredSelection().iterator();
while (i.hasNext()) {
IEnvironmentVariable var = (IEnvironmentVariable) i.next();
envvars.remove(var);
}
tableViewer.refresh();
}
}
});
table.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
updateButtons();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
updateButtons();
if (table.getSelectionCount() == 1) {
handleEdit();
}
}
});
tableViewer.setInput(envvars);
setControl(comp);
}
private void updateButtons() {
int n = tableViewer.getTable().getSelectionCount();
editButton.setEnabled(n == 1);
removeButton.setEnabled(n > 0);
}
private void handleEdit() {
IEnvironmentVariable var = (IEnvironmentVariable) tableViewer.getStructuredSelection().getFirstElement();
NewEnvVarDialog dialog = new NewEnvVarDialog(getShell(), var);
if (dialog.open() == Window.OK) {
envvars.remove(var);
envvars.add(dialog.getEnvVar());
tableViewer.refresh();
tableViewer.setSelection(new StructuredSelection(dialog.getEnvVar()));
}
}
public IEnvironmentVariable[] getEnvVars() {
return !envvars.isEmpty() ? envvars.toArray(new IEnvironmentVariable[0]) : null;
}
}