/******************************************************************************* * Copyright (c) 2005, 2014 Intel 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: * Intel Corporation - initial API and implementation * Anna Dushistova (MontaVista) - [366771] Converter fails to convert a CDT makefile project * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.managedbuilder.internal.ui.commands; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.cdt.managedbuilder.core.IBuildObject; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IConvertManagedBuildObject; import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; import org.eclipse.cdt.managedbuilder.core.IManagedProject; 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.properties.ManagedBuilderUIPlugin; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; 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.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; public class ConvertTargetDialog extends Dialog { final private String title; protected org.eclipse.swt.widgets.List convertersList; private IProject project; private Map<String, IConfigurationElement> conversionElements; private IConfigurationElement selectedConversionElement; private static boolean isConversionSuccessful = false; public static final String PREFIX = "ProjectConvert"; //$NON-NLS-1$ public static final String CONVERTERS_LIST = PREFIX + ".convertersList"; //$NON-NLS-1$ /** * @param parentShell the parent shell * @param project the project to convert * @param title the title of the dialog */ protected ConvertTargetDialog(Shell parentShell, IProject project, String title) { super(parentShell); this.title = title; setProject(project); IProjectType projectType = getProjectType(); if (projectType != null) { conversionElements = ManagedBuildManager.getConversionElements(projectType); } for (IBuildObject tc : getProjectToolchains()) { Map<String, IConfigurationElement> converters = ManagedBuildManager.getConversionElements(tc); if (converters != null) { if (conversionElements == null) { conversionElements = converters; } else { conversionElements.putAll(converters); } } } setShellStyle(getShellStyle() | SWT.RESIZE); } @Override protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.OK_ID) { handleConverterSelection(); IConvertManagedBuildObject convertBuildObject = null; try { convertBuildObject = (IConvertManagedBuildObject) getSelectedConversionElement().createExecutableExtension("class"); //$NON-NLS-1$ } catch (CoreException e) { ManagedBuilderUIPlugin.log(e); } if (convertBuildObject != null) { String fromId = getSelectedConversionElement().getAttribute("fromId"); //$NON-NLS-1$ String toId = getSelectedConversionElement().getAttribute("toId"); //$NON-NLS-1$ IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject()); if (info != null) { IManagedProject managedProject = info.getManagedProject(); if (managedProject != null) { if (convertBuildObject.convert(managedProject, fromId, toId, true) == null) { setConversionSuccessful(false); } else { setConversionSuccessful(true); } } else { setConversionSuccessful(false); } } else { setConversionSuccessful(false); } } else { setConversionSuccessful(false); } } super.buttonPressed(buttonId); } @Override protected void configureShell(Shell shell) { super.configureShell(shell); if (title != null) shell.setText(title); } @Override protected Control createDialogArea(Composite parent) { Composite comp = new Composite(parent, SWT.NULL); comp.setFont(parent.getFont()); comp.setLayout(new GridLayout(1, true)); comp.setLayoutData(new GridData(GridData.FILL_BOTH)); // Create the converters list group area final Group convertersListGroup = new Group(comp, SWT.NONE); convertersListGroup.setFont(parent.getFont()); convertersListGroup.setText(Messages.ProjectConvert_convertersList); convertersListGroup.setLayout(new GridLayout(1, false)); convertersListGroup.setLayoutData(new GridData(GridData.FILL_BOTH)); // Create the current config List convertersList = new org.eclipse.swt.widgets.List(convertersListGroup, SWT.SINGLE|SWT.V_SCROLL|SWT.H_SCROLL|SWT.BORDER); convertersList.setFont(convertersListGroup.getFont()); GridData data = new GridData(GridData.FILL_BOTH); convertersList.setLayoutData(data); convertersList.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent event) { convertersList = null; } }); convertersList.addListener (SWT.Selection, new Listener () { @Override public void handleEvent(Event e) { validateState(); } }); Object [] objs = getConversionElements().keySet().toArray(); String [] names = new String[objs.length]; for (int i = 0; i < objs.length; i++) { Object object = objs[i]; names[i] = (String)object; } convertersList.setItems(names); validateState(); return comp; } private void handleConverterSelection() { // Determine which configuration was selected int selectionIndex = convertersList.getSelectionIndex(); String selectedConverterName = convertersList .getItem(selectionIndex); IConfigurationElement selectedElement = getConversionElements().get(selectedConverterName); setSelectedConversionElement(selectedElement); return; } private void validateState() { Button b = getButton(IDialogConstants.OK_ID); if (b != null) b.setEnabled(convertersList.getSelectionIndex() != -1); } private Map<String, IConfigurationElement> getConversionElements() { if (conversionElements == null) { conversionElements = new HashMap<String, IConfigurationElement>(); } return conversionElements; } private IProjectType getProjectType() { IProjectType projectType = null; // Get the projectType from project. IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject()); if (info != null) { IManagedProject managedProject = info.getManagedProject(); if ( managedProject != null) { projectType = managedProject.getProjectType(); } } return projectType; } public IProject getProject() { return project; } public void setProject(IProject project) { this.project = project; } public IConfigurationElement getSelectedConversionElement() { return selectedConversionElement; } public void setSelectedConversionElement( IConfigurationElement selectedConversionElement) { this.selectedConversionElement = selectedConversionElement; } public static boolean isConversionSuccessful() { return isConversionSuccessful; } public void setConversionSuccessful(boolean isConversionSuccessful) { ConvertTargetDialog.isConversionSuccessful = isConversionSuccessful; } private List<IBuildObject> getProjectToolchains() { List<IBuildObject> projectToolchains = new ArrayList<>(); // Get the projectType from project. IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject()); if (info != null) { IConfiguration[] configs = info.getManagedProject().getConfigurations(); for (IConfiguration config : configs) { IToolChain toolchain = config.getToolChain(); if (toolchain != null) { projectToolchains.add(toolchain); } } } return projectToolchains; } }