package com.scss.config; import com.scss.ScssLintProjectComponent; 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 ScssLintConfigFileChangeTracker { private final AtomicBoolean TRACKING = new AtomicBoolean(false); private final Project project; public static final String SCSS_LINT_YML = ".scss-lint.yml"; public ScssLintConfigFileChangeTracker(@NotNull Project project) { this.project = project; } @NotNull public static ScssLintConfigFileChangeTracker getInstance(@NotNull Project project) { return ServiceManager.getService(project, ScssLintConfigFileChangeTracker.class); } public void startIfNeeded() { if (TRACKING.compareAndSet(false, true)) ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { VirtualFileManager.getInstance().addVirtualFileListener(new ScssLintConfigFileVfsListener(), ScssLintConfigFileChangeTracker.this.project); EditorEventMulticaster multicaster = EditorFactory.getInstance().getEventMulticaster(); multicaster.addDocumentListener(new ScssLintConfigFileDocumentListener(), ScssLintConfigFileChangeTracker.this.project); } }); } }); } private void onChange(@NotNull VirtualFile file) { // if (file.getFileType().equals(ScssLintConfigFileType.INSTANCE) && !project.isDisposed()) { if (SCSS_LINT_YML.equals(file.getName()) && !project.isDisposed()) { restartCodeAnalyzerIfNeeded(); } } private void restartCodeAnalyzerIfNeeded() { ScssLintProjectComponent component = project.getComponent(ScssLintProjectComponent.class); if (component.isEnabled()) { DaemonCodeAnalyzer.getInstance(project).restart(); } } private final class ScssLintConfigFileDocumentListener extends DocumentAdapter { private ScssLintConfigFileDocumentListener() { } public void beforeDocumentChange(DocumentEvent event) { } public void documentChanged(DocumentEvent event) { VirtualFile file = FileDocumentManager.getInstance().getFile(event.getDocument()); if (file != null) { ScssLintConfigFileChangeTracker.this.onChange(file); } } } private final class ScssLintConfigFileVfsListener extends VirtualFileAdapter { private ScssLintConfigFileVfsListener() { } public void fileCreated(@NotNull VirtualFileEvent event) { ScssLintConfigFileChangeTracker.this.onChange(event.getFile()); } public void fileDeleted(@NotNull VirtualFileEvent event) { ScssLintConfigFileChangeTracker.this.onChange(event.getFile()); } public void fileMoved(@NotNull VirtualFileMoveEvent event) { ScssLintConfigFileChangeTracker.this.onChange(event.getFile()); } public void fileCopied(@NotNull VirtualFileCopyEvent event) { ScssLintConfigFileChangeTracker.this.onChange(event.getFile()); ScssLintConfigFileChangeTracker.this.onChange(event.getOriginalFile()); } } }