mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-12 19:45:22 +02:00
Initial commit of the Import Executable Wizard.
This commit is contained in:
parent
8fb351caba
commit
8bd344b11f
10 changed files with 1408 additions and 1 deletions
|
@ -19,6 +19,7 @@ Export-Package:
|
||||||
org.eclipse.cdt.debug.internal.ui.views.modules,
|
org.eclipse.cdt.debug.internal.ui.views.modules,
|
||||||
org.eclipse.cdt.debug.internal.ui.views.signals,
|
org.eclipse.cdt.debug.internal.ui.views.signals,
|
||||||
org.eclipse.cdt.debug.ui,
|
org.eclipse.cdt.debug.ui,
|
||||||
|
org.eclipse.cdt.debug.ui.importexecutable,
|
||||||
org.eclipse.cdt.debug.ui.sourcelookup
|
org.eclipse.cdt.debug.ui.sourcelookup
|
||||||
Require-Bundle: org.eclipse.ui.ide,
|
Require-Bundle: org.eclipse.ui.ide,
|
||||||
org.eclipse.jface.text,
|
org.eclipse.jface.text,
|
||||||
|
|
BIN
debug/org.eclipse.cdt.debug.ui/icons/obj16/c_app.gif
Normal file
BIN
debug/org.eclipse.cdt.debug.ui/icons/obj16/c_app.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 606 B |
|
@ -131,3 +131,8 @@ EditRegisterGroupAction.label=Edit Register Group
|
||||||
EditRegisterGroupAction.tooltip=Edit Register Group
|
EditRegisterGroupAction.tooltip=Edit Register Group
|
||||||
RestoredefaultRegisterGroupsAction.label=Restore Default Register Groups
|
RestoredefaultRegisterGroupsAction.label=Restore Default Register Groups
|
||||||
RestoredefaultRegisterGroupsAction.tooltip=Restore Default Register Groups
|
RestoredefaultRegisterGroupsAction.tooltip=Restore Default Register Groups
|
||||||
|
|
||||||
|
# Import Executable
|
||||||
|
importCPPCategory.name=C/C++
|
||||||
|
importExecutableWizard.name=C/C++ Executable
|
||||||
|
importExecutableWizard.description=Imports a C/C++ executable file. Will create a project and launch configuration for debugging.
|
||||||
|
|
|
@ -1224,5 +1224,22 @@
|
||||||
class="org.eclipse.cdt.debug.internal.ui.DebugMarkerAnnotationModelFactory"
|
class="org.eclipse.cdt.debug.internal.ui.DebugMarkerAnnotationModelFactory"
|
||||||
contentTypeId="org.eclipse.cdt.core.cSource"/>
|
contentTypeId="org.eclipse.cdt.core.cSource"/>
|
||||||
</extension>
|
</extension>
|
||||||
|
<!-- Import Executable Wizard -->
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.importWizards">
|
||||||
|
<wizard
|
||||||
|
category="org.eclipse.cdt.ui.import"
|
||||||
|
icon="icons/obj16/c_app.gif"
|
||||||
|
name="%importExecutableWizard.name"
|
||||||
|
class="org.eclipse.cdt.debug.ui.importexecutable.ImportExecutableWizard"
|
||||||
|
id="org.eclipse.cdt.ui.wizardse.ImportExecutableWizard">
|
||||||
|
<description>
|
||||||
|
%importExecutableWizard.description
|
||||||
|
</description>
|
||||||
|
</wizard>
|
||||||
|
<category
|
||||||
|
id="org.eclipse.cdt.ui.import"
|
||||||
|
name="%importCPPCategory.name"/>
|
||||||
|
</extension>
|
||||||
|
|
||||||
</plugin>
|
</plugin>
|
|
@ -0,0 +1,317 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Nokia 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:
|
||||||
|
* Nokia - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.ui.importexecutable;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.model.IBinary;
|
||||||
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
|
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
|
||||||
|
import org.eclipse.cdt.internal.core.model.ExternalTranslationUnit;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
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.IPath;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.OperationCanceledException;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfigurationType;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||||
|
import org.eclipse.debug.core.ILaunchManager;
|
||||||
|
import org.eclipse.debug.core.model.ISourceLocator;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
|
||||||
|
import org.eclipse.debug.ui.DebugUITools;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.StructuredSelection;
|
||||||
|
import org.eclipse.jface.wizard.IWizardPage;
|
||||||
|
import org.eclipse.jface.wizard.Wizard;
|
||||||
|
import org.eclipse.swt.widgets.FileDialog;
|
||||||
|
import org.eclipse.ui.INewWizard;
|
||||||
|
import org.eclipse.ui.IWorkbench;
|
||||||
|
import org.eclipse.ui.progress.UIJob;
|
||||||
|
|
||||||
|
public abstract class AbstractImportExecutableWizard extends Wizard implements INewWizard {
|
||||||
|
|
||||||
|
// The ImportExecutableWizard lets you select one or more executables and
|
||||||
|
// import them into the workspace. You can bring the executables into an
|
||||||
|
// existing project or have the wizard create a new project that
|
||||||
|
// will contains the executables and allow you to debug them. The wizard can
|
||||||
|
// also create a default launch configuration for you that's pre configured
|
||||||
|
// to debug the executables.
|
||||||
|
|
||||||
|
public static final String DEBUG_PROJECT_ID = "org.eclipse.cdt.debug"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private ImportExecutablePageOne pageOne;
|
||||||
|
|
||||||
|
private ImportExecutablePageTwo pageTwo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override this method to add the correct binary parsers to the project.
|
||||||
|
* @param newProject - the project created by the wizard
|
||||||
|
* @throws CoreException
|
||||||
|
*/
|
||||||
|
public abstract void addBinaryParsers(IProject newProject) throws CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the executables to a new or existing project. The executables are
|
||||||
|
* added as external links.
|
||||||
|
*
|
||||||
|
* @param project -
|
||||||
|
* project receiving the executables
|
||||||
|
* @throws CoreException
|
||||||
|
*/
|
||||||
|
private void addExecutables(IProject project) throws CoreException {
|
||||||
|
|
||||||
|
String[] executables = pageOne.getSelectedExecutables();
|
||||||
|
|
||||||
|
for (int i = 0; i < executables.length; i++) {
|
||||||
|
IPath location = Path.fromOSString(executables[i]);
|
||||||
|
String executableName = location.toFile().getName();
|
||||||
|
IFile exeFile = project.getFile(executableName);
|
||||||
|
if (!exeFile.exists())
|
||||||
|
exeFile.createLink(location, 0, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addPages() {
|
||||||
|
super.addPages();
|
||||||
|
pageOne = new ImportExecutablePageOne(this);
|
||||||
|
addPage(pageOne);
|
||||||
|
pageTwo = new ImportExecutablePageTwo(this);
|
||||||
|
addPage(pageTwo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addSourceLocation(ISourceLocator locator, AbstractSourceLookupDirector director, IPath unitLocation)
|
||||||
|
{
|
||||||
|
if (unitLocation.toFile().exists()) {
|
||||||
|
boolean found = false;
|
||||||
|
String unitLocationPathString = unitLocation.toOSString();
|
||||||
|
if (locator instanceof ICSourceLocator)
|
||||||
|
found = (((ICSourceLocator) locator).findSourceElement(unitLocationPathString) != null);
|
||||||
|
else if (locator instanceof CSourceLookupDirector)
|
||||||
|
found = ((CSourceLookupDirector) locator).contains(unitLocationPathString);
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
|
||||||
|
DirectorySourceContainer directoryContainer = new DirectorySourceContainer(
|
||||||
|
unitLocation.removeLastSegments(1), false);
|
||||||
|
ArrayList containerList = new ArrayList(Arrays.asList(director
|
||||||
|
.getSourceContainers()));
|
||||||
|
containerList.add(directoryContainer);
|
||||||
|
director.setSourceContainers((ISourceContainer[]) containerList
|
||||||
|
.toArray(new ISourceContainer[containerList.size()]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addSourceLocations(IBinary[] binaries, ILaunchConfigurationWorkingCopy configuration) {
|
||||||
|
|
||||||
|
String memento = null;
|
||||||
|
String type = null;
|
||||||
|
try {
|
||||||
|
memento = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String) null);
|
||||||
|
type = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, (String) null);
|
||||||
|
if (type == null) {
|
||||||
|
type = configuration.getType().getSourceLocatorId();
|
||||||
|
}
|
||||||
|
|
||||||
|
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
|
||||||
|
ISourceLocator locator = launchManager.newSourceLocator(type);
|
||||||
|
if (locator instanceof AbstractSourceLookupDirector) {
|
||||||
|
AbstractSourceLookupDirector director = (AbstractSourceLookupDirector) locator;
|
||||||
|
if (memento == null) {
|
||||||
|
director.initializeDefaults(configuration);
|
||||||
|
} else {
|
||||||
|
director.initializeFromMemento(memento, configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < binaries.length; i++) {
|
||||||
|
IBinary binary = binaries[i];
|
||||||
|
if (!binary.getPath().lastSegment().startsWith(".")) {
|
||||||
|
addSourceLocation(locator, director, binary.getUnderlyingResource().getLocation());
|
||||||
|
List sourceFiles;
|
||||||
|
sourceFiles = binary.getChildrenOfType(ICElement.C_UNIT);
|
||||||
|
if (sourceFiles.size() == 0)
|
||||||
|
{
|
||||||
|
sourceFiles = binary.getChildrenOfType(ICElement.C_UNIT);
|
||||||
|
}
|
||||||
|
for (Iterator iter = sourceFiles.iterator(); iter.hasNext();) {
|
||||||
|
Object element = (Object) iter.next();
|
||||||
|
if (element instanceof ExternalTranslationUnit) {
|
||||||
|
ExternalTranslationUnit unit = (ExternalTranslationUnit) element;
|
||||||
|
IPath unitLocation = unit.getLocation();
|
||||||
|
addSourceLocation(locator, director, unitLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, director.getMemento());
|
||||||
|
configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, director.getId());
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IProject createCProjectForExecutable(String projectName) throws OperationCanceledException, CoreException {
|
||||||
|
|
||||||
|
IWorkspace workspace = ResourcesPlugin.getWorkspace();
|
||||||
|
IProject newProjectHandle = workspace.getRoot().getProject(projectName);
|
||||||
|
|
||||||
|
IProjectDescription description = workspace.newProjectDescription(newProjectHandle.getName());
|
||||||
|
description.setLocation(null);
|
||||||
|
|
||||||
|
IProject newProject = CCorePlugin.getDefault().createCProject(description, newProjectHandle, null,
|
||||||
|
DEBUG_PROJECT_ID);
|
||||||
|
|
||||||
|
return newProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createLaunchConfiguration(ICProject targetProject) throws CoreException {
|
||||||
|
|
||||||
|
ILaunchConfigurationWorkingCopy wc = this.getSelectedLaunchConfigurationType().newInstance(null,
|
||||||
|
this.getImportExecutablePage2().getNewConfigurationName());
|
||||||
|
|
||||||
|
wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, targetProject.getProject().getName());
|
||||||
|
wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, new File(getImportExecutablePage()
|
||||||
|
.getSelectedExecutables()[0]).getName());
|
||||||
|
|
||||||
|
addSourceLocations(targetProject.getBinaryContainer().getBinaries(), wc);
|
||||||
|
setConfigurationDefaults(wc);
|
||||||
|
|
||||||
|
final IStructuredSelection selection = new StructuredSelection(wc.doSave());
|
||||||
|
final String identifier = new String("org.eclipse.debug.ui.launchGroup.debug");
|
||||||
|
|
||||||
|
UIJob openLaunchConfigJob = new UIJob(Messages.AbstractImportExecutableWizard_CreateLaunchConfiguration) {
|
||||||
|
|
||||||
|
public IStatus runInUIThread(IProgressMonitor monitor) {
|
||||||
|
DebugUITools.openLaunchConfigurationDialogOnGroup(CUIPlugin.getActiveWorkbenchShell(), selection, identifier);
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}};
|
||||||
|
openLaunchConfigJob.schedule();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract String getExecutableListLabel();
|
||||||
|
|
||||||
|
public ImportExecutablePageOne getImportExecutablePage() {
|
||||||
|
return pageOne;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImportExecutablePageTwo getImportExecutablePage2() {
|
||||||
|
return pageTwo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IWizardPage getNextPage(IWizardPage page) {
|
||||||
|
if (page == pageOne) {
|
||||||
|
pageTwo.checkExecutableSettings();
|
||||||
|
}
|
||||||
|
return super.getNextPage(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract String getPageOneDescription();
|
||||||
|
|
||||||
|
public abstract String getPageOneTitle();
|
||||||
|
|
||||||
|
public ILaunchConfigurationType getSelectedLaunchConfigurationType() {
|
||||||
|
return pageTwo.getSelectedLaunchConfigurationType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultWindowTitle() {
|
||||||
|
return Messages.AbstractImportExecutableWizard_windowTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(IWorkbench workbench, IStructuredSelection selection) {
|
||||||
|
setWindowTitle(getDefaultWindowTitle());
|
||||||
|
setNeedsProgressMonitor(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean isExecutableFile(File file);
|
||||||
|
|
||||||
|
public boolean performFinish() {
|
||||||
|
|
||||||
|
ICProject targetProject = null;
|
||||||
|
try {
|
||||||
|
if (pageTwo.isCreateNewProjectSelected()) {
|
||||||
|
// Create a new project and add the executables and binary
|
||||||
|
// parsers.
|
||||||
|
IProject newProject = createCProjectForExecutable(pageTwo
|
||||||
|
.getNewProjectName());
|
||||||
|
setupProject(newProject);
|
||||||
|
addExecutables(newProject);
|
||||||
|
addBinaryParsers(newProject);
|
||||||
|
targetProject = CCorePlugin.getDefault().getCoreModel().create(
|
||||||
|
newProject);
|
||||||
|
} else {
|
||||||
|
// Assume the existing project already has binary parsers setup,
|
||||||
|
// just add the executables.
|
||||||
|
ICProject existingProject = pageTwo.getExistingCProject();
|
||||||
|
addExecutables(existingProject.getProject());
|
||||||
|
targetProject = existingProject;
|
||||||
|
}
|
||||||
|
if (pageTwo.isCreateLaunchConfigurationSelected()) {
|
||||||
|
createLaunchConfiguration(targetProject);
|
||||||
|
}
|
||||||
|
} catch (OperationCanceledException e) {
|
||||||
|
} catch (CoreException e) {
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subclasses should override this method to modify the launch configuration
|
||||||
|
* created by the wizard. The default implementation does nothing.
|
||||||
|
* @param config the launch configuration created by the wizard
|
||||||
|
*/
|
||||||
|
public void setConfigurationDefaults(ILaunchConfigurationWorkingCopy config) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void setupFileDialog(FileDialog dialog);
|
||||||
|
|
||||||
|
public void setupProject(IProject newProject) throws CoreException {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The wizard will only display launch configuration types that you support.
|
||||||
|
* This method will be called for each available type.
|
||||||
|
*
|
||||||
|
* @param type -
|
||||||
|
* the type of launch configuration
|
||||||
|
* @return - if the wizard supports this launch configuration type
|
||||||
|
*/
|
||||||
|
public abstract boolean supportsConfigurationType(
|
||||||
|
ILaunchConfigurationType type);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,459 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Nokia 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:
|
||||||
|
* Nokia - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.ui.importexecutable;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.jface.dialogs.Dialog;
|
||||||
|
import org.eclipse.jface.operation.IRunnableWithProgress;
|
||||||
|
import org.eclipse.jface.viewers.CheckStateChangedEvent;
|
||||||
|
import org.eclipse.jface.viewers.CheckboxTreeViewer;
|
||||||
|
import org.eclipse.jface.viewers.ICheckStateListener;
|
||||||
|
import org.eclipse.jface.viewers.ITreeContentProvider;
|
||||||
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
import org.eclipse.jface.wizard.WizardPage;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.FocusAdapter;
|
||||||
|
import org.eclipse.swt.events.FocusEvent;
|
||||||
|
import org.eclipse.swt.events.ModifyEvent;
|
||||||
|
import org.eclipse.swt.events.ModifyListener;
|
||||||
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
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.FileDialog;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
|
||||||
|
public class ImportExecutablePageOne extends WizardPage {
|
||||||
|
|
||||||
|
// Keep track of the directory that we browsed the last time
|
||||||
|
// the wizard was invoked.
|
||||||
|
private static String previouslyBrowsedDirectory = ""; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private Text multipleExecutablePathField;
|
||||||
|
|
||||||
|
private CheckboxTreeViewer executablesViewer;
|
||||||
|
|
||||||
|
private File[] executables = new File[0];
|
||||||
|
|
||||||
|
private String previouslySearchedDirectory;
|
||||||
|
|
||||||
|
private Text singleExecutablePathField;
|
||||||
|
|
||||||
|
private boolean selectSingleFile = true;
|
||||||
|
|
||||||
|
private Button selectSingleButton;
|
||||||
|
|
||||||
|
private Button selectSingleBrowseButton;
|
||||||
|
|
||||||
|
private Button selectMultipleButton;
|
||||||
|
|
||||||
|
private Button selectMultipleBrowseButton;
|
||||||
|
|
||||||
|
private Button selectAll;
|
||||||
|
|
||||||
|
private Button deselectAll;
|
||||||
|
|
||||||
|
private Label selectMultipleTitle;
|
||||||
|
|
||||||
|
private AbstractImportExecutableWizard wizard;
|
||||||
|
|
||||||
|
public ImportExecutablePageOne(AbstractImportExecutableWizard wizard) {
|
||||||
|
super("ImportApplicationPageOne");
|
||||||
|
this.wizard = wizard;
|
||||||
|
setPageComplete(false);
|
||||||
|
setTitle(wizard.getPageOneTitle());
|
||||||
|
setDescription(wizard.getPageOneDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkControlState() {
|
||||||
|
selectSingleFile = selectSingleButton.getSelection();
|
||||||
|
singleExecutablePathField.setEnabled(selectSingleFile);
|
||||||
|
selectSingleBrowseButton.setEnabled(selectSingleFile);
|
||||||
|
|
||||||
|
multipleExecutablePathField.setEnabled(!selectSingleFile);
|
||||||
|
selectMultipleBrowseButton.setEnabled(!selectSingleFile);
|
||||||
|
selectAll.setEnabled(!selectSingleFile);
|
||||||
|
deselectAll.setEnabled(!selectSingleFile);
|
||||||
|
selectMultipleTitle.setEnabled(!selectSingleFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean collectExecutableFiles(Collection files, File directory,
|
||||||
|
IProgressMonitor monitor) {
|
||||||
|
|
||||||
|
if (monitor.isCanceled())
|
||||||
|
return false;
|
||||||
|
monitor.subTask(directory.getPath());
|
||||||
|
File[] contents = directory.listFiles();
|
||||||
|
// first look for project description files
|
||||||
|
|
||||||
|
for (int i = 0; i < contents.length; i++) {
|
||||||
|
File file = contents[i];
|
||||||
|
if (file.isFile() && wizard.isExecutableFile(file)) {
|
||||||
|
files.add(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// no project description found, so recurse into sub-directories
|
||||||
|
for (int i = 0; i < contents.length; i++) {
|
||||||
|
if (contents[i].isDirectory())
|
||||||
|
collectExecutableFiles(files, contents[i], monitor);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
|
||||||
|
initializeDialogUnits(parent);
|
||||||
|
|
||||||
|
Composite workArea = new Composite(parent, SWT.NONE);
|
||||||
|
setControl(workArea);
|
||||||
|
|
||||||
|
workArea.setLayout(new GridLayout());
|
||||||
|
workArea.setLayoutData(new GridData(GridData.FILL_BOTH
|
||||||
|
| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
|
||||||
|
|
||||||
|
Composite selectExecutableGroup = new Composite(workArea, SWT.NONE);
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.numColumns = 3;
|
||||||
|
layout.makeColumnsEqualWidth = false;
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
selectExecutableGroup.setLayout(layout);
|
||||||
|
selectExecutableGroup.setLayoutData(new GridData(
|
||||||
|
GridData.FILL_HORIZONTAL));
|
||||||
|
|
||||||
|
createSelectExecutable(selectExecutableGroup);
|
||||||
|
createExecutablesRoot(selectExecutableGroup);
|
||||||
|
createExecutablesList(workArea);
|
||||||
|
Dialog.applyDialogFont(workArea);
|
||||||
|
selectSingleButton.setSelection(true);
|
||||||
|
checkControlState();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createExecutablesList(Composite workArea) {
|
||||||
|
|
||||||
|
selectMultipleTitle = new Label(workArea, SWT.NONE);
|
||||||
|
selectMultipleTitle.setText(wizard.getExecutableListLabel());
|
||||||
|
|
||||||
|
Composite listComposite = new Composite(workArea, SWT.NONE);
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.numColumns = 2;
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
layout.makeColumnsEqualWidth = false;
|
||||||
|
listComposite.setLayout(layout);
|
||||||
|
|
||||||
|
listComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
|
||||||
|
| GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
|
||||||
|
|
||||||
|
executablesViewer = new CheckboxTreeViewer(listComposite, SWT.BORDER);
|
||||||
|
GridData listData = new GridData(GridData.GRAB_HORIZONTAL
|
||||||
|
| GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
|
||||||
|
executablesViewer.getControl().setLayoutData(listData);
|
||||||
|
|
||||||
|
executablesViewer.setContentProvider(new ITreeContentProvider() {
|
||||||
|
|
||||||
|
public void dispose() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getChildren(Object parentElement) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getElements(Object inputElement) {
|
||||||
|
return executables;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getParent(Object element) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasChildren(Object element) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void inputChanged(Viewer viewer, Object oldInput,
|
||||||
|
Object newInput) {
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
executablesViewer.setLabelProvider(new LabelProvider() {
|
||||||
|
public String getText(Object element) {
|
||||||
|
return ((File) element).getName();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
executablesViewer.addCheckStateListener(new ICheckStateListener() {
|
||||||
|
|
||||||
|
public void checkStateChanged(CheckStateChangedEvent event) {
|
||||||
|
setPageComplete(executablesViewer.getCheckedElements().length > 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
executablesViewer.setInput(this);
|
||||||
|
createSelectionButtons(listComposite);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createExecutablesRoot(Composite workArea) {
|
||||||
|
|
||||||
|
selectMultipleButton = new Button(workArea, SWT.RADIO);
|
||||||
|
selectMultipleButton.setText(Messages.ImportExecutablePageOne_SearchDirectory);
|
||||||
|
selectMultipleButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
checkControlState();
|
||||||
|
|
||||||
|
if (!selectSingleFile) {
|
||||||
|
singleExecutablePathField.setText("");
|
||||||
|
noFilesSelected();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// project location entry field
|
||||||
|
this.multipleExecutablePathField = new Text(workArea, SWT.BORDER);
|
||||||
|
|
||||||
|
this.multipleExecutablePathField.setLayoutData(new GridData(
|
||||||
|
GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
|
||||||
|
selectMultipleBrowseButton = new Button(workArea, SWT.PUSH);
|
||||||
|
selectMultipleBrowseButton.setText(Messages.ImportExecutablePageOne_Browse);
|
||||||
|
setButtonLayoutData(selectMultipleBrowseButton);
|
||||||
|
|
||||||
|
selectMultipleBrowseButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
handleLocationBrowseButtonPressed();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
multipleExecutablePathField.addFocusListener(new FocusAdapter() {
|
||||||
|
public void focusLost(FocusEvent e) {
|
||||||
|
updateExecutablesList(multipleExecutablePathField.getText()
|
||||||
|
.trim());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createSelectExecutable(Composite workArea) {
|
||||||
|
// project specification group
|
||||||
|
|
||||||
|
selectSingleButton = new Button(workArea, SWT.RADIO);
|
||||||
|
selectSingleButton.setText(Messages.ImportExecutablePageOne_SelectExecutable);
|
||||||
|
selectSingleButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
checkControlState();
|
||||||
|
if (selectSingleFile) {
|
||||||
|
multipleExecutablePathField.setText("");
|
||||||
|
noFilesSelected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// project location entry field
|
||||||
|
this.singleExecutablePathField = new Text(workArea, SWT.BORDER);
|
||||||
|
// Set the data name field so Abbot based tests can find it.
|
||||||
|
singleExecutablePathField.setData("name", "singleExecutablePathField");
|
||||||
|
singleExecutablePathField.addModifyListener(new ModifyListener() {
|
||||||
|
|
||||||
|
public void modifyText(ModifyEvent e) {
|
||||||
|
setErrorMessage(null);
|
||||||
|
setPageComplete(false);
|
||||||
|
String path = singleExecutablePathField.getText();
|
||||||
|
if (path.length() > 0) {
|
||||||
|
File testFile = new File(path);
|
||||||
|
if (testFile.exists()) {
|
||||||
|
if (wizard.isExecutableFile(testFile))
|
||||||
|
{
|
||||||
|
executables = new File[1];
|
||||||
|
executables[0] = testFile;
|
||||||
|
setPageComplete(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
setErrorMessage(Messages.ImportExecutablePageOne_NoteAnEXE);
|
||||||
|
} else {
|
||||||
|
setErrorMessage(Messages.ImportExecutablePageOne_NoSuchFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
this.singleExecutablePathField.setLayoutData(new GridData(
|
||||||
|
GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
|
||||||
|
selectSingleBrowseButton = new Button(workArea, SWT.PUSH);
|
||||||
|
selectSingleBrowseButton.setText(Messages.ImportExecutablePageOne_Browse);
|
||||||
|
setButtonLayoutData(selectSingleBrowseButton);
|
||||||
|
|
||||||
|
selectSingleBrowseButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
FileDialog dialog = new FileDialog(getShell(), SWT.NONE);
|
||||||
|
wizard.setupFileDialog(dialog);
|
||||||
|
String res = dialog.open();
|
||||||
|
if (res != null) {
|
||||||
|
singleExecutablePathField.setText(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createSelectionButtons(Composite listComposite) {
|
||||||
|
Composite buttonsComposite = new Composite(listComposite, SWT.NONE);
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
buttonsComposite.setLayout(layout);
|
||||||
|
|
||||||
|
buttonsComposite.setLayoutData(new GridData(
|
||||||
|
GridData.VERTICAL_ALIGN_BEGINNING));
|
||||||
|
|
||||||
|
selectAll = new Button(buttonsComposite, SWT.PUSH);
|
||||||
|
selectAll.setText(Messages.ImportExecutablePageOne_SelectAll);
|
||||||
|
selectAll.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
executablesViewer.setCheckedElements(executables);
|
||||||
|
setPageComplete(executables.length > 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
setButtonLayoutData(selectAll);
|
||||||
|
|
||||||
|
deselectAll = new Button(buttonsComposite, SWT.PUSH);
|
||||||
|
deselectAll.setText(Messages.ImportExecutablePageOne_DeselectAll);
|
||||||
|
deselectAll.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
|
||||||
|
executablesViewer.setCheckedElements(new Object[0]);
|
||||||
|
setPageComplete(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
setButtonLayoutData(deselectAll);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getSelectedExecutables() {
|
||||||
|
String[] selectedExecutablePaths = new String[0];
|
||||||
|
if (selectSingleFile) {
|
||||||
|
if (executables.length > 0) {
|
||||||
|
selectedExecutablePaths = new String[1];
|
||||||
|
selectedExecutablePaths[0] = executables[0].getAbsolutePath();
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Object[] checkedFiles = executablesViewer.getCheckedElements();
|
||||||
|
selectedExecutablePaths = new String[checkedFiles.length];
|
||||||
|
for (int i = 0; i < checkedFiles.length; i++) {
|
||||||
|
selectedExecutablePaths[i] = ((File) checkedFiles[i])
|
||||||
|
.getAbsolutePath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return selectedExecutablePaths;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void handleLocationBrowseButtonPressed() {
|
||||||
|
|
||||||
|
DirectoryDialog dialog = new DirectoryDialog(
|
||||||
|
multipleExecutablePathField.getShell());
|
||||||
|
dialog
|
||||||
|
.setMessage(Messages.ImportExecutablePageOne_SelectADirectory);
|
||||||
|
|
||||||
|
String dirName = multipleExecutablePathField.getText().trim();
|
||||||
|
if (dirName.length() == 0)
|
||||||
|
dirName = previouslyBrowsedDirectory;
|
||||||
|
|
||||||
|
if (dirName.length() > 0) {
|
||||||
|
File path = new File(dirName);
|
||||||
|
if (path.exists())
|
||||||
|
dialog.setFilterPath(new Path(dirName).toOSString());
|
||||||
|
}
|
||||||
|
|
||||||
|
String selectedDirectory = dialog.open();
|
||||||
|
if (selectedDirectory != null) {
|
||||||
|
previouslyBrowsedDirectory = selectedDirectory;
|
||||||
|
multipleExecutablePathField.setText(previouslyBrowsedDirectory);
|
||||||
|
updateExecutablesList(selectedDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void noFilesSelected() {
|
||||||
|
executables = new File[0];
|
||||||
|
executablesViewer.refresh(true);
|
||||||
|
executablesViewer.setCheckedElements(executables);
|
||||||
|
previouslySearchedDirectory = "";
|
||||||
|
setPageComplete(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateExecutablesList(final String path) {
|
||||||
|
// don't search on empty path
|
||||||
|
if (path == null || path.length() == 0)
|
||||||
|
return;
|
||||||
|
// don't repeat the same search - the user might just be tabbing to
|
||||||
|
// traverse
|
||||||
|
if (previouslySearchedDirectory != null
|
||||||
|
&& previouslySearchedDirectory.equals(path))
|
||||||
|
return;
|
||||||
|
previouslySearchedDirectory = path;
|
||||||
|
try {
|
||||||
|
getContainer().run(true, true, new IRunnableWithProgress() {
|
||||||
|
public void run(IProgressMonitor monitor) {
|
||||||
|
|
||||||
|
monitor.beginTask(Messages.ImportExecutablePageOne_Searching, 100);
|
||||||
|
File directory = new File(path);
|
||||||
|
executables = new File[0];
|
||||||
|
monitor.worked(10);
|
||||||
|
if (directory.isDirectory()) {
|
||||||
|
|
||||||
|
Collection files = new ArrayList();
|
||||||
|
if (!collectExecutableFiles(files, directory, monitor))
|
||||||
|
return;
|
||||||
|
Iterator filesIterator = files.iterator();
|
||||||
|
executables = new File[files.size()];
|
||||||
|
int index = 0;
|
||||||
|
monitor.worked(50);
|
||||||
|
monitor.subTask(Messages.ImportExecutablePageOne_ProcessingResults);
|
||||||
|
while (filesIterator.hasNext()) {
|
||||||
|
File file = (File) filesIterator.next();
|
||||||
|
executables[index] = file;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
monitor.worked(60);
|
||||||
|
monitor.done();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// Nothing to do if the user interrupts.
|
||||||
|
}
|
||||||
|
|
||||||
|
executablesViewer.refresh(true);
|
||||||
|
executablesViewer.setCheckedElements(executables);
|
||||||
|
setPageComplete(executables.length > 0);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,423 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Nokia 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:
|
||||||
|
* Nokia - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.ui.importexecutable;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
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.ui.CElementLabelProvider;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfigurationType;
|
||||||
|
import org.eclipse.debug.core.ILaunchManager;
|
||||||
|
import org.eclipse.jface.viewers.ILabelProvider;
|
||||||
|
import org.eclipse.jface.window.Window;
|
||||||
|
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.SelectionAdapter;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Combo;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
|
||||||
|
|
||||||
|
public class ImportExecutablePageTwo extends WizardPage {
|
||||||
|
|
||||||
|
private Combo configTypes;
|
||||||
|
|
||||||
|
private Text configurationName;
|
||||||
|
|
||||||
|
private Label configurationNameLabel;
|
||||||
|
|
||||||
|
private Button createLaunch;
|
||||||
|
|
||||||
|
private Button existingProjectButton;
|
||||||
|
|
||||||
|
private Text existingProjectName;
|
||||||
|
|
||||||
|
private String filterPlatform;
|
||||||
|
|
||||||
|
private boolean isCreateLaunchConfigurationSelected = true;
|
||||||
|
|
||||||
|
private boolean isCreateNewProjectSelected = true;
|
||||||
|
|
||||||
|
private Button newProjectButton;
|
||||||
|
|
||||||
|
private Label newProjectLabel;
|
||||||
|
|
||||||
|
private Text newProjectName;
|
||||||
|
|
||||||
|
private Button searchButton;
|
||||||
|
|
||||||
|
private AbstractImportExecutableWizard wizard;
|
||||||
|
|
||||||
|
public ImportExecutablePageTwo(AbstractImportExecutableWizard wizard) {
|
||||||
|
super("ImportExecutablePageTwo");
|
||||||
|
this.wizard = wizard;
|
||||||
|
setTitle(Messages.ImportExecutablePageTwo_ChooseProject);
|
||||||
|
setDescription(Messages.ImportExecutablePageTwo_ChooseExisting);
|
||||||
|
filterPlatform = "*";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addLaunchConfigTypes() {
|
||||||
|
ILaunchConfigurationType[] configTypeList = DebugPlugin.getDefault()
|
||||||
|
.getLaunchManager().getLaunchConfigurationTypes();
|
||||||
|
for (int i = 0; i < configTypeList.length; i++) {
|
||||||
|
String configTypeName = configTypeList[i].getName();
|
||||||
|
if (configTypeList[i].isPublic()
|
||||||
|
&& configTypeList[i]
|
||||||
|
.supportsMode(ILaunchManager.DEBUG_MODE)) {
|
||||||
|
if (wizard.supportsConfigurationType(configTypeList[i])) {
|
||||||
|
configTypes.add(configTypeName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
configTypes.select(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkExecutableSettings() {
|
||||||
|
if (isCreateNewProjectSelected) {
|
||||||
|
String defaultName = getDefaultProjectName();
|
||||||
|
if (defaultName.length() > 0) {
|
||||||
|
ICProject cProject = CoreModel.getDefault().getCModel()
|
||||||
|
.getCProject(defaultName);
|
||||||
|
if (cProject.exists()) {
|
||||||
|
isCreateNewProjectSelected = false;
|
||||||
|
existingProjectName.setText(defaultName);
|
||||||
|
existingProjectButton.setSelection(true);
|
||||||
|
newProjectButton.setSelection(false);
|
||||||
|
checkExistingProjectName();
|
||||||
|
} else {
|
||||||
|
newProjectName.setText(defaultName);
|
||||||
|
checkNewProjectName();
|
||||||
|
}
|
||||||
|
setLaunchConfigurationName(defaultName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void checkExistingProjectName() {
|
||||||
|
ICProject project = getExistingCProject();
|
||||||
|
setErrorMessage(null);
|
||||||
|
setPageComplete(project != null);
|
||||||
|
if (project == null) {
|
||||||
|
setErrorMessage(Messages.ImportExecutablePageTwo_BadProjectName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void checkLaunchConfigurationName() {
|
||||||
|
String newName = configurationName.getText();
|
||||||
|
setErrorMessage(null);
|
||||||
|
if (isCreateLaunchConfigurationSelected) {
|
||||||
|
setPageComplete(newName.length() > 0);
|
||||||
|
if (newName.length() == 0) {
|
||||||
|
setErrorMessage(Messages.ImportExecutablePageTwo_EnterLaunchConfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void checkNewProjectName() {
|
||||||
|
String newName = newProjectName.getText().trim();
|
||||||
|
setErrorMessage(null);
|
||||||
|
setPageComplete(newName.length() > 0);
|
||||||
|
if (newName.length() == 0) {
|
||||||
|
setErrorMessage(Messages.ImportExecutablePageTwo_EnterProjectName);
|
||||||
|
}
|
||||||
|
ICProject cProject = CoreModel.getDefault().getCModel().getCProject(
|
||||||
|
newName);
|
||||||
|
if (cProject.exists()) {
|
||||||
|
setErrorMessage(Messages.ImportExecutablePageTwo_ProjectAlreadyExists);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ICProject chooseCProject() {
|
||||||
|
try {
|
||||||
|
ICProject[] projects = getCProjects();
|
||||||
|
|
||||||
|
ILabelProvider labelProvider = new CElementLabelProvider();
|
||||||
|
ElementListSelectionDialog dialog = new ElementListSelectionDialog(
|
||||||
|
getShell(), labelProvider);
|
||||||
|
dialog.setTitle("Select a Project"); //$NON-NLS-1$
|
||||||
|
dialog.setMessage("Choose a project for the executable."); //$NON-NLS-1$
|
||||||
|
dialog.setElements(projects);
|
||||||
|
|
||||||
|
ICProject cProject = getExistingCProject();
|
||||||
|
if (cProject != null) {
|
||||||
|
dialog.setInitialSelections(new Object[] { cProject });
|
||||||
|
}
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
return (ICProject) dialog.getFirstResult();
|
||||||
|
}
|
||||||
|
} catch (CModelException e) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
Composite container = new Composite(parent, SWT.NULL);
|
||||||
|
container.setLayout(new GridLayout());
|
||||||
|
//
|
||||||
|
setControl(container);
|
||||||
|
|
||||||
|
final Composite composite = new Composite(container, SWT.NONE);
|
||||||
|
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||||
|
final GridLayout gridLayout = new GridLayout();
|
||||||
|
gridLayout.numColumns = 4;
|
||||||
|
composite.setLayout(gridLayout);
|
||||||
|
|
||||||
|
newProjectButton = new Button(composite, SWT.RADIO);
|
||||||
|
newProjectButton.setText(Messages.ImportExecutablePageTwo_NewProjectName);
|
||||||
|
newProjectButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
isCreateNewProjectSelected = newProjectButton.getSelection();
|
||||||
|
checkNewProjectName();
|
||||||
|
updateControls();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
newProjectName = new Text(composite, SWT.BORDER);
|
||||||
|
final GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
|
||||||
|
gridData.horizontalSpan = 3;
|
||||||
|
newProjectName.setLayoutData(gridData);
|
||||||
|
newProjectName.addModifyListener(new ModifyListener() {
|
||||||
|
|
||||||
|
public void modifyText(ModifyEvent e) {
|
||||||
|
checkNewProjectName();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
new Label(composite, SWT.NONE);
|
||||||
|
|
||||||
|
newProjectLabel = new Label(composite, SWT.NONE);
|
||||||
|
final GridData gridData_1 = new GridData();
|
||||||
|
gridData_1.horizontalSpan = 3;
|
||||||
|
newProjectLabel.setLayoutData(gridData_1);
|
||||||
|
newProjectLabel
|
||||||
|
.setText(Messages.ImportExecutablePageTwo_ProjectLabel);
|
||||||
|
|
||||||
|
final Label dummy2 = new Label(composite, SWT.NONE);
|
||||||
|
final GridData gridData_2 = new GridData();
|
||||||
|
gridData_2.horizontalSpan = 4;
|
||||||
|
dummy2.setLayoutData(gridData_2);
|
||||||
|
|
||||||
|
existingProjectButton = new Button(composite, SWT.RADIO);
|
||||||
|
existingProjectButton.setText(Messages.ImportExecutablePageTwo_ExistingProject);
|
||||||
|
existingProjectButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
isCreateNewProjectSelected = !newProjectButton.getSelection();
|
||||||
|
checkExistingProjectName();
|
||||||
|
updateControls();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
existingProjectName = new Text(composite, SWT.BORDER);
|
||||||
|
final GridData gridData_3 = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
gridData_3.horizontalSpan = 2;
|
||||||
|
existingProjectName.setLayoutData(gridData_3);
|
||||||
|
existingProjectName.addModifyListener(new ModifyListener() {
|
||||||
|
|
||||||
|
public void modifyText(ModifyEvent e) {
|
||||||
|
checkExistingProjectName();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
searchButton = new Button(composite, SWT.NONE);
|
||||||
|
searchButton.setLayoutData(new GridData());
|
||||||
|
searchButton.setText(Messages.ImportExecutablePageTwo_Search);
|
||||||
|
searchButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
ICProject project = chooseCProject();
|
||||||
|
if (project == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String projectName = project.getElementName();
|
||||||
|
existingProjectName.setText(projectName);
|
||||||
|
updateControls();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
newProjectButton.setSelection(true);
|
||||||
|
|
||||||
|
final Label label = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
|
||||||
|
final GridData gridData_4 = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
|
||||||
|
gridData_4.horizontalSpan = 4;
|
||||||
|
label.setLayoutData(gridData_4);
|
||||||
|
|
||||||
|
final Composite composite_1 = new Composite(composite, SWT.NONE);
|
||||||
|
final GridData gridData_5 = new GridData();
|
||||||
|
gridData_5.horizontalSpan = 4;
|
||||||
|
composite_1.setLayoutData(gridData_5);
|
||||||
|
final GridLayout gridLayout_1 = new GridLayout();
|
||||||
|
gridLayout_1.numColumns = 3;
|
||||||
|
composite_1.setLayout(gridLayout_1);
|
||||||
|
|
||||||
|
createLaunch = new Button(composite_1, SWT.CHECK);
|
||||||
|
createLaunch.setText(Messages.ImportExecutablePageTwo_CreateLaunch);
|
||||||
|
createLaunch.setSelection(true);
|
||||||
|
createLaunch.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
isCreateLaunchConfigurationSelected = createLaunch
|
||||||
|
.getSelection();
|
||||||
|
setLaunchConfigurationName(configurationName.getText().trim());
|
||||||
|
checkLaunchConfigurationName();
|
||||||
|
updateControls();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
configTypes = new Combo(composite_1, SWT.READ_ONLY);
|
||||||
|
final GridData gridData_6 = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
|
||||||
|
gridData_6.horizontalSpan = 2;
|
||||||
|
configTypes.setLayoutData(gridData_6);
|
||||||
|
configTypes.addModifyListener(new ModifyListener() {
|
||||||
|
|
||||||
|
public void modifyText(ModifyEvent e) {
|
||||||
|
setLaunchConfigurationName(configurationName.getText().trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
configurationNameLabel = new Label(composite, SWT.NONE);
|
||||||
|
configurationNameLabel.setLayoutData(new GridData(
|
||||||
|
GridData.HORIZONTAL_ALIGN_END));
|
||||||
|
configurationNameLabel.setText(Messages.ImportExecutablePageTwo_Name);
|
||||||
|
|
||||||
|
configurationName = new Text(composite, SWT.BORDER);
|
||||||
|
final GridData gridData_7 = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
|
||||||
|
gridData_7.horizontalSpan = 3;
|
||||||
|
configurationName.setLayoutData(gridData_7);
|
||||||
|
configurationName.addModifyListener(new ModifyListener() {
|
||||||
|
|
||||||
|
public void modifyText(ModifyEvent e) {
|
||||||
|
checkLaunchConfigurationName();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
addLaunchConfigTypes();
|
||||||
|
updateControls();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private ICProject[] getCProjects() throws CModelException {
|
||||||
|
ICProject cproject[] = CoreModel.getDefault().getCModel()
|
||||||
|
.getCProjects();
|
||||||
|
ArrayList list = new ArrayList(cproject.length);
|
||||||
|
|
||||||
|
for (int i = 0; i < cproject.length; i++) {
|
||||||
|
ICDescriptor cdesciptor = null;
|
||||||
|
try {
|
||||||
|
cdesciptor = CCorePlugin.getDefault().getCProjectDescription(
|
||||||
|
(IProject) cproject[i].getResource(), false);
|
||||||
|
if (cdesciptor != null) {
|
||||||
|
String projectPlatform = cdesciptor.getPlatform();
|
||||||
|
if (filterPlatform.equals("*") //$NON-NLS-1$
|
||||||
|
|| projectPlatform.equals("*") //$NON-NLS-1$
|
||||||
|
|| filterPlatform.equalsIgnoreCase(projectPlatform) == true) {
|
||||||
|
list.add(cproject[i]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
list.add(cproject[i]);
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
list.add(cproject[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (ICProject[]) list.toArray(new ICProject[list.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getDefaultProjectName() {
|
||||||
|
String defaultName = new String();
|
||||||
|
String[] executables = wizard.getImportExecutablePage()
|
||||||
|
.getSelectedExecutables();
|
||||||
|
if (executables.length > 0) {
|
||||||
|
String fileName = new File(executables[0]).getName();
|
||||||
|
defaultName = new String(Messages.ImportExecutablePageTwo_DefaultProjectPrefix + fileName);
|
||||||
|
}
|
||||||
|
return defaultName;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ICProject getExistingCProject() {
|
||||||
|
String projectName = existingProjectName.getText().trim();
|
||||||
|
if (projectName.length() < 1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ICProject cProject = CoreModel.getDefault().getCModel().getCProject(
|
||||||
|
projectName);
|
||||||
|
if (!cProject.exists())
|
||||||
|
return null;
|
||||||
|
return cProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExistingProjectName() {
|
||||||
|
return existingProjectName.getText().trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNewConfigurationName() {
|
||||||
|
return configurationName.getText().trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNewProjectName() {
|
||||||
|
return newProjectName.getText().trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ILaunchConfigurationType getSelectedLaunchConfigurationType() {
|
||||||
|
ILaunchConfigurationType result = null;
|
||||||
|
String selectedTypeName = configTypes.getText();
|
||||||
|
ILaunchConfigurationType[] configTypeList = DebugPlugin.getDefault()
|
||||||
|
.getLaunchManager().getLaunchConfigurationTypes();
|
||||||
|
for (int i = 0; i < configTypeList.length; i++) {
|
||||||
|
if (selectedTypeName.equals(configTypeList[i].getName())) {
|
||||||
|
result = configTypeList[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCreateLaunchConfigurationSelected() {
|
||||||
|
return isCreateLaunchConfigurationSelected;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCreateNewProjectSelected() {
|
||||||
|
return isCreateNewProjectSelected;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setLaunchConfigurationName(String defaultName) {
|
||||||
|
configurationName.setText(DebugPlugin.getDefault().getLaunchManager()
|
||||||
|
.generateUniqueLaunchConfigurationNameFrom(defaultName));
|
||||||
|
checkLaunchConfigurationName();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateControls() {
|
||||||
|
isCreateNewProjectSelected = newProjectButton.getSelection();
|
||||||
|
searchButton.setEnabled(!isCreateNewProjectSelected);
|
||||||
|
newProjectName.setEnabled(isCreateNewProjectSelected);
|
||||||
|
existingProjectName.setEnabled(!isCreateNewProjectSelected);
|
||||||
|
newProjectLabel.setEnabled(isCreateNewProjectSelected);
|
||||||
|
|
||||||
|
configTypes.setEnabled(isCreateLaunchConfigurationSelected);
|
||||||
|
configurationName.setEnabled(isCreateLaunchConfigurationSelected);
|
||||||
|
configurationNameLabel.setEnabled(isCreateLaunchConfigurationSelected);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 Nokia 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:
|
||||||
|
* Nokia - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.ui.importexecutable;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.ICDescriptor;
|
||||||
|
import org.eclipse.cdt.core.ICDescriptorOperation;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfigurationType;
|
||||||
|
import org.eclipse.swt.widgets.FileDialog;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference implementation of a wizard that imports executables.
|
||||||
|
* Create your own version to import specific kinds of executables
|
||||||
|
* with product specific messages and launch configuration types.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ImportExecutableWizard extends AbstractImportExecutableWizard {
|
||||||
|
|
||||||
|
public String getPageOneTitle() {
|
||||||
|
return Messages.ImportExecutableWizard_pageOneTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPageOneDescription() {
|
||||||
|
return Messages.ImportExecutableWizard_pageOneDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExecutableListLabel() {
|
||||||
|
return Messages.ImportExecutableWizard_executableListLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setupFileDialog(FileDialog dialog) {
|
||||||
|
dialog.setText(Messages.ImportExecutableWizard_fileDialogTitle);
|
||||||
|
dialog.setFilterExtensions(new String[] { "*.*", "*.exe", "*.dll" });
|
||||||
|
dialog.setFilterNames(new String[] { Messages.ImportExecutableWizard_AllFiles, Messages.ImportExecutableWizard_Applications, Messages.ImportExecutableWizard_LIbaries });
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addBinaryParsers(IProject newProject) throws CoreException {
|
||||||
|
ICDescriptorOperation op = new ICDescriptorOperation() {
|
||||||
|
|
||||||
|
public void execute(ICDescriptor descriptor, IProgressMonitor monitor) throws CoreException {
|
||||||
|
descriptor.remove(CCorePlugin.BINARY_PARSER_UNIQ_ID);
|
||||||
|
descriptor.create(CCorePlugin.BINARY_PARSER_UNIQ_ID, "org.eclipse.cdt.core.PE");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
CCorePlugin.getDefault().getCDescriptorManager().runDescriptorOperation(newProject.getProject(), op, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportsConfigurationType(ILaunchConfigurationType type) {
|
||||||
|
return type.getIdentifier().startsWith("org.eclipse.cdt.launch");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isExecutableFile(File file) {
|
||||||
|
String filename = file.getName().toLowerCase();
|
||||||
|
if (filename.endsWith(".exe") || filename.endsWith(".dll")
|
||||||
|
|| filename.endsWith(".elf"))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,79 @@
|
||||||
|
package org.eclipse.cdt.debug.ui.importexecutable;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
|
public class Messages extends NLS {
|
||||||
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.debug.ui.importexecutable.messages"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private Messages() {
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
// initialize resource bundle
|
||||||
|
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String ImportExecutableWizard_pageOneTitle;
|
||||||
|
|
||||||
|
public static String ImportExecutableWizard_pageOneDescription;
|
||||||
|
|
||||||
|
public static String ImportExecutableWizard_executableListLabel;
|
||||||
|
|
||||||
|
public static String ImportExecutableWizard_fileDialogTitle;
|
||||||
|
|
||||||
|
public static String ImportExecutableWizard_AllFiles;
|
||||||
|
|
||||||
|
public static String ImportExecutableWizard_Applications;
|
||||||
|
|
||||||
|
public static String ImportExecutableWizard_LIbaries;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_SearchDirectory;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_SelectExecutable;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_NoteAnEXE;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_NoSuchFile;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_Browse;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_SelectAll;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_DeselectAll;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_SelectADirectory;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_Searching;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageOne_ProcessingResults;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_ChooseProject;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_ChooseExisting;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_BadProjectName;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_EnterLaunchConfig;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_EnterProjectName;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_ProjectAlreadyExists;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_NewProjectName;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_ProjectLabel;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_ExistingProject;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_Search;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_CreateLaunch;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_Name;
|
||||||
|
|
||||||
|
public static String ImportExecutablePageTwo_DefaultProjectPrefix;
|
||||||
|
|
||||||
|
public static String AbstractImportExecutableWizard_windowTitle;
|
||||||
|
|
||||||
|
public static String AbstractImportExecutableWizard_CreateLaunchConfiguration;
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
ImportExecutableWizard_pageOneTitle=Import C/C++ Executable Files
|
||||||
|
ImportExecutableWizard_pageOneDescription=Select a file or a directory to search for C/C++ executable files.
|
||||||
|
ImportExecutablePageOne_SelectExecutable=Select Executable:
|
||||||
|
ImportExecutablePageOne_SelectADirectory=Select a directory to search for C/C++ executable files.
|
||||||
|
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_DefaultProjectPrefix=Debug
|
||||||
|
ImportExecutableWizard_executableListLabel=C/C++ Executable Files
|
||||||
|
ImportExecutableWizard_fileDialogTitle=Choose an executable file
|
||||||
|
ImportExecutablePageOne_SearchDirectory=Search Directory:
|
||||||
|
ImportExecutablePageTwo_ChooseExisting=Choose an existing project or create a new one.
|
||||||
|
ImportExecutablePageTwo_BadProjectName=Invalid project name.
|
||||||
|
ImportExecutablePageTwo_NewProjectName=New Project Name:
|
||||||
|
ImportExecutablePageTwo_ExistingProject=Existing Project:
|
||||||
|
ImportExecutableWizard_AllFiles=All Files
|
||||||
|
ImportExecutableWizard_Applications=Applications
|
||||||
|
ImportExecutablePageOne_NoSuchFile=That file does not exist.
|
||||||
|
ImportExecutablePageOne_DeselectAll=Deselect All
|
||||||
|
ImportExecutablePageTwo_ChooseProject=Choose Project
|
||||||
|
ImportExecutablePageTwo_ProjectLabel=The new project will let you debug but not build the executable.
|
||||||
|
ImportExecutablePageTwo_CreateLaunch=Create a Launch Configuration:
|
||||||
|
ImportExecutableWizard_LIbaries=Libraries
|
||||||
|
ImportExecutablePageOne_Browse=Browse...
|
||||||
|
ImportExecutablePageTwo_Search=Search...
|
||||||
|
ImportExecutablePageTwo_Name=Name:
|
||||||
|
ImportExecutablePageOne_NoteAnEXE=Not an executable file.
|
||||||
|
ImportExecutablePageOne_SelectAll=Select All
|
||||||
|
ImportExecutablePageOne_Searching=Searching:
|
||||||
|
AbstractImportExecutableWizard_windowTitle=Import Executable
|
||||||
|
AbstractImportExecutableWizard_CreateLaunchConfiguration=Create Launch Configuration
|
Loading…
Add table
Reference in a new issue