filters: allow to create multiple grayed hyperlinks for a single line

This commit is contained in:
Sergey Simonchik
2016-09-15 19:47:54 +03:00
parent ba646ec14b
commit 480212e306
@@ -36,19 +36,8 @@ public interface Filter {
Filter[] EMPTY_ARRAY = new Filter[0];
class Result extends ResultItem {
private static final Map<TextAttributesKey, TextAttributes> GRAYED_BY_NORMAL_CACHE = ContainerUtil.newConcurrentMap(2);
static {
ApplicationManager.getApplication().getMessageBus().connect().subscribe(EditorColorsManager.TOPIC, new EditorColorsListener() {
@Override
public void globalSchemeChange(EditorColorsScheme scheme) {
// invalidate cache on Appearance Theme/Editor Scheme change
GRAYED_BY_NORMAL_CACHE.clear();
}
});
}
protected NextAction myNextAction = NextAction.EXIT;
protected final List<ResultItem> myResultItems;
private NextAction myNextAction = NextAction.EXIT;
private final List<ResultItem> myResultItems;
public Result(final int highlightStartOffset, final int highlightEndOffset, @Nullable final HyperlinkInfo hyperlinkInfo) {
this(highlightStartOffset, highlightEndOffset, hyperlinkInfo, null);
@@ -75,9 +64,7 @@ public interface Filter {
final int highlightEndOffset,
@Nullable final HyperlinkInfo hyperlinkInfo,
final boolean grayedHyperlink) {
super(highlightStartOffset, highlightEndOffset, hyperlinkInfo,
grayedHyperlink ? getGrayedHyperlinkAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES) : null,
grayedHyperlink ? getGrayedHyperlinkAttributes(CodeInsightColors.FOLLOWED_HYPERLINK_ATTRIBUTES) : null);
super(highlightStartOffset, highlightEndOffset, hyperlinkInfo, grayedHyperlink);
myResultItems = null;
}
@@ -154,22 +141,6 @@ public interface Filter {
public void setNextAction(NextAction nextAction) {
myNextAction = nextAction;
}
@Nullable
private static TextAttributes getGrayedHyperlinkAttributes(@NotNull TextAttributesKey normalHyperlinkAttrsKey) {
EditorColorsScheme globalScheme = EditorColorsManager.getInstance().getGlobalScheme();
TextAttributes grayedHyperlinkAttrs = GRAYED_BY_NORMAL_CACHE.get(normalHyperlinkAttrsKey);
if (grayedHyperlinkAttrs == null) {
TextAttributes normalHyperlinkAttrs = globalScheme.getAttributes(normalHyperlinkAttrsKey);
if (normalHyperlinkAttrs != null) {
grayedHyperlinkAttrs = normalHyperlinkAttrs.clone();
grayedHyperlinkAttrs.setForegroundColor(UIUtil.getInactiveTextColor());
grayedHyperlinkAttrs.setEffectColor(UIUtil.getInactiveTextColor());
GRAYED_BY_NORMAL_CACHE.put(normalHyperlinkAttrsKey, grayedHyperlinkAttrs);
}
}
return grayedHyperlinkAttrs;
}
}
enum NextAction {
@@ -177,6 +148,17 @@ public interface Filter {
}
class ResultItem {
private static final Map<TextAttributesKey, TextAttributes> GRAYED_BY_NORMAL_CACHE = ContainerUtil.newConcurrentMap(2);
static {
ApplicationManager.getApplication().getMessageBus().connect().subscribe(EditorColorsManager.TOPIC, new EditorColorsListener() {
@Override
public void globalSchemeChange(EditorColorsScheme scheme) {
// invalidate cache on Appearance Theme/Editor Scheme change
GRAYED_BY_NORMAL_CACHE.clear();
}
});
}
/**
* @deprecated use getter, the visibility of this field will be decreased.
*/
@@ -213,6 +195,15 @@ public interface Filter {
this(highlightStartOffset, highlightEndOffset, hyperlinkInfo, highlightAttributes, null);
}
public ResultItem(int highlightStartOffset,
int highlightEndOffset,
@Nullable HyperlinkInfo hyperlinkInfo,
boolean grayedHyperlink) {
this(highlightStartOffset, highlightEndOffset, hyperlinkInfo,
grayedHyperlink ? getGrayedHyperlinkAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES) : null,
grayedHyperlink ? getGrayedHyperlinkAttributes(CodeInsightColors.FOLLOWED_HYPERLINK_ATTRIBUTES) : null);
}
@SuppressWarnings("deprecation")
public ResultItem(final int highlightStartOffset,
final int highlightEndOffset,
@@ -252,6 +243,22 @@ public interface Filter {
//noinspection deprecation
return hyperlinkInfo;
}
@Nullable
private static TextAttributes getGrayedHyperlinkAttributes(@NotNull TextAttributesKey normalHyperlinkAttrsKey) {
EditorColorsScheme globalScheme = EditorColorsManager.getInstance().getGlobalScheme();
TextAttributes grayedHyperlinkAttrs = GRAYED_BY_NORMAL_CACHE.get(normalHyperlinkAttrsKey);
if (grayedHyperlinkAttrs == null) {
TextAttributes normalHyperlinkAttrs = globalScheme.getAttributes(normalHyperlinkAttrsKey);
if (normalHyperlinkAttrs != null) {
grayedHyperlinkAttrs = normalHyperlinkAttrs.clone();
grayedHyperlinkAttrs.setForegroundColor(UIUtil.getInactiveTextColor());
grayedHyperlinkAttrs.setEffectColor(UIUtil.getInactiveTextColor());
GRAYED_BY_NORMAL_CACHE.put(normalHyperlinkAttrsKey, grayedHyperlinkAttrs);
}
}
return grayedHyperlinkAttrs;
}
}
/**