diff --git a/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF b/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF index 83cb2367c03..d6e27cdb939 100644 --- a/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF +++ b/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.debug.ui; singleton:=true -Bundle-Version: 7.4.0.qualifier +Bundle-Version: 7.5.0.qualifier Bundle-Activator: org.eclipse.cdt.debug.ui.CDebugUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/debug/org.eclipse.cdt.debug.ui/pom.xml b/debug/org.eclipse.cdt.debug.ui/pom.xml index e70695b6903..d1348c31c9a 100644 --- a/debug/org.eclipse.cdt.debug.ui/pom.xml +++ b/debug/org.eclipse.cdt.debug.ui/pom.xml @@ -11,7 +11,7 @@ ../../pom.xml - 7.4.0-SNAPSHOT + 7.5.0-SNAPSHOT org.eclipse.cdt.debug.ui eclipse-plugin diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/AbstractImportExecutableWizard.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/AbstractImportExecutableWizard.java index 05d28348613..c44630504e2 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/AbstractImportExecutableWizard.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/AbstractImportExecutableWizard.java @@ -70,6 +70,8 @@ public abstract class AbstractImportExecutableWizard extends Wizard implements I /** * Adds the executables to a new or existing project. The executables are * added as external links. + * If an executable of the same name already exists then the existing linked + * resource's location is replaced by the local location's value. * * @param project - * project receiving the executables @@ -83,13 +85,10 @@ public abstract class AbstractImportExecutableWizard extends Wizard implements I IPath location = Path.fromOSString(executables[i]); String executableName = location.toFile().getName(); IFile exeFile = project.getProject().getFile(executableName); - if (!exeFile.exists()) - { - try { - exeFile.createLink(location, 0, null); - } catch (Exception e) { - this.getImportExecutablePage2().setErrorMessage("Error importing: " + executables[i]); - } + try { + exeFile.createLink(location, IResource.REPLACE, null); + } catch (Exception e) { + this.getImportExecutablePage2().setErrorMessage("Error importing: " + executables[i]); } } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/ImportExecutablePageTwo.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/ImportExecutablePageTwo.java index 6ed5b53e1da..bdc6185f12d 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/ImportExecutablePageTwo.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/ImportExecutablePageTwo.java @@ -11,24 +11,31 @@ package org.eclipse.cdt.debug.ui.importexecutable; import java.util.ArrayList; +import java.util.List; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.ICDescriptor; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.parser.util.StringUtil; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds; import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.ui.CElementLabelProvider; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; @@ -400,6 +407,7 @@ public class ImportExecutablePageTwo extends WizardPage { @Override public boolean isPageComplete() { setErrorMessage(null); + setWarningMessage(null); if (isCreateNewProjectSelected()) { if (getNewProjectName().length() == 0) { @@ -421,6 +429,20 @@ public class ImportExecutablePageTwo extends WizardPage { setErrorMessage(Messages.ImportExecutablePageTwo_BadProjectName); return false; } + + // check if executables with same names already exist in the existing project + String[] executables = wizard.getImportExecutablePage().getSelectedExecutables(); + List existingNames = new ArrayList(); + for (String executable : executables) { + IFile exeFile = getExecutableFile(project.getProject(), executable); + if (exeFile.exists()) { + existingNames.add(exeFile.getName()); + } + } + if (!existingNames.isEmpty()) { + setWarningMessage(NLS.bind(Messages.ImportExecutablePageTwo_ExecutableAlreadyExists, + StringUtil.join(existingNames, ", "))); //$NON-NLS-1$ + } } if (isCreateLaunchConfigurationSelected() && getNewConfigurationName().length() == 0) { @@ -430,6 +452,26 @@ public class ImportExecutablePageTwo extends WizardPage { } return super.isPageComplete(); } + + /** + * Returns the executable resource having the specified path within the project. + * @param project - the project of the executable file + * @param executable - the string path of the executable + * @return the executable file + */ + private IFile getExecutableFile(IProject project, String executable) { + IPath location = Path.fromOSString(executable); + String name = location.toFile().getName(); + return project.getFile(name); + } + + /** + * Sets or clears the warning message for this page. + * @param message - the message, or null to clear the message + */ + private void setWarningMessage(String message) { + setMessage(message, IMessageProvider.WARNING); + } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/Messages.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/Messages.java index d3fe6942e71..11671cfed02 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/Messages.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/Messages.java @@ -48,6 +48,10 @@ public class Messages extends NLS { public static String ImportExecutablePageTwo_CreateLaunch; public static String ImportExecutablePageTwo_Name; public static String ImportExecutablePageTwo_DefaultProjectPrefix; + /** + * @since 7.5 + */ + public static String ImportExecutablePageTwo_ExecutableAlreadyExists; private Messages() { } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/Messages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/Messages.properties index 2f486672af4..4d5027a35de 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/Messages.properties +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/importexecutable/Messages.properties @@ -18,6 +18,8 @@ ImportExecutablePageTwo_EnterProjectName=Enter a project name. ImportExecutablePageOne_ProcessingResults=Processing results ImportExecutablePageTwo_EnterLaunchConfig=Enter a launch configuration name. ImportExecutablePageTwo_ProjectAlreadyExists=That project already exists, enter a new name. +ImportExecutablePageTwo_ExecutableAlreadyExists=Project already contains {0} executable(s). \ +If you continue the file(s) will be replaced. ImportExecutablePageTwo_DefaultProjectPrefix=Debug_ ImportExecutableWizard_executableListLabel=C/C++ Executable Files: ImportExecutableWizard_fileDialogTitle=Choose an executable file