3.x RC1 compatibility
[phpeclipse.git] / net.sourceforge.phpeclipse.debug.ui / src / net / sourceforge / phpdt / internal / debug / ui / PHPSourceLocator.java
index c4e4e3f..aaba834 100644 (file)
@@ -1,21 +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;
-import net.sourceforge.phpdt.internal.launching.PHPLaunchConfigurationAttribute;
 
 public class PHPSourceLocator implements IPersistableSourceLocator, ISourcePresentation {
   private String absoluteWorkingDirectory;
+  private Map pathMap = null;
+       private boolean remoteDebug;
+       private IPath remoteSourcePath;
+       private String projectName;
 
   public PHPSourceLocator() {
 
@@ -42,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;
+    }
   }
 
   /**
@@ -65,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);