List of usage examples for com.intellij.openapi.fileTypes FileTypeListener FileTypeListener
FileTypeListener
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; }