X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.debug.ui/src/net/sourceforge/phpdt/internal/debug/ui/PHPSourceLocator.java b/net.sourceforge.phpeclipse.debug.ui/src/net/sourceforge/phpdt/internal/debug/ui/PHPSourceLocator.java index fd31b85..aaba834 100644 --- a/net.sourceforge.phpeclipse.debug.ui/src/net/sourceforge/phpdt/internal/debug/ui/PHPSourceLocator.java +++ b/net.sourceforge.phpeclipse.debug.ui/src/net/sourceforge/phpdt/internal/debug/ui/PHPSourceLocator.java @@ -1,22 +1,39 @@ package net.sourceforge.phpdt.internal.debug.ui; +import java.util.Map; +import java.util.Iterator; + +import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame; import net.sourceforge.phpdt.internal.launching.PHPLaunchConfigurationAttribute; import net.sourceforge.phpeclipse.PHPeclipsePlugin; +import net.sourceforge.phpeclipse.builder.ExternalEditorInput; +import net.sourceforge.phpeclipse.builder.FileStorage; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.model.IPersistableSourceLocator; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.ui.ISourcePresentation; +//import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorInput; +//import org.eclipse.ui.IEditorRegistry; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.FileEditorInput; public class PHPSourceLocator implements IPersistableSourceLocator, ISourcePresentation { private String absoluteWorkingDirectory; + private Map pathMap = null; + private boolean remoteDebug; + private IPath remoteSourcePath; + private String projectName; public PHPSourceLocator() { @@ -43,14 +60,56 @@ public class PHPSourceLocator implements IPersistableSourceLocator, ISourcePrese */ public void initializeDefaults(ILaunchConfiguration configuration) throws CoreException { this.absoluteWorkingDirectory = configuration.getAttribute(PHPLaunchConfigurationAttribute.WORKING_DIRECTORY, ""); + this.remoteDebug=configuration.getAttribute(PHPLaunchConfigurationAttribute.REMOTE_DEBUG,false); + this.pathMap = configuration.getAttribute(PHPLaunchConfigurationAttribute.FILE_MAP, (Map)null); + this.projectName =configuration.getAttribute(PHPLaunchConfigurationAttribute.PROJECT_NAME, ""); + + if (Platform.getOS().equals(Platform.OS_WIN32)) + this.remoteSourcePath= new Path((configuration.getAttribute(PHPLaunchConfigurationAttribute.REMOTE_PATH, "")).toLowerCase()); + else + this.remoteSourcePath= new Path(configuration.getAttribute(PHPLaunchConfigurationAttribute.REMOTE_PATH, "")); + +// system.os.name + } /** * @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(IStackFrame) */ public Object getSourceElement(IStackFrame stackFrame) { - return null; - //return ((PHPStackFrame) stackFrame).getFileName(); + + String fileName=((PHPStackFrame) stackFrame).getFileName(); + String file=""; + + if (remoteDebug) + { + IPath path = new Path(fileName); + if (remoteSourcePath.isPrefixOf(path)) + { + IPath projectPath; + path=path.removeFirstSegments(remoteSourcePath.matchingFirstSegments(path)); + file=path.toString(); + projectPath=(PHPeclipsePlugin.getWorkspace().getRoot().getProject(projectName).getLocation()); + return (projectPath.append(path)).toOSString(); + } + + if (pathMap == null) { + return fileName; + } + Iterator iterator = pathMap.keySet().iterator(); + while (iterator.hasNext()) { + String local = (String) iterator.next(); + IPath remotePath = new Path((String) pathMap.get(local)); + if (remotePath.isPrefixOf(path)) { + path=path.removeFirstSegments(remotePath.matchingFirstSegments(path)); + IPath localPath= new Path(local); + return localPath.append(path).toOSString(); + } + } + return fileName; + } else { + return fileName; + } } /** @@ -66,14 +125,38 @@ public class PHPSourceLocator implements IPersistableSourceLocator, ISourcePrese public IEditorInput getEditorInput(Object element) { String filename = (String) element; - IFile eclipseFile = PHPeclipsePlugin.getWorkspace().getRoot().getFileForLocation(new Path(filename)); - if (eclipseFile == null) { - filename = this.getAbsoluteWorkingDirectory() + "/" + filename; - eclipseFile = PHPeclipsePlugin.getWorkspace().getRoot().getFileForLocation(new Path(filename)); - if (eclipseFile == null) { + IWorkbench workbench = PlatformUI.getWorkbench(); + IWorkbenchWindow window = workbench.getWorkbenchWindows()[0]; + IWorkbenchPage page = window.getActivePage(); + IPath path = new Path(filename); + + + + // If the file exists in the workspace, open it + IFile eclipseFile = PHPeclipsePlugin.getWorkspace().getRoot().getFileForLocation(path); + // IFile eclipseFile = PHPeclipsePlugin.getWorkspace().getRoot().getFileForLocation(new Path(filename)); +// if (eclipseFile == null) { +// filename = this.getAbsoluteWorkingDirectory() + "/" + filename; +// eclipseFile = PHPeclipsePlugin.getWorkspace().getRoot().getFileForLocation(new Path(filename)); +// if (eclipseFile == null) { +// PHPeclipsePlugin.log(IStatus.INFO, "Could not find file \"" + element + "\"."); +// return null; +// } +// } else + if (eclipseFile == null || !eclipseFile.exists()) { + // Otherwise open the stream directly + if (page == null) { PHPeclipsePlugin.log(IStatus.INFO, "Could not find file \"" + element + "\"."); return null; } + FileStorage storage = new FileStorage(path); + storage.setReadOnly(); + // IEditorRegistry registry = workbench.getEditorRegistry(); + // IEditorDescriptor desc = registry.getDefaultEditor(filename); + // if (desc == null) { + // desc = registry.getDefaultEditor(); + // } + return new ExternalEditorInput(storage); } return new FileEditorInput(eclipseFile);