diff --git a/platform/lang-api/src/com/intellij/codeInsight/daemon/MergeableLineMarkerInfo.java b/platform/lang-api/src/com/intellij/codeInsight/daemon/MergeableLineMarkerInfo.java index 0449c679722e..58c96a69cafe 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/daemon/MergeableLineMarkerInfo.java +++ b/platform/lang-api/src/com/intellij/codeInsight/daemon/MergeableLineMarkerInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2017 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; +import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBList; @@ -28,14 +29,13 @@ import com.intellij.util.Function; import com.intellij.util.SmartList; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; +import com.intellij.xml.util.XmlStringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * @author Konstantin Bulenkov @@ -54,13 +54,27 @@ public abstract class MergeableLineMarkerInfo extends Line public abstract boolean canMergeWith(@NotNull MergeableLineMarkerInfo info); public abstract Icon getCommonIcon(@NotNull List infos); + @NotNull - public abstract Function getCommonTooltip(@NotNull List infos); + public Function getCommonTooltip(@NotNull final List infos) { + return (Function)element -> { + Set tooltips = new HashSet<>(ContainerUtil.mapNotNull(infos, info -> info.getLineMarkerTooltip())); + StringBuilder tooltip = new StringBuilder(); + for (String info : tooltips) { + if (tooltip.length() > 0) { + tooltip.append(UIUtil.BORDER_LINE); + } + tooltip.append(UIUtil.getHtmlBody(info)); + } + return XmlStringUtil.wrapInHtml(tooltip); + }; + } + public GutterIconRenderer.Alignment getCommonIconAlignment(@NotNull List infos) { return GutterIconRenderer.Alignment.LEFT; } - + public String getElementPresentation(PsiElement element) { return element.getText(); } @@ -133,7 +147,7 @@ public abstract class MergeableLineMarkerInfo extends Line Collections.sort(infos, (o1, o2) -> o1.startOffset - o2.startOffset); final JBList list = new JBList(infos); list.setFixedCellHeight(UIUtil.LIST_FIXED_CELL_HEIGHT); - PopupChooserBuilder builder = JBPopupFactory.getInstance().createListPopupBuilder(list); + PopupChooserBuilder builder = JBPopupFactory.getInstance().createListPopupBuilder(list); if (!markers.get(0).configurePopupAndRenderer(builder, list, infos)) { list.installCellRenderer(dom -> { if (dom instanceof LineMarkerInfo) { diff --git a/platform/lang-api/src/com/intellij/codeInsight/daemon/RelatedItemLineMarkerInfo.java b/platform/lang-api/src/com/intellij/codeInsight/daemon/RelatedItemLineMarkerInfo.java index fb1ff62dbb42..33fd24eed593 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/daemon/RelatedItemLineMarkerInfo.java +++ b/platform/lang-api/src/com/intellij/codeInsight/daemon/RelatedItemLineMarkerInfo.java @@ -83,22 +83,6 @@ public class RelatedItemLineMarkerInfo extends MergeableLi return myIcon; } - @NotNull - @Override - public Function getCommonTooltip(@NotNull final List infos) { - return (Function)element -> { - Set tooltips = new HashSet<>(ContainerUtil.mapNotNull(infos, info -> info.getLineMarkerTooltip())); - StringBuilder tooltip = new StringBuilder(); - for (String info : tooltips) { - if (tooltip.length() > 0) { - tooltip.append(UIUtil.BORDER_LINE); - } - tooltip.append(UIUtil.getHtmlBody(info)); - } - return XmlStringUtil.wrapInHtml(tooltip); - }; - } - private static class RelatedItemLineMarkerGutterIconRenderer extends LineMarkerGutterIconRenderer { public RelatedItemLineMarkerGutterIconRenderer(final RelatedItemLineMarkerInfo markerInfo) { super(markerInfo); diff --git a/xml/dom-impl/src/com/intellij/codeInsight/navigation/NavigationGutterIconBuilder.java b/xml/dom-impl/src/com/intellij/codeInsight/navigation/NavigationGutterIconBuilder.java index cb1324da3600..63ddfca05b01 100644 --- a/xml/dom-impl/src/com/intellij/codeInsight/navigation/NavigationGutterIconBuilder.java +++ b/xml/dom-impl/src/com/intellij/codeInsight/navigation/NavigationGutterIconBuilder.java @@ -57,23 +57,23 @@ import java.util.*; */ public class NavigationGutterIconBuilder { @NonNls private static final String PATTERN = "    {0}"; - private static final NotNullFunction> DEFAULT_PSI_CONVERTOR = + private static final NotNullFunction> DEFAULT_PSI_CONVERTOR = element -> ContainerUtil.createMaybeSingletonList(element); private final Icon myIcon; - private final NotNullFunction> myConverter; + private final NotNullFunction> myConverter; - private NotNullLazyValue> myTargets; - private boolean myLazy; + protected NotNullLazyValue> myTargets; + protected boolean myLazy; private String myTooltipText; private String myPopupTitle; private String myEmptyText; private String myTooltipTitle; private GutterIconRenderer.Alignment myAlignment = GutterIconRenderer.Alignment.CENTER; private Computable myCellRenderer; - private NullableFunction myNamer = ElementPresentationManager.namer(); - private final NotNullFunction> myGotoRelatedItemProvider; - public static final NotNullFunction> DEFAULT_DOM_CONVERTOR = + private NullableFunction myNamer = ElementPresentationManager.namer(); + protected final NotNullFunction> myGotoRelatedItemProvider; + public static final NotNullFunction> DEFAULT_DOM_CONVERTOR = o -> ContainerUtil.createMaybeSingletonList(o.getXmlElement()); public static final NotNullFunction> DOM_GOTO_RELATED_ITEM_PROVIDER = dom -> { if (dom.getXmlElement() != null) { @@ -160,7 +160,7 @@ public class NavigationGutterIconBuilder { return this; } - public NavigationGutterIconBuilder setNamer(@NotNull NullableFunction namer) { + public NavigationGutterIconBuilder setNamer(@NotNull NullableFunction namer) { myNamer = namer; return this; } @@ -193,15 +193,18 @@ public class NavigationGutterIconBuilder { public RelatedItemLineMarkerInfo createLineMarkerInfo(@NotNull PsiElement element) { final MyNavigationGutterIconRenderer renderer = createGutterIconRenderer(element.getProject()); final String tooltip = renderer.getTooltipText(); - NotNullLazyValue> gotoTargets = createGotoTargetsThunk(myLazy, myGotoRelatedItemProvider, - evaluateAndForget(myTargets)); - return new RelatedItemLineMarkerInfo(element, element.getTextRange(), renderer.getIcon(), Pass.LINE_MARKERS, - tooltip == null ? null : new ConstantFunction(tooltip), - renderer.isNavigateAction() ? renderer : null, renderer.getAlignment(), - gotoTargets); + NotNullLazyValue> gotoTargets = getGotoTargets(); + return new RelatedItemLineMarkerInfo<>(element, element.getTextRange(), renderer.getIcon(), Pass.LINE_MARKERS, + tooltip == null ? null : new ConstantFunction<>(tooltip), + renderer.isNavigateAction() ? renderer : null, renderer.getAlignment(), + gotoTargets); } @NotNull + protected NotNullLazyValue> getGotoTargets() { + return createGotoTargetsThunk(myLazy, myGotoRelatedItemProvider, evaluateAndForget(myTargets)); + } + private static NotNullLazyValue> createGotoTargetsThunk(boolean lazy, final NotNullFunction> gotoRelatedItemProvider, final Factory> factory) { @@ -225,9 +228,9 @@ public class NavigationGutterIconBuilder { private void checkBuilt() { assert myTargets != null : "Must have called .setTargets() before calling create()"; } - - @NotNull - private static Factory evaluateAndForget(NotNullLazyValue lazyValue) { + + protected static Factory evaluateAndForget(NotNullLazyValue lazyValue) { + final Ref> ref = Ref.create(lazyValue); return new Factory() { volatile T result; @@ -243,8 +246,7 @@ public class NavigationGutterIconBuilder { }; } - @NotNull - private MyNavigationGutterIconRenderer createGutterIconRenderer(@NotNull final Project project) { + protected MyNavigationGutterIconRenderer createGutterIconRenderer(@NotNull final Project project) { checkBuilt(); NotNullLazyValue> pointers = createPointersThunk(myLazy, project, evaluateAndForget(myTargets), @@ -390,4 +392,16 @@ public class NavigationGutterIconBuilder { return result; } } + + private static class MyPsiElementRelatedItemLineMarkerInfo extends RelatedItemLineMarkerInfo { + public MyPsiElementRelatedItemLineMarkerInfo(PsiElement element, + NavigationGutterIconRenderer renderer, + String tooltip, + NotNullLazyValue> gotoTargets) { + super(element, element.getTextRange(), renderer.getIcon(), Pass.LINE_MARKERS, tooltip == null + ? null + : new ConstantFunction<>(tooltip), + renderer.isNavigateAction() ? renderer : null, renderer.getAlignment(), gotoTargets); + } + } }