diff --git a/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties b/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties index 30b20c35af5..13b1085fb6c 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties +++ b/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties @@ -63,6 +63,9 @@ MBS.create.configuration=Create New Configuration WizardConvertMakeProject.name=Convert to a C/C++ Project WizardConvertMakeProject.description=Convert to a C/C++ Project +WizardMakeProjFromExisting.name=Existing Code +WizardMakeProjFromExisting.description=Creates a new Makefile project in a directory containing existing code + Tool.settings=Tool Settings Build.steps=Build Steps Build.artifact=Build Artifact diff --git a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml index b8198152f25..278e7255cc0 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml +++ b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml @@ -685,8 +685,19 @@ id="org.eclipse.cdt.managedbuilder.core.managedBuildNature"> - - - + + + + + %WizardMakeProjFromExisting.description + + + diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/Messages.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/Messages.java new file mode 100644 index 00000000000..c847df937e7 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/Messages.java @@ -0,0 +1,31 @@ +package org.eclipse.cdt.managedbuilder.ui.wizards; + +import org.eclipse.osgi.util.NLS; + +/** + * @since 7.0 + */ +public class Messages extends NLS { + private static final String BUNDLE_NAME = "org.eclipse.cdt.managedbuilder.ui.wizards.messages"; //$NON-NLS-1$ + public static String NewMakeProjFromExisting_0; + public static String NewMakeProjFromExisting_1; + public static String NewMakeProjFromExistingPage_0; + public static String NewMakeProjFromExistingPage_1; + public static String NewMakeProjFromExistingPage_10; + public static String NewMakeProjFromExistingPage_11; + public static String NewMakeProjFromExistingPage_2; + public static String NewMakeProjFromExistingPage_3; + public static String NewMakeProjFromExistingPage_4; + public static String NewMakeProjFromExistingPage_5; + public static String NewMakeProjFromExistingPage_6; + public static String NewMakeProjFromExistingPage_7; + public static String NewMakeProjFromExistingPage_8; + public static String NewMakeProjFromExistingPage_9; + static { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, Messages.class); + } + + private Messages() { + } +} diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/NewMakeProjFromExisting.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/NewMakeProjFromExisting.java new file mode 100644 index 00000000000..67b81d7a81e --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/NewMakeProjFromExisting.java @@ -0,0 +1,123 @@ +/******************************************************************************* + * Copyright (c) 2010 Wind River 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 + * + * Contributors: + * Doug Schaefer (WRS) - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.managedbuilder.ui.wizards; + +import java.lang.reflect.InvocationTargetException; + +import org.eclipse.cdt.core.CCProjectNature; +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager; +import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; +import org.eclipse.cdt.managedbuilder.core.IBuilder; +import org.eclipse.cdt.managedbuilder.core.IToolChain; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.internal.core.Configuration; +import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.internal.core.ManagedProject; +import org.eclipse.cdt.managedbuilder.internal.core.ToolChain; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.ui.IImportWizard; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.actions.WorkspaceModifyOperation; + +/** + * Wizard to create a new CDT project that wraps existing code. + * @since 7.0 + */ +public class NewMakeProjFromExisting extends Wizard implements IImportWizard { + + NewMakeProjFromExistingPage page; + + public void init(IWorkbench workbench, IStructuredSelection selection) { + setWindowTitle(Messages.NewMakeProjFromExisting_0); + } + + @Override + public void addPages() { + page = new NewMakeProjFromExistingPage(); + addPage(page); + } + + @Override + public boolean performFinish() { + final String projectName = page.getProjectName(); + final String location = page.getLocation(); + final boolean isCPP = page.isCPP(); + final IToolChain toolChain = page.getToolChain(); + + IRunnableWithProgress op = new WorkspaceModifyOperation() { + @Override + protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, + InterruptedException { + monitor.beginTask(Messages.NewMakeProjFromExisting_1, 10); + + // Create Project + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + IProject project = workspace.getRoot().getProject(projectName); + + // TODO handle the case where a .project file was already there + IProjectDescription description = workspace.newProjectDescription(project.getName()); + description.setLocation(new Path(location)); + + CCorePlugin.getDefault().createCDTProject(description, project, monitor); + + // Optionally C++ natures + if (isCPP) + CCProjectNature.addCCNature(project, new SubProgressMonitor(monitor, 1)); + + // Set up build information + ICProjectDescriptionManager pdMgr = CoreModel.getDefault().getProjectDescriptionManager(); + ICProjectDescription projDesc = pdMgr.createProjectDescription(project, false); + ManagedBuildInfo info = ManagedBuildManager.createBuildInfo(project); + ManagedProject mProj = new ManagedProject(projDesc); + info.setManagedProject(mProj); + monitor.worked(1); + + CfgHolder cfgHolder = new CfgHolder(toolChain, null); + String s = toolChain == null ? "0" : ((ToolChain)toolChain).getId(); //$NON-NLS-1$ + Configuration config = new Configuration(mProj, (ToolChain)toolChain, ManagedBuildManager.calculateChildId(s, null), cfgHolder.getName()); + IBuilder builder = config.getEditableBuilder(); + builder.setManagedBuildOn(false); + CConfigurationData data = config.getConfigurationData(); + projDesc.createConfiguration(ManagedBuildManager.CFG_DATA_PROVIDER_ID, data); + monitor.worked(1); + + pdMgr.setProjectDescription(project, projDesc); + + monitor.done(); + } + }; + + try { + getContainer().run(true, true, op); + } catch (InvocationTargetException e) { + e.printStackTrace(); + return false; + } catch (InterruptedException e) { + e.printStackTrace(); + return false; + } + return true; + } + +} diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/NewMakeProjFromExistingPage.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/NewMakeProjFromExistingPage.java new file mode 100644 index 00000000000..3ecfd9202d0 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/NewMakeProjFromExistingPage.java @@ -0,0 +1,210 @@ +/******************************************************************************* + * Copyright (c) 2010 Wind River 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 + * + * Contributors: + * Doug Schaefer (WRS) - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.managedbuilder.ui.wizards; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.cdt.managedbuilder.core.IToolChain; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +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.DirectoryDialog; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.List; +import org.eclipse.swt.widgets.Text; + +/** + * Page to select existing code location and toolchain. + * + * @since 7.0 + */ +public class NewMakeProjFromExistingPage extends WizardPage { + + Text projectName; + Text location; + Button langc; + Button langcpp; + IWorkspaceRoot root; + List tcList; + Map tcMap = new HashMap(); + + protected NewMakeProjFromExistingPage() { + super(Messages.NewMakeProjFromExistingPage_0); + setTitle(Messages.NewMakeProjFromExistingPage_1); + setDescription(Messages.NewMakeProjFromExistingPage_2); + + root = ResourcesPlugin.getWorkspace().getRoot(); + } + + public void createControl(Composite parent) { + Composite comp = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + comp.setLayout(layout); + comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + addProjectNameSelector(comp); + addSourceSelector(comp); + addLanguageSelector(comp); + addToolchainSelector(comp); + + setControl(comp); + } + + public void addProjectNameSelector(Composite parent) { + Group group = new Group(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + group.setLayout(layout); + group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + group.setText(Messages.NewMakeProjFromExistingPage_3); + + projectName = new Text(group, SWT.BORDER); + projectName.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + projectName.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + validateProjectName(); + } + }); + } + + public void validateProjectName() { + String projectName = location.getText(); + IProject project = root.getProject(projectName); + if (project.exists()) + setErrorMessage(Messages.NewMakeProjFromExistingPage_4); + else + setErrorMessage(null); + } + + public void addSourceSelector(Composite parent) { + Group group = new Group(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + group.setLayout(layout); + group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + group.setText(Messages.NewMakeProjFromExistingPage_5); + + location = new Text(group, SWT.BORDER); + location.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + location.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + validateSource(); + } + }); + validateSource(); + + Button browse = new Button(group, SWT.NONE); + browse.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); + browse.setText(Messages.NewMakeProjFromExistingPage_6); + browse.addSelectionListener(new SelectionListener() { + public void widgetSelected(SelectionEvent e) { + DirectoryDialog dialog = new DirectoryDialog(location.getShell()); + dialog.setMessage(Messages.NewMakeProjFromExistingPage_7); + String dir = dialog.open(); + if (dir != null) + location.setText(dir); + } + + public void widgetDefaultSelected(SelectionEvent e) { + } + }); + } + + void validateSource() { + File file= new File(location.getText()); + if (file.isDirectory()) { + setErrorMessage(null); + projectName.setText(file.getName()); + } else + setErrorMessage(Messages.NewMakeProjFromExistingPage_8); + } + + public void addLanguageSelector(Composite parent) { + Group group = new Group(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + group.setLayout(layout); + group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + group.setText(Messages.NewMakeProjFromExistingPage_9); + + // TODO, should be a way to dynamically list these + langc = new Button(group, SWT.CHECK); + langc.setText("C"); //$NON-NLS-1$ + langc.setSelection(true); + + langcpp = new Button(group, SWT.CHECK); + langcpp.setText("C++"); //$NON-NLS-1$ + langcpp.setSelection(true); + } + + public void addToolchainSelector(Composite parent) { + Group group = new Group(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + group.setLayout(layout); + group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + group.setText(Messages.NewMakeProjFromExistingPage_10); + + tcList = new List(group, SWT.SINGLE); + group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + tcList.add(Messages.NewMakeProjFromExistingPage_11); + + IToolChain[] toolChains = ManagedBuildManager.getRealToolChains(); + for (IToolChain toolChain : toolChains) { + if (toolChain.isAbstract() || toolChain.isSystemObject()) + continue; + tcMap.put(toolChain.getUniqueRealName(), toolChain); + } + + ArrayList names = new ArrayList(tcMap.keySet()); + Collections.sort(names); + for (String name : names) + tcList.add(name); + + tcList.setSelection(0); // select + } + + public String getProjectName() { + return projectName.getText(); + } + + public String getLocation() { + return location.getText(); + } + + public boolean isC() { + return langc.getSelection(); + } + + public boolean isCPP() { + return langcpp.getSelection(); + } + + public IToolChain getToolChain() { + String[] selection = tcList.getSelection(); + return selection.length != 0 ? tcMap.get(selection[0]) : null; + } + +} diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/messages.properties b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/messages.properties new file mode 100644 index 00000000000..1273795d75e --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/messages.properties @@ -0,0 +1,14 @@ +NewMakeProjFromExisting_0=Import Existing Code +NewMakeProjFromExisting_1=Importing Existing Code +NewMakeProjFromExistingPage_0=Import Existing Code +NewMakeProjFromExistingPage_1=Import Existing Code +NewMakeProjFromExistingPage_10=Toolchain for Indexer Settings +NewMakeProjFromExistingPage_11= +NewMakeProjFromExistingPage_2=Create a new Makefile project from existing code in that same directory +NewMakeProjFromExistingPage_3=Project Name +NewMakeProjFromExistingPage_4=Project already exists +NewMakeProjFromExistingPage_5=Existing Code Location +NewMakeProjFromExistingPage_6=Browse... +NewMakeProjFromExistingPage_7=Select root directory of existing code +NewMakeProjFromExistingPage_8=Not a valid directory +NewMakeProjFromExistingPage_9=Languages