package tern.eclipse.ide.jsdt.internal.ui.search;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.search.ui.text.Match;
import org.eclipse.ui.PartInitException;
import org.eclipse.wst.jsdt.core.IJavaScriptElement;
import org.eclipse.wst.jsdt.core.ILocalVariable;
import org.eclipse.wst.jsdt.core.ISourceRange;
import org.eclipse.wst.jsdt.core.ISourceReference;
import org.eclipse.wst.jsdt.core.JavaScriptModelException;
import org.eclipse.wst.jsdt.ui.search.ElementQuerySpecification;
import org.eclipse.wst.jsdt.ui.search.IMatchPresentation;
import org.eclipse.wst.jsdt.ui.search.IQueryParticipant;
import org.eclipse.wst.jsdt.ui.search.ISearchRequestor;
import org.eclipse.wst.jsdt.ui.search.QuerySpecification;
import tern.ITernFile;
import tern.eclipse.ide.core.IIDETernProject;
import tern.eclipse.ide.core.TernCorePlugin;
import tern.eclipse.ide.core.resources.TernDocumentFile;
import tern.eclipse.ide.ui.utils.EditorUtils;
import tern.server.protocol.refs.ITernRefCollector;
import tern.server.protocol.refs.TernRefsQuery;
public class TernQueryParticipant implements IQueryParticipant, IMatchPresentation {
@Override
public void search(final ISearchRequestor requestor, QuerySpecification querySpecification,
IProgressMonitor monitor) throws CoreException {
if (querySpecification instanceof ElementQuerySpecification) {
// element search (eg. from global find references in Java file)
ElementQuerySpecification elementQuery = (ElementQuerySpecification) querySpecification;
IJavaScriptElement jsElement = elementQuery.getElement();
IResource resource = jsElement.getResource();
if (resource == null || resource.getType() != IResource.FILE) {
return;
}
IFile file = (IFile) resource;
IProject project = file.getProject();
if (TernCorePlugin.hasTernNature(project)) {
final IIDETernProject ternProject = TernCorePlugin.getTernProject(project);
IDocument document = EditorUtils.getDocument(file);
ITernFile ternFile = document != null ? new TernDocumentFile(file, document) : null;
Integer end = getEnd(jsElement);
if (end != null) {
String filename = ternFile.getFullName(ternProject);
TernRefsQuery query = new TernRefsQuery(filename, end);
ITernRefCollector collector = new ITernRefCollector() {
@Override
public void setDefinition(String filename, Long start, Long end) {
IFile file = ternProject.getIDEFile(filename);
Match match = new Match(new TernRef(file), start.intValue(),
(end.intValue() - start.intValue()));
requestor.reportMatch(match);
}
};
try {
ternProject.request(query, ternFile, collector);
} catch (Exception e) {
e.printStackTrace();
}
}
// IWorkbenchWindow[] windows =
// JSDTTernUIPlugin.getDefault().getWorkbench().getWorkbenchWindows();
// for (int i = 0; i < windows.length; i++) {
// IWorkbenchPage page = windows[i].getActivePage();
// if (page != null) {
// IEditorPart part = page.getActiveEditor();
// if (part instanceof AbstractTextEditor) {
// ISelection selection = ((AbstractTextEditor)
// part).getSelectionProvider().getSelection();
// if (selection != null && !selection.isEmpty() && selection
// instanceof ITextSelection) {
// ITextSelection textSelection = (ITextSelection) selection;
// end = textSelection.getOffset() + textSelection.getLength();
// break;
// }
// }
// }
// }
}
}
}
protected Integer getEnd(IJavaScriptElement jsElement) {
ISourceRange range = null;
if (jsElement instanceof ILocalVariable) {
range = ((ILocalVariable) jsElement).getNameRange();
} else if (jsElement instanceof ISourceReference) {
try {
range = ((ISourceReference) jsElement).getSourceRange();
} catch (JavaScriptModelException e) {
e.printStackTrace();
}
}
if (range != null) {
return range.getOffset() + range.getLength();
}
return null;
}
@Override
public int estimateTicks(QuerySpecification specification) {
return 0;
}
@Override
public IMatchPresentation getUIParticipant() {
return this;
}
@Override
public ILabelProvider createLabelProvider() {
return new TernRefLabelProvider();
}
@Override
public void showMatch(Match match, int currentOffset, int currentLength, boolean activate)
throws PartInitException {
Object element = match.getElement();
if (element instanceof TernRef) {
IFile file = ((TernRef) element).getFile();
EditorUtils.openInEditor(file, currentOffset, currentLength, activate);
}
}
}