diff --git a/java/testFramework/src/com/intellij/testFramework/PsiTestCase.java b/java/testFramework/src/com/intellij/testFramework/PsiTestCase.java index ec471600d9f5..3640b28a5582 100644 --- a/java/testFramework/src/com/intellij/testFramework/PsiTestCase.java +++ b/java/testFramework/src/com/intellij/testFramework/PsiTestCase.java @@ -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() { - @Override - protected void run(Result 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() { - @Override - protected void run(Result result) throws Throwable { - result.setResult(dir.createChildDirectory(null, name)); - } - }.execute().throwException().getResultObject(); - } } diff --git a/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java b/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java index 3087b66e0e9c..8a2837a5dc5d 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java +++ b/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java @@ -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) { diff --git a/platform/platform-api/src/com/intellij/openapi/fileTypes/FileTypeManager.java b/platform/platform-api/src/com/intellij/openapi/fileTypes/FileTypeManager.java index 493a423e57d1..f1ce04617f4a 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileTypes/FileTypeManager.java +++ b/platform/platform-api/src/com/intellij/openapi/fileTypes/FileTypeManager.java @@ -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 diff --git a/platform/platform-api/src/com/intellij/openapi/fileTypes/MockFileTypeManager.java b/platform/platform-api/src/com/intellij/openapi/fileTypes/MockFileTypeManager.java index e9906bd8d9a5..a89c565a7580 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileTypes/MockFileTypeManager.java +++ b/platform/platform-api/src/com/intellij/openapi/fileTypes/MockFileTypeManager.java @@ -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() { diff --git a/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.java b/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.java index 11f174ec4dd7..60f83cd52239 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.java @@ -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) { diff --git a/platform/platform-impl/src/com/intellij/openapi/fileTypes/ex/FileTypeChooser.java b/platform/platform-impl/src/com/intellij/openapi/fileTypes/ex/FileTypeChooser.java index 21505a9dd91d..1dee7280761a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileTypes/ex/FileTypeChooser.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileTypes/ex/FileTypeChooser.java @@ -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() { + @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 patterns = new LinkedList(); - 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)) { diff --git a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeManagerImpl.java index 2789a26ee8e0..f80fe3b6269a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeManagerImpl.java @@ -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); } } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/fileTypes/FileTypeManagerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/fileTypes/FileTypeManagerTest.java new file mode 100644 index 000000000000..aa50b4070c7b --- /dev/null +++ b/platform/platform-tests/testSrc/com/intellij/openapi/fileTypes/FileTypeManagerTest.java @@ -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()); + } +} diff --git a/platform/testFramework/src/com/intellij/mock/MockFileTypeManager.java b/platform/testFramework/src/com/intellij/mock/MockFileTypeManager.java index 852ea03ac1a4..9e73343781eb 100644 --- a/platform/testFramework/src/com/intellij/mock/MockFileTypeManager.java +++ b/platform/testFramework/src/com/intellij/mock/MockFileTypeManager.java @@ -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 getAssociations(@NotNull FileType type) { diff --git a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java index 84a3123ea6cf..df145e7ff9f0 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java @@ -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() { + @Override + protected void run(Result 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() { + @Override + protected void run(Result result) throws Throwable { + result.setResult(dir.createChildDirectory(null, name)); + } + }.execute().throwException().getResultObject(); + } }