+++ /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)
- *
- * Return the client side source filename for the server side source file.
- * E.g. when cross debugging, the server side filename could be /var/www/index.php
- * on the client side it is either a Eclipse_PHP_projectname\index.php (when it is a linked file)
- *
- *
- * @param stackFrame The stackframe for which we want the client side source file name
- * @return The filename as it appears on the client side
- */
- public Object getSourceElement (IStackFrame stackFrame) {
- IPath projectPath;
- IPath remotePath;
- IPath path;
- IPath localPath;
- Iterator iterator;
- String fileName;
- String file;
- String local;
-
- fileName = ((PHPStackFrame) stackFrame).getFileName (); // Get the filename as it is submitted by DBG
- file = "";
-
- if (remoteDebug) { // Is it a remote debugging session
- path = new Path (fileName); // Create a IPath object for the server side filename
-
- if (!remoteSourcePath.isEmpty()) {
- if (remoteSourcePath.isPrefixOf (path)) { // Is the server side filename with the remote source path
- path = path.removeFirstSegments (remoteSourcePath.matchingFirstSegments (path)); // Remove the remote source path
- file = path.toString (); // The filename without the remote source path
- projectPath = (PHPeclipsePlugin.getWorkspace().getRoot().getProject(projectName).getLocation()); // Get the absolute project path
-
- return (projectPath.append (path)).toOSString (); // Return the filename as absolute client side path
- }
- }
- else {
- if (pathMap == null) { // Do we have path mapping (e.g. for cross platform debugging)
- return fileName; // No, then return the filename as it given by DBG (the full server side path)
- }
-
- iterator = pathMap.keySet().iterator();
-
- while (iterator.hasNext ()) {
- local = (String) iterator.next (); // Get the local/client side path of the mapping
- remotePath = new Path ((String) pathMap.get (local)); // Get the remote/server side path of the mapping
-
- if (remotePath.isPrefixOf (path)) { // Starts the remote/server side file path with the remote/server side mapping path
- path = path.removeFirstSegments (remotePath.matchingFirstSegments (path)); // Remove the absolute path from filename
- localPath = new Path (local); // Create new IPath object for the local/client side path
- path = localPath.append (path); // Prepend the project relative path to filename
-
- projectPath = (PHPeclipsePlugin.getWorkspace().getRoot().getProject(projectName).getLocation()); // Get the absolute project path
-
- return (projectPath.append (path)).toOSString (); // Return the filename as absolute client side path
- }
- }
- }
-
- if (pathMap == null) { // Do we have path mapping (e.g. for cross platform debugging)
- return fileName; // No, then return the filename as it given by DBG (the full server side path)
- }
-
- iterator = pathMap.keySet().iterator();
-
- while (iterator.hasNext ()) {
- local = (String) iterator.next (); // Get the local/client side path of the mapping
- remotePath = new Path ((String) pathMap.get (local)); // Get the remote/server side path of the mapping
-
- if (remotePath.isPrefixOf (path)) { // Starts the remote/server side file path with the remote/server side mapping path
- path = path.removeFirstSegments (remotePath.matchingFirstSegments (path)); // Remove the absolute path from filename
- localPath = new Path (local); // Create new IPath object for the local/client side path
-
- return localPath.append (path).toOSString (); // Append the remote filename to the client side path (So we return the absolute path
- // to the source file as the client side sees it.
- }
- }
-
- 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)
- *
- * @param element The absolute local/client side file path
- */
- public IEditorInput getEditorInput (Object element) {
- String filename;
- IWorkbench workbench;
- IWorkbenchWindow window;
- IWorkbenchPage page;
- IPath path;
- IFile eclipseFile;
-
- filename = (String) element;
- workbench = PlatformUI.getWorkbench ();
- window = workbench.getWorkbenchWindows ()[0];
- page = window.getActivePage ();
- path = new Path (filename); // Create an IPath object of the absolute local/client side file name
-
- // If the file exists in the workspace, open it
- 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);
- }
-}