/******************************************************************************* * Copyright (c) 2002, 2015 IBM Corporation 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 * * Contributors: * IBM Rational Software - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.autotools.ui.wizards; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.eclipse.cdt.core.CProjectNature; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IProjectType; import org.eclipse.cdt.managedbuilder.core.IToolChain; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.ui.wizards.MBSCustomPageManager; import org.eclipse.cdt.ui.newui.CDTHelpContextIds; import org.eclipse.cdt.ui.wizards.NewCProjectWizard; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; 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.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; /** * Class that implements the project type and configuration selection page in the new * project wizard for managed builder projects. * * @since 1.2 */ public class CProjectPlatformPage extends WizardPage { /* * Dialog variables and string constants */ private static final String PREFIX = "PlatformBlock"; //$NON-NLS-1$ private static final String LABEL = PREFIX + ".label"; //$NON-NLS-1$ private static final String TIP = PREFIX + ".tip"; //$NON-NLS-1$ private static final String CONFIG_LABEL = LABEL + ".configs"; //$NON-NLS-1$ private static final String TARGET_LABEL = LABEL + ".platform"; //$NON-NLS-1$ private static final String TARGET_TIP = TIP + ".platform"; //$NON-NLS-1$ private static final String FORCEDCONFIG_TIP = TIP + ".forcedconfigs"; //$NON-NLS-1$ // support for exporting data to custom wizard pages public static final String PAGE_ID = "org.eclipse.cdt.managedbuilder.ui.wizard.platformPage"; //$NON-NLS-1$ public static final String PROJECT_TYPE = "projectType"; //$NON-NLS-1$ public static final String TOOLCHAIN = "toolchain"; //$NON-NLS-1$ public static final String NATURE = "nature"; //$NON-NLS-1$ protected Text platformSelection; private List<Object> selectedConfigurations; protected IProjectType projectType; protected Button showAllConfigs; protected boolean showAllConfigsForced; protected CheckboxTableViewer tableViewer; protected IConfiguration configurations[]; /** * Constructor. * @param pageName * @param wizard */ public CProjectPlatformPage(String pageName) { super(pageName); setPageComplete(false); projectType = ManagedBuildManager.getExtensionProjectType("org.eclipse.linuxtools.cdt.autotools.core.projectType"); //$NON-NLS-1$ selectedConfigurations = new ArrayList<>(0); showAllConfigsForced = false; } @Override public boolean canFlipToNextPage() { return validatePage() && getNextPage() != null; } private void createConfigSelectionGroup (Composite parent) { // Create the group composite Composite composite = new Composite(parent, SWT.NULL); composite.setFont(parent.getFont()); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); // Create a check box table of valid configurations final Label configLabel = new Label(composite, SWT.LEFT); configLabel.setFont(composite.getFont()); configLabel.setText(AutotoolsWizardMessages.getResourceString(CONFIG_LABEL)); Table table = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL); table.setLayoutData(new GridData(GridData.FILL_BOTH)); table.setHeaderVisible(true); table.setLinesVisible(false); // Add a table layout to the table TableLayout tableLayout = new TableLayout(); table.setHeaderVisible(false); table.setLayout(tableLayout); // Add the viewer tableViewer = new CheckboxTableViewer(table); tableViewer.setLabelProvider(new ConfigurationLabelProvider()); tableViewer.setContentProvider(new ConfigurationContentProvider()); tableViewer.addSelectionChangedListener(e -> handleConfigurationSelectionChange()); } /** * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { // Create the composite control for the tab Composite composite = new Composite(parent, SWT.NULL); composite.setFont(parent.getFont()); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); // Setup the help information PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, CDTHelpContextIds.MAN_PROJ_PLATFORM_HELP); // Create the widgets createTypeSelectGroup(composite); createConfigSelectionGroup(composite); // Publish which project type has been chosen with the custom wizard page manager MBSCustomPageManager.addPageProperty(PAGE_ID, PROJECT_TYPE, projectType.getId()); // Select configuration populateConfigurations(); setPageComplete(validatePage()); // Do the nasty setErrorMessage(null); setMessage(null); setControl(composite); } private void createTypeSelectGroup(Composite parent) { // Create the group composite Composite composite = new Composite(parent, SWT.NULL); composite.setFont(parent.getFont()); composite.setLayout(new GridLayout(2, false)); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Create the platform selection label and combo widgets final Label platformLabel = new Label(composite, SWT.LEFT); platformLabel.setFont(composite.getFont()); platformLabel.setText(AutotoolsWizardMessages.getResourceString(TARGET_LABEL)); platformSelection = new Text(composite, SWT.READ_ONLY); // platformSelection = new Combo(composite, SWT.READ_ONLY | SWT.BORDER); platformSelection.setFont(composite.getFont()); platformSelection.setToolTipText(AutotoolsWizardMessages.getResourceString(TARGET_TIP)); platformSelection.setText("GNU Autotools"); //$NON-NLS-1$ platformSelection.addDisposeListener(e -> platformSelection = null); GridData gd = new GridData(GridData.FILL_HORIZONTAL); // Make this the same as NewCProjectWizardPage.SIZING_TEXT_FIELD_WIDTH gd.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH + 50; platformSelection.setLayoutData(gd); } public IProject getProject() { return ((NewCProjectWizard)getWizard()).getNewProject(); } /** * @return */ public IConfiguration[] getSelectedConfigurations() { return selectedConfigurations.toArray(new IConfiguration[selectedConfigurations.size()]); } /** * Returns the selected project type. * * @return IProjectType Selected type or <code>null</code> if an invalid selection * has been made. */ public IProjectType getProjectType() { return projectType; } private void handleConfigurationSelectionChange() { // Get the selections from the table viewer selectedConfigurations.clear(); selectedConfigurations.addAll(Arrays.asList(tableViewer.getCheckedElements())); // support for publishing the toolchains for the selected configs so that custom wizard // pages will know which toolchains have been selected // get the toolchains from the selected configs and put them into a set Set<IToolChain> toolchainSet = new LinkedHashSet<>(); for(int k = 0; k < selectedConfigurations.size(); k++) { IConfiguration config = (IConfiguration) selectedConfigurations.get(k); IToolChain toolchain = config.getToolChain(); toolchainSet.add(toolchain); } // publish the set of selected toolchains with the custom page manager MBSCustomPageManager.addPageProperty(PAGE_ID, TOOLCHAIN, toolchainSet); // TODO: Don't know where this goes and how to find true nature MBSCustomPageManager.addPageProperty(CProjectPlatformPage.PAGE_ID, CProjectPlatformPage.NATURE, CProjectNature.C_NATURE_ID); setPageComplete(validatePage()); } /** * Populate the table viewer with either all known configurations * or only with the supported configurations depending on whether a user * has chosen to display unsupported configurations or not * By default, only supported configurations are selected. */ private void populateConfigurations() { if (projectType == null) return; IConfiguration selected[] = null; configurations = filterSupportedConfigurations(projectType.getConfigurations()); selected = configurations; // Check for buildable configs on this platform if (selected.length == 0) { // Indicate that there are no buildable configurations on this platform for this project // type and that all configurations will be selected setMessage(AutotoolsWizardMessages.getResourceString(FORCEDCONFIG_TIP), WARNING); } else { setMessage(null, NONE); } tableViewer.setInput(configurations); tableViewer.setCheckedElements(selected); handleConfigurationSelectionChange(); } /** * Returns the array of supported configurations found in the configurations * passed to this method */ IConfiguration[] filterSupportedConfigurations(IConfiguration cfgs[]){ ArrayList<IConfiguration> supported = new ArrayList<>(); String os = Platform.getOS(); String arch = Platform.getOSArch(); for (int i = 0; i < cfgs.length; i++) { // First, filter on supported state if (cfgs[i].isSupported()) { // Now, apply the OS and ARCH filters to determine if the configuration should be shown // Determine if the configuration's tool-chain supports this OS & Architecture. IToolChain tc = cfgs[i].getToolChain(); List<String> osList = Arrays.asList(tc.getOSList()); if (osList.contains("all") || osList.contains(os)) { //$NON-NLS-1$ List<String> archList = Arrays.asList(tc.getArchList()); if (archList.contains("all") || archList.contains(arch)) { //$NON-NLS-1$ supported.add(cfgs[i]); } } } } return supported.toArray(new IConfiguration[supported.size()]); } /** * @return */ private boolean validatePage() { // TODO some validation ... maybe if ((tableViewer.getCheckedElements()).length > 0) { setErrorMessage(null); return true; } else { setErrorMessage(AutotoolsWizardMessages.getResourceString("PlatformBlock.message.error.noconfigs")); //$NON-NLS-1$ return false; } } }