From cfe69a2dc44df76883557c8d80322b0df0b648ef Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 23 Jul 2019 12:13:36 +0300 Subject: [PATCH] IDEA-204308 Multiline TODO popup interferes with editing the TODO redo the fix - bring back popup when hovering over scrollbar GitOrigin-RevId: e622939ab06688230cc0db16d52bd93d940cfc01 --- .../daemon/impl/GeneralHighlightingPass.java | 11 ++++++++--- .../daemon/impl/DaemonCodeAnalyzerImpl.java | 2 +- .../openapi/editor/impl/EditorMarkupModelImpl.java | 12 ++++++++---- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java index 5a6a3abc7033..6df3810d0843 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java @@ -27,6 +27,7 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.problems.Problem; import com.intellij.problems.WolfTheProblemSolver; @@ -42,6 +43,7 @@ import com.intellij.util.concurrency.EdtExecutorService; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.JBIterable; import com.intellij.util.containers.Stack; +import com.intellij.xml.util.XmlStringUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -486,14 +488,16 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP range -> joiner.add(text.subSequence(range.getStartOffset(), range.getEndOffset())) ); String description = joiner.toString(); + String tooltip = XmlStringUtil.escapeString(StringUtil.shortenPathWithEllipsis(description, 1024)).replace("\n", "
"); TextAttributes attributes = todoItem.getPattern().getAttributes().getTextAttributes(); - addTodoItem(startOffset, endOffset, priorityRange, insideResult, outsideResult, attributes, description, textRange); + addTodoItem(startOffset, endOffset, priorityRange, insideResult, outsideResult, attributes, description, tooltip, textRange); if (!additionalRanges.isEmpty()) { TextAttributes attributesForAdditionalLines = attributes.clone(); attributesForAdditionalLines.setErrorStripeColor(null); for (TextRange range: additionalRanges) { - addTodoItem(startOffset, endOffset, priorityRange, insideResult, outsideResult, attributesForAdditionalLines, description, range); + addTodoItem(startOffset, endOffset, priorityRange, insideResult, outsideResult, attributesForAdditionalLines, description, + tooltip, range); } } } @@ -505,12 +509,13 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP @NotNull Collection insideResult, @NotNull Collection outsideResult, @NotNull TextAttributes attributes, - @NotNull String description, @NotNull TextRange range) { + @NotNull String description, @NotNull String tooltip, @NotNull TextRange range) { if (range.getStartOffset() >= restrictEndOffset || range.getEndOffset() <= restrictStartOffset) return; HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.TODO) .range(range) .textAttributes(attributes) .description(description) + .escapedToolTip(tooltip) .createUnconditionally(); Collection result = priorityRange.containsRange(info.getStartOffset(), info.getEndOffset()) ? insideResult : outsideResult; result.add(info); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index 646b565193ce..18887564a18d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -643,7 +643,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx implements Pers final List foundInfoList = new SmartList<>(); processHighlightsNearOffset(document, myProject, minSeverity, offset, includeFixRange, info -> { - if (info.getSeverity() == HighlightInfoType.ELEMENT_UNDER_CARET_SEVERITY) { + if (info.getSeverity() == HighlightInfoType.ELEMENT_UNDER_CARET_SEVERITY || info.type == HighlightInfoType.TODO) { return true; } if (!foundInfoList.isEmpty()) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java index ceca4c0c7529..57c1082afe99 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java @@ -4,6 +4,7 @@ package com.intellij.openapi.editor.impl; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings; import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.HighlightInfoType; import com.intellij.codeInsight.hint.*; import com.intellij.ide.IdeEventQueue; import com.intellij.ide.ui.UISettings; @@ -292,10 +293,13 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark final int startOffset = getOffset(fitLineToEditor(visualLine - myPreviewLines), true); final int endOffset = getOffset(fitLineToEditor(visualLine + myPreviewLines), false); markupModel.processRangeHighlightersOverlappingWith(startOffset, endOffset, highlighter -> { - if (highlighter.getErrorStripeMarkColor() != null) { - if (highlighter.getStartOffset() < endOffset && highlighter.getEndOffset() > startOffset) { - highlighters.add(highlighter); - } + Object tooltip = highlighter.getErrorStripeTooltip(); + if (tooltip != null && + !(tooltip instanceof HighlightInfo && ((HighlightInfo)tooltip).type == HighlightInfoType.TODO) && + highlighter.getErrorStripeMarkColor() != null && + highlighter.getStartOffset() < endOffset && + highlighter.getEndOffset() > startOffset) { + highlighters.add(highlighter); } return true; });