package ru.naumen.gintonic.context.quickfix.moving; import static ru.naumen.gintonic.utils.CollectionUtils.getFirst; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import ru.naumen.gintonic.command.BindingNavigationCycle; import ru.naumen.gintonic.guice.injection.InjectionPoint; import ru.naumen.gintonic.guice.statements.BindingDefinition; import ru.naumen.gintonic.guice.statements.JustInTimeBindingStatement; import ru.naumen.gintonic.plugin.icons.Icons; import ru.naumen.gintonic.project.files.SelectAndReveal; import ru.naumen.gintonic.project.source.references.SourceCodeReference; import ru.naumen.gintonic.utils.BindingUtils; import ru.naumen.gintonic.utils.ICompilationUnitSelectionUtils; import ru.naumen.gintonic.utils.ListUtils; import ru.naumen.gintonic.utils.StringUtils; import ru.naumen.gintonic.widgets.Widgets; public class ProposalGoToImpl implements IJavaCompletionProposal { private List<BindingDefinition> bindingDefinitions; private String typeName; private InjectionPoint injectionPoint; public ProposalGoToImpl(List<BindingDefinition> bindingDefinitions, InjectionPoint injectionPoint) { this.bindingDefinitions = bindingDefinitions; this.typeName = BindingUtils.extractTypeName(injectionPoint, getFirst(bindingDefinitions)); this.injectionPoint = injectionPoint; } @Override public Point getSelection(IDocument document) { return null; } @Override public Image getImage() { return Icons.ginTonicDefaultIconSmall; } @Override public String getDisplayString() { String type = typeName == null ? "" : " '" + StringUtils.qualifiedNameToSimpleName(typeName) + "'"; return "Go to implementation" + type; } @Override public String getAdditionalProposalInfo() { return null; } @Override public IContextInformation getContextInformation() { return null; } @Override public void apply(IDocument document) { BindingDefinition bindingDefinition = null; if(bindingDefinitions.size() > 1) { bindingDefinition = Widgets.showUserSelect(bindingDefinitions); if(bindingDefinition == null) { return; } } else if(!bindingDefinitions.isEmpty()) { bindingDefinition = getFirst(bindingDefinitions); } if (bindingDefinition == null && !bindingDefinitions.isEmpty()) { // May be user press Cancel or Escape return; } String typeName = BindingUtils.extractTypeName(injectionPoint, bindingDefinition); if (bindingDefinition instanceof JustInTimeBindingStatement) { BindingNavigationCycle navigationCycle = new BindingNavigationCycle(SourceCodeReference.createCurrent(), ListUtils.newArrayList(bindingDefinition)); navigationCycle.jumpToNext(); return; } if (typeName == null) { return; } IProject project = ICompilationUnitSelectionUtils.getCompilationUnitSelection() .getICompilationUnit().getResource().getProject(); SelectAndReveal.selectAndRevealType(typeName, project); } @Override public int getRelevance() { return 0; } }