package org.angularjs.codeInsight;
import com.intellij.icons.AllIcons;
import com.intellij.injected.editor.VirtualFileWindow;
import com.intellij.lang.javascript.psi.JSExpression;
import com.intellij.lang.typescript.compiler.languageService.ide.TypeScriptLanguageServiceCompletionContributor;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlTokenType;
import icons.AngularJSIcons;
import org.angularjs.service.Angular2LanguageService;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import static com.intellij.lang.typescript.compiler.languageService.TypeScriptLanguageServiceUtil.useServiceCompletion;
public class Angular2ServiceCompletionContributor extends TypeScriptLanguageServiceCompletionContributor {
@Override
protected boolean isAvailableForFile(PsiFile file) {
if (!Angular2LanguageService.isEnabledAngularService(file.getProject())) {
return false;
}
VirtualFile virtualFile = file.getVirtualFile();
return useServiceCompletion(file.getProject(), virtualFile);
}
@Override
protected boolean isApplicablePlaceForCompletion(PsiElement position) {
PsiElement parent = position.getParent();
if (parent instanceof JSExpression) {
return true;
}
if (parent instanceof XmlTag) {
IElementType type = position.getNode().getElementType();
if (type == XmlTokenType.XML_NAME || type == XmlTokenType.XML_TAG_NAME) {
return true;
}
}
return false;
}
@Override
protected VirtualFile getVirtualFile(@NotNull PsiFile file) {
VirtualFile virtualFile = PsiUtilCore.getVirtualFile(file);
if (virtualFile instanceof VirtualFileWindow) {
virtualFile = ((VirtualFileWindow)virtualFile).getDelegate();
}
return virtualFile;
}
@Nullable
protected Icon getIcon(String kind, @Nullable String kindModifiers) {
if ("element".equals(kind)) {
return AllIcons.Nodes.Tag;
}
if ("component".equals(kind)) {
return AngularJSIcons.Angular2;
}
return getKindIcon(kind);
}
}