package com.eslint.config;
import com.eslint.ESLintProjectComponent;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.event.DocumentAdapter;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.event.EditorEventMulticaster;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.*;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.atomic.AtomicBoolean;
public class ESLintConfigFileListener {
private final Project project;
private final AtomicBoolean LISTENING = new AtomicBoolean(false);
public ESLintConfigFileListener(@NotNull Project project) {
this.project = project;
}
private void startListener() {
if (LISTENING.compareAndSet(false, true))
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
public void run() {
VirtualFileManager.getInstance().addVirtualFileListener(new ESLintConfigFileVfsListener(), ESLintConfigFileListener.this.project);
EditorEventMulticaster multicaster = EditorFactory.getInstance().getEventMulticaster();
multicaster.addDocumentListener(new ESLintConfigFileDocumentListener(), ESLintConfigFileListener.this.project);
}
});
}
});
}
public static void start(@NotNull Project project) {
ESLintConfigFileListener listener = ServiceManager.getService(project, ESLintConfigFileListener.class);
listener.startListener();
}
private void fileChanged(@NotNull VirtualFile file) {
if (ESLintConfigFileUtil.isESLintConfigFile(file) && !project.isDisposed()) {
restartAnalyzer();
}
}
private void restartAnalyzer() {
ESLintProjectComponent component = project.getComponent(ESLintProjectComponent.class);
if (component.isEnabled()) {
DaemonCodeAnalyzer.getInstance(project).restart();
}
}
/**
* VFS Listener
*/
private class ESLintConfigFileVfsListener extends VirtualFileAdapter {
private ESLintConfigFileVfsListener() {
}
public void fileCreated(@NotNull VirtualFileEvent event) {
ESLintConfigFileListener.this.fileChanged(event.getFile());
}
public void fileDeleted(@NotNull VirtualFileEvent event) {
ESLintConfigFileListener.this.fileChanged(event.getFile());
}
public void fileMoved(@NotNull VirtualFileMoveEvent event) {
ESLintConfigFileListener.this.fileChanged(event.getFile());
}
public void fileCopied(@NotNull VirtualFileCopyEvent event) {
ESLintConfigFileListener.this.fileChanged(event.getFile());
ESLintConfigFileListener.this.fileChanged(event.getOriginalFile());
}
}
/**
* Document Listener
*/
private class ESLintConfigFileDocumentListener extends DocumentAdapter {
private ESLintConfigFileDocumentListener() {
}
public void documentChanged(DocumentEvent event) {
VirtualFile file = FileDocumentManager.getInstance().getFile(event.getDocument());
if (file != null) {
ESLintConfigFileListener.this.fileChanged(file);
}
}
}
}