ru.crazyproger.plugins.webtoper.nls.codeinsight.NlsCompletionContributor.java Source code

Java tutorial

Introduction

Here is the source code for ru.crazyproger.plugins.webtoper.nls.codeinsight.NlsCompletionContributor.java

Source

/*
 * Copyright 2013 Vladimir Rudev
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package ru.crazyproger.plugins.webtoper.nls.codeinsight;

import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import com.intellij.codeInsight.completion.CompletionContributor;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.CompletionProvider;
import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.lang.properties.PropertiesFileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.FileTypeIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import ru.crazyproger.plugins.webtoper.nls.NlsUtils;
import ru.crazyproger.plugins.webtoper.nls.psi.NlsFileImpl;
import ru.crazyproger.plugins.webtoper.nls.psi.impl.NlsNameImpl;

import java.util.Collection;
import java.util.Collections;

import static com.intellij.patterns.PlatformPatterns.psiElement;

public class NlsCompletionContributor extends CompletionContributor {
    public NlsCompletionContributor() {
        extend(CompletionType.BASIC, psiElement(NlsNameImpl.class), new CompletionProvider<CompletionParameters>() {
            @Override
            protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context,
                    @NotNull CompletionResultSet result) {
                Project project = parameters.getPosition().getContainingFile().getProject();
                Collection<NlsFileImpl> files = getNlsFiles(project);
                if (files.isEmpty())
                    return;
                final NlsFileImpl currentFile = (NlsFileImpl) parameters.getOriginalFile();
                final Collection<NlsFileImpl> includedFiles = currentFile.getIncludedFiles();
                Collection<NlsFileImpl> filtered = Collections2.filter(files, new Predicate<NlsFileImpl>() {
                    @Override
                    public boolean apply(@Nullable NlsFileImpl nlsFile) {
                        assert nlsFile != null;
                        return !nlsFile.equals(currentFile) && !includedFiles.contains(nlsFile);
                    }
                });

                Collection<LookupElement> lookupElements = Collections2.transform(filtered,
                        new NlsFile2LookupElementFunction());

                result.addAllElements(lookupElements);
            }
        });
    }

    @NotNull
    public static Collection<NlsFileImpl> getNlsFiles(Project project) {
        Collection<VirtualFile> files = getNlsVirtualFiles(project);
        if (files.isEmpty())
            return Collections.emptyList();
        final PsiManager psiManager = PsiManager.getInstance(project);
        Collection<NlsFileImpl> nlsFiles = Collections2.transform(files, new Function<VirtualFile, NlsFileImpl>() {
            @Override
            public NlsFileImpl apply(@Nullable VirtualFile virtualFile) {
                if (virtualFile != null) {
                    return (NlsFileImpl) psiManager.findFile(virtualFile);
                }
                return null;
            }
        });
        return Collections2.filter(nlsFiles, Predicates.notNull());
    }

    @NotNull
    private static Collection<VirtualFile> getNlsVirtualFiles(Project project) {
        GlobalSearchScope nlsScope = NlsUtils.getNlsScope(project);
        if (nlsScope == null) {
            return Collections.emptyList();
        }
        return FileTypeIndex.getFiles(PropertiesFileType.INSTANCE, nlsScope);
    }

    public static class NlsFile2LookupElementFunction implements Function<NlsFileImpl, LookupElement> {

        @Override
        public LookupElement apply(@Nullable NlsFileImpl nlsFile) {
            assert nlsFile != null;
            String fullName = nlsFile.getNlsName();
            assert fullName != null;
            return LookupElementBuilder.create(nlsFile, fullName).withIcon(nlsFile.getIcon(0));
        }
    }
}