blob: 75964cc2bc32ef8bd1923b43a25cb82583201e65 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 QNX Software Systems and others.
* 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
*******************************************************************************/
package org.eclipse.cdt.ui.build;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
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.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.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.cdt.core.build.IToolChain;
import org.eclipse.cdt.core.build.IToolChainManager;
import org.eclipse.cdt.core.build.IUserToolChainProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.CUIMessages;
import org.eclipse.cdt.internal.ui.build.NewToolChainWizard;
/**
* Preference page to manage Toolchains for Core Build.
*
* @since 6.3
*/
public class ToolChainPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
private TableViewer availTable;
private Button availUp;
private Button availDown;
private TableViewer userTable;
private Button userEdit;
private Button userRemove;
private List<IToolChain> toolChains;
private static IToolChainManager manager = CUIPlugin.getService(IToolChainManager.class);
private ISafeRunnable tcListener = () -> Display.getDefault().asyncExec(() -> {
availTable.refresh();
userTable.refresh();
});
public ToolChainPreferencePage() {
super(CUIMessages.ToolChainPreferencePage_Toolchains);
}
@Override
public void init(IWorkbench workbench) {
}
private static class TableLabelProvider extends LabelProvider implements ITableLabelProvider {
@Override
public String getColumnText(Object element, int columnIndex) {
IToolChain toolChain = (IToolChain) element;
switch (columnIndex) {
case 0:
return manager.getToolChainTypeName(toolChain.getTypeId());
case 1:
return toolChain.getName();
case 2:
return toolChain.getProperty(IToolChain.ATTR_OS);
case 3:
return toolChain.getProperty(IToolChain.ATTR_ARCH);
}
return null;
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
}
@Override
protected Control createContents(Composite parent) {
initializeDialogUnits(parent);
Composite control = new Composite(parent, SWT.NONE);
control.setLayout(new GridLayout());
Group availGroup = new Group(control, SWT.NONE);
availGroup.setText(CUIMessages.ToolChainPreferencePage_AvailableToolchains);
availGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
availGroup.setLayout(new GridLayout(2, false));
availTable = createToolChainTable(availGroup);
availTable.setLabelProvider(new TableLabelProvider());
availTable.setContentProvider(new IStructuredContentProvider() {
@Override
public Object[] getElements(Object inputElement) {
toolChains = new ArrayList<IToolChain>();
try {
toolChains.addAll(manager.getAllToolChains());
} catch (CoreException e) {
CUIPlugin.log(e.getStatus());
}
return toolChains.toArray();
}
});
availTable.getTable().addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateButtons();
}
});
Composite availButtonComp = new Composite(availGroup, SWT.NONE);
availButtonComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
availButtonComp.setLayout(new GridLayout());
availUp = new Button(availButtonComp, SWT.PUSH);
availUp.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false));
availUp.setText(CUIMessages.ToolChainPreferencePage_Up);
availUp.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int i = availTable.getTable().getSelectionIndex();
if (i < 1) {
return;
}
IToolChain tc = toolChains.get(i - 1);
toolChains.set(i - 1, toolChains.get(i));
toolChains.set(i, tc);
availTable.refresh();
}
});
availDown = new Button(availButtonComp, SWT.PUSH);
availDown.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false));
availDown.setText(CUIMessages.ToolChainPreferencePage_Down);
availDown.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int i = availTable.getTable().getSelectionIndex();
if (i < 0 || i > toolChains.size() - 2) {
return;
}
IToolChain tc = toolChains.get(i + 1);
toolChains.set(i + 1, toolChains.get(i));
toolChains.set(i, tc);
availTable.refresh();
}
});
Group userGroup = new Group(control, SWT.NONE);
userGroup.setText(CUIMessages.ToolChainPreferencePage_UserDefinedToolchains);
userGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
userGroup.setLayout(new GridLayout(2, false));
userTable = createToolChainTable(userGroup);
userTable.setLabelProvider(new TableLabelProvider());
userTable.setContentProvider(new IStructuredContentProvider() {
@Override
public Object[] getElements(Object inputElement) {
List<IToolChain> tcs = new ArrayList<>();
try {
for (IToolChain tc : manager.getAllToolChains()) {
if (tc.getProvider() instanceof IUserToolChainProvider) {
tcs.add(tc);
}
}
} catch (CoreException e) {
CUIPlugin.log(e);
}
return tcs.toArray();
}
});
userTable.getTable().addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateButtons();
}
});
Composite userButtonComp = new Composite(userGroup, SWT.NONE);
userButtonComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
userButtonComp.setLayout(new GridLayout());
Button userAdd = new Button(userButtonComp, SWT.PUSH);
userAdd.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false));
userAdd.setText(CUIMessages.ToolChainPreferencePage_Add);
userAdd.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Wizard wizard = new NewToolChainWizard();
WizardDialog dialog = new WizardDialog(getShell(), wizard);
dialog.open();
}
});
userEdit = new Button(userButtonComp, SWT.PUSH);
userEdit.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
userEdit.setText(CUIMessages.ToolChainPreferencePage_EditDot);
userEdit.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IToolChain tc = (IToolChain) userTable.getStructuredSelection().getFirstElement();
String providerId = tc.getProvider().getId();
ToolChainWizard wizard = null;
IExtensionPoint point = Platform.getExtensionRegistry()
.getExtensionPoint(CUIPlugin.PLUGIN_ID + ".newToolChainWizards"); //$NON-NLS-1$
loop: for (IExtension extension : point.getExtensions()) {
for (IConfigurationElement element : extension.getConfigurationElements()) {
if (providerId.equals(element.getAttribute("providerId"))) { //$NON-NLS-1$
try {
wizard = (ToolChainWizard) element.createExecutableExtension("class"); //$NON-NLS-1$
break loop;
} catch (CoreException e1) {
CUIPlugin.log(e1.getStatus());
}
}
}
}
if (wizard != null) {
wizard.setToolChain(tc);
WizardDialog dialog = new WizardDialog(getShell(), wizard);
dialog.open();
} else {
MessageDialog.openInformation(getShell(), CUIMessages.ToolChainPreferencePage_Edit, CUIMessages.ToolChainPreferencePage_NoEditor);
}
}
});
userRemove = new Button(userButtonComp, SWT.PUSH);
userRemove.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false));
userRemove.setText(CUIMessages.ToolChainPreferencePage_Remove);
userRemove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (MessageDialog.openConfirm(getShell(), CUIMessages.ToolChainPreferencePage_Remove1,
CUIMessages.ToolChainPreferencePage_AreYouSure)) {
IToolChain tc = (IToolChain) userTable.getStructuredSelection().getFirstElement();
IUserToolChainProvider provider = (IUserToolChainProvider) tc.getProvider();
new Job(CUIMessages.ToolChainPreferencePage_RemoveToolchain) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
provider.removeToolChain(tc);
return Status.OK_STATUS;
} catch (CoreException e) {
return e.getStatus();
}
}
}.schedule();
}
}
});
availTable.setInput(manager);
userTable.setInput(manager);
updateButtons();
manager.addToolChainListener(tcListener);
return control;
}
@Override
public void dispose() {
manager.removeToolChainListener(tcListener);
super.dispose();
}
@Override
public boolean performOk() {
if (!super.performOk()) {
return false;
}
try {
if (!toolChains.equals(manager.getAllToolChains())) {
manager.setToolChainOrder(toolChains);
}
} catch (CoreException e) {
CUIPlugin.log(e.getStatus());
return false;
}
return true;
}
private TableViewer createToolChainTable(Composite parent) {
Composite tableComp = new Composite(parent, SWT.NONE);
tableComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Table table = new Table(tableComp, SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumnLayout tableLayout = new TableColumnLayout();
TableColumn tableTypeColumn = new TableColumn(table, SWT.LEAD);
tableTypeColumn.setText(CUIMessages.ToolChainPreferencePage_Type);
tableLayout.setColumnData(tableTypeColumn, new ColumnWeightData(2));
TableColumn tableNameColumn = new TableColumn(table, SWT.LEAD);
tableNameColumn.setText(CUIMessages.ToolChainPreferencePage_Name);
tableLayout.setColumnData(tableNameColumn, new ColumnWeightData(10));
TableColumn tableOSColumn = new TableColumn(table, SWT.LEAD);
tableOSColumn.setText(CUIMessages.ToolChainPreferencePage_OS);
tableLayout.setColumnData(tableOSColumn, new ColumnWeightData(2));
TableColumn tableArchColumn = new TableColumn(table, SWT.LEAD);
tableArchColumn.setText(CUIMessages.ToolChainPreferencePage_Arch);
tableLayout.setColumnData(tableArchColumn, new ColumnWeightData(2));
tableComp.setLayout(tableLayout);
return new TableViewer(table);
}
private void updateButtons() {
int i = availTable.getTable().getSelectionIndex();
availUp.setEnabled(i > 0);
availDown.setEnabled(i >= 0 && i < toolChains.size() - 2);
boolean userSelected = userTable.getTable().getSelectionCount() > 0;
userEdit.setEnabled(userSelected);
userRemove.setEnabled(userSelected);
}
}