483d6f17c2363d75f6ddf95199f9c28078673a23
[idea/community.git] / platform / lang-impl / src / com / intellij / codeInsight / daemon / impl / ErrorStripeUpdateManager.java
1 // Copyright 2000-2019 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.impl;
3
4 import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
5 import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings;
6 import com.intellij.openapi.application.ApplicationManager;
7 import com.intellij.openapi.components.ServiceManager;
8 import com.intellij.openapi.editor.Editor;
9 import com.intellij.openapi.editor.ex.EditorMarkupModel;
10 import com.intellij.openapi.editor.ex.ErrorStripTooltipRendererProvider;
11 import com.intellij.openapi.editor.impl.EditorMarkupModelImpl;
12 import com.intellij.openapi.editor.markup.ErrorStripeRenderer;
13 import com.intellij.openapi.project.Project;
14 import com.intellij.psi.PsiDocumentManager;
15 import com.intellij.psi.PsiFile;
16 import org.jetbrains.annotations.NotNull;
17 import org.jetbrains.annotations.Nullable;
18
19 public class ErrorStripeUpdateManager {
20   public static ErrorStripeUpdateManager getInstance(Project project) {
21     return ServiceManager.getService(project, ErrorStripeUpdateManager.class);
22   }
23
24   private final Project myProject;
25   private final PsiDocumentManager myPsiDocumentManager;
26
27   public ErrorStripeUpdateManager(Project project) {
28     myProject = project;
29     myPsiDocumentManager = PsiDocumentManager.getInstance(myProject);
30   }
31
32   @SuppressWarnings("WeakerAccess") // Used in Rider
33   public void repaintErrorStripePanel(@NotNull Editor editor) {
34     ApplicationManager.getApplication().assertIsDispatchThread();
35     if (!myProject.isInitialized()) return;
36
37     PsiFile file = myPsiDocumentManager.getPsiFile(editor.getDocument());
38     final EditorMarkupModel markup = (EditorMarkupModel) editor.getMarkupModel();
39     markup.setErrorPanelPopupHandler(new DaemonEditorPopup(myProject, editor));
40     markup.setErrorStripTooltipRendererProvider(createTooltipRenderer(editor));
41     markup.setMinMarkHeight(DaemonCodeAnalyzerSettings.getInstance().getErrorStripeMarkMinHeight());
42     setOrRefreshErrorStripeRenderer(markup, file);
43   }
44
45   @SuppressWarnings("WeakerAccess") // Used in Rider
46   protected void setOrRefreshErrorStripeRenderer(@NotNull EditorMarkupModel editorMarkupModel, @Nullable PsiFile file) {
47     ApplicationManager.getApplication().assertIsDispatchThread();
48     if (!editorMarkupModel.isErrorStripeVisible() || !DaemonCodeAnalyzer.getInstance(myProject).isHighlightingAvailable(file)) {
49       return;
50     }
51     ErrorStripeRenderer renderer = editorMarkupModel.getErrorStripeRenderer();
52     if (renderer instanceof TrafficLightRenderer) {
53       TrafficLightRenderer tlr = (TrafficLightRenderer) renderer;
54       EditorMarkupModelImpl markupModelImpl = (EditorMarkupModelImpl) editorMarkupModel;
55       tlr.refresh(markupModelImpl);
56       markupModelImpl.repaintTrafficLightIcon();
57       if (tlr.isValid()) return;
58     }
59     Editor editor = editorMarkupModel.getEditor();
60     if (editor.isDisposed()) return;
61
62     editorMarkupModel.setErrorStripeRenderer(createRenderer(editor, file));
63   }
64
65   @NotNull
66   private ErrorStripTooltipRendererProvider createTooltipRenderer(Editor editor) {
67     return new DaemonTooltipRendererProvider(myProject, editor);
68   }
69
70   @Nullable
71   protected TrafficLightRenderer createRenderer(@NotNull Editor editor, @Nullable PsiFile file) {
72     for (TrafficLightRendererContributor contributor : TrafficLightRendererContributor.EP_NAME.getExtensionList()) {
73       TrafficLightRenderer renderer = contributor.createRenderer(editor, file);
74       if (renderer != null) {
75         return renderer;
76       }
77     }
78     return new TrafficLightRenderer(myProject, editor.getDocument());
79   }
80 }