1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
// Copyright 2000-2019 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.hints.presentation
import com.intellij.ide.ui.AntialiasingType
import com.intellij.openapi.editor.markup.EffectType
import com.intellij.openapi.editor.markup.TextAttributes
import com.intellij.ui.paint.EffectPainter
import org.jetbrains.annotations.ApiStatus
import java.awt.Graphics2D
import java.awt.RenderingHints
/**
* Draws text.
*/
@ApiStatus.Internal
class TextInlayPresentation(
private val metricsStorage: InlayTextMetricsStorage,
val isSmall: Boolean,
var text: String
) : BasePresentation() {
override val width: Int
get() = getMetrics().getStringWidth(text)
override val height: Int
get() = getMetrics().fontHeight
private fun getMetrics() = metricsStorage.getFontMetrics(isSmall)
override fun paint(g: Graphics2D, attributes: TextAttributes) {
val savedHint = g.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING)
try {
val foreground = attributes.foregroundColor
if (foreground != null) {
val metrics = getMetrics()
val font = metrics.font
g.font = font
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AntialiasingType.getKeyForCurrentScope(false))
g.color = foreground
g.drawString(text, 0, metrics.fontBaseline)
val effectColor = attributes.effectColor
if (effectColor != null) {
g.color = effectColor
when (attributes.effectType) {
EffectType.LINE_UNDERSCORE -> EffectPainter.LINE_UNDERSCORE.paint(g, 0, metrics.ascent, width, metrics.descent, font)
EffectType.BOLD_LINE_UNDERSCORE -> EffectPainter.BOLD_LINE_UNDERSCORE.paint(g, 0, metrics.ascent, width, metrics.descent, font)
EffectType.STRIKEOUT -> EffectPainter.STRIKE_THROUGH.paint(g, 0, metrics.fontBaseline, width, height, font)
EffectType.WAVE_UNDERSCORE -> EffectPainter.WAVE_UNDERSCORE.paint(g, 0, metrics.ascent, width, metrics.descent, font)
EffectType.BOLD_DOTTED_LINE -> EffectPainter.BOLD_DOTTED_UNDERSCORE.paint(g, 0, metrics.ascent, width, metrics.descent, font)
else -> {}
}
}
}
}
finally {
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedHint)
}
}
override fun toString(): String = text
}
|