package tk.eclipse.plugin.jspeditor.editors;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner;
import org.eclipse.jdt.internal.ui.text.java.AbstractJavaCompletionProposal;
import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ContextInformation;
import org.eclipse.jface.text.contentassist.ContextInformationValidator;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.contentassist.IContextInformationValidator;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import tk.eclipse.plugin.htmleditor.HTMLPlugin;
import tk.eclipse.plugin.htmleditor.HTMLUtil;
import tk.eclipse.plugin.jspeditor.compiler.CompileResult;
import tk.eclipse.plugin.jspeditor.compiler.JSPCompiler;
/**
* Provides code completion for Java code.
*
* @author Naoki Takezoe
* @since 2.0.3
*/
public class JSPScriptletAssistProcessor implements IContentAssistProcessor {
private IFile file;
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
if(file == null){
return new ICompletionProposal[0];
}
try {
CompileResult result = JSPCompiler.compile(viewer.getDocument().get());
IJavaProject project = JavaCore.create(file.getProject());
if(project != null){
ICompilationUnit unit = HTMLUtil.getTemporaryCompilationUnit(project);
HTMLUtil.setContentsToCU(unit, result.toString());
CompletionProposalCollector collector = new CompletionProposalCollector(project);
int headerLength = result.getHeader().length();
unit.codeComplete(headerLength + offset,
collector, DefaultWorkingCopyOwner.PRIMARY);
IJavaCompletionProposal[] proposals = collector.getJavaCompletionProposals();
List<ICompletionProposal> list = new ArrayList<ICompletionProposal>();
for(int i=0;i<proposals.length;i++){
if(proposals[i] instanceof AbstractJavaCompletionProposal){
AbstractJavaCompletionProposal proposal = (AbstractJavaCompletionProposal)proposals[i];
if(proposal.getDisplayString().endsWith("_xxx")){
continue;
}
proposal.setReplacementOffset(proposal.getReplacementOffset() - headerLength);
list.add(proposal);
}
}
return list.toArray(new ICompletionProposal[list.size()]);
}
} catch(Exception e){
HTMLPlugin.logException(e);
}
return new ICompletionProposal[0];
}
public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
ContextInformation[] info = new ContextInformation[0];
return info;
}
public char[] getCompletionProposalAutoActivationCharacters() {
return new char[0];
}
public char[] getContextInformationAutoActivationCharacters() {
return new char[0];
}
public IContextInformationValidator getContextInformationValidator() {
return new ContextInformationValidator(this);
}
public String getErrorMessage() {
return "Error";
}
public void update(JSPSourceEditor editor){
IEditorInput input = editor.getEditorInput();
if(input instanceof IFileEditorInput){
this.file = ((IFileEditorInput)input).getFile();
}
}
}