--- /dev/null
+package net.sourceforge.phpdt.internal.launching;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame;
+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.IEditorInput;
+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() {
+
+ }
+
+ public String getAbsoluteWorkingDirectory() {
+ return absoluteWorkingDirectory;
+ }
+ /**
+ * @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento()
+ */
+ public String getMemento() throws CoreException {
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeFromMemento(String)
+ */
+ public void initializeFromMemento(String memento) throws CoreException {
+ }
+
+ /**
+ * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(ILaunchConfiguration)
+ */
+ 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) {
+
+ 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;
+ }
+ }
+
+ /**
+ * @see org.eclipse.debug.ui.ISourcePresentation#getEditorId(IEditorInput, Object)
+ */
+ public String getEditorId(IEditorInput input, Object element) {
+ return PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor((String) element).getId();
+ }
+
+ /**
+ * @see org.eclipse.debug.ui.ISourcePresentation#getEditorInput(Object)
+ */
+ public IEditorInput getEditorInput(Object element) {
+
+ String filename = (String) element;
+ 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);
+
+ }
+
+}