blob: 83ddb39804287d248fba0e240678fe8fa626ab1e [file] [log] [blame]
package org.eclipse.dltk.launching.sourcelookup;
import java.net.URI;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant;
import org.eclipse.dltk.debug.core.DLTKDebugConstants;
import org.eclipse.dltk.internal.core.DefaultWorkingCopyOwner;
import org.eclipse.dltk.internal.core.ScriptProject;
import org.eclipse.dltk.internal.debug.core.model.ScriptStackFrame;
import org.eclipse.dltk.internal.launching.LaunchConfigurationUtils;
public class ScriptSourceLookupParticipant
extends AbstractSourceLookupParticipant {
@Override
public String getSourceName(Object object) throws CoreException {
if (object instanceof ScriptStackFrame) {
final ScriptStackFrame frame = (ScriptStackFrame) object;
final URI uri = frame.getSourceURI();
if (DLTKDebugConstants.UNKNOWN_SCHEME
.equalsIgnoreCase(uri.getScheme())) {
return null;
}
String path = uri.getPath();
if (path.length() == 0) {
return null;
}
// if (Platform.getOS().equals(Platform.OS_WIN32)) {
// path = path.substring(1);
// }
String root = getProjectRoot();
// strip off the project root
if (path.startsWith(root) && path.charAt(root.length()) == '/') {
return path.substring(root.length() + 1);
}
IFile[] files = getWorkspaceRoot().findFilesForLocationURI(uri);
IProject project = LaunchConfigurationUtils
.getProject(getDirector().getLaunchConfiguration());
for (int i = 0; i < files.length; i++) {
IFile file = files[i];
if (file.exists()) {
if (file.getProject().equals(project)) {
return file.getProjectRelativePath().toString();
}
}
}
return path;
}
return null;
}
protected String getProjectRoot() throws CoreException {
IProject project = LaunchConfigurationUtils
.getProject(getDirector().getLaunchConfiguration());
return project.getLocationURI().getPath();
}
@Override
public Object[] findSourceElements(Object object) throws CoreException {
final Object[] elements = super.findSourceElements(object);
if (elements != null && elements.length > 0) {
return elements;
}
if (object instanceof ScriptStackFrame) {
ScriptStackFrame frame = (ScriptStackFrame) object;
final URI uri = frame.getSourceURI();
if (DLTKDebugConstants.UNKNOWN_SCHEME
.equalsIgnoreCase(uri.getScheme())) {
return null;
}
final String path = uri.getPath();
if (path == null || path.length() == 0) {
return null;
}
final Path pathObj = new Path(path);
if (pathObj.isEmpty()) {
return null;
}
ILaunchConfiguration launchConfiguration = this.getDirector()
.getLaunchConfiguration();
IProject project = LaunchConfigurationUtils
.getProject(launchConfiguration);
final ProjectSourceLookup lookup = new ProjectSourceLookup(project);
final IProjectLookupResult result = lookup.find(pathObj);
if (result != null) {
return result.toArray();
}
return new Object[] { new DBGPSourceModule(
(ScriptProject) lookup.getScriptProject(), path,
DefaultWorkingCopyOwner.PRIMARY, frame) };
}
return null;
}
private static IWorkspaceRoot getWorkspaceRoot() {
return ResourcesPlugin.getWorkspace().getRoot();
}
}