/*******************************************************************************
* 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.contentassist;
import org.eclipse.dltk.core.CompletionProposal;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.ui.text.completion.CompletionProposalLabelProvider;
import org.eclipse.dltk.ui.text.completion.IScriptCompletionProposal;
import org.eclipse.dltk.ui.text.completion.ProposalInfo;
import org.eclipse.dltk.ui.text.completion.ScriptCompletionProposal;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.php.core.codeassist.ICompletionContextResolver;
import org.eclipse.php.core.codeassist.ICompletionStrategyFactory;
import org.eclipse.php.internal.core.codeassist.IPHPCompletionRequestorExtension;
import org.eclipse.php.internal.ui.editor.contentassist.PHPCompletionProposalCollector;
import org.eclipse.swt.graphics.Image;
import com.dubture.symfony.core.builder.SymfonyNature;
import com.dubture.symfony.core.codeassist.SymfonyCompletionContextResolver;
import com.dubture.symfony.core.codeassist.SymfonyCompletionStrategyFactory;
/**
* The {@link SymfonyCompletionProposalCollector} is
* responsible for creating custom proposals for
* Symfony elements like Routes and Services.
*
*
* @author "Robert Gruendler <r.gruendler@gmail.com>"
*
*/
@SuppressWarnings("restriction")
public class SymfonyCompletionProposalCollector extends
PHPCompletionProposalCollector implements IPHPCompletionRequestorExtension {
private SymfonyCompletionProposalLabelProvider labelProvider;
public SymfonyCompletionProposalCollector(IDocument document,
ISourceModule cu, boolean explicit) {
super(document, cu, explicit);
}
@Override
public CompletionProposalLabelProvider getLabelProvider() {
if (labelProvider == null)
labelProvider = new SymfonyCompletionProposalLabelProvider();
return labelProvider;
}
@Override
protected IScriptCompletionProposal createScriptCompletionProposal(
CompletionProposal proposal) {
IModelElement element = proposal.getModelElement();
if (element == null) {
return null;
}
ProposalInfo proposalInfo = CompletionProposalProvider.createScriptCompletionProposal(proposal, this);
ImageDescriptor imageDescriptor = CompletionProposalProvider.createTypeImageDescriptor(proposal);
if (proposalInfo != null) {
ScriptCompletionProposal symfonyProposal = generateSymfonyProposal(proposal, imageDescriptor);
symfonyProposal.setProposalInfo(proposalInfo);
symfonyProposal.setRelevance(computeRelevance(proposal));
return symfonyProposal;
}
return super.createScriptCompletionProposal(proposal);
}
private ScriptCompletionProposal generateSymfonyProposal(CompletionProposal typeProposal, ImageDescriptor descriptor) {
String completion = new String(typeProposal.getCompletion());
int replaceStart = typeProposal.getReplaceStart();
int length = getLength(typeProposal);
Image image = getImage(descriptor);
String displayString = ((SymfonyCompletionProposalLabelProvider) getLabelProvider())
.createTypeProposalLabel(typeProposal);
ScriptCompletionProposal scriptProposal = new EmptyCompletionProposal(completion, replaceStart, length, image, displayString, 0);
return scriptProposal;
}
@Override
protected String getNatureId() {
return SymfonyNature.NATURE_ID;
}
@Override
public ICompletionContextResolver[] getContextResolvers() {
return new ICompletionContextResolver[] {
new SymfonyCompletionContextResolver()
};
}
@Override
public ICompletionStrategyFactory[] getStrategyFactories() {
return new ICompletionStrategyFactory[] {
new SymfonyCompletionStrategyFactory()
};
}
}