IDEA-252890 event `pluginUnloaded` should be fired after `forbidGettingServicesToken...
[idea/community.git] / platform / editor-ui-ex / src / com / intellij / openapi / editor / impl / DocumentMarkupModelManager.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.openapi.editor.impl;
3
4 import com.intellij.openapi.components.Service;
5 import com.intellij.openapi.diagnostic.Logger;
6 import com.intellij.openapi.editor.Document;
7 import com.intellij.openapi.project.Project;
8 import com.intellij.openapi.util.Disposer;
9 import com.intellij.util.containers.WeakList;
10 import org.jetbrains.annotations.NotNull;
11
12 @Service
13 public final class DocumentMarkupModelManager {
14   private static final Logger LOG = Logger.getInstance(DocumentMarkupModelManager.class);
15
16   private final WeakList<Document> myDocumentSet = new WeakList<>();
17   private volatile boolean myDisposed;
18
19   public static DocumentMarkupModelManager getInstance(@NotNull Project project) {
20     return project.getService(DocumentMarkupModelManager.class);
21   }
22
23   public DocumentMarkupModelManager(@NotNull Project project) {
24     Disposer.register(project, () -> cleanupProjectMarkups(project));
25   }
26
27   public void registerDocument(Document document) {
28     LOG.assertTrue(!myDisposed);
29     myDocumentSet.add(document);
30   }
31
32   public boolean isDisposed() {
33     return myDisposed;
34   }
35
36   private void cleanupProjectMarkups(@NotNull Project project) {
37     if (!myDisposed) {
38       myDisposed = true;
39       for (Document document : myDocumentSet.toStrongList()) {
40         DocumentMarkupModel.removeMarkupModel(document, project);
41       }
42     }
43   }
44 }