@@ -16,20 +16,23 @@ import com.intellij.codeInsight.daemon.LineMarkerInfo
16
16
import com.intellij.codeInsight.daemon.LineMarkerProvider
17
17
import com.intellij.codeInsight.daemon.MergeableLineMarkerInfo
18
18
import com.intellij.codeInsight.daemon.NavigateAction
19
+ import com.intellij.codeInsight.hint.HintManager
19
20
import com.intellij.icons.AllIcons
20
21
import com.intellij.openapi.editor.markup.GutterIconRenderer
22
+ import com.intellij.psi.JVMElementFactories
21
23
import com.intellij.psi.PsiElement
22
- import com.intellij.psi.PsiExpressionList
23
- import com.intellij.psi.PsiLiteralExpression
24
- import com.intellij.psi.PsiNewExpression
25
- import com.intellij.psi.impl.source.tree.JavaElementType
26
24
import com.intellij.psi.util.PsiEditorUtil
27
25
import com.intellij.ui.ColorChooser
28
26
import com.intellij.util.FunctionUtil
29
27
import com.intellij.util.ui.ColorIcon
30
28
import com.intellij.util.ui.ColorsIcon
31
29
import java.awt.Color
32
30
import javax.swing.Icon
31
+ import org.jetbrains.uast.UCallExpression
32
+ import org.jetbrains.uast.UElement
33
+ import org.jetbrains.uast.UIdentifier
34
+ import org.jetbrains.uast.ULiteralExpression
35
+ import org.jetbrains.uast.toUElementOfType
33
36
34
37
class ColorLineMarkerProvider : LineMarkerProvider {
35
38
@@ -38,7 +41,8 @@ class ColorLineMarkerProvider : LineMarkerProvider {
38
41
return null
39
42
}
40
43
41
- val info = element.findColor { map, chosen -> ColorInfo (element, chosen.value, map, chosen.key) }
44
+ val identifier = element.toUElementOfType<UIdentifier >() ? : return null
45
+ val info = identifier.findColor { map, chosen -> ColorInfo (element, chosen.value, map, chosen.key, identifier) }
42
46
if (info != null ) {
43
47
NavigateAction .setNavigateAction(info, " Change Color" , null )
44
48
}
@@ -49,7 +53,13 @@ class ColorLineMarkerProvider : LineMarkerProvider {
49
53
open class ColorInfo : MergeableLineMarkerInfo <PsiElement > {
50
54
protected val color: Color
51
55
52
- constructor (element: PsiElement , color: Color , map: Map <String , Color >, colorName: String ) : super (
56
+ constructor (
57
+ element: PsiElement ,
58
+ color: Color ,
59
+ map: Map <String , Color >,
60
+ colorName: String ,
61
+ workElement: UElement
62
+ ) : super (
53
63
element,
54
64
element.textRange,
55
65
ColorIcon (12 , color),
@@ -63,8 +73,8 @@ class ColorLineMarkerProvider : LineMarkerProvider {
63
73
64
74
val picker = ColorPicker (map, editor.component)
65
75
val newColor = picker.showDialog()
66
- if (newColor != null ) {
67
- element .setColor(newColor)
76
+ if (newColor != null && map[newColor] != color ) {
77
+ workElement .setColor(newColor)
68
78
}
69
79
},
70
80
GutterIconRenderer .Alignment .RIGHT ,
@@ -103,7 +113,7 @@ class ColorLineMarkerProvider : LineMarkerProvider {
103
113
class CommonColorInfo (
104
114
element : PsiElement ,
105
115
color : Color ,
106
- workElement : PsiElement
116
+ workElement : UElement
107
117
) : ColorLineMarkerProvider.ColorInfo(
108
118
element,
109
119
color,
@@ -113,18 +123,20 @@ class ColorLineMarkerProvider : LineMarkerProvider {
113
123
}
114
124
115
125
val editor = PsiEditorUtil .findEditor(element) ? : return @handler
126
+ if (JVMElementFactories .getFactory(element.language, element.project) == null) {
127
+ // The setColor methods used here require a JVMElementFactory. Unfortunately the Kotlin plugin does not
128
+ // implement it yet. It is better to not display the color chooser at all than deceiving users after
129
+ // after they chose a color
130
+ HintManager .getInstance()
131
+ .showErrorHint(editor, "Can 't change colors in " + element.language.displayName)
132
+ return @handler
133
+ }
116
134
117
135
val c = ColorChooser .chooseColor(editor.component, "Choose Color ", color, false)
118
- if (c != null) {
119
- when (workElement) {
120
- is PsiLiteralExpression -> workElement.setColor(c.rgb and 0xFFFFFF)
121
- is PsiExpressionList -> workElement.setColor(c.red, c.green, c.blue)
122
- is PsiNewExpression -> {
123
- val list = workElement.getNode().findChildByType(JavaElementType .EXPRESSION_LIST )
124
- as PsiExpressionList ?
125
- list?.setColor(c.red, c.green, c.blue)
126
- }
127
- }
136
+ ? : return @handler
137
+ when (workElement) {
138
+ is ULiteralExpression -> workElement.setColor(c.rgb and 0xFFFFFF)
139
+ is UCallExpression -> workElement.setColor(c.red, c.green, c.blue)
128
140
}
129
141
}
130
142
)
@@ -139,6 +151,6 @@ class ColorLineMarkerProvider : LineMarkerProvider {
139
151
return info
140
152
}
141
153
142
- abstract fun findColor (element : PsiElement ): Pair <Color , PsiElement >?
154
+ abstract fun findColor (element : PsiElement ): Pair <Color , UElement >?
143
155
}
144
156
}
0 commit comments