Example usage for com.intellij.openapi.fileTypes FileTypeListener FileTypeListener

List of usage examples for com.intellij.openapi.fileTypes FileTypeListener FileTypeListener

Introduction

In this page you can find the example usage for com.intellij.openapi.fileTypes FileTypeListener FileTypeListener.

Prototype

FileTypeListener

Source Link

Usage

From source file:com.intellij.util.indexing.FileBasedIndexImpl.java

License:Apache License

public FileBasedIndexImpl(@SuppressWarnings("UnusedParameters") VirtualFileManager vfManager,
        FileDocumentManager fdm, FileTypeManagerImpl fileTypeManager, @NotNull MessageBus bus,
        SerializationManagerEx sm) {//  w  w  w .  j  av  a 2 s  .  c o  m
    myFileDocumentManager = fdm;
    myFileTypeManager = fileTypeManager;
    mySerializationManagerEx = sm;
    myIsUnitTestMode = ApplicationManager.getApplication().isUnitTestMode();
    myConfigPath = calcConfigPath(PathManager.getConfigPath());
    myLogPath = calcConfigPath(PathManager.getLogPath());

    final MessageBusConnection connection = bus.connect();
    connection.subscribe(PsiDocumentTransactionListener.TOPIC, new PsiDocumentTransactionListener() {
        @Override
        public void transactionStarted(@NotNull final Document doc, @NotNull final PsiFile file) {
            myTransactionMap = myTransactionMap.plus(doc, file);
            myUpToDateIndicesForUnsavedOrTransactedDocuments.clear();
        }

        @Override
        public void transactionCompleted(@NotNull final Document doc, @NotNull final PsiFile file) {
            myTransactionMap = myTransactionMap.minus(doc);
        }
    });

    connection.subscribe(FileTypeManager.TOPIC, new FileTypeListener() {
        @Nullable
        private Map<FileType, Set<String>> myTypeToExtensionMap;

        @Override
        public void beforeFileTypesChanged(@NotNull final FileTypeEvent event) {
            cleanupProcessedFlag();
            myTypeToExtensionMap = new THashMap<FileType, Set<String>>();
            for (FileType type : myFileTypeManager.getRegisteredFileTypes()) {
                myTypeToExtensionMap.put(type, getExtensions(type));
            }
        }

        @Override
        public void fileTypesChanged(@NotNull final FileTypeEvent event) {
            final Map<FileType, Set<String>> oldExtensions = myTypeToExtensionMap;
            myTypeToExtensionMap = null;
            if (oldExtensions != null) {
                final Map<FileType, Set<String>> newExtensions = new THashMap<FileType, Set<String>>();
                for (FileType type : myFileTypeManager.getRegisteredFileTypes()) {
                    newExtensions.put(type, getExtensions(type));
                }
                // we are interested only in extension changes or removals.
                // addition of an extension is handled separately by RootsChanged event
                if (!newExtensions.keySet().containsAll(oldExtensions.keySet())) {
                    rebuildAllIndices();
                    return;
                }
                for (Map.Entry<FileType, Set<String>> entry : oldExtensions.entrySet()) {
                    FileType fileType = entry.getKey();
                    Set<String> strings = entry.getValue();
                    if (!newExtensions.get(fileType).containsAll(strings)) {
                        rebuildAllIndices();
                        return;
                    }
                }
            }
        }

        @NotNull
        private Set<String> getExtensions(@NotNull FileType type) {
            final Set<String> set = new THashSet<String>();
            for (FileNameMatcher matcher : myFileTypeManager.getAssociations(type)) {
                set.add(matcher.getPresentableString());
            }
            return set;
        }

        private void rebuildAllIndices() {
            IndexingStamp.flushCaches();
            for (ID<?, ?> indexId : myIndices.keySet()) {
                try {
                    clearIndex(indexId);
                } catch (StorageException e) {
                    LOG.info(e);
                }
            }
            scheduleIndexRebuild();
        }
    });

    connection.subscribe(AppTopics.FILE_DOCUMENT_SYNC, new FileDocumentManagerAdapter() {
        @Override
        public void fileContentReloaded(@NotNull VirtualFile file, @NotNull Document document) {
            cleanupMemoryStorage();
        }

        @Override
        public void unsavedDocumentsDropped() {
            cleanupMemoryStorage();
        }
    });

    ApplicationManager.getApplication().addApplicationListener(new ApplicationAdapter() {
        @Override
        public void writeActionStarted(Object action) {
            myUpToDateIndicesForUnsavedOrTransactedDocuments.clear();
        }
    });

    myChangedFilesCollector = new ChangedFilesCollector();
    myConnection = connection;
}