package com.coffeelint.config;
import com.coffeelint.CoffeeLintProjectComponent;
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 CoffeeLintConfigFileListener {
private final Project project;
private final AtomicBoolean LISTENING = new AtomicBoolean(false);
public CoffeeLintConfigFileListener(@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 CoffeeLintConfigFileVfsListener(), CoffeeLintConfigFileListener.this.project);
EditorEventMulticaster multicaster = EditorFactory.getInstance().getEventMulticaster();
multicaster.addDocumentListener(new CoffeeLintConfigFileDocumentListener(), CoffeeLintConfigFileListener.this.project);
}
});
}
});
}
public static void start(@NotNull Project project) {
CoffeeLintConfigFileListener listener = ServiceManager.getService(project, CoffeeLintConfigFileListener.class);
listener.startListener();
}
private void fileChanged(@NotNull VirtualFile file) {
if (CoffeeLintConfigFileUtil.isCoffeeLintConfigFile(file) && !project.isDisposed()) {
restartAnalyzer();
}
}
private void restartAnalyzer() {
CoffeeLintProjectComponent component = project.getComponent(CoffeeLintProjectComponent.class);
if (component.isEnabled()) {
DaemonCodeAnalyzer.getInstance(project).restart();
}
}
/**
* VFS Listener
*/
private class CoffeeLintConfigFileVfsListener extends VirtualFileAdapter {
private CoffeeLintConfigFileVfsListener() {
}
public void fileCreated(@NotNull VirtualFileEvent event) {
CoffeeLintConfigFileListener.this.fileChanged(event.getFile());
}
public void fileDeleted(@NotNull VirtualFileEvent event) {
CoffeeLintConfigFileListener.this.fileChanged(event.getFile());
}
public void fileMoved(@NotNull VirtualFileMoveEvent event) {
CoffeeLintConfigFileListener.this.fileChanged(event.getFile());
}
public void fileCopied(@NotNull VirtualFileCopyEvent event) {
CoffeeLintConfigFileListener.this.fileChanged(event.getFile());
// CoffeeLintConfigFileListener.this.fileChanged(event.getOriginalFile());
}
}
/**
* Document Listener
*/
private class CoffeeLintConfigFileDocumentListener extends DocumentAdapter {
private CoffeeLintConfigFileDocumentListener() {
}
public void documentChanged(DocumentEvent event) {
VirtualFile file = FileDocumentManager.getInstance().getFile(event.getDocument());
if (file != null) {
CoffeeLintConfigFileListener.this.fileChanged(file);
}
}
}
}