Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Prigogin2010-12-10 22:39:43 +0000
committerSergey Prigogin2010-12-10 22:39:43 +0000
commit9aee6c4850fa0e464f50122bdee94527d926eb30 (patch)
tree3bf51d103c90fc2ef2277044bff2949679132710
parent49332004f6240d4cc050aa715028d67033fc5887 (diff)
downloadorg.eclipse.cdt-9aee6c4850fa0e464f50122bdee94527d926eb30.tar.gz
org.eclipse.cdt-9aee6c4850fa0e464f50122bdee94527d926eb30.tar.xz
org.eclipse.cdt-9aee6c4850fa0e464f50122bdee94527d926eb30.zip
Bug 225805 - Sourcelookup handling does not scale to large projects
-rw-r--r--core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ISourceFinder.java2
-rw-r--r--debug/org.eclipse.cdt.debug.core/plugin.properties7
-rw-r--r--debug/org.eclipse.cdt.debug.core/plugin.xml24
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugCorePlugin.java23
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/CProjectSourceContainer.java277
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/IMappingSourceContainer.java29
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/MappingSourceContainer.java6
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/ICDebugInternalConstants.java10
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java7
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CProjectSourceContainerType.java67
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLookupDirector.java51
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourcePathComputerDelegate.java46
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CommonSourceLookupDirector.java6
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainer.java204
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainerType.java64
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.java14
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.properties12
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceFoldersRelativePathSourceContainer.java208
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceFoldersRelativePathSourceContainerType.java65
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java61
-rw-r--r--debug/org.eclipse.cdt.debug.ui/icons/obj16/dir_anchor_obj.gifbin0 -> 936 bytes
-rw-r--r--debug/org.eclipse.cdt.debug.ui/icons/obj16/proj_anchor_obj.gifbin0 -> 963 bytes
-rw-r--r--debug/org.eclipse.cdt.debug.ui/plugin.properties2
-rw-r--r--debug/org.eclipse.cdt.debug.ui/plugin.xml23
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java8
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/IInternalCDebugUIConstants.java15
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties4
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java2
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CProjectSourceContainerBrowser.java64
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CompilationDirectorySourceContainerBrowser.java67
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CompilationDirectorySourceContainerDialog.java231
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/ProgramRelativePathSourceContainerBrowser.java27
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java14
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceFoldersRelativePathSourceContainerBrowser.java64
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java15
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties20
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/TargetProjectSourceContainerDialog.java73
-rw-r--r--doc/org.eclipse.cdt.doc.user/contexts_CDT_DEBUGGER.xml4
-rw-r--r--doc/org.eclipse.cdt.doc.user/reference/cdt_o_ref.htm2
-rw-r--r--doc/org.eclipse.cdt.doc.user/reference/cdt_u_dbg_src.htm16
-rw-r--r--doc/org.eclipse.cdt.doc.user/topics_Reference.xml3
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/CSourceLookup.java11
42 files changed, 1735 insertions, 113 deletions
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ISourceFinder.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ISourceFinder.java
index adf6f11f5e5..34f2fede5bf 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ISourceFinder.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ISourceFinder.java
@@ -29,7 +29,7 @@ import org.eclipse.core.runtime.IPath;
* CDT has:
* <ul>
* <li>A global (common) source locator. Its containers are defined via Window > Preferences > C/C++ > Debug >
- * Common Source Lookup Path
+ * Source Lookup Path
* <li>Launch configuration source locators. The containers of such a locator are defined via the 'Source' tab
* in a CDT launch configuration. The common source containers are automatically added to this locator.
* <li>Launch source locators. Typically, a launch's locator is the one defined in the launch configuration
diff --git a/debug/org.eclipse.cdt.debug.core/plugin.properties b/debug/org.eclipse.cdt.debug.core/plugin.properties
index 8c6f5beeebb..f6c0b57095a 100644
--- a/debug/org.eclipse.cdt.debug.core/plugin.properties
+++ b/debug/org.eclipse.cdt.debug.core/plugin.properties
@@ -13,6 +13,7 @@
# IBM Corporation
# Texas Instruments - added extension point for source container type (279473)
# Ericsson - Added support for Tracepoints (284286)
+# Sergey Prigogin (Google)
###############################################################################
pluginName=C/C++ Development Tools Debug Model
providerName=Eclipse CDT
@@ -36,12 +37,18 @@ cAddressTracepoints.name=C/C++ Address Tracepoints
cFunctionTracepoints.name=C/C++ Function Tracepoints
breakpointProblem.name=C/C++ Breakpoint Problem
+containerName.project=Project
+containerDescription.project=A project in the workspace.
containerName.mapping=Path Mapping
containerDescription.mapping=A path mapping.
containerName.mapEntry=Path Map Entry
containerDescription.mapEntry=An entry in a path mapping.
containerName.directory=File System Directory
containerDescription.directory=A directory in the local file system.
+containerName.compilationDirectory=Compilation Directory
+containerDescription.compilationDirectory=A directory in the local file system used for running the C/C++ compiler.
+containerName.sourceFoldersRelativePath=Project - Path Relative to Source Folders
+containerDescription.sourceFoldersRelativePath=A project where file system directories corresponding to source folders are used for running C/C++ compiler.
containerName.absolutePath=Absolute File Path
containerDescription.absolutePath=An absolute path to a file in the local file system.
containerName.programRelativePath=Program Relative File Path
diff --git a/debug/org.eclipse.cdt.debug.core/plugin.xml b/debug/org.eclipse.cdt.debug.core/plugin.xml
index 63c27129be8..37561872682 100644
--- a/debug/org.eclipse.cdt.debug.core/plugin.xml
+++ b/debug/org.eclipse.cdt.debug.core/plugin.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
-
<extension-point id="CDebugger" name="%CDebugger.name" schema="schema/CDebugger.exsd"/>
<extension-point id="BreakpointActionType" name="%BreakpointAction" schema="schema/BreakpointAction.exsd"/>
<extension-point id="BreakpointExtension" name="%BreakpointAction" schema="schema/BreakpointExtension.exsd"/>
@@ -283,6 +282,11 @@
<extension
point="org.eclipse.debug.core.sourceContainerTypes">
<sourceContainerType
+ class="org.eclipse.cdt.debug.internal.core.sourcelookup.CProjectSourceContainerType"
+ description="%containerDescription.project"
+ id="org.eclipse.cdt.debug.core.containerType.project"
+ name="%containerName.project"/>
+ <sourceContainerType
class="org.eclipse.cdt.debug.internal.core.sourcelookup.MappingSourceContainerType"
description="%containerDescription.mapping"
id="org.eclipse.cdt.debug.core.containerType.mapping"
@@ -298,6 +302,16 @@
id="org.eclipse.cdt.debug.core.containerType.directory"
name="%containerName.directory"/>
<sourceContainerType
+ class="org.eclipse.cdt.debug.internal.core.sourcelookup.CompilationDirectorySourceContainerType"
+ description="%containerDescription.compilationDirectory"
+ id="org.eclipse.cdt.debug.core.containerType.compilationDirectory"
+ name="%containerName.compilationDirectory"/>
+ <sourceContainerType
+ class="org.eclipse.cdt.debug.internal.core.sourcelookup.SourceFoldersRelativePathSourceContainerType"
+ description="%containerDescription.sourceFoldersRelativePath"
+ id="org.eclipse.cdt.debug.core.containerType.sourceFoldersRelativePath"
+ name="%containerName.sourceFoldersRelativePath"/>
+ <sourceContainerType
class="org.eclipse.cdt.debug.internal.core.sourcelookup.AbsolutePathSourceContainerType"
description="%containerDescription.absolutePath"
id="org.eclipse.cdt.debug.core.containerType.absolutePath"
@@ -342,13 +356,17 @@
<sourceContainer
id="org.eclipse.cdt.debug.core.containerType.mapping"/>
<sourceContainer
+ id="org.eclipse.cdt.debug.core.containerType.compilationDirectory"/>
+ <sourceContainer
+ id="org.eclipse.cdt.debug.core.containerType.project"/>
+ <sourceContainer
+ id="org.eclipse.cdt.debug.core.containerType.sourceFoldersRelativePath"/>
+ <sourceContainer
id="org.eclipse.debug.core.containerType.folder"/>
<sourceContainer
id="org.eclipse.debug.core.containerType.workspace"/>
<sourceContainer
id="org.eclipse.debug.core.containerType.directory"/>
- <sourceContainer
- id="org.eclipse.debug.core.containerType.project"/>
</extension>
<extension
point="org.eclipse.core.runtime.adapters">
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugCorePlugin.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugCorePlugin.java
index e8f8ace4d42..b645f121ca4 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugCorePlugin.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugCorePlugin.java
@@ -8,6 +8,7 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Ken Ryall (Nokia) - Support for breakpoint actions (bug 118308)
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.debug.core;
@@ -21,7 +22,10 @@ import org.eclipse.cdt.debug.core.breakpointactions.BreakpointActionManager;
import org.eclipse.cdt.debug.core.command.CCommandAdapterFactory;
import org.eclipse.cdt.debug.core.disassembly.IDisassemblyContextService;
import org.eclipse.cdt.debug.core.model.IRestart;
+import org.eclipse.cdt.debug.core.sourcelookup.AbsolutePathSourceContainer;
+import org.eclipse.cdt.debug.core.sourcelookup.CProjectSourceContainer;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
+import org.eclipse.cdt.debug.core.sourcelookup.ProgramRelativePathSourceContainer;
import org.eclipse.cdt.debug.internal.core.DebugConfiguration;
import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants;
import org.eclipse.cdt.debug.internal.core.ListenerList;
@@ -45,6 +49,7 @@ import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchDelegate;
import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.osgi.framework.BundleContext;
/**
@@ -364,7 +369,12 @@ public class CDebugCorePlugin extends Plugin {
private void initializeCommonSourceLookupDirector() {
if (fCommonSourceLookupDirector == null) {
fCommonSourceLookupDirector = new CommonSourceLookupDirector();
- String newMemento = CDebugCorePlugin.getDefault().getPluginPreferences().getString(ICDebugInternalConstants.PREF_COMMON_SOURCE_CONTAINERS);
+ boolean convertingFromLegacyFormat = false;
+ String newMemento = CDebugCorePlugin.getDefault().getPluginPreferences().getString(ICDebugInternalConstants.PREF_DEFAULT_SOURCE_CONTAINERS);
+ if (newMemento.length() == 0) {
+ newMemento = CDebugCorePlugin.getDefault().getPluginPreferences().getString(ICDebugInternalConstants.PREF_COMMON_SOURCE_CONTAINERS);
+ convertingFromLegacyFormat = true;
+ }
if (newMemento.length() == 0) {
// Add the participant(s). This happens as part of
// initializeFromMemento(), but since we're not calling it, we
@@ -380,6 +390,17 @@ public class CDebugCorePlugin extends Plugin {
log(e.getStatus());
}
}
+ if (convertingFromLegacyFormat) {
+ // Add three source containers that used to be present implicitly.
+ ISourceContainer[] oldContainers = fCommonSourceLookupDirector.getSourceContainers();
+ ISourceContainer[] containers = new ISourceContainer[oldContainers.length + 3];
+ int i = 0;
+ containers[i++] = new AbsolutePathSourceContainer();
+ containers[i++] = new ProgramRelativePathSourceContainer();
+ containers[i++] = new CProjectSourceContainer(null, true);
+ System.arraycopy(oldContainers, 0, containers, i, oldContainers.length);
+ fCommonSourceLookupDirector.setSourceContainers(containers);
+ }
}
}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/CProjectSourceContainer.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/CProjectSourceContainer.java
new file mode 100644
index 00000000000..2e25d78e858
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/CProjectSourceContainer.java
@@ -0,0 +1,277 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * QNX Software Systems - Mikhail Khodjaiants - Bug 80857
+ * Sergey Prigogin (Google)
+ *******************************************************************************/
+package org.eclipse.cdt.debug.core.sourcelookup;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.cdt.debug.core.CDebugCorePlugin;
+import org.eclipse.cdt.debug.internal.core.sourcelookup.InternalSourceLookupMessages;
+import org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer;
+import org.eclipse.debug.core.sourcelookup.containers.FolderSourceContainer;
+
+/**
+ * A project in the workspace. Source is searched for in the root project
+ * folder and all folders within the project recursively. Optionally,
+ * referenced projects may be searched as well.
+ *
+ * Source elements returned from <code>findSourceElements(...)</code> are instances of
+ * <code>IFile</code>.
+ * <p>
+ * Clients may instantiate this class.
+ * </p>
+ * @since 7.1
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class CProjectSourceContainer extends CompositeSourceContainer {
+ /**
+ * Unique identifier for the project source container type
+ * (value <code>org.eclipse.cdt.debug.core.containerType.project</code>).
+ */
+ public static final String TYPE_ID =
+ CDebugCorePlugin.getUniqueIdentifier() + ".containerType.project"; //$NON-NLS-1$
+ private IProject fProject;
+ private boolean fSearchReferencedProjects;
+ private URI fRootURI;
+ private boolean fInitializedRootURI;
+ private IFileStore fRootFile;
+ private IWorkspaceRoot fRoot;
+
+ /**
+ * Constructs a project source container.
+ *
+ * @param project the project to search for source in
+ * @param referenced whether referenced projects should be considered
+ */
+ public CProjectSourceContainer(IProject project, boolean referenced) {
+ fProject = project;
+ fSearchReferencedProjects = referenced;
+ }
+
+ /**
+ * Returns the project this source container references.
+ *
+ * @return the project this source container references
+ */
+ public IProject getProject() {
+ return fProject;
+ }
+
+ /**
+ * Returns the project associated with this source container either directly or through
+ * the current launch configuration.
+ * @return an IProject instance or {@code null}.
+ */
+ private IProject getResolvedProject() {
+ if (fProject != null)
+ return fProject;
+ ISourceLookupDirector director = getDirector();
+ if (director != null) {
+ return SourceUtils.getLaunchConfigurationProject(director);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#findSourceElements(java.lang.String)
+ */
+ public Object[] findSourceElements(String name) throws CoreException {
+ ArrayList<Object> sources = new ArrayList<Object>();
+
+ // An IllegalArgumentException is thrown from the "getFile" method
+ // if the path created by appending the file name to the container
+ // path doesn't conform with Eclipse resource restrictions.
+ // To prevent the interruption of the search procedure we check
+ // if the path is valid before passing it to "getFile".
+ if (validateFile(name)) {
+ IFile file = fProject.getFile(new Path(name));
+ if (file.exists()) {
+ sources.add(file);
+ } else {
+ if (!fInitializedRootURI) {
+ initializeRootURI();
+ }
+ // See bug 82627 - perform case insensitive source lookup
+ if (fRootURI == null) {
+ return EMPTY;
+ }
+ // See bug 98090 - we need to handle relative path names
+ IFileStore target = fRootFile.getFileStore(new Path(name));
+ if (target.fetchInfo().exists()) {
+ // We no longer have to account for bug 95832, and URIs take care
+ // of canonical paths (fix to bug 95679 was removed).
+ IFile[] files = fRoot.findFilesForLocationURI(target.toURI());
+ if (isFindDuplicates() && files.length > 1) {
+ for (IFile f : files) {
+ sources.add(f);
+ }
+ } else if (files.length > 0) {
+ sources.add(files[0]);
+ }
+ }
+ }
+ }
+
+ // Check sub-folders
+ if ((isFindDuplicates() && true) || (sources.isEmpty() && true)) {
+ ISourceContainer[] containers = getSourceContainers();
+ for (int i = 0; i < containers.length; i++) {
+ Object[] objects = containers[i].findSourceElements(name);
+ if (objects == null || objects.length == 0) {
+ continue;
+ }
+ if (isFindDuplicates()) {
+ for (Object object : objects)
+ sources.add(object);
+ } else {
+ sources.add(objects[0]);
+ break;
+ }
+ }
+ }
+
+ if (sources.isEmpty())
+ return EMPTY;
+ return sources.toArray();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#getName()
+ */
+ public String getName() {
+ IProject project = getResolvedProject();
+ return project != null ? project.getName() : InternalSourceLookupMessages.CProjectSourceContainer_0;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ if (obj != null && obj instanceof CProjectSourceContainer) {
+ CProjectSourceContainer loc = (CProjectSourceContainer) obj;
+ return fProject == null ? loc.fProject == null : fProject.equals(loc.fProject);
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ return TYPE_ID.hashCode() * 31 + (fProject == null ? 0 : fProject.hashCode());
+ }
+
+ public boolean isComposite() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.containers.CompositeSourceContainer#createSourceContainers()
+ */
+ protected ISourceContainer[] createSourceContainers() throws CoreException {
+ IProject project = getResolvedProject();
+ if (project != null && project.isOpen()) {
+ if (isSearchReferencedProjects()) {
+ IProject[] projects = SourceUtils.getAllReferencedProjects(project);
+ ISourceContainer[] folders = createFolderSourceContainers(project);
+ List<ISourceContainer> containers = new ArrayList<ISourceContainer>(folders.length + projects.length);
+ for (ISourceContainer folder : folders) {
+ containers.add(folder);
+ }
+ for (IProject ref : projects) {
+ if (ref.exists() && ref.isOpen()) {
+ CProjectSourceContainer container = new CProjectSourceContainer(ref, false);
+ container.init(getDirector());
+ containers.add(container);
+ }
+ }
+ return containers.toArray(new ISourceContainer[containers.size()]);
+ }
+ return createFolderSourceContainers(project);
+ }
+ return new ISourceContainer[0];
+ }
+
+ private ISourceContainer[] createFolderSourceContainers(IProject project) throws CoreException {
+ IResource[] resources = project.members();
+ List<FolderSourceContainer> list = new ArrayList<FolderSourceContainer>(resources.length);
+ for (IResource resource : resources) {
+ if (resource.getType() == IResource.FOLDER) {
+ list.add(new FolderSourceContainer((IFolder) resource, true));
+ }
+ }
+ ISourceContainer[] containers = list.toArray(new ISourceContainer[list.size()]);
+ for (ISourceContainer container : containers) {
+ container.init(getDirector());
+ }
+ return containers;
+ }
+
+ /**
+ * Validates the given string as a path for a file in this container.
+ *
+ * @param name path name
+ */
+ private boolean validateFile(String name) {
+ IProject project = getResolvedProject();
+ if (project == null) {
+ return false;
+ }
+ IPath path = project.getFullPath().append(name);
+ return ResourcesPlugin.getWorkspace().validatePath(path.toOSString(), IResource.FILE).isOK();
+ }
+
+ private void initializeRootURI() {
+ fInitializedRootURI = true;
+ IProject project = getResolvedProject();
+ if (project == null)
+ return;
+ fRootURI = project.getLocationURI();
+ if (fRootURI == null)
+ return;
+ try {
+ fRootFile = EFS.getStore(fRootURI);
+ } catch (CoreException e) {
+ }
+ fRoot = ResourcesPlugin.getWorkspace().getRoot();
+ }
+
+ /**
+ * Returns whether referenced projects are considered.
+ *
+ * @return whether referenced projects are considered
+ */
+ public boolean isSearchReferencedProjects() {
+ return fSearchReferencedProjects;
+ }
+
+ public ISourceContainerType getType() {
+ return getSourceContainerType(TYPE_ID);
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/IMappingSourceContainer.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/IMappingSourceContainer.java
new file mode 100644
index 00000000000..3144f6818a9
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/IMappingSourceContainer.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.core.sourcelookup;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+
+/**
+ * A source container that maps some filesystem locations to other filesystem locations.
+ * @since 7.1
+ */
+public interface IMappingSourceContainer extends ISourceContainer {
+
+ /**
+ * Returns path to the file as it appears in the debug information generated by the C/C++
+ * compiler.
+ * @param sourceName absolute filesystem path to a source or header file.
+ * @return path to the file as it appears in the debug information generated by the compiler.
+ */
+ public IPath getCompilationPath(String sourceName);
+} \ No newline at end of file
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/MappingSourceContainer.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/MappingSourceContainer.java
index 753b843397a..518d1bbd6f9 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/MappingSourceContainer.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/MappingSourceContainer.java
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.debug.core.sourcelookup;
@@ -30,7 +31,7 @@ import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainer;
/**
* The source container for path mappings.
*/
-public class MappingSourceContainer extends AbstractSourceContainer {
+public class MappingSourceContainer extends AbstractSourceContainer implements IMappingSourceContainer {
/**
* Unique identifier for the mapping source container type
* (value <code>org.eclipse.cdt.debug.core.containerType.mapping</code>).
@@ -180,6 +181,9 @@ public class MappingSourceContainer extends AbstractSourceContainer {
fName = name;
}
+ /* (non-Javadoc)
+ * @see IMappingSourceContainer#getCompilationPath(String)
+ */
public IPath getCompilationPath(String sourceName) {
IPath path = new Path(sourceName);
IPath result = null;
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/ICDebugInternalConstants.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/ICDebugInternalConstants.java
index 6e8c8e1f6e3..4e736f482ac 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/ICDebugInternalConstants.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/ICDebugInternalConstants.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2005 QNX Software Systems and others.
+ * Copyright (c) 2000, 2010 QNX Software 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
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.debug.internal.core;
@@ -26,10 +27,17 @@ public class ICDebugInternalConstants {
/**
* String preference for the common source containers.
+ * This preference is superseded by PREF_DEFAULT_SOURCE_CONTAINERS. Kept for backward
+ * compatibility only.
*/
public static final String PREF_COMMON_SOURCE_CONTAINERS = CDebugCorePlugin.getUniqueIdentifier() + ".cDebug.common_source_containers"; //$NON-NLS-1$
/**
+ * String preference for the default source containers.
+ */
+ public static final String PREF_DEFAULT_SOURCE_CONTAINERS = CDebugCorePlugin.getUniqueIdentifier() + ".cDebug.default_source_containers"; //$NON-NLS-1$
+
+ /**
* Boolean preference indicating the on/off state of the Show Full Paths
* toggle action. Actually, as the action appears in multiple views, and the
* state is preserved for each view, the full preference key is the view ID
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
index 16886beacfe..ffc25add58e 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
@@ -85,6 +85,7 @@ import org.eclipse.cdt.debug.core.model.IGlobalVariableDescriptor;
import org.eclipse.cdt.debug.core.model.IModuleRetrieval;
import org.eclipse.cdt.debug.core.model.IPersistableRegisterGroup;
import org.eclipse.cdt.debug.core.model.IRegisterDescriptor;
+import org.eclipse.cdt.debug.core.sourcelookup.CProjectSourceContainer;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
import org.eclipse.cdt.debug.core.sourcelookup.ISourceLookupChangeListener;
import org.eclipse.cdt.debug.internal.core.CBreakpointManager;
@@ -1830,7 +1831,11 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
for (ISourceContainer container : containers) {
String pathToAdd = null;
- if (container instanceof ProjectSourceContainer) {
+ if (container instanceof CProjectSourceContainer) {
+ IProject project = ((CProjectSourceContainer) container).getProject();
+ if (project != null && project.exists())
+ pathToAdd = project.getLocation().toPortableString();
+ } else if (container instanceof ProjectSourceContainer) { // For backward compatibility
IProject project = ((ProjectSourceContainer) container).getProject();
if (project != null && project.exists())
pathToAdd = project.getLocation().toPortableString();
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CProjectSourceContainerType.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CProjectSourceContainerType.java
new file mode 100644
index 00000000000..42b418b03d9
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CProjectSourceContainerType.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * Sergey Prigogin (Google)
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.core.sourcelookup;
+
+import org.eclipse.cdt.debug.core.sourcelookup.CProjectSourceContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * The type for creating/restoring a project source container.
+ */
+public class CProjectSourceContainerType extends AbstractSourceContainerTypeDelegate {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
+ */
+ public String getMemento(ISourceContainer container) throws CoreException {
+ CProjectSourceContainer sourceContainer = (CProjectSourceContainer) container;
+ Document document = newDocument();
+ Element element = document.createElement("project"); //$NON-NLS-1$
+ IProject project = sourceContainer.getProject();
+ if (project != null) {
+ element.setAttribute("name", project.getName()); //$NON-NLS-1$
+ }
+ element.setAttribute("referencedProjects", String.valueOf(sourceContainer.isSearchReferencedProjects())); //$NON-NLS-1$
+ document.appendChild(element);
+ return serializeDocument(document);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#createSourceContainer(java.lang.String)
+ */
+ public ISourceContainer createSourceContainer(String memento) throws CoreException {
+ Node node = parseDocument(memento);
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ Element element = (Element)node;
+ if ("project".equals(element.getNodeName())) { //$NON-NLS-1$
+ String string = element.getAttribute("name"); //$NON-NLS-1$
+ IProject project = null;
+ if (string != null && string.length() > 0) {
+ project = ResourcesPlugin.getWorkspace().getRoot().getProject(string);
+ }
+ String nest = element.getAttribute("referencedProjects"); //$NON-NLS-1$
+ boolean ref = "true".equals(nest); //$NON-NLS-1$
+ return new CProjectSourceContainer(project, ref);
+ }
+ abort(InternalSourceLookupMessages.CProjectSourceContainerType_1, null);
+ }
+ abort(InternalSourceLookupMessages.CProjectSourceContainerType_2, null);
+ return null;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLookupDirector.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLookupDirector.java
index 659b04635a3..113d1c5ab83 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLookupDirector.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLookupDirector.java
@@ -9,6 +9,7 @@
* QNX Software Systems - Initial API and implementation
* Nokia - Added support for AbsoluteSourceContainer(159833)
* Texas Instruments - added extension point for source container type (279473)
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.debug.internal.core.sourcelookup;
@@ -19,8 +20,9 @@ import java.util.Set;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.sourcelookup.AbsolutePathSourceContainer;
+import org.eclipse.cdt.debug.core.sourcelookup.CProjectSourceContainer;
+import org.eclipse.cdt.debug.core.sourcelookup.IMappingSourceContainer;
import org.eclipse.cdt.debug.core.sourcelookup.ProgramRelativePathSourceContainer;
-import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
@@ -58,7 +60,7 @@ public class CSourceLookupDirector extends AbstractSourceLookupDirector {
* @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#initializeParticipants()
*/
public void initializeParticipants() {
- addParticipants(new ISourceLookupParticipant[]{ new CSourceLookupParticipant() });
+ addParticipants(new ISourceLookupParticipant[] { new CSourceLookupParticipant() });
}
/* (non-Javadoc)
@@ -98,7 +100,10 @@ public class CSourceLookupDirector extends AbstractSourceLookupDirector {
}
private boolean contains(ISourceContainer container, IProject project) {
- if (container instanceof ProjectSourceContainer && ((ProjectSourceContainer) container).getProject().equals(project)) {
+ if (container instanceof CProjectSourceContainer && project.equals(((CProjectSourceContainer) container).getProject())) {
+ return true;
+ }
+ if (container instanceof ProjectSourceContainer && project.equals(((CProjectSourceContainer) container).getProject())) {
return true;
}
try {
@@ -115,7 +120,19 @@ public class CSourceLookupDirector extends AbstractSourceLookupDirector {
IPath path = new Path(sourceName);
if (!path.isValidPath(sourceName))
return false;
- if (container instanceof ProjectSourceContainer) {
+ if (container instanceof IMappingSourceContainer) {
+ return ((IMappingSourceContainer) container).getCompilationPath(sourceName) != null;
+ }
+ if (container instanceof CProjectSourceContainer) {
+ IProject project = ((CProjectSourceContainer) container).getProject();
+ if (project != null) {
+ IPath projPath = project.getLocation();
+ if (projPath != null && projPath.isPrefixOf(path)) {
+ IFile file = ((CProjectSourceContainer) container).getProject().getFile(path.removeFirstSegments(projPath.segmentCount()));
+ return file != null && file.exists();
+ }
+ }
+ } else if (container instanceof ProjectSourceContainer) {
IProject project = ((ProjectSourceContainer) container).getProject();
IPath projPath = project.getLocation();
if (projPath != null && projPath.isPrefixOf(path)) {
@@ -135,11 +152,7 @@ public class CSourceLookupDirector extends AbstractSourceLookupDirector {
IPath dirPath = new Path(dir.getAbsolutePath());
if (searchSubfolders || dirPath.segmentCount() + 1 == path.segmentCount())
return dirPath.isPrefixOf(path);
- }
- if (container instanceof MappingSourceContainer) {
- return (((MappingSourceContainer) container).getCompilationPath(sourceName) != null);
- }
- if (container instanceof AbsolutePathSourceContainer) {
+ } else if (container instanceof AbsolutePathSourceContainer) {
return ((AbsolutePathSourceContainer) container).isValidAbsoluteFilePath(sourceName);
} else if (container instanceof ProgramRelativePathSourceContainer) {
try {
@@ -160,8 +173,8 @@ public class CSourceLookupDirector extends AbstractSourceLookupDirector {
}
public IPath getCompilationPath(String sourceName) {
- for (ISourceContainer cont : getSourceContainers()) {
- IPath path = getCompilationPath(cont, sourceName);
+ for (ISourceContainer container : getSourceContainers()) {
+ IPath path = SourceUtils.getCompilationPath(container, sourceName);
if (path != null) {
return path;
}
@@ -169,22 +182,6 @@ public class CSourceLookupDirector extends AbstractSourceLookupDirector {
return null;
}
- private IPath getCompilationPath(ISourceContainer container, String sourceName) {
- if (container instanceof MappingSourceContainer) {
- return ((MappingSourceContainer) container).getCompilationPath(sourceName);
- }
-
- try {
- for (ISourceContainer cont : container.getSourceContainers()) {
- IPath path = getCompilationPath(cont, sourceName);
- if (path != null)
- return path;
- }
- } catch (CoreException e) {
- }
- return null;
- }
-
// >> Bugzilla 279473
private void readSupportedContainerTypes() {
synchronized (fSupportedTypesLock) {
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourcePathComputerDelegate.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourcePathComputerDelegate.java
index 8b16d5ddc47..6662f065389 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourcePathComputerDelegate.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourcePathComputerDelegate.java
@@ -8,25 +8,17 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Nokia - Added support for AbsoluteSourceContainer(159833)
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.debug.internal.core.sourcelookup;
-import java.util.ArrayList;
-import java.util.List;
-
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.debug.core.sourcelookup.AbsolutePathSourceContainer;
-import org.eclipse.cdt.debug.core.sourcelookup.ProgramRelativePathSourceContainer;
-import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
import org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
/**
* Computes the default source lookup path for a launch configuration.
@@ -44,34 +36,16 @@ public class CSourcePathComputerDelegate implements ISourcePathComputerDelegate
* @see org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate#computeSourceContainers(org.eclipse.debug.core.ILaunchConfiguration, org.eclipse.core.runtime.IProgressMonitor)
*/
public ISourceContainer[] computeSourceContainers(ILaunchConfiguration configuration, IProgressMonitor monitor) throws CoreException {
- // First, get all the the containers in the global preferences (but add them last)
ISourceContainer[] common = CDebugCorePlugin.getDefault().getCommonSourceLookupDirector().getSourceContainers();
-
- List<ISourceContainer> containers = new ArrayList<ISourceContainer>(common.length + 3);
+ ISourceContainer[] containers = new ISourceContainer[common.length];
- // Add a container that fetches files that are specified with an absolute path
- containers.add(new AbsolutePathSourceContainer());
-
- // Add a container that fetches files that are specified with a program relative path
- containers.add(new ProgramRelativePathSourceContainer());
-
- // Add a container that looks in the project specified in the configuration
- String projectName = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String) null);
- if (projectName != null && projectName.length() > 0) {
- IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
- if (project.exists()) {
- containers.add(new ProjectSourceContainer(project, true));
- }
+ for (int i = 0; i < common.length; i++) {
+ ISourceContainer container = common[i];
+ ISourceContainerType type = container.getType();
+ // Clone the container to make sure that the original can be safely disposed.
+ container = type.createSourceContainer(type.getMemento(container));
+ containers[i] = container;
}
-
- // Finally, add the common (global) containers
- for (ISourceContainer sc : common) {
- // If the container is a path-mapper, use a copy (why?)
- if (sc.getType().getId().equals(MappingSourceContainer.TYPE_ID))
- sc = ((MappingSourceContainer) sc).copy();
- containers.add(sc);
- }
-
- return containers.toArray(new ISourceContainer[containers.size()]);
+ return containers;
}
}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CommonSourceLookupDirector.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CommonSourceLookupDirector.java
index 1f2f1f00334..28d5fee46fc 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CommonSourceLookupDirector.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CommonSourceLookupDirector.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2005 QNX Software Systems and others.
+ * Copyright (c) 2004, 2010 QNX Software 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
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.debug.internal.core.sourcelookup;
@@ -26,7 +27,8 @@ public class CommonSourceLookupDirector extends CSourceLookupDirector {
public void setSourceContainers(ISourceContainer[] containers) {
try {
super.setSourceContainers(containers);
- CDebugCorePlugin.getDefault().getPluginPreferences().setValue(ICDebugInternalConstants.PREF_COMMON_SOURCE_CONTAINERS, getMemento());
+ CDebugCorePlugin.getDefault().getPluginPreferences().setValue(ICDebugInternalConstants.PREF_DEFAULT_SOURCE_CONTAINERS, getMemento());
+ CDebugCorePlugin.getDefault().getPluginPreferences().setValue(ICDebugInternalConstants.PREF_COMMON_SOURCE_CONTAINERS, ""); //$NON-NLS-1$
CDebugCorePlugin.getDefault().savePluginPreferences();
} catch (CoreException e) {
CDebugCorePlugin.log(e.getStatus());
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainer.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainer.java
new file mode 100644
index 00000000000..dc5d71ac12f
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainer.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.core.sourcelookup;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.cdt.debug.core.CDebugCorePlugin;
+import org.eclipse.cdt.debug.core.sourcelookup.IMappingSourceContainer;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
+import org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer;
+import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
+
+/**
+ * A directory in the local file system that is used for running the C/C++ compiler. This container
+ * is intended to be used when debugging information produced by the C/C++ compiler contains paths
+ * to the source and header files relative to the directory where the compiler is run from.
+ * The assumption is that all files under a compilation directory are compiled relative to
+ * that directory, unless they belong to another compilation directory container that is higher on
+ * the source container list.
+ *
+ * Source elements returned from <code>findSourceElements(...)</code> are instances of
+ * <code>LocalFileStorage</code>.
+ * <p>
+ * Clients may instantiate this class.
+ * </p>
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class CompilationDirectorySourceContainer extends CompositeSourceContainer implements IMappingSourceContainer {
+ /**
+ * Unique identifier for the compilation directory source container type
+ * (value <code>org.eclipse.debug.core.containerType.compilationDirectory</code>).
+ */
+ public static final String TYPE_ID =
+ CDebugCorePlugin.getUniqueIdentifier() + ".containerType.compilationDirectory"; //$NON-NLS-1$
+
+ // Root directory.
+ private File fDirectory;
+ // Whether to each subdirectory of the compilation directory is also the compilation directory
+ // for the files it contains.
+ private boolean fSubfolders;
+
+ /**
+ * Constructs an external folder container for the
+ * directory identified by the given path.
+ *
+ * @param dirPath path to a directory in the local file system
+ * @param subfolders whether folders within the root directory
+ * should be searched for source elements
+ */
+ public CompilationDirectorySourceContainer(IPath dirPath, boolean subfolders) {
+ this(dirPath.toFile(), subfolders);
+ }
+
+ /**
+ * Constructs an external folder container for the
+ * directory identified by the given file.
+ *
+ * @param dir a directory in the local file system
+ * @param subfolders whether folders within the root directory
+ * should be searched for source elements
+ */
+ public CompilationDirectorySourceContainer(File dir, boolean subfolders) {
+ fDirectory = dir;
+ fSubfolders = subfolders;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
+ */
+ public String getName() {
+ return fDirectory.getAbsolutePath();
+ }
+
+ /**
+ * Returns the root directory in the local file system associated
+ * with this source container.
+ *
+ * @return the root directory in the local file system associated
+ * with this source container
+ */
+ public File getDirectory() {
+ return fDirectory;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
+ */
+ public ISourceContainerType getType() {
+ return getSourceContainerType(TYPE_ID);
+ }
+
+ /**
+ * Source elements returned from this method are instances of <code>LocalFileStorage</code>.
+ * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#findSourceElements(String)
+ */
+ public Object[] findSourceElements(String name) throws CoreException {
+ ArrayList<Object> sources = new ArrayList<Object>();
+ File directory = getDirectory();
+ File file = new File(directory, name);
+ if (file.exists() && file.isFile()) {
+ sources.add(new LocalFileStorage(file));
+ }
+
+ // Check sub-folders
+ if ((isFindDuplicates() && fSubfolders) || (sources.isEmpty() && fSubfolders)) {
+ ISourceContainer[] containers = getSourceContainers();
+ for (int i = 0; i < containers.length; i++) {
+ Object[] objects = containers[i].findSourceElements(name);
+ if (objects == null || objects.length == 0) {
+ continue;
+ }
+ if (isFindDuplicates()) {
+ for (int j = 0; j < objects.length; j++)
+ sources.add(objects[j]);
+ } else {
+ sources.add(objects[0]);
+ break;
+ }
+ }
+ }
+
+ if (sources.isEmpty())
+ return EMPTY;
+ return sources.toArray();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#isComposite()
+ */
+ public boolean isComposite() {
+ return fSubfolders;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof CompilationDirectorySourceContainer) {
+ CompilationDirectorySourceContainer container = (CompilationDirectorySourceContainer) obj;
+ return container.getDirectory().equals(getDirectory());
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ return getDirectory().hashCode();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer#createSourceContainers()
+ */
+ protected ISourceContainer[] createSourceContainers() throws CoreException {
+ if (fSubfolders) {
+ String[] files = fDirectory.list();
+ if (files != null) {
+ List<ISourceContainer> dirs = new ArrayList<ISourceContainer>();
+ for (String name : files) {
+ File file = new File(getDirectory(), name);
+ if (file.exists() && file.isDirectory()) {
+ dirs.add(new CompilationDirectorySourceContainer(file, true));
+ }
+ }
+ ISourceContainer[] containers = dirs.toArray(new ISourceContainer[dirs.size()]);
+ for (ISourceContainer container : containers) {
+ container.init(getDirector());
+ }
+ return containers;
+ }
+ }
+ return new ISourceContainer[0];
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.core.sourcelookup.IMappingSourceContainer#getCompilationPath(java.lang.String)
+ */
+ public IPath getCompilationPath(String sourceName) {
+ IPath path = new Path(sourceName);
+ IPath base = new Path(fDirectory.getPath());
+ if (base.isPrefixOf(path)) {
+ if (fSubfolders) {
+ base = path.removeLastSegments(1);
+ }
+ return path.makeRelativeTo(base);
+ }
+ return null;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainerType.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainerType.java
new file mode 100644
index 00000000000..c6c9aedc5cb
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainerType.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.core.sourcelookup;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * See <code>CompilationDirectorySourceContainer</code>.
+ */
+public class CompilationDirectorySourceContainerType extends AbstractSourceContainerTypeDelegate {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
+ */
+ public String getMemento(ISourceContainer container) throws CoreException {
+ CompilationDirectorySourceContainer folder = (CompilationDirectorySourceContainer) container;
+ Document document = newDocument();
+ Element element = document.createElement("directory"); //$NON-NLS-1$
+ element.setAttribute("path", folder.getDirectory().getAbsolutePath()); //$NON-NLS-1$
+ String nest = "false"; //$NON-NLS-1$
+ if (folder.isComposite()) {
+ nest = "true"; //$NON-NLS-1$
+ }
+ element.setAttribute("nest", nest); //$NON-NLS-1$
+ document.appendChild(element);
+ return serializeDocument(document);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#createSourceContainer(java.lang.String)
+ */
+ public ISourceContainer createSourceContainer(String memento) throws CoreException {
+ Node node = parseDocument(memento);
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ Element element = (Element) node;
+ if ("directory".equals(element.getNodeName())) { //$NON-NLS-1$
+ String string = element.getAttribute("path"); //$NON-NLS-1$
+ if (string == null || string.length() == 0) {
+ abort(InternalSourceLookupMessages.CompilationDirectorySourceContainerType_0, null);
+ }
+ String nest = element.getAttribute("nest"); //$NON-NLS-1$
+ boolean nested = "true".equals(nest); //$NON-NLS-1$
+ return new CompilationDirectorySourceContainer(new Path(string), nested);
+ }
+ abort(InternalSourceLookupMessages.CompilationDirectorySourceContainerType_1, null);
+ }
+ abort(InternalSourceLookupMessages.CompilationDirectorySourceContainerType_2, null);
+ return null;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.java
index bbead0ae9bb..00627576d29 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2006 QNX Software Systems and others.
+ * Copyright (c) 2004, 2010 QNX Software 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
@@ -21,6 +21,12 @@ public class InternalSourceLookupMessages extends NLS {
public static String CDirectorySourceContainerType_0;
public static String CDirectorySourceContainerType_1;
public static String CDirectorySourceContainerType_2;
+ public static String CompilationDirectorySourceContainerType_0;
+ public static String CompilationDirectorySourceContainerType_1;
+ public static String CompilationDirectorySourceContainerType_2;
+ public static String CProjectSourceContainer_0;
+ public static String CProjectSourceContainerType_1;
+ public static String CProjectSourceContainerType_2;
public static String CProjectSourceLocation_0;
public static String CProjectSourceLocation_1;
public static String CProjectSourceLocation_2;
@@ -35,8 +41,12 @@ public class InternalSourceLookupMessages extends NLS {
public static String MappingSourceContainerType_0;
public static String MappingSourceContainerType_1;
public static String MappingSourceContainerType_2;
- public static String SourceUtils_0;
public static String ProgramRelativePathSourceContainerType_1;
+ public static String SourceFoldersRelativePathSourceContainer_0;
+ public static String SourceFoldersRelativePathSourceContainer_1;
+ public static String SourceFoldersRelativePathSourceContainerType_1;
+ public static String SourceFoldersRelativePathSourceContainerType_2;
+ public static String SourceUtils_0;
static {
NLS.initializeMessages(InternalSourceLookupMessages.class.getName(), InternalSourceLookupMessages.class);
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.properties b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.properties
index 58aeadb5f8e..6bf8cab6be2 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.properties
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/InternalSourceLookupMessages.properties
@@ -17,6 +17,12 @@ CDirectorySourceLocation_3=Exception occurred initializing source location.
CDirectorySourceContainerType_0=Unable to restore directory source lookup entry - missing path attribute.
CDirectorySourceContainerType_1=Unable to restore directory source lookup entry - expecting directory element.
CDirectorySourceContainerType_2=Unable to restore directory source lookup entry - invalid memento.
+CompilationDirectorySourceContainerType_0=Unable to restore compilation directory source lookup entry - missing path attribute.
+CompilationDirectorySourceContainerType_1=Unable to restore compilation directory source lookup entry - expecting directory element.
+CompilationDirectorySourceContainerType_2=Unable to restore compilation directory source lookup entry - invalid memento.
+CProjectSourceContainer_0=Project
+CProjectSourceContainerType_1=Unable to restore project source lookup entry - expecting project element.
+CProjectSourceContainerType_2=Unable to restore project source lookup entry - invalid memento.
CProjectSourceLocation_0=Unable to create memento for C/C++ project source location {0}.
CProjectSourceLocation_1=Unable to initialize source location - missing project name
CProjectSourceLocation_2=Exception occurred initializing source location.
@@ -31,5 +37,9 @@ MapEntrySourceContainerType_3=Source lookup: unable to restore map entry - inval
MappingSourceContainerType_0=Source lookup: unable to restore map entry - expecting memento attribute.
MappingSourceContainerType_1=Source lookup: unable to restore mapping - expecting mapping element.
MappingSourceContainerType_2=Source lookup: unable to restore mapping - invalid memento.
-SourceUtils_0=Mapping
ProgramRelativePathSourceContainerType_1=Source lookup: unable to restore program relative source container - invalid memento.
+SourceFoldersRelativePathSourceContainer_0=Project - Path Relative to Source Folders.
+SourceFoldersRelativePathSourceContainer_1={0} - Path Relative to Source Folders.
+SourceFoldersRelativePathSourceContainerType_1=Unable to restore source folders relative path source lookup entry - expecting project element.
+SourceFoldersRelativePathSourceContainerType_2=Unable to restore source folders relative path source lookup entry - invalid memento.
+SourceUtils_0=Mapping
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceFoldersRelativePathSourceContainer.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceFoldersRelativePathSourceContainer.java
new file mode 100644
index 00000000000..8cef128fa65
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceFoldersRelativePathSourceContainer.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.core.sourcelookup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.ISourceRoot;
+import org.eclipse.cdt.debug.core.CDebugCorePlugin;
+import org.eclipse.cdt.debug.core.sourcelookup.IMappingSourceContainer;
+import org.eclipse.cdt.internal.core.model.CModelManager;
+import org.eclipse.cdt.internal.core.resources.ResourceLookup;
+import org.eclipse.core.resources.IContainer;
+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.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * A project where source folders are used for running the C/C++ compiler. This container
+ * is intended to be used when debugging information produced by the C/C++ compiler contains paths
+ * to the source and header files relative to the directory where the compiler is run from.
+ * The assumption is that all files under a source folder are compiled relative to that folder.
+ *
+ * Source elements returned from <code>findSourceElements(...)</code> are instances of
+ * <code>LocalFileStorage</code>.
+ * <p>
+ * Clients may instantiate this class.
+ * </p>
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class SourceFoldersRelativePathSourceContainer extends CompositeSourceContainer
+ implements IMappingSourceContainer {
+ /**
+ * Unique identifier for the container type
+ * (value <code>org.eclipse.cdt.debug.core.containerType.sourceFoldersRelativePath</code>).
+ */
+ public static final String TYPE_ID =
+ CDebugCorePlugin.getUniqueIdentifier() + ".containerType.sourceFoldersRelativePath"; //$NON-NLS-1$
+
+ private final IProject fProject;
+ private boolean fSearchReferencedProjects;
+
+ /**
+ * Constructs a source folder relative path source container.
+ *
+ * @param project the project to search for source in. A {@code null} project indicates
+ * the the project from the launch configuration should be used.
+ * @param referenced whether referenced projects should be considered
+ */
+ public SourceFoldersRelativePathSourceContainer(IProject project, boolean referenced) {
+ fProject = project;
+ fSearchReferencedProjects = referenced;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#isComposite()
+ */
+ public boolean isComposite() {
+ return true;
+ }
+
+ /**
+ * Returns whether referenced projects are considered.
+ *
+ * @return whether referenced projects are considered
+ */
+ public boolean isSearchReferencedProjects() {
+ return fSearchReferencedProjects;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#getName()
+ */
+ public String getName() {
+ IProject project = getResolvedProject();
+ return project == null ?
+ InternalSourceLookupMessages.SourceFoldersRelativePathSourceContainer_0 :
+ NLS.bind(InternalSourceLookupMessages.SourceFoldersRelativePathSourceContainer_1, project.getName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
+ */
+ public ISourceContainerType getType() {
+ return getSourceContainerType(TYPE_ID);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ if (obj != null && obj instanceof SourceFoldersRelativePathSourceContainer) {
+ SourceFoldersRelativePathSourceContainer loc = (SourceFoldersRelativePathSourceContainer) obj;
+ return fProject == null ? loc.fProject == null : fProject.equals(loc.fProject);
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ return TYPE_ID.hashCode() * 31 + (fProject == null ? 0 : fProject.hashCode());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.core.sourcelookup.IMappingSourceContainer#getCompilationPath(java.lang.String)
+ */
+ public IPath getCompilationPath(String sourceName) {
+ IProject project = getResolvedProject();
+ if (project == null)
+ return null;
+ ICProject cProject = CModelManager.getDefault().create(project);
+ IPath path = new Path(sourceName);
+ for (IFile file : ResourceLookup.findFilesForLocation(path)) {
+ ISourceRoot root = cProject.findSourceRoot(file);
+ if (root != null) {
+ return path.makeRelativeTo(root.getResource().getLocation());
+ }
+ }
+
+// XXX
+// try {
+// for (ISourceContainer container : getSourceContainers()) {
+// path = SourceUtils.getCompilationPath(container, sourceName);
+// if (path != null) {
+// return path;
+// }
+// }
+// } catch (CoreException e) {
+// }
+ return null;
+ }
+
+ public IProject getProject() {
+ return fProject;
+ }
+
+ /**
+ * Returns the project associated with this source container either directly or through
+ * the current launch configuration.
+ * @return an IProject instance or {@code null}.
+ */
+ private IProject getResolvedProject() {
+ if (fProject != null)
+ return fProject;
+ ISourceLookupDirector director = getDirector();
+ if (director != null) {
+ return SourceUtils.getLaunchConfigurationProject(director);
+ }
+ return null;
+ }
+
+ @Override
+ protected ISourceContainer[] createSourceContainers() throws CoreException {
+ IProject project = getResolvedProject();
+ if (project != null && project.isOpen()) {
+ if (isSearchReferencedProjects()) {
+ IProject[] projects = SourceUtils.getAllReferencedProjects(project);
+ ISourceContainer[] folders = createCompilationDirectoryContainers(project);
+ List<ISourceContainer> containers = new ArrayList<ISourceContainer>(folders.length + projects.length);
+ for (ISourceContainer folder : folders) {
+ containers.add(folder);
+ }
+ for (IProject ref : projects) {
+ if (ref.exists() && ref.isOpen()) {
+ SourceFoldersRelativePathSourceContainer container =
+ new SourceFoldersRelativePathSourceContainer(ref, false);
+ container.init(getDirector());
+ containers.add(container);
+ }
+ }
+ return containers.toArray(new ISourceContainer[containers.size()]);
+ }
+ return createCompilationDirectoryContainers(project);
+ }
+ return new ISourceContainer[0];
+ }
+
+ private ISourceContainer[] createCompilationDirectoryContainers(IProject project) throws CoreException {
+ ICProject cProject = CModelManager.getDefault().create(project);
+ ISourceRoot[] roots = cProject.getAllSourceRoots();
+ List<ISourceContainer> list = new ArrayList<ISourceContainer>(roots.length);
+ for (ISourceRoot root : roots) {
+ IContainer folder = (IContainer) root.getResource();
+ ISourceContainer container = new CompilationDirectorySourceContainer(folder.getLocation(), false);
+ container.init(getDirector());
+ list.add(container);
+ }
+ return list.toArray(new ISourceContainer[list.size()]);
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceFoldersRelativePathSourceContainerType.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceFoldersRelativePathSourceContainerType.java
new file mode 100644
index 00000000000..993cbdd3fec
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceFoldersRelativePathSourceContainerType.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.core.sourcelookup;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * See <code>SourceFoldersRelativePathSourceContainer</code>.
+ */
+public class SourceFoldersRelativePathSourceContainerType extends AbstractSourceContainerTypeDelegate {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
+ */
+ public String getMemento(ISourceContainer container) throws CoreException {
+ SourceFoldersRelativePathSourceContainer sourceContainer = (SourceFoldersRelativePathSourceContainer) container;
+ Document document = newDocument();
+ Element element = document.createElement("project"); //$NON-NLS-1$
+ IProject project = sourceContainer.getProject();
+ if (project != null) {
+ element.setAttribute("name", project.getName()); //$NON-NLS-1$
+ }
+ element.setAttribute("referencedProjects", String.valueOf(sourceContainer.isSearchReferencedProjects())); //$NON-NLS-1$
+ document.appendChild(element);
+ return serializeDocument(document);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#createSourceContainer(java.lang.String)
+ */
+ public ISourceContainer createSourceContainer(String memento) throws CoreException {
+ Node node = parseDocument(memento);
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ Element element = (Element)node;
+ if ("project".equals(element.getNodeName())) { //$NON-NLS-1$
+ String string = element.getAttribute("name"); //$NON-NLS-1$
+ IProject project = null;
+ if (string != null && string.length() > 0) {
+ project = ResourcesPlugin.getWorkspace().getRoot().getProject(string);
+ }
+ String nest = element.getAttribute("referencedProjects"); //$NON-NLS-1$
+ boolean ref = "true".equals(nest); //$NON-NLS-1$
+ return new SourceFoldersRelativePathSourceContainer(project, ref);
+ }
+ abort(InternalSourceLookupMessages.SourceFoldersRelativePathSourceContainerType_1, null);
+ }
+ abort(InternalSourceLookupMessages.SourceFoldersRelativePathSourceContainerType_2, null);
+ return null;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java
index c6e744da565..cb3841d18d8 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2009 QNX Software Systems and others.
+ * Copyright (c) 2000, 2010 QNX Software 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
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.debug.internal.core.sourcelookup;
@@ -14,25 +15,34 @@ import java.io.IOException;
import java.io.StringReader;
import com.ibm.icu.text.MessageFormat;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.Set;
+
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.CDebugUtils;
+import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
+import org.eclipse.cdt.debug.core.sourcelookup.CProjectSourceContainer;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.IDirectorySourceLocation;
+import org.eclipse.cdt.debug.core.sourcelookup.IMappingSourceContainer;
import org.eclipse.cdt.debug.core.sourcelookup.IProjectSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -160,7 +170,7 @@ public class SourceUtils {
int mappingCount = 0;
for (ICSourceLocation location : locations) {
if (location instanceof IProjectSourceLocation) {
- containers.add(new ProjectSourceContainer(((IProjectSourceLocation) location).getProject(), false));
+ containers.add(new CProjectSourceContainer(((IProjectSourceLocation) location).getProject(), false));
} else if (location instanceof IDirectorySourceLocation) {
IDirectorySourceLocation d = (IDirectorySourceLocation) location;
IPath a = d.getAssociation();
@@ -175,4 +185,49 @@ public class SourceUtils {
}
return containers.toArray(new ISourceContainer[containers.size()]);
}
+
+ static IPath getCompilationPath(ISourceContainer container, String sourceName) {
+ if (container instanceof IMappingSourceContainer) {
+ return ((IMappingSourceContainer) container).getCompilationPath(sourceName);
+ }
+
+ try {
+ for (ISourceContainer cont : container.getSourceContainers()) {
+ IPath path = getCompilationPath(cont, sourceName);
+ if (path != null)
+ return path;
+ }
+ } catch (CoreException e) {
+ }
+ return null;
+ }
+
+ public static IProject[] getAllReferencedProjects(IProject project) throws CoreException {
+ Set<IProject> all = new HashSet<IProject>();
+ getAllReferencedProjects(all, project);
+ return all.toArray(new IProject[all.size()]);
+ }
+
+ private static void getAllReferencedProjects(Set<IProject> all, IProject project) throws CoreException {
+ for (IProject ref : project.getReferencedProjects()) {
+ if (!all.contains(ref) && ref.exists() && ref.isOpen()) {
+ all.add(ref);
+ getAllReferencedProjects(all, ref);
+ }
+ }
+ }
+
+ public static IProject getLaunchConfigurationProject(ISourceLookupDirector director) {
+ ILaunchConfiguration config = director.getLaunchConfiguration();
+ if (config != null) {
+ try {
+ String name = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
+ if (name.length() > 0)
+ return ResourcesPlugin.getWorkspace().getRoot().getProject(name);
+ } catch (CoreException e) {
+ CDebugCorePlugin.log(e);
+ }
+ }
+ return null;
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/icons/obj16/dir_anchor_obj.gif b/debug/org.eclipse.cdt.debug.ui/icons/obj16/dir_anchor_obj.gif
new file mode 100644
index 00000000000..90041b13b07
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/icons/obj16/dir_anchor_obj.gif
Binary files differ
diff --git a/debug/org.eclipse.cdt.debug.ui/icons/obj16/proj_anchor_obj.gif b/debug/org.eclipse.cdt.debug.ui/icons/obj16/proj_anchor_obj.gif
new file mode 100644
index 00000000000..047722ec770
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/icons/obj16/proj_anchor_obj.gif
Binary files differ
diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.properties b/debug/org.eclipse.cdt.debug.ui/plugin.properties
index 1ef10596118..cdd86fbea8c 100644
--- a/debug/org.eclipse.cdt.debug.ui/plugin.properties
+++ b/debug/org.eclipse.cdt.debug.ui/plugin.properties
@@ -20,7 +20,7 @@ ExecutablesView.name=Executables
CDebuggerPage.name=C Debugger UI Page
MemoryPreferencePage.name=Memory View
CDebugPreferencePage.name=Debug
-SourcePreferencePage.name=Common Source Lookup Path
+SourcePreferencePage.name=Source Lookup Path
DebuggerTypesPreferencePage.name=Debugger Types
BreakpointActionPage.name=Breakpoint Action UI Page
diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.xml b/debug/org.eclipse.cdt.debug.ui/plugin.xml
index 08513444b9b..632b796debe 100644
--- a/debug/org.eclipse.cdt.debug.ui/plugin.xml
+++ b/debug/org.eclipse.cdt.debug.ui/plugin.xml
@@ -1286,7 +1286,12 @@
<adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
</factory>
<factory
- adaptableType="org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer"
+ adaptableType="org.eclipse.cdt.debug.core.sourcelookup.containers.CProjectSourceContainer"
+ class="org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceContainerAdapterFactory">
+ <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
+ </factory>
+ <factory
+ adaptableType="org.eclipse.cdt.debug.core.sourcelookup.containers.SourceFoldersRelativePathSourceContainer"
class="org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceContainerAdapterFactory">
<adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
</factory>
@@ -1477,6 +1482,11 @@
<extension
point="org.eclipse.debug.ui.sourceContainerPresentations">
<sourceContainerPresentation
+ browserClass="org.eclipse.cdt.debug.internal.ui.sourcelookup.CProjectSourceContainerBrowser"
+ containerTypeID="org.eclipse.cdt.debug.core.containerType.project"
+ icon="icons/obj16/project_obj.gif"
+ id="org.eclipse.cdt.debug.ui.sourceContainerPresentation.project"/>
+ <sourceContainerPresentation
browserClass="org.eclipse.cdt.debug.internal.ui.sourcelookup.NewMappingSourceContainerBrowser"
containerTypeID="org.eclipse.cdt.debug.core.containerType.mapping"
icon="icons/obj16/mapping_obj.gif"
@@ -1491,9 +1501,20 @@
icon="icons/obj16/abspath_obj.gif"
id="org.eclipse.cdt.debug.ui.sourceContainerPresentation.absolutePath"/>
<sourceContainerPresentation
+ browserClass="org.eclipse.cdt.debug.internal.ui.sourcelookup.ProgramRelativePathSourceContainerBrowser"
containerTypeID="org.eclipse.cdt.debug.core.containerType.programRelativePath"
icon="icons/obj16/program_rel_path_obj.gif"
id="org.eclipse.cdt.debug.ui.sourceContainerPresentation.programRelativePath"/>
+ <sourceContainerPresentation
+ browserClass="org.eclipse.cdt.debug.internal.ui.sourcelookup.CompilationDirectorySourceContainerBrowser"
+ containerTypeID="org.eclipse.cdt.debug.core.containerType.compilationDirectory"
+ icon="icons/obj16/dir_anchor_obj.gif"
+ id="org.eclipse.cdt.debug.ui.sourceContainerPresentation.compilationDirectory"/>
+ <sourceContainerPresentation
+ browserClass="org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceFoldersRelativePathSourceContainerBrowser"
+ containerTypeID="org.eclipse.cdt.debug.core.containerType.sourceFoldersRelativePath"
+ icon="icons/obj16/proj_anchor_obj.gif"
+ id="org.eclipse.cdt.debug.ui.sourceContainerPresentation.sourceFoldersRelativePath"/>
</extension>
<extension
point="org.eclipse.core.filebuffers.annotationModelCreation">
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java
index 250e5c46b94..2d98298566c 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2008 QNX Software Systems and others.
+ * Copyright (c) 2000, 2010 QNX Software 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
@@ -8,14 +8,13 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Markus Schorn (Wind River Systems)
+ * Sergey Prigogin (Google)
*******************************************************************************/
-
package org.eclipse.cdt.debug.internal.ui;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
/**
- *
* Help context ids for the C/C++ debug ui.
* <p>
* This interface contains constants only; it is not intended to be implemented
@@ -80,9 +79,10 @@ public interface ICDebugHelpContextIds {
public static final String ADD_DIRECTORY_CONTAINER_DIALOG = PREFIX + "add_directory_container_dialog"; //$NON-NLS-1$
public static final String REGISTER_GROUP = PREFIX + "register_group_dialog"; //$NON-NLS-1$
public static final String CONFIGURE_COLUMNS_DIALOG = PREFIX + "configure_columns_dialog_context"; //$NON-NLS-1$;
+ public static final String COMPILATION_DIRECTORY_SOURCE_CONTAINER_DIALOG = PREFIX + "compilation_directory_source_container_dialog_context"; //$NON-NLS-1$;;
+ public static final String ADD_TARGET_PROJECT_CONTAINER_DIALOG = PREFIX + "target_project_source_container_dialog";//$NON-NLS-1$
// Wizards
public static final String IMPORT_EXECUTABLE_PAGE_ONE = PREFIX + "import_executable_page_one"; //$NON-NLS-1$
public static final String IMPORT_EXECUTABLE_PAGE_TWO = PREFIX + "import_executable_page_two"; //$NON-NLS-1$
-
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/IInternalCDebugUIConstants.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/IInternalCDebugUIConstants.java
index b3a07378b51..780fcf6a689 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/IInternalCDebugUIConstants.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/IInternalCDebugUIConstants.java
@@ -1,12 +1,13 @@
/*******************************************************************************
- * Copyright (c) 2004, 2008 QNX Software Systems and others.
+ * Copyright (c) 2004, 2010 QNX Software 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:
- * QNX Software Systems - Initial API and implementation
+ * QNX Software Systems - Initial API and implementation
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui;
@@ -43,7 +44,7 @@ public interface IInternalCDebugUIConstants {
public static final RGB DEFAULT_DISASSEMBLY_SOURCE_LINE_RGB = Display.getDefault().getSystemColor( SWT.COLOR_DARK_BLUE ).getRGB();
- //Current stack frame instruction pointer
+ // Current stack frame instruction pointer
public static final String DISASM_INSTRUCTION_POINTER = PREFIX + "disassemblyInstructionPointer"; //$NON-NLS-1$
// marker types for instruction pointer annotations - top stack frame, and secondary
@@ -74,10 +75,12 @@ public interface IInternalCDebugUIConstants {
*/
public static final int INTERNAL_ERROR = 150;
- // new disassembly (start)
+ // new disassembly
public static final String DISASM_DISPLAY_MODE_INSTRUCTIONS = "instructions"; //$NON-NLS-1$
public static final String DISASM_DISPLAY_MODE_SOURCE = "source"; //$NON-NLS-1$
-
- // new disassembly (end)
+
+ // wizard images
+ public static final String IMG_ADD_COMP_DIR_WIZ = "IMG_ADD_SRC_DIRECTORY"; //$NON-NLS-1$
+ public static final String IMG_EDIT_COMP_DIR_WIZ = "IMG_EDIT_SRC_DIRECTORY"; //$NON-NLS-1$
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties
index 369e4b42227..f3fe088b32c 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2003, 2009 QNX Software Systems and others.
+# Copyright (c) 2003, 2010 QNX Software 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
@@ -25,7 +25,7 @@ CDebugPreferencePage.13=Value must be an integer between {0} and {1}.
CDebugPreferencePage.14=Binary
CDebugPreferencePage.15=Show source files in binaries
CDebugPreferencePage.16=Character encoding:
-SourcePreferencePage.0=Common S&ource Lookup Path:
+SourcePreferencePage.0=Default S&ource Lookup Path:
DebuggerTypesPage.0=Select All
DebuggerTypesPage.1=Deselect All
DebuggerTypesPage.2=Default
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java
index 529f155fe1a..9ea87e3c139 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java
@@ -41,7 +41,7 @@ import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
/**
- * The "Common Source Lookup Path" preference page.
+ * The "Source Lookup Path" preference page.
*/
public class SourcePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
private SourceContainerViewer fPathViewer;
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CProjectSourceContainerBrowser.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CProjectSourceContainerBrowser.java
new file mode 100644
index 00000000000..0109a48e93d
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CProjectSourceContainerBrowser.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import java.util.ArrayList;
+
+import org.eclipse.cdt.debug.core.sourcelookup.CProjectSourceContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.internal.ui.sourcelookup.BasicContainerContentProvider;
+import org.eclipse.debug.internal.ui.sourcelookup.browsers.ProjectSourceContainerDialog;
+import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+/**
+ * The browser for adding a source folder relative path source container.
+ */
+public class CProjectSourceContainerBrowser extends AbstractSourceContainerBrowser {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.ILaunchConfiguration)
+ */
+ public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
+ if (director.getLaunchConfiguration() == null) {
+ TargetProjectSourceContainerDialog dialog = new TargetProjectSourceContainerDialog(shell);
+ if (dialog.open() == Window.OK) {
+ return new ISourceContainer[] {
+ new CProjectSourceContainer(null, dialog.isAddReferencedProjects()) };
+ }
+ } else {
+ Object input = ResourcesPlugin.getWorkspace().getRoot();
+ IStructuredContentProvider contentProvider=new BasicContainerContentProvider();
+ ILabelProvider labelProvider = new WorkbenchLabelProvider();
+ ProjectSourceContainerDialog dialog =
+ new ProjectSourceContainerDialog(shell, input, contentProvider, labelProvider,
+ SourceLookupUIMessages.projectSelection_chooseLabel);
+ if (dialog.open() == Window.OK) {
+ ArrayList<ISourceContainer> res= new ArrayList<ISourceContainer>();
+ for (Object element : dialog.getResult()) {
+ if (!(element instanceof IProject))
+ continue;
+ res.add(new CProjectSourceContainer((IProject) element,
+ dialog.isAddRequiredProjects()));
+ }
+ return res.toArray(new ISourceContainer[res.size()]);
+ }
+ }
+ return new ISourceContainer[0];
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CompilationDirectorySourceContainerBrowser.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CompilationDirectorySourceContainerBrowser.java
new file mode 100644
index 00000000000..334658bc347
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CompilationDirectorySourceContainerBrowser.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
+import org.eclipse.cdt.debug.internal.core.sourcelookup.CompilationDirectorySourceContainer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * The browser for adding a compilation directory source container.
+ */
+public class CompilationDirectorySourceContainerBrowser extends AbstractSourceContainerBrowser {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.ILaunchConfiguration)
+ */
+ public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
+ ISourceContainer[] containers = new ISourceContainer[1];
+ CompilationDirectorySourceContainerDialog dialog = new CompilationDirectorySourceContainerDialog(shell);
+ if (dialog.open() == Window.OK) {
+ String directory = dialog.getDirectory();
+ if (directory != null) {
+ containers[0] = new CompilationDirectorySourceContainer(new Path(directory), dialog.isCompilationSubfolders());
+ return containers;
+ }
+ }
+ return new ISourceContainer[0];
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser#canEditSourceContainers(org.eclipse.debug.core.sourcelookup.ISourceLookupDirector, org.eclipse.debug.core.sourcelookup.ISourceContainer[])
+ */
+ public boolean canEditSourceContainers(ISourceLookupDirector director, ISourceContainer[] containers) {
+ return containers.length == 1 && CompilationDirectorySourceContainer.TYPE_ID.equals(containers[0].getType().getId());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser#editSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.sourcelookup.ISourceLookupDirector, org.eclipse.debug.core.sourcelookup.ISourceContainer[])
+ */
+ public ISourceContainer[] editSourceContainers(Shell shell, ISourceLookupDirector director, ISourceContainer[] containers) {
+ if (containers.length == 1 && CompilationDirectorySourceContainer.TYPE_ID.equals(containers[0].getType().getId()) ) {
+ CompilationDirectorySourceContainer c = (CompilationDirectorySourceContainer) containers[0];
+ CompilationDirectorySourceContainerDialog dialog =
+ new CompilationDirectorySourceContainerDialog(shell, c.getDirectory().getPath(), c.isComposite());
+ if (dialog.open() == Window.OK) {
+ String directory = dialog.getDirectory();
+ if (directory != null) {
+ containers[0].dispose();
+ return new ISourceContainer[] { new CompilationDirectorySourceContainer(new Path(directory), dialog.isCompilationSubfolders()) };
+ }
+ }
+ }
+ return containers;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CompilationDirectorySourceContainerDialog.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CompilationDirectorySourceContainerDialog.java
new file mode 100644
index 00000000000..050df7b9e67
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CompilationDirectorySourceContainerDialog.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import java.io.File;
+
+import org.eclipse.cdt.debug.internal.ui.CDebugImages;
+import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
+import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
+import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+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.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * The dialog for selecting the external folder for which a compilation directory source container
+ * will be created.
+ */
+public class CompilationDirectorySourceContainerDialog extends TitleAreaDialog {
+ private static final String LAST_PATH_SETTING = "EXT_FOLDER_LAST_PATH_SETTING"; //$NON-NLS-1$
+ private static final String LAST_SUBDIR_SETTING = "EXT_FOLDER_LAST_SUBDIR_SETTING"; //$NON-NLS-1$
+
+ private String fDirectory;
+ private boolean fCompilationSubfolders;
+
+ private Text fDirText;
+ private Button fSubfoldersButton;
+ private boolean fNewContainer;
+
+ /**
+ * Creates a dialog to select a new file system folder.
+ *
+ * @param shell shell
+ */
+ public CompilationDirectorySourceContainerDialog(Shell shell) {
+ this(shell, "", //$NON-NLS-1$
+ CDebugUIPlugin.getDefault().getDialogSettings().getBoolean(LAST_SUBDIR_SETTING));
+ fNewContainer = true;
+ }
+
+ /**
+ * Creates a dialog to edit file system folder.
+ *
+ * @param shell shell
+ * @param directory directory to edit or empty string
+ * @param compilationSubfolders whether the 'Subdirectories are also used for compilation'
+ * checkbox should be checked
+ * @param newContainer
+ */
+ public CompilationDirectorySourceContainerDialog(Shell shell, String directory, boolean compilationSubfolders) {
+ super(shell);
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ fDirectory = directory;
+ fCompilationSubfolders = compilationSubfolders;
+ fNewContainer = false;
+ }
+
+ /**
+ * Returns the result of the dialog.open() operation
+ * @return the dialog.open() result
+ */
+ public String getDirectory() {
+ return fDirectory;
+ }
+
+ /**
+ * Returns whether the 'Subdirectories are also used for compilation' option is selected.
+ *
+ * @return whether the 'Subdirectories are also used for compilation' option is selected
+ */
+ public boolean isCompilationSubfolders() {
+ return fCompilationSubfolders;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createDialogArea(Composite parent) {
+ Image image = fNewContainer ?
+ CDebugImages.get(IInternalCDebugUIConstants.IMG_ADD_COMP_DIR_WIZ) :
+ CDebugImages.get(IInternalCDebugUIConstants.IMG_EDIT_COMP_DIR_WIZ);
+ setTitle(SourceLookupUIMessages.CompilationDirectorySourceContainerDialog_2);
+ setMessage(SourceLookupUIMessages.CompilationDirectorySourceContainerDialog_3);
+ setTitleImage(image);
+ Composite parentComposite = (Composite) super.createDialogArea(parent);
+ Font font = parentComposite.getFont();
+ Composite composite = new Composite(parentComposite, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ composite.setFont(font);
+
+ Composite dirComposite = new Composite(composite, SWT.NONE);
+ layout = new GridLayout(2, false);
+ dirComposite.setLayout(layout);
+ dirComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ dirComposite.setFont(font);
+
+ Label label = new Label(dirComposite, SWT.NONE);
+ label.setText(SourceLookupUIMessages.CompilationDirectorySourceContainerDialog_4);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 2;
+ label.setLayoutData(data);
+ label.setFont(font);
+
+ fDirText = new Text(dirComposite, SWT.BORDER);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 1;
+ fDirText.setLayoutData(data);
+ fDirText.setFont(font);
+ fDirText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ validate();
+ }
+ });
+
+ Button button = new Button(dirComposite, SWT.PUSH);
+ button.setText(SourceLookupUIMessages.CompilationDirectorySourceContainerDialog_5);
+ data = new GridData();
+ int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
+ Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ data.widthHint = Math.max(widthHint, minSize.x);
+ button.setLayoutData(data);
+ button.setFont(JFaceResources.getDialogFont());
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ browse();
+ }
+ });
+
+ fSubfoldersButton = new Button(dirComposite, SWT.CHECK);
+ fSubfoldersButton.setText(SourceLookupUIMessages.CompilationDirectorySourceContainerDialog_6);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.verticalIndent = layout.verticalSpacing; // Extra vertical spacing
+ fSubfoldersButton.setLayoutData(data);
+ fSubfoldersButton.setFont(font);
+
+ return parentComposite;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+ */
+ protected void configureShell(Shell newShell) {
+ String title = null;
+ if (fNewContainer) {
+ title = SourceLookupUIMessages.CompilationDirectorySourceContainerDialog_7;
+ } else {
+ title = SourceLookupUIMessages.CompilationDirectorySourceContainerDialog_8;
+ }
+ newShell.setText(title);
+ super.configureShell(newShell);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createContents(Composite parent) {
+ Control c = super.createContents(parent);
+ fDirText.setText(fDirectory);
+ fSubfoldersButton.setSelection(fCompilationSubfolders);
+ validate();
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(c, ICDebugHelpContextIds.COMPILATION_DIRECTORY_SOURCE_CONTAINER_DIALOG);
+ return c;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ */
+ protected void okPressed() {
+ fDirectory = fDirText.getText().trim();
+ fCompilationSubfolders = fSubfoldersButton.getSelection();
+ CDebugUIPlugin.getDefault().getDialogSettings().put(LAST_PATH_SETTING, fDirectory);
+ CDebugUIPlugin.getDefault().getDialogSettings().put(LAST_SUBDIR_SETTING, fCompilationSubfolders);
+ super.okPressed();
+ }
+
+ private void browse() {
+ String last = fDirText.getText().trim();
+ if (last.length() == 0) {
+ last = CDebugUIPlugin.getDefault().getDialogSettings().get(LAST_PATH_SETTING);
+ }
+ if (last == null) {
+ last = ""; //$NON-NLS-1$
+ }
+ DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SINGLE);
+ dialog.setText(SourceLookupUIMessages.CompilationDirectorySourceContainerDialog_0);
+ dialog.setMessage(SourceLookupUIMessages.CompilationDirectorySourceContainerDialog_1);
+ dialog.setFilterPath(last);
+ String result = dialog.open();
+ if (result == null) {
+ return;
+ }
+ fDirText.setText(result);
+ }
+
+ private void validate() {
+ File file = new File(fDirText.getText().trim());
+ getButton(IDialogConstants.OK_ID).setEnabled(file.isDirectory() && file.exists());
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/ProgramRelativePathSourceContainerBrowser.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/ProgramRelativePathSourceContainerBrowser.java
new file mode 100644
index 00000000000..2e2f86715b0
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/ProgramRelativePathSourceContainerBrowser.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import org.eclipse.cdt.debug.core.sourcelookup.ProgramRelativePathSourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Adds a program-relative path to the source lookup path.
+ */
+public class ProgramRelativePathSourceContainerBrowser extends AbstractSourceContainerBrowser {
+
+ public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
+ return new ISourceContainer[] { new ProgramRelativePathSourceContainer() };
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java
index 510193344bb..6f9d983d0d3 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2006 QNX Software Systems and others.
+ * Copyright (c) 2004, 2010 QNX Software 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
@@ -14,6 +14,7 @@ import java.io.File;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.debug.core.sourcelookup.CProjectSourceContainer;
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer;
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
@@ -45,8 +46,15 @@ public class SourceContainerWorkbenchAdapter implements IWorkbenchAdapter {
if (o instanceof MapEntrySourceContainer) {
return CDebugImages.DESC_OBJS_PATH_MAP_ENTRY;
}
- if (o instanceof ProjectSourceContainer) {
- IProject project = ((ProjectSourceContainer)o).getProject();
+ if (o instanceof CProjectSourceContainer) {
+ IProject project = ((CProjectSourceContainer) o).getProject();
+ if (project != null) {
+ ICProject cProject = CCorePlugin.getDefault().getCoreModel().create(project);
+ if (cProject != null)
+ return getImageDescriptor(cProject);
+ }
+ } else if (o instanceof ProjectSourceContainer) {
+ IProject project = ((ProjectSourceContainer) o).getProject();
ICProject cProject = CCorePlugin.getDefault().getCoreModel().create(project);
if (cProject != null)
return getImageDescriptor(cProject);
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceFoldersRelativePathSourceContainerBrowser.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceFoldersRelativePathSourceContainerBrowser.java
new file mode 100644
index 00000000000..d8f64d4f924
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceFoldersRelativePathSourceContainerBrowser.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import java.util.ArrayList;
+
+import org.eclipse.cdt.debug.internal.core.sourcelookup.SourceFoldersRelativePathSourceContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.internal.ui.sourcelookup.BasicContainerContentProvider;
+import org.eclipse.debug.internal.ui.sourcelookup.browsers.ProjectSourceContainerDialog;
+import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+/**
+ * The browser for adding a source folder relative path source container.
+ */
+public class SourceFoldersRelativePathSourceContainerBrowser extends AbstractSourceContainerBrowser {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.ILaunchConfiguration)
+ */
+ public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
+ if (director.getLaunchConfiguration() == null) {
+ TargetProjectSourceContainerDialog dialog = new TargetProjectSourceContainerDialog(shell);
+ if (dialog.open() == Window.OK) {
+ return new ISourceContainer[] {
+ new SourceFoldersRelativePathSourceContainer(null, dialog.isAddReferencedProjects()) };
+ }
+ } else {
+ Object input = ResourcesPlugin.getWorkspace().getRoot();
+ IStructuredContentProvider contentProvider=new BasicContainerContentProvider();
+ ILabelProvider labelProvider = new WorkbenchLabelProvider();
+ ProjectSourceContainerDialog dialog =
+ new ProjectSourceContainerDialog(shell, input, contentProvider, labelProvider,
+ SourceLookupUIMessages.projectSelection_chooseLabel);
+ if (dialog.open() == Window.OK) {
+ ArrayList<ISourceContainer> res= new ArrayList<ISourceContainer>();
+ for (Object element : dialog.getResult()) {
+ if (!(element instanceof IProject))
+ continue;
+ res.add(new SourceFoldersRelativePathSourceContainer((IProject) element,
+ dialog.isAddRequiredProjects()));
+ }
+ return res.toArray(new ISourceContainer[res.size()]);
+ }
+ }
+ return new ISourceContainer[0];
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java
index 3752fccbe1e..3aa56f17b63 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2005 QNX Software Systems and others.
+ * Copyright (c) 2004, 2010 QNX Software 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
@@ -53,6 +53,19 @@ public class SourceLookupUIMessages extends NLS {
public static String CSourceNotFoundEditor_3;
public static String CSourceNotFoundEditor_4;
public static String CSourceNotFoundEditor_5;
+ public static String CompilationDirectorySourceContainerDialog_0;
+ public static String CompilationDirectorySourceContainerDialog_1;
+ public static String CompilationDirectorySourceContainerDialog_2;
+ public static String CompilationDirectorySourceContainerDialog_3;
+ public static String CompilationDirectorySourceContainerDialog_4;
+ public static String CompilationDirectorySourceContainerDialog_5;
+ public static String CompilationDirectorySourceContainerDialog_6;
+ public static String CompilationDirectorySourceContainerDialog_7;
+ public static String CompilationDirectorySourceContainerDialog_8;
+ public static String TargetProjectSourceContainerDialog_title;
+ public static String TargetProjectSourceContainerDialog_description;
+ public static String TargetProjectSourceContainerDialog_referencedLabel;
+ public static String projectSelection_chooseLabel;
static {
NLS.initializeMessages(SourceLookupUIMessages.class.getName(), SourceLookupUIMessages.class);
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties
index 4764c96bdfc..00293eac067 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2005, 2009 QNX Software Systems and others.
+# Copyright (c) 2005, 2010 QNX Software 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
@@ -7,8 +7,9 @@
#
# Contributors:
# QNX Software Systems - initial API and implementation
-# Ken Ryall (Nokia) - Added support for CSourceNotFoundElement ( 167305 )
-# Ken Ryall (Nokia) - Option to open disassembly view when no source ( 81353 )
+# Ken Ryall (Nokia) - Added support for CSourceNotFoundElement (167305)
+# Ken Ryall (Nokia) - Option to open disassembly view when no source (81353)
+# Sergey Prigogin (Google)
###############################################################################
AddContainerAction_0=&Add...
AddSourceContainerDialog_0=Add Source
@@ -49,3 +50,16 @@ CSourceNotFoundEditor_2=Missing Source File
CSourceNotFoundEditor_3=No source available for \"{0}\" \n
CSourceNotFoundEditor_4=View Disassembly...
CSourceNotFoundEditor_5=Edit Source Lookup Path...
+CompilationDirectorySourceContainerDialog_0=Directory Selection
+CompilationDirectorySourceContainerDialog_1=Choose directory to add:
+CompilationDirectorySourceContainerDialog_2=Compilation directory
+CompilationDirectorySourceContainerDialog_3=Specify directory and whether subdirectories are also used for compilation
+CompilationDirectorySourceContainerDialog_4=&Directory:
+CompilationDirectorySourceContainerDialog_5=&Browse...
+CompilationDirectorySourceContainerDialog_6=&Subdirectories are also used for compilation
+CompilationDirectorySourceContainerDialog_7=Add Compilation Directory
+CompilationDirectorySourceContainerDialog_8=Edit Compilation Directory
+TargetProjectSourceContainerDialog_title=Referenced Projects
+TargetProjectSourceContainerDialog_description=Specify whether referenced projects should be included
+TargetProjectSourceContainerDialog_referencedLabel=Add projects &referenced by the target project
+projectSelection_chooseLabel = Choose &project(s) to add:
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/TargetProjectSourceContainerDialog.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/TargetProjectSourceContainerDialog.java
new file mode 100644
index 00000000000..0478374af20
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/TargetProjectSourceContainerDialog.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Google, Inc 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:
+ * Sergey Prigogin (Google) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * The dialog for configuring a source container for a project associated with the launch target.
+ */
+public class TargetProjectSourceContainerDialog extends SelectionDialog {
+ private boolean fAddReferencedProjects;
+
+ public TargetProjectSourceContainerDialog(Shell parentShell) {
+ super(parentShell);
+ setTitle(SourceLookupUIMessages.TargetProjectSourceContainerDialog_title);
+ setMessage(SourceLookupUIMessages.TargetProjectSourceContainerDialog_description);
+ }
+
+ /**
+ * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createDialogArea(Composite parent) {
+ Font font = parent.getFont();
+
+ // Page group
+ Composite composite = (Composite) super.createDialogArea(parent);
+ initializeDialogUnits(composite);
+
+ createMessageArea(composite);
+
+ final Button addRequired = new Button(composite, SWT.CHECK);
+ addRequired.setText(SourceLookupUIMessages.TargetProjectSourceContainerDialog_referencedLabel);
+ addRequired.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ fAddReferencedProjects = addRequired.getSelection();
+ }
+ });
+ addRequired.setSelection(fAddReferencedProjects);
+ addRequired.setFont(font);
+
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(getShell(),
+ ICDebugHelpContextIds.ADD_TARGET_PROJECT_CONTAINER_DIALOG);
+ applyDialogFont(composite);
+ return composite;
+ }
+
+ /**
+ * Returns whether the user has selected to add referenced projects.
+ *
+ * @return whether the user has selected to add referenced projects
+ */
+ public boolean isAddReferencedProjects() {
+ return fAddReferencedProjects;
+ }
+}
diff --git a/doc/org.eclipse.cdt.doc.user/contexts_CDT_DEBUGGER.xml b/doc/org.eclipse.cdt.doc.user/contexts_CDT_DEBUGGER.xml
index bce86cf35b8..6df58d21f97 100644
--- a/doc/org.eclipse.cdt.doc.user/contexts_CDT_DEBUGGER.xml
+++ b/doc/org.eclipse.cdt.doc.user/contexts_CDT_DEBUGGER.xml
@@ -121,9 +121,9 @@
<topic href="reference/cdt_u_dbg_brkpt_actions.htm" label="Breakpoint Actions preferences"/>
<topic href="tasks/cdt_t_addrmv_brk_action.htm" label="Attaching and Removing Breakpoint Actions"/>
</context>
-<context id="source_preference_page_context" title="Common Source Lookup Path">
+<context id="source_preference_page_context" title="Source Lookup Path">
<description>Manage common source paths.</description>
- <topic href="reference/cdt_u_dbg_src.htm" label="Common Source Lookup Path"/>
+ <topic href="reference/cdt_u_dbg_src.htm" label="Source Lookup Path"/>
</context>
</contexts>
diff --git a/doc/org.eclipse.cdt.doc.user/reference/cdt_o_ref.htm b/doc/org.eclipse.cdt.doc.user/reference/cdt_o_ref.htm
index 92ac6b0c33a..4810022472c 100644
--- a/doc/org.eclipse.cdt.doc.user/reference/cdt_o_ref.htm
+++ b/doc/org.eclipse.cdt.doc.user/reference/cdt_o_ref.htm
@@ -61,7 +61,7 @@
<img src="../images/trans.gif" border="0" width="100" height="1" alt=""><a style="text-decoration:none" href="cdt_u_debug.htm">Debug preferences</a><br>
<img src="../images/trans.gif" border="0" width="150" height="1" alt=""><a style="text-decoration:none" href="cdt_u_dbg_brkpt_actions.htm">Breakpoint Actions</a><br>
- <img src="../images/trans.gif" border="0" width="150" height="1" alt=""><a style="text-decoration:none" href="cdt_u_dbg_src.htm">Common Source Lookup Path</a><br>
+ <img src="../images/trans.gif" border="0" width="150" height="1" alt=""><a style="text-decoration:none" href="cdt_u_dbg_src.htm">Source Lookup Path</a><br>
<img src="../images/trans.gif" border="0" width="150" height="1" alt=""><a style="text-decoration:none" href="cdt_u_gdb_mi.htm">GDB MI preferences</a><br>
<img src="../images/trans.gif" border="0" width="100" height="1" alt=""><a style="text-decoration:none" href="cdt_u_c_editor_gen.htm">Editor preferences</a><br>
diff --git a/doc/org.eclipse.cdt.doc.user/reference/cdt_u_dbg_src.htm b/doc/org.eclipse.cdt.doc.user/reference/cdt_u_dbg_src.htm
index aa41006c714..881240890f2 100644
--- a/doc/org.eclipse.cdt.doc.user/reference/cdt_u_dbg_src.htm
+++ b/doc/org.eclipse.cdt.doc.user/reference/cdt_u_dbg_src.htm
@@ -4,21 +4,21 @@
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Common Source Lookup Path preferences</title>
+ <title>Source Lookup Path preferences</title>
<link rel="stylesheet" type="text/css" href="../help.css">
<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"></script>
</head>
<body>
-<h1>Common Source Lookup Path preference</h1>
+<h1>Source Lookup Path preference</h1>
-<p>Use the <img src="../images/command_link.png" border="0" alt="" > <a class="command-link" href='javascript:executeCommand("org.eclipse.ui.window.preferences(preferencePageId=org.eclipse.cdt.debug.ui.SourcePreferencePage)")'>Common Source Lookup Path</a> preference page to add or remove source containers.</p>
+<p>Use the <img src="../images/command_link.png" border="0" alt="" > <a class="command-link" href='javascript:executeCommand("org.eclipse.ui.window.preferences(preferencePageId=org.eclipse.cdt.debug.ui.SourcePreferencePage)")'>Source Lookup Path</a> preference page to add or remove source containers.</p>
-<p><img src="../images/debug_src_pref.png" alt="Debug Source Code Locations Preferences" ></p>
+<p><img src="../images/debug_src_pref.png" alt="Debug Source Code Locations Preferences" ></p>
<table width="600px" cellpadding="5" cellspacing="0" border="1" >
<caption>
- <strong>Common Source Lookup Path Options </strong>
+ <strong>Default Source Lookup Path Options</strong>
</caption>
<colgroup>
<col width="30%" valign="top" >
@@ -33,9 +33,13 @@
<td width="99" valign="top"><strong>Add...</strong></td>
<td width="475">Opens the <strong>Add Source</strong> dialog to insert a new source container of one of the following types:<br><br>
<ul>
+ <li>Absolute File Path</li>
+ <li>Compilation Directory</li>
<li>File System Directory</li>
<li>Path Mapping</li>
<li>Project</li>
+ <li>Project - Path Relative to Source Folders</li>
+ <li>Program Relative File Path</li>
<li>Workspace</li>
<li>Workspace Folder </li>
</ul>
@@ -43,7 +47,7 @@
</tr>
<tr>
<td valign="top"><strong>Edit...</strong></td>
- <td>Opens the <strong>Edit File System Director</strong>y dialog to modify the currently selected source container.</td>
+ <td>Opens the <strong>Edit File System Directory</strong> dialog to modify the currently selected source container.</td>
</tr>
<tr>
<td valign="top"><strong>Remove</strong></td>
diff --git a/doc/org.eclipse.cdt.doc.user/topics_Reference.xml b/doc/org.eclipse.cdt.doc.user/topics_Reference.xml
index 79c9ae14a5d..0d51605e400 100644
--- a/doc/org.eclipse.cdt.doc.user/topics_Reference.xml
+++ b/doc/org.eclipse.cdt.doc.user/topics_Reference.xml
@@ -72,12 +72,11 @@
<topic label="Debug preferences" href="reference/cdt_u_debug.htm">
<topic label="Breakpoint Actions" href="reference/cdt_u_dbg_brkpt_actions.htm"/>
- <topic label="Common Source Lookup Path" href="reference/cdt_u_dbg_src.htm"/>
+ <topic label="Source Lookup Path" href="reference/cdt_u_dbg_src.htm"/>
<topic label="GDB MI" href="reference/cdt_u_gdb_mi.htm"/>
<topic label="GDB" href="reference/cdt_u_dsfgdb.htm"/>
</topic>
-
<topic label="Editor preferences" href="reference/cdt_u_c_editor_gen.htm">
<topic label="Content Assist" href="reference/cdt_u_c_editor_con_assist.htm" >
<topic label="Advanced" href="reference/cdt_u_c_editor_con_assist_adv.htm"/>
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/CSourceLookup.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/CSourceLookup.java
index 3906e527fc3..26bd188d974 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/CSourceLookup.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/CSourceLookup.java
@@ -17,6 +17,7 @@ import java.util.Hashtable;
import java.util.List;
import java.util.Map;
+import org.eclipse.cdt.debug.core.sourcelookup.CProjectSourceContainer;
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
@@ -79,7 +80,15 @@ public class CSourceLookup extends AbstractDsfService implements ISourceLookup {
ArrayList<String> list = new ArrayList<String>(containers.length);
for (ISourceContainer container : containers) {
- if (container instanceof ProjectSourceContainer) {
+ if (container instanceof CProjectSourceContainer) {
+ IProject project = ((CProjectSourceContainer) container).getProject();
+ if (project != null && project.exists()) {
+ IPath location = project.getLocation();
+ if (location != null) {
+ list.add(location.toPortableString());
+ }
+ }
+ } else if (container instanceof ProjectSourceContainer) { // For backward compatibility
IProject project = ((ProjectSourceContainer) container).getProject();
if (project != null && project.exists()) {
IPath location = project.getLocation();

Back to the top