package org.easyb.eclipse.templates.processor; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.easyb.eclipse.templates.TemplateActivator; import org.easyb.eclipse.templates.manager.TemplateManager; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer; import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext; /** * Calculates Behaviour completion proposals * Based on AbstractTemplateCompletionProposalComputer * @author whiteda * */ public class BehaviourTemplateCompletionProposalComputer implements IJavaCompletionProposalComputer{ @Override public List computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) { if (!(context instanceof JavaContentAssistInvocationContext)) return Collections.EMPTY_LIST; JavaContentAssistInvocationContext javaContext= (JavaContentAssistInvocationContext) context; ICompilationUnit unit= javaContext.getCompilationUnit(); if (unit == null){ return Collections.EMPTY_LIST; } //TODO when a EasybCompilationUnit can be added filter here //so only stories/specifications have templates resolved not //Java or Groovy compilation units try { if(!TemplateActivator.getDefault().isBehaviourFile(unit.getCorrespondingResource())){ return Collections.EMPTY_LIST; } } catch (JavaModelException e) { TemplateActivator.Log("Unable to check if resouce is a easyb behaviour",e); return Collections.EMPTY_LIST; } BehaviourTemplateProposal[] templateProposals= TemplateManager.getInstance().getTemplateProposals(javaContext.getViewer(),javaContext.getInvocationOffset()); IJavaCompletionProposal[] keyWordResults= javaContext.getKeywordProposals(); if (keyWordResults.length == 0){ return Arrays.asList(templateProposals); } /* Update relevance of template proposals that match with a keyword * give those templates slightly more relevance than the keyword to * sort them first. */ for (int k= 0; k < templateProposals.length; k++) { BehaviourTemplateProposal curr= templateProposals[k]; String name= curr.getTemplateName(); for (int i= 0; i < keyWordResults.length; i++) { String keyword= keyWordResults[i].getDisplayString(); if (name.startsWith(keyword)) { String content= curr.getTemplatePattern(); if (content.startsWith(keyword)) { curr.setRelevance(keyWordResults[i].getRelevance() + 1); break; } } } } return Arrays.asList(templateProposals); } @Override public List computeContextInformation( ContentAssistInvocationContext context, IProgressMonitor monitor) { // TODO Auto-generated method stub return Collections.EMPTY_LIST; } @Override public String getErrorMessage() { // TODO Auto-generated method stub return null; } @Override public void sessionEnded() { // TODO Auto-generated method stub } @Override public void sessionStarted() { // TODO Auto-generated method stub } }