diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/EditorSettings.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/EditorSettings.java index 270e36386857..1b3e776ea960 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/EditorSettings.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/EditorSettings.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor; +import com.intellij.lang.Language; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -156,4 +157,13 @@ public interface EditorSettings { boolean isShowIntentionBulb(); void setShowIntentionBulb(boolean show); + + /** + * Sets the language which determines certain editor settings (right margin and soft margins, 'wrap on reaching right margin'). + * + * @see #getRightMargin(Project) + * @see #getSoftMargins() + * @see #isWrapWhenTypingReachesRightMargin(Project) + */ + void setLanguage(@Nullable Language language); } diff --git a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.java index 3e2d091a159e..260be3831f16 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.java @@ -2,6 +2,7 @@ package com.intellij.openapi.fileEditor.impl; import com.intellij.ide.highlighter.HighlighterFactory; +import com.intellij.lang.Language; import com.intellij.openapi.Disposable; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; @@ -14,6 +15,7 @@ import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.fileEditor.*; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileEditor.ex.FileEditorWithProvider; +import com.intellij.openapi.fileEditor.impl.text.TextEditorImpl; import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider; import com.intellij.openapi.fileEditor.impl.text.TextEditorPsiDataProvider; import com.intellij.openapi.project.Project; @@ -469,6 +471,8 @@ final class TestEditorManagerImpl extends FileEditorManagerEx implements Disposa LOG.assertTrue(document != null, psiFile); editor = EditorFactory.getInstance().createEditor(document, myProject); final EditorHighlighter highlighter = HighlighterFactory.createHighlighter(myProject, file); + Language language = TextEditorImpl.getDocumentLanguage(editor); + editor.getSettings().setLanguage(language); ((EditorEx) editor).setHighlighter(highlighter); ((EditorEx) editor).setFile(file); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SettingsImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SettingsImpl.java index a3896052e18d..7cbd1120711a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SettingsImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SettingsImpl.java @@ -5,7 +5,6 @@ package com.intellij.openapi.editor.impl; import com.intellij.application.options.CodeStyle; import com.intellij.lang.Language; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.EditorKind; import com.intellij.openapi.editor.EditorSettings; import com.intellij.openapi.editor.ex.DocumentEx; @@ -31,7 +30,7 @@ public class SettingsImpl implements EditorSettings { private static final Logger LOG = Logger.getInstance(SettingsImpl.class); @Nullable private final EditorEx myEditor; - @Nullable private final Language myLanguage; + @Nullable private Language myLanguage; private Boolean myIsCamelWords; // This group of settings does not have UI @@ -89,8 +88,6 @@ public class SettingsImpl implements EditorSettings { SettingsImpl(@Nullable EditorEx editor, @Nullable Project project, @Nullable EditorKind kind) { myEditor = editor; - myLanguage = editor != null && project != null ? getDocumentLanguage(project, editor.getDocument()) : null; - if (EditorKind.CONSOLE.equals(kind)) { mySoftWrapAppliancePlace = SoftWrapAppliancePlaces.CONSOLE; } @@ -216,19 +213,6 @@ public class SettingsImpl implements EditorSettings { : CodeStyle.getProjectOrDefaultSettings(project).getRightMargin(myLanguage); } - @Nullable - private static Language getDocumentLanguage(@NotNull Project project, @NotNull Document document) { - if (!project.isDisposed()) { - PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); - PsiFile file = documentManager.getPsiFile(document); - if (file != null) return file.getLanguage(); - } - else { - LOG.warn("Attempting to get a language for document on a disposed project: " + project.getName()); - } - return null; - } - @Override public boolean isWrapWhenTypingReachesRightMargin(Project project) { if (myWrapWhenTypingReachesRightMargin != null) return myWrapWhenTypingReachesRightMargin.booleanValue(); @@ -716,4 +700,8 @@ public class SettingsImpl implements EditorSettings { public void setShowIntentionBulb(boolean show) { myShowIntentionBulb = show; } + + public void setLanguage(@Nullable Language language) { + myLanguage = language; + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorImpl.java index a9401c590a75..86f9cc206c8e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorImpl.java @@ -3,6 +3,8 @@ package com.intellij.openapi.fileEditor.impl.text; import com.intellij.codeHighlighting.BackgroundEditorHighlighter; import com.intellij.ide.structureView.StructureViewBuilder; +import com.intellij.lang.Language; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.colors.EditorColorsManager; @@ -18,7 +20,10 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.Navigatable; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import javax.swing.*; @@ -33,6 +38,8 @@ import java.util.concurrent.TimeoutException; * @author Vladimir Kondratyev */ public class TextEditorImpl extends UserDataHolderBase implements TextEditor { + private static final Logger LOG = Logger.getInstance(TextEditorImpl.class); + private static final Key TRANSIENT_EDITOR_STATE_KEY = Key.create("transientState"); protected final Project myProject; @@ -65,7 +72,26 @@ public class TextEditorImpl extends UserDataHolderBase implements TextEditor { EditorHighlighter highlighter = EditorHighlighterFactory.getInstance().createEditorHighlighter(myFile, scheme, myProject); EditorEx editor = (EditorEx)getEditor(); highlighter.setText(editor.getDocument().getImmutableCharSequence()); - return () -> editor.setHighlighter(highlighter); + Language language = getDocumentLanguage(editor); + return () -> { + editor.getSettings().setLanguage(language); + editor.setHighlighter(highlighter); + }; + } + + @Nullable + public static Language getDocumentLanguage(@NotNull Editor editor) { + Project project = editor.getProject(); + LOG.assertTrue(project != null); + if (!project.isDisposed()) { + PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); + PsiFile file = documentManager.getPsiFile(editor.getDocument()); + if (file != null) return file.getLanguage(); + } + else { + LOG.warn("Attempting to get a language for document on a disposed project: " + project.getName()); + } + return null; } @NotNull