mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
allow to autodetect text file from the FileChooser
This commit is contained in:
@@ -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)) {
|
||||
|
||||
+9
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+41
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user