diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java index 883181ea7c4..ad0ff7797fc 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java @@ -186,6 +186,10 @@ public class ManagedBuildManager extends AbstractCExtension { public static final String INTERNAL_BUILDER_ID = "org.eclipse.cdt.build.core.internal.builder"; //$NON-NLS-1$ + private static final String os = Platform.getOS(); + private static final String arch = Platform.getOSArch(); + private static final String ALL = "all"; //$NON-NLS-1$ + // This is the version of the manifest and project files private static final PluginVersionIdentifier buildInfoVersion = new PluginVersionIdentifier(4, 0, 0); private static final Version version = new Version(4, 0, 0); @@ -4696,4 +4700,19 @@ public class ManagedBuildManager extends AbstractCExtension { return ToolChainModificationManager.getInstance(); } + // Check toolchain for platform compatibility + public static boolean isPlatformOk(IToolChain tc) { + ITargetPlatform tp = tc.getTargetPlatform(); + if (tp != null) { + List osList = Arrays.asList(tc.getOSList()); + if (osList.contains(ALL) || osList.contains(os)) { + List archList = Arrays.asList(tc.getArchList()); + if (archList.contains(ALL) || archList.contains(arch)) + return true; // OS and ARCH fits + } + return false; // OS or ARCH does not fit + } + return true; // no target platform - nothing to check. + } + } diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/NewCfgDialog.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/NewCfgDialog.java index 5fb00023e61..d3688677fb8 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/NewCfgDialog.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/NewCfgDialog.java @@ -12,10 +12,17 @@ package org.eclipse.cdt.managedbuilder.ui.properties; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; +import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyManager; +import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyType; +import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyValue; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IManagedProject; import org.eclipse.cdt.managedbuilder.core.IProjectType; @@ -23,8 +30,10 @@ 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.ManagedProject; +import org.eclipse.cdt.managedbuilder.ui.wizards.MBSWizardHandler; import org.eclipse.cdt.ui.newui.INewCfgDialog; import org.eclipse.cdt.ui.newui.UIMessages; +import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -59,6 +68,9 @@ public class NewCfgDialog implements INewCfgDialog { private static final String INVALID = ERROR + ".invalidName"; //$NON-NLS-1$ private static final String DESCRIPTION = LABEL + ".description"; //$NON-NLS-1$ private static final String NULL = "[null]"; //$NON-NLS-1$ + private static final String SEPARATOR = " > "; //$NON-NLS-1$ + private static final String ART = MBSWizardHandler.ARTIFACT; + private static final String NOT = UIMessages.getString("NewCfgDialog.3"); //$NON-NLS-1$ // Widgets private Text configName; private Text configDescription; @@ -66,6 +78,10 @@ public class NewCfgDialog implements INewCfgDialog { private Combo realConfigSelector; private Button b_clone; private Button b_real; + private Button b_import; + private Button b_importDef; + private Combo importSelector; + private Combo importDefSelector; private Label statusLabel; /** Default configurations defined in the toolchain description */ @@ -76,6 +92,8 @@ public class NewCfgDialog implements INewCfgDialog { private String newName; private String newDescription; private String title; + private Map imported; + private Map importedDef; protected Shell parentShell; @@ -95,9 +113,14 @@ public class NewCfgDialog implements INewCfgDialog { newDescription = configDescription.getText().trim(); if (b_clone.getSelection()) parentConfig = cfgds[cloneConfigSelector.getSelectionIndex()]; - else // real cfg + else if (b_real.getSelection()) // real cfg parentConfig = rcfgs[realConfigSelector.getSelectionIndex()]; - newConfiguration(); + else if (b_import.getSelection()) + parentConfig = getConfigFromName(importSelector.getText(), imported); + else if (b_importDef.getSelection()) + parentConfig = getConfigFromName(importDefSelector.getText(), importedDef); + if (parentConfig != null) + newConfiguration(); } else { newName = null; newDescription = null; @@ -257,6 +280,54 @@ public class NewCfgDialog implements INewCfgDialog { if(extCfgs.length == 0) b_real.setEnabled(false); + /* import */ + b_import = new Button(group, SWT.RADIO); + b_import.setText(UIMessages.getString("NewCfgDialog.4")); //$NON-NLS-1$ + gd = new GridData(GridData.BEGINNING); + b_import.setLayoutData(gd); + b_import.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + setButtons(); + } + }); + importSelector = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER); + importSelector.setFont(group.getFont()); + importSelector.setItems(getImportItems()); + importSelector.select(0); + importSelector.setVisibleItemCount(Math.min(10, importSelector.getItemCount())); + gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + importSelector.setLayoutData(gd); + importSelector.setEnabled(false); + importSelector.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + setButtons(); + } + }); + + /* import predefined */ + b_importDef = new Button(group, SWT.RADIO); + b_importDef.setText(UIMessages.getString("NewCfgDialog.5")); //$NON-NLS-1$ + gd = new GridData(GridData.BEGINNING); + b_importDef.setLayoutData(gd); + b_importDef.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + setButtons(); + } + }); + importDefSelector = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER); + importDefSelector.setFont(group.getFont()); + importDefSelector.setItems(getImportDefItems()); + importDefSelector.select(0); + importDefSelector.setVisibleItemCount(Math.min(10, importDefSelector.getItemCount())); + gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + importDefSelector.setLayoutData(gd); + importDefSelector.setEnabled(false); + importDefSelector.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + setButtons(); + } + }); + statusLabel = new Label(composite, SWT.CENTER); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; @@ -304,9 +375,15 @@ public class NewCfgDialog implements INewCfgDialog { statusLabel.setVisible(false); if (b != null) b.setEnabled(true); } + if (b_import.getSelection() && importSelector.getSelectionIndex() == 0) + b.setEnabled(false); + if (b_importDef.getSelection() && importDefSelector.getSelectionIndex() == 0) + b.setEnabled(false); cloneConfigSelector.setEnabled(b_clone.getSelection()); realConfigSelector.setEnabled(b_real.getSelection()); + importSelector.setEnabled(b_import.getSelection()); + importDefSelector.setEnabled(b_importDef.getSelection()); } } @@ -484,4 +561,60 @@ public class NewCfgDialog implements INewCfgDialog { ManagedBuilderUIPlugin.log(e); } } + + private String[] getImportItems() { + imported = new HashMap(); + if (des != null) { + IProject[] ps = des.getProject().getWorkspace().getRoot().getProjects(); + for (IProject p : ps) { + ICProjectDescription prjd = CoreModel.getDefault().getProjectDescription(p, false); + if (prjd == null) + continue; + ICConfigurationDescription[] cfgs = prjd.getConfigurations(); + if (cfgs == null || cfgs.length == 0) + continue; + for (ICConfigurationDescription d : cfgs) { + IConfiguration cfg = ManagedBuildManager.getConfigurationForDescription(d); + if (cfg != null) + imported.put(p.getName() + SEPARATOR + d.getName(), cfg); + } + } + } + ArrayList lst = new ArrayList(imported.keySet()); + Collections.sort(lst); + lst.add(0, NOT); + return lst.toArray(new String[lst.size()]); + } + + private String[] getImportDefItems() { + importedDef = new HashMap(); + IBuildPropertyManager bpm = ManagedBuildManager.getBuildPropertyManager(); + IBuildPropertyType bpt = bpm.getPropertyType(ART); + for (IBuildPropertyValue v : bpt.getSupportedValues()) { + String id = v.getId(); + IToolChain[] tcs = ManagedBuildManager.getExtensionsToolChains(ART, id, false); + if (tcs == null || tcs.length == 0) continue; + for (IToolChain tc : tcs) { + if (tc.isSystemObject() || tc.isAbstract() || ! tc.isSupported()) + continue; + // prefix: "X" shown if toolchain is not supported by platform. + String pre = ManagedBuildManager.isPlatformOk(tc) ? " " : "X "; //$NON-NLS-1$ //$NON-NLS-2$ + for (IConfiguration c : ManagedBuildManager.getExtensionConfigurations(tc, ART, id)) { + if (c.isSystemObject() || ! c.isSupported()) + continue; + importedDef.put(pre + v.getName() + SEPARATOR + tc.getName() + SEPARATOR + c.getName(), c); + } + } + } + ArrayList lst = new ArrayList(importedDef.keySet()); + Collections.sort(lst); + lst.add(0, NOT); + return lst.toArray(new String[lst.size()]); + } + + private IConfiguration getConfigFromName(String s, Map imp) { + if (imp == null) + return null; + return imp.get(s); + } } diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/AbstractCWizard.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/AbstractCWizard.java index f28d18ab0a2..fd3e54c55ca 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/AbstractCWizard.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/AbstractCWizard.java @@ -10,29 +10,21 @@ *******************************************************************************/ package org.eclipse.cdt.managedbuilder.ui.wizards; -import java.util.Arrays; -import java.util.List; - import org.eclipse.cdt.internal.ui.CPluginImages; import org.eclipse.cdt.managedbuilder.core.IInputType; -import org.eclipse.cdt.managedbuilder.core.ITargetPlatform; import org.eclipse.cdt.managedbuilder.core.ITool; import org.eclipse.cdt.managedbuilder.core.IToolChain; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.ui.properties.ManagedBuilderUIImages; import org.eclipse.cdt.ui.wizards.CDTCommonProjectWizard; import org.eclipse.cdt.ui.wizards.CNewWizard; import org.eclipse.cdt.ui.wizards.IWizardItemsListListener; -import org.eclipse.cdt.utils.Platform; import org.eclipse.jface.wizard.IWizard; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; public abstract class AbstractCWizard extends CNewWizard { - private static final String os = Platform.getOS(); - private static final String arch = Platform.getOSArch(); - private static final String ALL = "all"; //$NON-NLS-1$ - protected static final Image IMG0 = CPluginImages.get(CPluginImages.IMG_OBJS_CFOLDER); protected static final Image IMG1 = ManagedBuilderUIImages.get(ManagedBuilderUIImages.IMG_BUILD_CAT); protected static final Image IMG2 = ManagedBuilderUIImages.get(ManagedBuilderUIImages.IMG_BUILD_TOOL); @@ -64,17 +56,7 @@ public abstract class AbstractCWizard extends CNewWizard { return false; // Check for platform compatibility - ITargetPlatform tp = tc.getTargetPlatform(); - if (tp != null) { - List osList = Arrays.asList(tc.getOSList()); - if (osList.contains(ALL) || osList.contains(os)) { - List archList = Arrays.asList(tc.getArchList()); - if (archList.contains(ALL) || archList.contains(arch)) - return true; // OS and ARCH fits - } - return false; // OS or ARCH does not fit - } - return true; // No platform: nothing to check + return ManagedBuildManager.isPlatformOk(tc); } /** diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties index 2aa9a57553c..4affa11878e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties @@ -588,4 +588,7 @@ StringVariableSelectionDialog_columnDescription=&Variable Description: NewCfgDialog.0= NewCfgDialog.1= NewCfgDialog.2=Cannot create new configuration +NewCfgDialog.3=-- not selected -- +NewCfgDialog.4=Import from projects +NewCfgDialog.5=Import predefined CDTMainWizardPage.0=Project name cannot contain '\#' symbol