blob: d9be7105a6383a15ebfe4c536311a22bf30162c6 [file] [log] [blame]
/*
* Copyright 2000-2014 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.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;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.fileTypes.FileNameMatcherFactory;
import java.util.ArrayList;
import java.util.List;
/**
* Manages the relationship between filenames and {@link FileType} instances.
*/
public abstract class FileTypeManager extends FileTypeRegistry {
static {
FileTypeRegistry.ourInstanceGetter = new Getter<FileTypeRegistry>() {
@Override
public FileTypeRegistry get() {
return FileTypeManager.getInstance();
}
};
}
private static FileTypeManager ourInstance = CachedSingletonsRegistry.markCachedField(FileTypeManager.class);
@NotNull
public static final Topic<FileTypeListener> TOPIC = new Topic<FileTypeListener>("File types change", FileTypeListener.class);
/**
* Returns the singleton instance of the FileTypeManager component.
*
* @return the instance of FileTypeManager
*/
public static FileTypeManager getInstance() {
FileTypeManager instance = ourInstance;
if (instance == null) {
Application app = ApplicationManager.getApplication();
ourInstance = instance = app != null ? app.getComponent(FileTypeManager.class) : new MockFileTypeManager();
}
return instance;
}
/**
* @deprecated use {@link com.intellij.openapi.fileTypes.FileTypeFactory} instead
*/
public abstract void registerFileType(@NotNull FileType type, @NotNull List<FileNameMatcher> defaultAssociations);
/**
* Registers a file type.
*
* @param type The file type to register.
* @param defaultAssociatedExtensions The list of extensions which cause the file to be
* treated as the specified file type. The extensions should not start with '.'.
* @deprecated use {@link com.intellij.openapi.fileTypes.FileTypeFactory} instead
*/
public final void registerFileType(@NotNull FileType type, @NonNls @Nullable String... defaultAssociatedExtensions) {
List<FileNameMatcher> matchers = new ArrayList<FileNameMatcher>();
if (defaultAssociatedExtensions != null) {
for (String extension : defaultAssociatedExtensions) {
matchers.add(new ExtensionFileNameMatcher(extension));
}
}
registerFileType(type, matchers);
}
/**
* Checks if the specified file is ignored by IDEA. Ignored files are not visible in
* different project views and cannot be opened in the editor. They will neither be parsed nor compiled.
*
* @param name The name of the file to check.
* @return true if the file is ignored, false otherwise.
*/
public abstract boolean isFileIgnored(@NonNls @NotNull String name);
/**
* Returns the list of extensions associated with the specified file type.
*
* @param type The file type for which the extensions are requested.
* @return The array of extensions associated with the file type.
* @deprecated since more generic way of associations by means of wildcards exist not every associations matches extension paradigm
*/
@NotNull
public abstract String[] getAssociatedExtensions(@NotNull FileType type);
@NotNull
public abstract List<FileNameMatcher> getAssociations(@NotNull FileType type);
public abstract boolean isFileOfType(@NotNull VirtualFile file, @NotNull FileType type);
/**
* Adds a listener for receiving notifications about changes in the list of
* registered file types.
*
* @param listener The listener instance.
* @deprecated Subscribe to #TOPIC on any message bus level.
*/
public abstract void addFileTypeListener(@NotNull FileTypeListener listener);
/**
* Removes a listener for receiving notifications about changes in the list of
* registered file types.
*
* @param listener The listener instance.
* @deprecated Subscribe to #TOPIC on any message bus level.
*/
public abstract void removeFileTypeListener(@NotNull FileTypeListener listener);
/**
* If fileName is already associated with any known file type returns it.
* Otherwise asks user to select file type and associates it with fileName extension if any selected.
*
* @param file - a file to ask for file type association
* @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
* which are excluded from the project structure though they may be present
* physically on the HD.
*
* @return Semicolon-delimited list of patterns.
*/
@NotNull
public abstract String getIgnoredFilesList();
/**
* Sets new list of semicolon-delimited patterns for files and folders which
* are excluded from the project structure.
*
* @param list List of semicolon-delimited patterns.
*/
public abstract void setIgnoredFilesList(@NotNull String list);
/**
* Adds an extension to the list of extensions associated with a file type.
*
* @param type the file type to associate the extension with.
* @param extension the extension to associate.
* @since 5.0.2
*/
public final void associateExtension(@NotNull FileType type, @NotNull @NonNls String extension) {
associate(type, new ExtensionFileNameMatcher(extension));
}
public final void associatePattern(@NotNull FileType type, @NotNull @NonNls String pattern) {
associate(type, parseFromString(pattern));
}
public abstract void associate(@NotNull FileType type, @NotNull FileNameMatcher matcher);
/**
* Removes an extension from the list of extensions associated with a file type.
*
* @param type the file type to remove the extension from.
* @param extension the extension to remove.
* @since 5.0.2
*/
public final void removeAssociatedExtension(@NotNull FileType type, @NotNull @NonNls String extension) {
removeAssociation(type, new ExtensionFileNameMatcher(extension));
}
public abstract void removeAssociation(@NotNull FileType type, @NotNull FileNameMatcher matcher);
@NotNull
public static FileNameMatcher parseFromString(@NotNull String pattern) {
return FileNameMatcherFactory.getInstance().createMatcher(pattern);
}
@NotNull
public abstract FileType getStdFileType(@NotNull @NonNls String fileTypeName);
}