blob: 42b0b56661fe94eb57af5a882d844ffa1f995b20 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* 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 com.intellij.ide.util.gotoByName;
import com.intellij.navigation.ChooseByNameContributorEx;
import com.intellij.util.CommonProcessors;
import com.intellij.util.indexing.FindSymbolParameters;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.ProjectScope;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Processor;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.IdFilter;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
public class DefaultFileNavigationContributor implements ChooseByNameContributorEx, DumbAware {
@Override
@NotNull
public String[] getNames(Project project, boolean includeNonProjectItems) {
if (FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping) {
final THashSet<String> names = new THashSet<String>(1000);
IdFilter filter = IdFilter.getProjectIdFilter(project, includeNonProjectItems);
processNames(new Processor<String>() {
@Override
public boolean process(String s) {
names.add(s);
return true;
}
}, FindSymbolParameters.searchScopeFor(project, includeNonProjectItems), filter);
if (IdFilter.LOG.isDebugEnabled()) {
IdFilter.LOG.debug("All names retrieved2:" + names.size());
}
return ArrayUtil.toStringArray(names);
} else {
return FilenameIndex.getAllFilenames(project);
}
}
@Override
@NotNull
public NavigationItem[] getItemsByName(String name, final String pattern, Project project, boolean includeNonProjectItems) {
CommonProcessors.CollectProcessor<NavigationItem> processor = new CommonProcessors.CollectProcessor<NavigationItem>();
processElementsWithName(name, processor, FindSymbolParameters.wrap(pattern, project, includeNonProjectItems));
return processor.toArray(new NavigationItem[processor.getResults().size()]);
}
@Override
public void processNames(@NotNull final Processor<String> processor, @NotNull GlobalSearchScope scope, IdFilter filter) {
long started = System.currentTimeMillis();
FileBasedIndex.getInstance().processAllKeys(FilenameIndex.NAME, new Processor<String>() {
@Override
public boolean process(String s) {
return processor.process(s);
}
}, scope, filter);
if (IdFilter.LOG.isDebugEnabled()) {
IdFilter.LOG.debug("All names retrieved:" + (System.currentTimeMillis() - started));
}
}
@Override
public void processElementsWithName(@NotNull String name,
@NotNull Processor<NavigationItem> processor,
@NotNull FindSymbolParameters parameters) {
String completePattern = parameters.getCompletePattern();
final boolean includeDirs = completePattern.endsWith("/") || completePattern.endsWith("\\") ||
completePattern.startsWith("/") || completePattern.startsWith("\\");
boolean result = FilenameIndex.processFilesByName(
name, includeDirs, processor, parameters.getSearchScope(), parameters.getProject(), parameters.getIdFilter()
);
if (!result && includeDirs) {
FilenameIndex.processFilesByName(
name, false, processor, parameters.getSearchScope(), parameters.getProject(), parameters.getIdFilter()
);
}
}
}