OC-9609 broken based on AST-tree folding at project opening +review CR-OC-1561
[idea/community.git] / platform / lang-impl / src / com / intellij / codeInsight / daemon / impl / CodeFoldingPass.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.codeInsight.daemon.impl;
18
19 import com.intellij.codeHighlighting.TextEditorHighlightingPass;
20 import com.intellij.codeInsight.folding.CodeFoldingManager;
21 import com.intellij.lang.injection.InjectedLanguageManager;
22 import com.intellij.openapi.editor.Editor;
23 import com.intellij.openapi.editor.ex.util.EditorUtil;
24 import com.intellij.openapi.progress.ProgressIndicator;
25 import com.intellij.openapi.project.IndexNotReadyException;
26 import com.intellij.openapi.project.PossiblyDumbAware;
27 import com.intellij.openapi.project.Project;
28 import com.intellij.openapi.util.Key;
29 import com.intellij.psi.PsiFile;
30 import org.jetbrains.annotations.NotNull;
31
32 class CodeFoldingPass extends TextEditorHighlightingPass implements PossiblyDumbAware {
33   private static final Key<Boolean> THE_FIRST_TIME = Key.create("FirstFoldingPass");
34   private Runnable myRunnable;
35   private final Editor myEditor;
36   private final PsiFile myFile;
37
38   CodeFoldingPass(@NotNull Project project, @NotNull Editor editor, @NotNull PsiFile file) {
39     super(project, editor.getDocument(), false);
40     myEditor = editor;
41     myFile = file;
42   }
43
44   @Override
45   public void doCollectInformation(@NotNull ProgressIndicator progress) {
46     final boolean firstTime = isFirstTime(myFile, myEditor, THE_FIRST_TIME);
47     Runnable runnable = CodeFoldingManager.getInstance(myProject).updateFoldRegionsAsync(myEditor, firstTime);
48     synchronized (this) {
49       myRunnable = runnable;
50     }
51   }
52
53   static boolean isFirstTime(PsiFile file, Editor editor, Key<Boolean> key) {
54     return file.getUserData(key) == null || editor.getUserData(key) == null;
55   }
56
57   static void clearFirstTimeFlag(PsiFile file, Editor editor, Key<Boolean> key) {
58     file.putUserData(key, Boolean.FALSE);
59     editor.putUserData(key, Boolean.FALSE);
60   }
61
62   @Override
63   public void doApplyInformationToEditor() {
64     Runnable runnable;
65     synchronized (this) {
66       runnable = myRunnable;
67     }
68     if (runnable != null){
69       try {
70         runnable.run();
71       }
72       catch (IndexNotReadyException ignored) {
73       }
74     }
75
76     if (InjectedLanguageManager.getInstance(myFile.getProject()).getTopLevelFile(myFile) == myFile) {
77       clearFirstTimeFlag(myFile, myEditor, THE_FIRST_TIME);
78     }
79   }
80
81   /**
82    * Checks the ability to update folding in the Dumb Mode. True by default.
83    * @return true if the language implementation can update folding ranges
84    */
85   @Override
86   public boolean isDumbAware() {
87     return EditorUtil.supportsDumbModeFolding(myEditor);
88   }
89 }