package com.cedricziel.idea.typo3.codeInsight; import com.cedricziel.idea.typo3.TYPO3CMSIcons; import com.cedricziel.idea.typo3.container.IconProvider; import com.cedricziel.idea.typo3.psi.PhpElementsUtil; import com.cedricziel.idea.typo3.util.IconUtil; import com.intellij.codeInsight.completion.*; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ProcessingContext; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.ParameterList; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.io.IOException; public class IconCompletionContributor extends CompletionContributor { public IconCompletionContributor() { extend(CompletionType.BASIC, PlatformPatterns.psiElement(), new CompletionProvider<CompletionParameters>() { public void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet resultSet) { PsiElement element = parameters.getPosition().getParent(); ParameterList parameterList = PsiTreeUtil.getParentOfType(element, ParameterList.class); if (parameterList == null) { return; } PsiElement methodReference = PsiTreeUtil.getParentOfType(element, MethodReference.class); if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "getIcon")) { completeAvailableIcons(element, resultSet); } } } ); } private void completeAvailableIcons(PsiElement element, CompletionResultSet resultSet) { IconProvider iconProvider = IconProvider.getInstance(element.getProject()); iconProvider.all(element.getProject()).forEach(iconDefinition -> { LookupElementBuilder lookupElement; try { if (iconDefinition.getVirtualFile() == null) { throw new IOException("Could not find icon source"); } Icon iconFromFile = IconUtil.createIconFromFile(iconDefinition.getVirtualFile()); if (iconFromFile == null) { throw new IOException("Unable to create image from icon source"); } lookupElement = LookupElementBuilder .create(iconDefinition.getIdentifier()) .withIcon(iconFromFile); } catch (IOException e) { // Silent error lookupElement = LookupElementBuilder .create(iconDefinition.getIdentifier()) .withIcon(TYPO3CMSIcons.ICON_NOT_RESOLVED); } if (iconDefinition.getFilename() != null) { lookupElement = lookupElement.appendTailText(iconDefinition.getFilename(), true); } else if (iconDefinition.getProvider() != null) { lookupElement = lookupElement.appendTailText(iconDefinition.getProvider().getText(), true); } resultSet.addElement(lookupElement); }); } }