blob: 5fbdfeaa93b3f0dd5018c33aca4a02ec66f9cc18 [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.actions;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.ide.util.gotoByName.ChooseByNameFilter;
import com.intellij.ide.util.gotoByName.ChooseByNamePopup;
import com.intellij.ide.util.gotoByName.GotoFileConfiguration;
import com.intellij.ide.util.gotoByName.GotoFileModel;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.FileTypes;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.Navigatable;
import com.intellij.psi.PsiFile;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* "Go to | File" action implementation.
*
* @author Eugene Belyaev
* @author Constantine.Plotnikov
*/
public class GotoFileAction extends GotoActionBase implements DumbAware {
public static final String ID = "GotoFile";
@Override
public void gotoActionPerformed(AnActionEvent e) {
FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.file");
final Project project = e.getData(CommonDataKeys.PROJECT);
final GotoFileModel gotoFileModel = new GotoFileModel(project);
showNavigationPopup(e, gotoFileModel, new GotoActionCallback<FileType>() {
@Override
protected ChooseByNameFilter<FileType> createFilter(@NotNull ChooseByNamePopup popup) {
return new GotoFileFilter(popup, gotoFileModel, project);
}
@Override
public void elementChosen(final ChooseByNamePopup popup, final Object element) {
if (element == null) return;
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
Navigatable n = (Navigatable)element;
//this is for better cursor position
if (element instanceof PsiFile) {
VirtualFile vfile = ((PsiFile)element).getVirtualFile();
if (vfile == null) return;
n = new OpenFileDescriptor(project, vfile, popup.getLinePosition(), popup.getColumnPosition()).setUseCurrentWindow(popup.isOpenInCurrentWindowRequested());
}
if (!n.canNavigate()) return;
n.navigate(true);
}
}, ModalityState.NON_MODAL);
}
}, "Files matching pattern", true);
}
protected static class GotoFileFilter extends ChooseByNameFilter<FileType> {
GotoFileFilter(final ChooseByNamePopup popup, GotoFileModel model, final Project project) {
super(popup, model, GotoFileConfiguration.getInstance(project), project);
}
@Override
@NotNull
protected List<FileType> getAllFilterValues() {
List<FileType> elements = new ArrayList<FileType>();
ContainerUtil.addAll(elements, FileTypeManager.getInstance().getRegisteredFileTypes());
Collections.sort(elements, FileTypeComparator.INSTANCE);
return elements;
}
@Override
protected String textForFilterValue(@NotNull FileType value) {
return value.getName();
}
@Override
protected Icon iconForFilterValue(@NotNull FileType value) {
return value.getIcon();
}
}
/**
* A file type comparator. The comparison rules are applied in the following order.
* <ol>
* <li>Unknown file type is greatest.</li>
* <li>Text files are less then binary ones.</li>
* <li>File type with greater name is greater (case is ignored).</li>
* </ol>
*/
static class FileTypeComparator implements Comparator<FileType> {
/**
* an instance of comparator
*/
static final Comparator<FileType> INSTANCE = new FileTypeComparator();
/**
* {@inheritDoc}
*/
@Override
public int compare(final FileType o1, final FileType o2) {
if (o1 == o2) {
return 0;
}
if (o1 == FileTypes.UNKNOWN) {
return 1;
}
if (o2 == FileTypes.UNKNOWN) {
return -1;
}
if (o1.isBinary() && !o2.isBinary()) {
return 1;
}
if (!o1.isBinary() && o2.isBinary()) {
return -1;
}
return o1.getName().compareToIgnoreCase(o2.getName());
}
}
}