cbd8da60ab396642ee653013dcf0192a9773e23f
[idea/community.git] / platform / lang-impl / src / com / intellij / psi / impl / source / codeStyle / lineIndent / FormatterBasedIndentAdjuster.java
1 /*
2  * Copyright 2000-2016 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 package com.intellij.psi.impl.source.codeStyle.lineIndent;
17
18 import com.intellij.openapi.application.ApplicationManager;
19 import com.intellij.openapi.command.CommandProcessor;
20 import com.intellij.openapi.editor.Document;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.psi.PsiDocumentManager;
23 import com.intellij.psi.codeStyle.CodeStyleManager;
24 import org.jetbrains.annotations.NotNull;
25
26 public class FormatterBasedIndentAdjuster  {
27
28   private FormatterBasedIndentAdjuster() {
29   }
30
31   public static void scheduleIndentAdjustment(@NotNull Project myProject,
32                                               @NotNull Document myDocument,
33                                               int myOffset) {
34     IndentAdjusterRunnable fixer = new IndentAdjusterRunnable(myProject, myDocument, myOffset);
35     PsiDocumentManager documentManager = PsiDocumentManager.getInstance(myProject);
36     if (ApplicationManager.getApplication().isUnitTestMode()) {
37       documentManager.commitDocument(myDocument);
38       fixer.run();
39     }
40     else {
41       documentManager.performLaterWhenAllCommitted(fixer);
42     }
43   }
44   
45   public static class IndentAdjusterRunnable implements Runnable {
46     private Project myProject;
47     private int myLine;
48     private Document myDocument;
49
50     public IndentAdjusterRunnable(Project project, Document document, int offset) {
51       myProject = project;
52       myDocument = document;
53       myLine = myDocument.getLineNumber(offset);
54     }
55
56     public void run() {
57       int lineStart = myDocument.getLineStartOffset(myLine);
58       CommandProcessor.getInstance().runUndoTransparentAction(() ->
59         ApplicationManager.getApplication().runWriteAction(() -> {
60           CodeStyleManager.getInstance(myProject).adjustLineIndent(myDocument, lineStart);
61         }));
62     }
63   }
64   
65 }