package tk.eclipse.plugin.xmleditor.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.internal.ui.text.java.JavaCompletionProposal; import org.eclipse.jdt.internal.ui.text.java.LazyJavaTypeCompletionProposal; import org.eclipse.jdt.ui.text.java.CompletionProposalCollector; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.swt.graphics.Image; import tk.eclipse.plugin.htmleditor.HTMLUtil; import tk.eclipse.plugin.htmleditor.assist.AssistInfo; /** * Provides code completion at the attribute value. * * @author Naoki Takezoe * @since 2.0.3 */ public class ClassNameAssistProcessor { /** * Provides classname completion. * * @param value the inputed value * @return the array of attribute value proposals */ public AssistInfo[] getClassAttributeValues(IFile file, String value) { if(value.length()==0){ return new AssistInfo[0]; } try { IJavaProject project = JavaCore.create(file.getProject()); CompletionProposalCollector collector = new CompletionProposalCollector(project); ICompilationUnit unit = HTMLUtil.getTemporaryCompilationUnit(project); String source = "public class _xxx { public static void hoge(){ " + value + "}}"; HTMLUtil.setContentsToCU(unit, source); unit.codeComplete(source.length() - 2, collector, DefaultWorkingCopyOwner.PRIMARY); IJavaCompletionProposal[] proposals = collector.getJavaCompletionProposals(); List<AssistInfo> result = new ArrayList<AssistInfo>(); for(int j=0;j<proposals.length;j++){ if(proposals[j].getImage()!=null){ if(proposals[j] instanceof LazyJavaTypeCompletionProposal){ LazyJavaTypeCompletionProposal p = (LazyJavaTypeCompletionProposal)proposals[j]; if(p.getReplacementString().startsWith(value)){ result.add(new JavaClassAssistInfo(p)); } } else if(proposals[j] instanceof JavaCompletionProposal){ JavaCompletionProposal p = (JavaCompletionProposal)proposals[j]; if(p.getReplacementString().startsWith(value)){ result.add(new JavaClassAssistInfo(p)); } } } } return result.toArray(new AssistInfo[result.size()]); } catch(Exception ex){ ex.printStackTrace(); } return new AssistInfo[0]; } /** * The wrapper of <code>AbstractJavaCompletionProposal</code>. * <p> * This class provides the <code>AssistInfo</code> interface and * <code>toCompletionProposal()</code> returns the wrapped * <code>AbstractJavaCompletionProposal</code> instance. */ private class JavaClassAssistInfo extends AssistInfo { private AbstractJavaCompletionProposal proposal; public JavaClassAssistInfo(AbstractJavaCompletionProposal proposal){ super(""); this.proposal = proposal; } @Override public String getDisplayString() { return proposal.getDisplayString(); } @Override public Image getImage() { return proposal.getImage(); } @Override public String getReplaceString() { return proposal.getReplacementString(); } @Override public ICompletionProposal toCompletionProposal(int offset, String matchString, Image defaultImage) { proposal.setReplacementOffset(offset - matchString.length()); proposal.setReplacementLength(matchString.length()); proposal.setCursorPosition(proposal.getReplacementString().length()); return proposal; } } }