/*******************************************************************************
* This file is part of the Symfony eclipse plugin.
*
* (c) Robert Gruendler <r.gruendler@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
******************************************************************************/
package com.dubture.symfony.ui.editor;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.index2.search.ISearchEngine.MatchRule;
import org.eclipse.dltk.core.search.IDLTKSearchScope;
import org.eclipse.dltk.core.search.SearchEngine;
import org.eclipse.dltk.internal.core.SourceMethod;
import org.eclipse.dltk.internal.core.SourceType;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.php.internal.ui.editor.PHPStructuredEditor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import com.dubture.symfony.core.log.Logger;
import com.dubture.symfony.core.model.SymfonyModelAccess;
import com.dubture.symfony.index.model.Route;
@SuppressWarnings("restriction")
public class EditorUtility {
private Route route = null;
private IScriptProject project;
private SourceMethod sourceMethod;
public EditorUtility() {
}
public Route getRouteAtCursor() {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
IEditorPart part = page.getActiveEditor();
if (part instanceof PHPStructuredEditor) {
PHPStructuredEditor editor = (PHPStructuredEditor) part;
ISourceModule source = org.eclipse.dltk.internal.ui.editor.EditorUtility.getEditorInputModelElement(editor, false);
project = source.getScriptProject();
ISelectionProvider provider = editor.getSelectionProvider();
ISelection selection = provider.getSelection();
if (selection instanceof ITextSelection) {
ITextSelection textSelection = (ITextSelection) selection;
int offset = textSelection.getOffset();
try {
IModelElement element = source.getElementAt(offset);
if (element != null) {
sourceMethod = getMethod(element);
if (sourceMethod != null && sourceMethod.getParent() != null) {
SourceType sourceType = (SourceType) sourceMethod.getParent();
String fqn = sourceType.getFullyQualifiedName("\\");
IDLTKSearchScope scope = SearchEngine.createSearchScope(source);
SymfonyModelAccess model = SymfonyModelAccess.getDefault();
IType[] types = model.findTypes(fqn, MatchRule.EXACT, 0, 0, scope, null);
if (types.length == 1) {
IType type = types[0];
IMethod method = type.getMethod(sourceMethod.getElementName());
route = model.getRoute(type, method);
}
}
}
} catch (ModelException e) {
Logger.logException(e);
}
}
}
}
});
return route;
}
public SourceMethod getMethod(IModelElement element) {
if (element instanceof SourceMethod)
return (SourceMethod) element;
while(element.getParent() != null) {
if (element.getParent() instanceof SourceMethod)
return (SourceMethod) element.getParent();
element = element.getParent();
}
return null;
}
public IScriptProject getProject() {
return project;
}
public SourceMethod getMethod() {
return sourceMethod;
}
}