mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-240653 Doc Rendering per editor
GitOrigin-RevId: a9d4611493edfdecd775de30ebb27f08622a6be2
This commit is contained in:
committed by
intellij-monorepo-bot
parent
ce7dae26b1
commit
2601a01c7e
+1
-1
@@ -127,7 +127,7 @@ public class JavaDocRenderTest extends AbstractEditorTest {
|
||||
}
|
||||
|
||||
private void updateRenderedItems(boolean collapseNewRegions) {
|
||||
DocRenderPassFactory.Items items = DocRenderPassFactory.calculateItemsToRender(getEditor().getDocument(), getFile());
|
||||
DocRenderPassFactory.Items items = DocRenderPassFactory.calculateItemsToRender(getEditor(), getFile());
|
||||
DocRenderPassFactory.applyItemsToRender(getEditor(), getProject(), items, collapseNewRegions);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -2,7 +2,7 @@
|
||||
package com.intellij.application.options.editor
|
||||
|
||||
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings
|
||||
import com.intellij.codeInsight.documentation.render.DocRenderItem
|
||||
import com.intellij.codeInsight.documentation.render.DocRenderManager
|
||||
import com.intellij.ide.IdeBundle
|
||||
import com.intellij.ide.ui.LafManager
|
||||
import com.intellij.ide.ui.UISettings
|
||||
@@ -121,7 +121,7 @@ class EditorAppearanceConfigurable : BoundCompositeSearchableConfigurable<Unname
|
||||
uiSettings.fireUISettingsChanged()
|
||||
}
|
||||
if (docRenderingEnabled != EditorSettingsExternalizable.getInstance().isDocCommentRenderingEnabled) {
|
||||
DocRenderItem.resetAllToDefaultState()
|
||||
DocRenderManager.resetAllEditorsToDefaultState()
|
||||
}
|
||||
|
||||
EditorOptionsPanel.restartDaemons()
|
||||
|
||||
@@ -3,7 +3,7 @@ package com.intellij.codeInsight.actions
|
||||
|
||||
import com.intellij.codeInsight.daemon.impl.analysis.FileHighlightingSetting
|
||||
import com.intellij.codeInsight.daemon.impl.analysis.HighlightLevelUtil
|
||||
import com.intellij.codeInsight.documentation.render.DocRenderItem
|
||||
import com.intellij.codeInsight.documentation.render.DocRenderManager
|
||||
import com.intellij.codeInsight.hints.InlayHintsPassFactory
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.editor.Editor
|
||||
@@ -70,16 +70,8 @@ class FontReaderModeProvider : ReaderModeProvider {
|
||||
|
||||
class DocsRenderingReaderModeProvider : ReaderModeProvider {
|
||||
override fun applyModeChanged(project: Project, editor: Editor, readerMode: Boolean) {
|
||||
if (readerMode) {
|
||||
if (ReaderModeSettings.instance(project).showRenderedDocs) {
|
||||
EditorSettingsExternalizable.getInstance().isDocCommentRenderingEnabled = true
|
||||
}
|
||||
}
|
||||
else {
|
||||
EditorSettingsExternalizable.getInstance().isDocCommentRenderingEnabled = false
|
||||
}
|
||||
DocRenderManager.setDocRenderingEnabled(editor, if (readerMode) ReaderModeSettings.instance(project).showRenderedDocs else null)
|
||||
|
||||
DocRenderItem.resetToDefaultEditorState(editor)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
-26
@@ -2,7 +2,6 @@
|
||||
package com.intellij.codeInsight.documentation.render;
|
||||
|
||||
import com.intellij.codeInsight.CodeInsightBundle;
|
||||
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
|
||||
import com.intellij.codeInsight.documentation.DocFontSizePopup;
|
||||
import com.intellij.icons.AllIcons;
|
||||
import com.intellij.ide.HelpTooltip;
|
||||
@@ -16,7 +15,6 @@ import com.intellij.openapi.editor.*;
|
||||
import com.intellij.openapi.editor.colors.EditorColorsManager;
|
||||
import com.intellij.openapi.editor.event.*;
|
||||
import com.intellij.openapi.editor.ex.EditorEx;
|
||||
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
|
||||
import com.intellij.openapi.editor.ex.FoldingModelEx;
|
||||
import com.intellij.openapi.editor.ex.util.EditorScrollingPositionKeeper;
|
||||
import com.intellij.openapi.editor.impl.EditorImpl;
|
||||
@@ -28,7 +26,6 @@ import com.intellij.openapi.keymap.KeymapUtil;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.DumbAwareAction;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.project.ProjectManager;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
@@ -50,8 +47,8 @@ import org.jetbrains.annotations.Nullable;
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.function.BooleanSupplier;
|
||||
|
||||
public class DocRenderItem {
|
||||
@@ -201,15 +198,15 @@ public class DocRenderItem {
|
||||
}).findFirst().orElse(null);
|
||||
}
|
||||
|
||||
private static void resetToDefaultState(@NotNull Editor editor) {
|
||||
static void resetToDefaultState(@NotNull Editor editor) {
|
||||
Collection<DocRenderItem> items = editor.getUserData(OUR_ITEMS);
|
||||
if (items == null) return;
|
||||
boolean globalSetting = EditorSettingsExternalizable.getInstance().isDocCommentRenderingEnabled();
|
||||
boolean editorSetting = DocRenderManager.isDocRenderingEnabled(editor);
|
||||
keepScrollingPositionWhile(editor, () -> {
|
||||
List<Runnable> foldingTasks = new ArrayList<>();
|
||||
boolean updated = false;
|
||||
for (DocRenderItem item : items) {
|
||||
if (item.isValid() && (item.inlay == null) == globalSetting) {
|
||||
if (item.isValid() && (item.inlay == null) == editorSetting) {
|
||||
updated |= item.toggle(foldingTasks);
|
||||
}
|
||||
}
|
||||
@@ -218,24 +215,6 @@ public class DocRenderItem {
|
||||
});
|
||||
}
|
||||
|
||||
public static void resetToDefaultEditorState(@NotNull Editor editor) {
|
||||
resetToDefaultState(editor);
|
||||
DocRenderPassFactory.forceRefreshOnNextPass(editor);
|
||||
for (Project project : ProjectManager.getInstance().getOpenProjects()) {
|
||||
DaemonCodeAnalyzer.getInstance(project).restart();
|
||||
}
|
||||
}
|
||||
|
||||
public static void resetAllToDefaultState() {
|
||||
for (Editor editor : EditorFactory.getInstance().getAllEditors()) {
|
||||
resetToDefaultState(editor);
|
||||
DocRenderPassFactory.forceRefreshOnNextPass(editor);
|
||||
}
|
||||
for (Project project : ProjectManager.getInstance().getOpenProjects()) {
|
||||
DaemonCodeAnalyzer.getInstance(project).restart();
|
||||
}
|
||||
}
|
||||
|
||||
public static EditorCustomElementRenderer createDemoRenderer(@NotNull Editor editor) {
|
||||
DocRenderItem item = new DocRenderItem(editor, new TextRange(0, 0), "Rendered documentation with <a href='''>link</a>");
|
||||
return new DocRenderer(item);
|
||||
@@ -320,7 +299,7 @@ public class DocRenderItem {
|
||||
}
|
||||
Disposer.dispose(inlay);
|
||||
inlay = null;
|
||||
if (!EditorSettingsExternalizable.getInstance().isDocCommentRenderingEnabled()) {
|
||||
if (!DocRenderManager.isDocRenderingEnabled(editor)) {
|
||||
// the value won't be updated by DocRenderPass on document modification, so we shouldn't cache the value
|
||||
textToRender = null;
|
||||
}
|
||||
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
// Copyright 2000-2020 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.
|
||||
package com.intellij.codeInsight.documentation.render;
|
||||
|
||||
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.EditorFactory;
|
||||
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.project.ProjectManager;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class DocRenderManager {
|
||||
private static final Key<Boolean> DOC_RENDER_ENABLED = Key.create("doc.render.enabled");
|
||||
|
||||
/**
|
||||
* Allows to override global doc comments rendering setting for a specific editor. Passing {@code null} as {@code value} makes editor use
|
||||
* the global setting again.
|
||||
*/
|
||||
public static void setDocRenderingEnabled(@NotNull Editor editor, @Nullable Boolean value) {
|
||||
ApplicationManager.getApplication().assertIsDispatchThread();
|
||||
boolean enabledBefore = isDocRenderingEnabled(editor);
|
||||
editor.putUserData(DOC_RENDER_ENABLED, value);
|
||||
boolean enabledAfter = isDocRenderingEnabled(editor);
|
||||
if (enabledAfter != enabledBefore) {
|
||||
resetEditorToDefaultState(editor);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells whether doc comment rendering is enabled for a specific editor.
|
||||
*
|
||||
* @see #setDocRenderingEnabled(Editor, Boolean)
|
||||
*/
|
||||
public static boolean isDocRenderingEnabled(@NotNull Editor editor) {
|
||||
Boolean value = editor.getUserData(DOC_RENDER_ENABLED);
|
||||
return value == null ? EditorSettingsExternalizable.getInstance().isDocCommentRenderingEnabled() : value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets all doc comments to their default state (rendered or not rendered) for all opened editors.
|
||||
*
|
||||
* @see #isDocRenderingEnabled(Editor)
|
||||
*/
|
||||
public static void resetAllEditorsToDefaultState() {
|
||||
ApplicationManager.getApplication().assertIsDispatchThread();
|
||||
for (Editor editor : EditorFactory.getInstance().getAllEditors()) {
|
||||
DocRenderItem.resetToDefaultState(editor);
|
||||
DocRenderPassFactory.forceRefreshOnNextPass(editor);
|
||||
}
|
||||
for (Project project : ProjectManager.getInstance().getOpenProjects()) {
|
||||
DaemonCodeAnalyzer.getInstance(project).restart();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets all doc comments to their default state (rendered or not rendered) in the specified editor.
|
||||
*
|
||||
* @see #isDocRenderingEnabled(Editor)
|
||||
*/
|
||||
public static void resetEditorToDefaultState(@NotNull Editor editor) {
|
||||
ApplicationManager.getApplication().assertIsDispatchThread();
|
||||
DocRenderItem.resetToDefaultState(editor);
|
||||
DocRenderPassFactory.forceRefreshOnNextPass(editor);
|
||||
Project project = editor.getProject();
|
||||
if (project != null) {
|
||||
DaemonCodeAnalyzer.getInstance(project).restart();
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -8,7 +8,6 @@ import com.intellij.codeInsight.documentation.DocumentationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
|
||||
import com.intellij.openapi.progress.ProgressIndicator;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.IndexNotReadyException;
|
||||
@@ -61,7 +60,7 @@ public class DocRenderPassFactory implements TextEditorHighlightingPassFactoryRe
|
||||
|
||||
@Override
|
||||
public void doCollectInformation(@NotNull ProgressIndicator progress) {
|
||||
items = calculateItemsToRender(myDocument, myFile);
|
||||
items = calculateItemsToRender(myEditor, myFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -71,8 +70,9 @@ public class DocRenderPassFactory implements TextEditorHighlightingPassFactoryRe
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static Items calculateItemsToRender(@NotNull Document document, @NotNull PsiFile psiFile) {
|
||||
boolean enabled = EditorSettingsExternalizable.getInstance().isDocCommentRenderingEnabled();
|
||||
public static Items calculateItemsToRender(@NotNull Editor editor, @NotNull PsiFile psiFile) {
|
||||
boolean enabled = DocRenderManager.isDocRenderingEnabled(editor);
|
||||
Document document = editor.getDocument();
|
||||
Items items = new Items();
|
||||
DocumentationManager.getProviderFromElement(psiFile).collectDocComments(psiFile, comment -> {
|
||||
TextRange range = comment.getTextRange();
|
||||
|
||||
+1
-1
@@ -16,6 +16,6 @@ public class ToggleRenderAllDocs extends ToggleAction implements DumbAware {
|
||||
@Override
|
||||
public void setSelected(@NotNull AnActionEvent e, boolean state) {
|
||||
EditorSettingsExternalizable.getInstance().setDocCommentRenderingEnabled(state);
|
||||
DocRenderItem.resetAllToDefaultState();
|
||||
DocRenderManager.resetAllEditorsToDefaultState();
|
||||
}
|
||||
}
|
||||
|
||||
+5
-6
@@ -9,6 +9,7 @@ import com.intellij.codeHighlighting.BackgroundEditorHighlighter;
|
||||
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
|
||||
import com.intellij.codeInsight.daemon.impl.TextEditorBackgroundHighlighter;
|
||||
import com.intellij.codeInsight.daemon.impl.focusMode.FocusModePassFactory;
|
||||
import com.intellij.codeInsight.documentation.render.DocRenderManager;
|
||||
import com.intellij.codeInsight.documentation.render.DocRenderPassFactory;
|
||||
import com.intellij.codeInsight.folding.CodeFoldingManager;
|
||||
import com.intellij.codeInsight.lookup.LookupManager;
|
||||
@@ -18,7 +19,6 @@ import com.intellij.openapi.actionSystem.LangDataKeys;
|
||||
import com.intellij.openapi.actionSystem.PlatformDataKeys;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
|
||||
import com.intellij.openapi.editor.impl.EditorImpl;
|
||||
import com.intellij.openapi.fileEditor.FileDocumentManager;
|
||||
import com.intellij.openapi.module.ModuleUtilCore;
|
||||
@@ -54,14 +54,13 @@ public class PsiAwareTextEditorImpl extends TextEditorImpl {
|
||||
|
||||
List<? extends Segment> focusZones = FocusModePassFactory.calcFocusZones(psiFile);
|
||||
|
||||
DocRenderPassFactory.Items items =
|
||||
document != null && psiFile != null && EditorSettingsExternalizable.getInstance().isDocCommentRenderingEnabled()
|
||||
? DocRenderPassFactory.calculateItemsToRender(document, psiFile)
|
||||
: null;
|
||||
Editor editor = getEditor();
|
||||
DocRenderPassFactory.Items items = document != null && psiFile != null && DocRenderManager.isDocRenderingEnabled(getEditor())
|
||||
? DocRenderPassFactory.calculateItemsToRender(editor, psiFile)
|
||||
: null;
|
||||
|
||||
return () -> {
|
||||
baseResult.run();
|
||||
Editor editor = getEditor();
|
||||
|
||||
if (foldingState != null) {
|
||||
foldingState.setToEditor(editor);
|
||||
|
||||
Reference in New Issue
Block a user