cleanup
[idea/community.git] / java / java-impl / src / com / intellij / codeInsight / daemon / problems / pass / ProjectProblemFileSelectionListener.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.codeInsight.daemon.problems.pass;
3
4 import com.intellij.codeInsight.daemon.problems.FileStateUpdater;
5 import com.intellij.codeInsight.hints.InlayHintsSettings;
6 import com.intellij.injected.editor.VirtualFileWindow;
7 import com.intellij.openapi.fileEditor.*;
8 import com.intellij.openapi.project.Project;
9 import com.intellij.openapi.roots.ProjectFileIndex;
10 import com.intellij.openapi.roots.ProjectRootManager;
11 import com.intellij.openapi.startup.StartupActivity;
12 import com.intellij.openapi.vfs.VirtualFile;
13 import com.intellij.openapi.vfs.VirtualFileManager;
14 import com.intellij.openapi.vfs.newvfs.BulkFileListener;
15 import com.intellij.openapi.vfs.newvfs.events.VFileDeleteEvent;
16 import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
17 import com.intellij.psi.PsiFile;
18 import com.intellij.psi.PsiJavaFile;
19 import com.intellij.psi.PsiManager;
20 import com.intellij.util.messages.MessageBusConnection;
21 import org.jetbrains.annotations.NotNull;
22
23 import java.util.List;
24
25 import static com.intellij.codeInsight.daemon.problems.pass.ProjectProblemInlaySettingsProvider.hintsEnabled;
26 import static com.intellij.util.ObjectUtils.tryCast;
27
28 final class ProjectProblemFileSelectionListener implements FileEditorManagerListener, InlayHintsSettings.SettingsListener, BulkFileListener {
29   private final Project myProject;
30
31   private ProjectProblemFileSelectionListener(Project project) {
32     myProject = project;
33   }
34
35   @Override
36   public void selectionChanged(@NotNull FileEditorManagerEvent event) {
37     if (!hintsEnabled()) return;
38     VirtualFile oldFile = event.getOldFile();
39     VirtualFile newFile = event.getNewFile();
40     TextEditor oldEditor = tryCast(event.getOldEditor(), TextEditor.class);
41     if (oldFile == null || oldEditor == null || oldFile instanceof VirtualFileWindow || !oldFile.isValid() || oldFile.equals(newFile)) return;
42     PsiJavaFile psiJavaFile = tryCast(PsiManager.getInstance(myProject).findFile(oldFile), PsiJavaFile.class);
43     if (psiJavaFile == null) return;
44     ProjectProblemPassUtils.removeInlays(oldEditor.getEditor());
45     FileStateUpdater.setPreviousState(psiJavaFile);
46   }
47
48   @Override
49   public void before(@NotNull List<? extends VFileEvent> events) {
50     PsiManager psiManager = PsiManager.getInstance(myProject);
51     ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
52     for (VFileEvent e : events) {
53       if (!(e instanceof VFileDeleteEvent)) continue;
54       VirtualFile virtualFile = ((VFileDeleteEvent)e).getFile();
55       if (!fileIndex.isInContent(virtualFile)) continue;
56       PsiFile psiFile = psiManager.findFile(virtualFile);
57       if (psiFile == null) continue;
58       FileStateUpdater.removeState(psiFile);
59     }
60   }
61
62   @Override
63   public void settingsChanged() {
64     if (!hintsEnabled()) onHintsDisabled();
65   }
66
67   @Override
68   public void languageStatusChanged() {
69     if (!hintsEnabled()) onHintsDisabled();
70   }
71
72   @Override
73   public void globalEnabledStatusChanged(boolean newEnabled) {
74     if (!hintsEnabled()) onHintsDisabled();
75   }
76
77   private void onHintsDisabled() {
78     FileEditorManager editorManager = FileEditorManager.getInstance(myProject);
79     PsiManager psiManager = PsiManager.getInstance(myProject);
80     for (FileEditor selectedEditor : editorManager.getSelectedEditors()) {
81       TextEditor textEditor = tryCast(selectedEditor, TextEditor.class);
82       if (textEditor == null) continue;
83       VirtualFile virtualFile = selectedEditor.getFile();
84       if (virtualFile == null) continue;
85       PsiJavaFile psiJavaFile = tryCast(psiManager.findFile(virtualFile), PsiJavaFile.class);
86       if (psiJavaFile == null) continue;
87       ProjectProblemPassUtils.removeInlays(textEditor.getEditor());
88       FileStateUpdater.setPreviousState(psiJavaFile);
89     }
90   }
91
92   public static class MyStartupActivity implements StartupActivity {
93     @Override
94     public void runActivity(@NotNull Project project) {
95       ProjectProblemFileSelectionListener listener = new ProjectProblemFileSelectionListener(project);
96       MessageBusConnection connection = project.getMessageBus().connect();
97       connection.subscribe(FILE_EDITOR_MANAGER, listener);
98       connection.subscribe(InlayHintsSettings.getINLAY_SETTINGS_CHANGED(), listener);
99       connection.subscribe(VirtualFileManager.VFS_CHANGES, listener);
100     }
101   }
102 }