cdt/cdt_6_0_x/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/AbsolutePathSourceContainer.java
changeset 37 c2bce6dd59e7
child 57 b9108837a1fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cdt/cdt_6_0_x/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/AbsolutePathSourceContainer.java	Wed Jul 29 14:30:25 2009 -0500
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Nokia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia - Initial implementation (159833)
+ *     Broadcom - http://bugs.eclipse.org/247853
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.core.sourcelookup;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.debug.core.CDebugCorePlugin;
+import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
+import org.eclipse.cdt.internal.core.model.ExternalTranslationUnit;
+import org.eclipse.cdt.internal.core.resources.ResourceLookup;
+import org.eclipse.core.resources.IFile;
+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.Path;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainer;
+import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
+
+public class AbsolutePathSourceContainer extends AbstractSourceContainer {
+	/**
+	 * Unique identifier for the absolute source container type
+	 * (value <code>org.eclipse.cdt.debug.core.containerType.absolutePath</code>).
+	 */
+	public static final String TYPE_ID = CDebugCorePlugin.getUniqueIdentifier() + ".containerType.absolutePath";	 //$NON-NLS-1$
+
+	private Object[] findSourceElementByFile(File file) {
+		IFile[] wfiles = ResourceLookup.findFilesForLocation(new Path(file.getAbsolutePath()));
+		if (wfiles.length > 0) {
+			ResourceLookup.sortFilesByRelevance(wfiles, getProject());
+			return wfiles;
+		}
+
+		try {
+			// Check the canonical path as well to support case insensitive file
+			// systems like Windows.
+			wfiles = ResourceLookup.findFilesForLocation(new Path(file.getCanonicalPath()));
+			if (wfiles.length > 0) {
+				ResourceLookup.sortFilesByRelevance(wfiles, getProject());
+				return wfiles;
+			}
+			
+			// The file is not already in the workspace so try to create an external translation unit for it.
+			ISourceLookupDirector director = getDirector();
+			if (director != null)
+			{
+				ILaunchConfiguration launchConfiguration = director.getLaunchConfiguration();
+				if (launchConfiguration != null)
+				{
+					String projectName = launchConfiguration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
+					if (projectName.length() > 0) {
+						ICProject project = CoreModel.getDefault().getCModel().getCProject(projectName);
+						if (project != null)
+						{
+							IPath path = Path.fromOSString(file.getCanonicalPath());
+							String id = CoreModel.getRegistedContentTypeId(project.getProject(), path.lastSegment());
+							return new ExternalTranslationUnit[] { new ExternalTranslationUnit(project, path, id) };
+						}
+					}
+				}
+			}
+		} catch (IOException e) { // ignore if getCanonicalPath throws
+		} catch (CoreException e) {
+		}
+
+		// If we can't create an ETU then fall back on LocalFileStorage.
+		return new LocalFileStorage[] { new LocalFileStorage(file) };
+	}
+
+	/**
+	 * Find the project associated with the current launch configuration
+	 * @return IProject or null
+	 */
+	private IProject getProject() {
+		ILaunchConfiguration config = getDirector().getLaunchConfiguration();
+		if (config != null) {
+			try {
+				String name = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, "");
+				if (name.length() > 0)
+					return ResourcesPlugin.getWorkspace().getRoot().getProject(name);
+			} catch (CoreException e) {
+				// Don't care carry on search using other heuristics
+			}
+		}
+		return null;
+	}
+
+	public boolean isValidAbsoluteFilePath( String name )
+	{
+		return isValidAbsoluteFilePath( new File(name) );	
+	}
+
+	public boolean isValidAbsoluteFilePath( File file )
+	{
+		return file.isAbsolute() && file.exists() && file.isFile();	
+	}
+	
+	public Object[] findSourceElements( String name ) throws CoreException {
+		if ( name != null ) {
+			File file = new File( name );
+			if ( isValidAbsoluteFilePath(file) ) {
+				return findSourceElementByFile( file );
+			}
+		}
+		return new Object[0];
+	}
+
+	public String getName() {
+		return SourceLookupMessages.getString( "AbsolutePathSourceContainer.0" ); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
+	 */
+	public ISourceContainerType getType() {
+		return getSourceContainerType( TYPE_ID );
+	}
+
+	@Override
+	public int hashCode() {
+		return TYPE_ID.hashCode();
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+	    if (!(obj instanceof AbsolutePathSourceContainer))
+		    return false;
+	    return true;
+    }
+}