allow to autodetect text file from the FileChooser

This commit is contained in:
Alexey Kudravtsev
2012-04-23 10:19:20 +04:00
parent 7a4c044982
commit 094c4b3e6c
10 changed files with 105 additions and 28 deletions
@@ -243,21 +243,4 @@ public abstract class PsiTestCase extends ModuleTestCase {
public void commitDocument(com.intellij.openapi.editor.Document document) {
PsiDocumentManager.getInstance(getProject()).commitDocument(document);
}
protected static VirtualFile createChildData(final VirtualFile dir, @NonNls final String name) {
return new WriteAction<VirtualFile>() {
@Override
protected void run(Result<VirtualFile> result) throws Throwable {
result.setResult(dir.createChildData(null, name));
}
}.execute().throwException().getResultObject();
}
protected static VirtualFile createChildDirectory(final VirtualFile dir, @NonNls final String name) {
return new WriteAction<VirtualFile>() {
@Override
protected void run(Result<VirtualFile> result) throws Throwable {
result.setResult(dir.createChildDirectory(null, name));
}
}.execute().throwException().getResultObject();
}
}
@@ -44,11 +44,12 @@ public class OpenFileDescriptor implements Navigatable {
@NotNull
private final VirtualFile myFile;
private final int myOffset;
private final int myLogicalLine;
private final int myLogicalColumn;
private final int myOffset;
private final int myLogicalLine;
private final int myLogicalColumn;
private final RangeMarker myRangeMarker;
private final Project myProject;
@NotNull
private final Project myProject;
private boolean myUseCurrentWindow = false;
@@ -121,8 +122,8 @@ public class OpenFileDescriptor implements Navigatable {
navigateInProjectView();
}
private boolean navigateInEditor(Project project, boolean requestFocus) {
FileType type = FileTypeManager.getInstance().getKnownFileTypeOrAssociate(myFile);
private boolean navigateInEditor(@NotNull Project project, boolean requestFocus) {
FileType type = FileTypeManager.getInstance().getKnownFileTypeOrAssociate(myFile,project);
if (type == null || !myFile.isValid()) return false;
if (type instanceof INativeFileType && requestFocus) {
@@ -18,6 +18,7 @@ package com.intellij.openapi.fileTypes;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.CachedSingletonsRegistry;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Getter;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.messages.Topic;
@@ -146,7 +147,10 @@ public abstract class FileTypeManager extends FileTypeRegistry {
* @return Known file type or null. Never returns {@link FileTypes#UNKNOWN}.
*/
@Nullable
@Deprecated() // use getKnownFileTypeOrAssociate(VirtualFile file, Project project) instead
public abstract FileType getKnownFileTypeOrAssociate(@NotNull VirtualFile file);
@Nullable
public abstract FileType getKnownFileTypeOrAssociate(@NotNull VirtualFile file, @NotNull Project project);
/**
* Returns the semicolon-delimited list of patterns for files and folders
@@ -19,6 +19,7 @@
*/
package com.intellij.openapi.fileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NonNls;
@@ -92,6 +93,11 @@ class MockFileTypeManager extends FileTypeManager {
return file.getFileType();
}
@Override
public FileType getKnownFileTypeOrAssociate(@NotNull VirtualFile file, @NotNull Project project) {
return getKnownFileTypeOrAssociate(file);
}
@NotNull
@Override
public String getIgnoredFilesList() {
@@ -78,7 +78,7 @@ public class OpenFileAction extends AnAction implements DumbAware {
}
}
FileType type = FileTypeChooser.getKnownFileTypeOrAssociate(file.getName());
FileType type = FileTypeChooser.getKnownFileTypeOrAssociate(file,project);
if (type == null) return;
if (project != null) {
@@ -19,10 +19,13 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.fileTypes.*;
import com.intellij.openapi.fileTypes.impl.FileTypeRenderer;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.ui.CollectionComboBoxModel;
import com.intellij.ui.ListScrollingUtil;
import com.intellij.util.ArrayUtil;
@@ -58,6 +61,7 @@ public class FileTypeChooser extends DialogWrapper {
FileType[] fileTypes = FileTypeManager.getInstance().getRegisteredFileTypes();
Arrays.sort(fileTypes, new Comparator<FileType>() {
@Override
public int compare(final FileType fileType1, final FileType fileType2) {
if (fileType1 == null){
return 1;
@@ -82,6 +86,7 @@ public class FileTypeChooser extends DialogWrapper {
init();
}
@Override
protected JComponent createCenterPanel() {
myTitleLabel.setText(FileTypesBundle.message("filetype.chooser.prompt", myFileName));
@@ -90,6 +95,7 @@ public class FileTypeChooser extends DialogWrapper {
myList.addMouseListener(
new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2){
doOKAction();
@@ -100,6 +106,7 @@ public class FileTypeChooser extends DialogWrapper {
myList.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
updateButtonsState();
}
@@ -111,6 +118,7 @@ public class FileTypeChooser extends DialogWrapper {
return myPanel;
}
@Override
public JComponent getPreferredFocusedComponent() {
return myList;
}
@@ -119,6 +127,7 @@ public class FileTypeChooser extends DialogWrapper {
setOKActionEnabled(myList.getSelectedIndex() != -1 || myOpenAsNative.isSelected());
}
@Override
protected String getDimensionServiceKey(){
return "#com.intellij.fileTypes.FileTypeChooser";
}
@@ -133,7 +142,8 @@ public class FileTypeChooser extends DialogWrapper {
* @return Known file type or null. Never returns {@link com.intellij.openapi.fileTypes.FileTypes#UNKNOWN}.
*/
@Nullable
public static FileType getKnownFileTypeOrAssociate(@NotNull VirtualFile file) {
public static FileType getKnownFileTypeOrAssociate(@NotNull VirtualFile file, @NotNull Project project) {
((PsiManagerEx)PsiManager.getInstance(project)).getFileManager().findFile(file); // autodetect text file if needed
FileType type = file.getFileType();
if (type == FileTypes.UNKNOWN) {
type = getKnownFileTypeOrAssociate(file.getName());
@@ -142,7 +152,7 @@ public class FileTypeChooser extends DialogWrapper {
}
@Nullable
public static FileType getKnownFileTypeOrAssociate(String fileName) {
public static FileType getKnownFileTypeOrAssociate(@NotNull String fileName) {
FileTypeManager fileTypeManager = FileTypeManager.getInstance();
FileType type = fileTypeManager.getFileTypeByFileName(fileName);
if (type == FileTypes.UNKNOWN) {
@@ -160,6 +170,7 @@ public class FileTypeChooser extends DialogWrapper {
if (type == FileTypes.UNKNOWN) return null;
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
FileTypeManagerEx.getInstanceEx().associatePattern(type, (String)chooser.myPattern.getSelectedItem());
}
@@ -171,8 +182,8 @@ public class FileTypeChooser extends DialogWrapper {
@NotNull
static String[] suggestPatterns(@NotNull final String fileName) {
final Deque<String> patterns = new LinkedList<String>();
int i = -1;
patterns.addFirst(fileName);
int i = -1;
while ((i = fileName.indexOf('.', i + 1)) > 0) {
final String extension = fileName.substring(i);
if (!StringUtil.isEmpty(extension)) {
@@ -31,6 +31,7 @@ import com.intellij.openapi.options.BaseSchemeProcessor;
import com.intellij.openapi.options.ExternalInfo;
import com.intellij.openapi.options.SchemesManager;
import com.intellij.openapi.options.SchemesManagerFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.io.ByteSequence;
import com.intellij.openapi.util.io.FileUtil;
@@ -1080,6 +1081,13 @@ public class FileTypeManagerImpl extends FileTypeManagerEx implements NamedJDOME
@Override
@Nullable
public FileType getKnownFileTypeOrAssociate(@NotNull VirtualFile file) {
return FileTypeChooser.getKnownFileTypeOrAssociate(file);
FileType type = file.getFileType();
if (type != UnknownFileType.INSTANCE) return type;
return FileTypeChooser.getKnownFileTypeOrAssociate(file.getName());
}
@Override
public FileType getKnownFileTypeOrAssociate(@NotNull VirtualFile file, @NotNull Project project) {
return FileTypeChooser.getKnownFileTypeOrAssociate(file, project);
}
}
@@ -0,0 +1,41 @@
/*
* Copyright 2000-2012 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.openapi.fileTypes;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.testFramework.PlatformTestCase;
import java.io.IOException;
public class FileTypeManagerTest extends PlatformTestCase {
public void testAutoDetectTextFileFromContents() throws IOException {
VirtualFile temp = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(createTempDirectory());
VirtualFile vFile = createChildData(temp, "test.xxxxxxx");
VfsUtil.saveText(vFile, "text");
FileType type = vFile.getFileType();
assertEquals(UnknownFileType.INSTANCE, type);
PsiFile psiFile = ((PsiManagerEx)PsiManager.getInstance(myProject)).getFileManager().findFile(vFile); // autodetect text file if needed
assertNotNull(psiFile);
assertEquals(PlainTextFileType.INSTANCE, vFile.getFileType());
}
}
@@ -4,6 +4,7 @@ import com.intellij.openapi.fileTypes.*;
import com.intellij.openapi.fileTypes.ex.FileTypeManagerEx;
import com.intellij.openapi.fileTypes.impl.AbstractFileType;
import com.intellij.openapi.options.SchemesManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
@@ -118,6 +119,11 @@ public class MockFileTypeManager extends FileTypeManagerEx {
return file.getFileType();
}
@Override
public FileType getKnownFileTypeOrAssociate(@NotNull VirtualFile file, @NotNull Project project) {
return getKnownFileTypeOrAssociate(file);
}
@Override
@NotNull
public List<FileNameMatcher> getAssociations(@NotNull FileType type) {
@@ -773,4 +773,21 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface WrapInCommand {}
protected static VirtualFile createChildData(@NotNull final VirtualFile dir, @NotNull @NonNls final String name) {
return new WriteAction<VirtualFile>() {
@Override
protected void run(Result<VirtualFile> result) throws Throwable {
result.setResult(dir.createChildData(null, name));
}
}.execute().throwException().getResultObject();
}
protected static VirtualFile createChildDirectory(@NotNull final VirtualFile dir, @NotNull @NonNls final String name) {
return new WriteAction<VirtualFile>() {
@Override
protected void run(Result<VirtualFile> result) throws Throwable {
result.setResult(dir.createChildDirectory(null, name));
}
}.execute().throwException().getResultObject();
}
}