Package org.eclipse.php.internal.debug.ui.console

Source Code of org.eclipse.php.internal.debug.ui.console.PHPConsoleSourceModuleLookup

/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*     Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.debug.ui.console;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.*;
import org.eclipse.dltk.core.environment.EnvironmentPathUtils;
import org.eclipse.dltk.core.search.IDLTKSearchScope;
import org.eclipse.dltk.core.search.SearchEngine;
import org.eclipse.dltk.internal.core.Model;
import org.eclipse.dltk.internal.core.ModelManager;
import org.eclipse.dltk.internal.core.ProjectFragment;
import org.eclipse.dltk.internal.core.util.Util;
import org.eclipse.php.internal.ui.PHPUiPlugin;
import org.eclipse.php.internal.ui.editor.PHPStructuredEditor;
import org.eclipse.php.internal.ui.editor.input.NonExistingPHPFileEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;

public class PHPConsoleSourceModuleLookup {

  private final IDLTKSearchScope scope;
  private final Model model;

  public PHPConsoleSourceModuleLookup(IDLTKLanguageToolkit toolkit) {
    this.model = ModelManager.getModelManager().getModel();
    scope = SearchEngine.createWorkspaceScope(toolkit);
  }

  private IProject[] getAllProjects() {
    return ResourcesPlugin.getWorkspace().getRoot().getProjects();
  }

  private boolean checkScope(IProject project, IPath[] scopeProjectsAndZips) {
    final IPath location = project.getFullPath();
    for (int j = 0; j < scopeProjectsAndZips.length; j++) {
      if (scopeProjectsAndZips[j].equals(location)) {
        return true;
      }
    }
    return false;
  }

  public ISourceModule findSourceModuleByLocalPath(final IPath path) {
    NonExistingPHPFileEditorInput nonExistingEditorInput = NonExistingPHPFileEditorInput
        .findEditorInput(path);
    if (nonExistingEditorInput != null) {
      IWorkbenchPage activePage = PHPUiPlugin.getActivePage();
      if (activePage != null) {
        IEditorPart editor = activePage
            .findEditor(nonExistingEditorInput);
        if (editor instanceof PHPStructuredEditor) {
          return (ISourceModule) ((PHPStructuredEditor) editor)
              .getModelElement();
        }
      }
      return null;
    }

    final boolean isFullPath = EnvironmentPathUtils.isFull(path);
    final IProject[] projects = getAllProjects();
    final IPath[] enclosingProjectsAndZips = scope
        .enclosingProjectsAndZips();
    for (int i = 0, max = projects.length; i < max; i++) {
      try {
        final IProject project = projects[i];
        if (!checkScope(project, enclosingProjectsAndZips)) {
          continue;
        }
        if (!project.isAccessible()
            || !DLTKLanguageManager.hasScriptNature(project))
          continue;

        IScriptProject scriptProject = model.getScriptProject(project);
        final ISourceModule module = findInProject(scriptProject, path,
            isFullPath);
        if (module != null) {
          return module.exists() ? module : null;
        }

      } catch (CoreException e) {
        // CoreException from hasNature - should not happen since we
        // check that the project is accessible
        // ModelException from getProjectFragments - a problem occurred
        // while accessing project: nothing we can do, ignore
      }
    }
    return null;
  }

  private ISourceModule findInProject(IScriptProject scriptProject,
      IPath path, boolean isFullPath) throws ModelException {
    IProjectFragment[] roots = scriptProject.getProjectFragments();
    for (int j = 0, rootCount = roots.length; j < rootCount; j++) {
      final ProjectFragment root = (ProjectFragment) roots[j];
      IPath rootPath = root.getPath();
      if (!isFullPath) {
        rootPath = EnvironmentPathUtils.getLocalPath(rootPath);
      }
      if (rootPath.isPrefixOf(path)
          && !Util.isExcluded(path, root.fullInclusionPatternChars(),
              root.fullExclusionPatternChars(), false)) {
        IPath localPath = path.setDevice(null).removeFirstSegments(
            rootPath.segmentCount());
        if (localPath.segmentCount() >= 1) {
          final IScriptFolder folder;
          if (localPath.segmentCount() > 1) {
            folder = root.getScriptFolder(localPath
                .removeLastSegments(1));
          } else {
            folder = root.getScriptFolder(""); //$NON-NLS-1$
          }
          return folder.getSourceModule(localPath.lastSegment());
        }
      }
    }
    return null;
  }

}
TOP

Related Classes of org.eclipse.php.internal.debug.ui.console.PHPConsoleSourceModuleLookup

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.