5a19b12710323a038116861159c2850ceef4ab71
[idea/community.git] / platform / analysis-api / src / com / intellij / codeHighlighting / HighlightDisplayLevel.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.codeHighlighting;
17
18 import com.intellij.icons.AllIcons;
19 import com.intellij.lang.annotation.HighlightSeverity;
20 import com.intellij.openapi.editor.colors.CodeInsightColors;
21 import com.intellij.openapi.editor.colors.EditorColorsManager;
22 import com.intellij.openapi.editor.colors.TextAttributesKey;
23 import com.intellij.openapi.editor.markup.TextAttributes;
24 import com.intellij.openapi.util.Comparing;
25 import com.intellij.ui.JBColor;
26 import com.intellij.util.IconUtil;
27 import com.intellij.util.ObjectUtils;
28 import com.intellij.util.containers.HashMap;
29 import com.intellij.util.ui.ColorIcon;
30 import com.intellij.util.ui.JBUI;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33
34 import javax.swing.*;
35 import java.awt.*;
36 import java.util.Map;
37
38 public class HighlightDisplayLevel {
39   private static final Map<HighlightSeverity, HighlightDisplayLevel> ourMap = new HashMap<HighlightSeverity, HighlightDisplayLevel>();
40
41   public static final HighlightDisplayLevel GENERIC_SERVER_ERROR_OR_WARNING = new HighlightDisplayLevel(HighlightSeverity.GENERIC_SERVER_ERROR_OR_WARNING,
42                                                                                                         createIconByKey(CodeInsightColors.GENERIC_SERVER_ERROR_OR_WARNING));
43   public static final HighlightDisplayLevel ERROR = new HighlightDisplayLevel(HighlightSeverity.ERROR, createErrorIcon());
44
45   @NotNull
46   private static Icon createErrorIcon() {
47     return new SingleColorIcon(CodeInsightColors.ERRORS_ATTRIBUTES) {
48       @Override
49       public void paintIcon(Component c, Graphics g, int x, int y) {
50         IconUtil.colorize(AllIcons.General.InspectionsError, getColor()).paintIcon(c, g, x, y);
51       }
52     };
53   }
54
55   public static final HighlightDisplayLevel WARNING = new HighlightDisplayLevel(HighlightSeverity.WARNING, createIconByKey(CodeInsightColors.WARNINGS_ATTRIBUTES));
56   private static final TextAttributesKey DO_NOT_SHOW_KEY = TextAttributesKey.createTextAttributesKey("DO_NOT_SHOW");
57   public static final HighlightDisplayLevel DO_NOT_SHOW = new HighlightDisplayLevel(HighlightSeverity.INFORMATION, createIconByKey(DO_NOT_SHOW_KEY));
58   /**
59    * use #WEAK_WARNING instead
60    */
61   @Deprecated
62   public static final HighlightDisplayLevel INFO = new HighlightDisplayLevel(HighlightSeverity.INFO, DO_NOT_SHOW.getIcon());
63   public static final HighlightDisplayLevel WEAK_WARNING = new HighlightDisplayLevel(HighlightSeverity.WEAK_WARNING, createIconByKey(CodeInsightColors.WEAK_WARNING_ATTRIBUTES));
64
65   public static final HighlightDisplayLevel NON_SWITCHABLE_ERROR = new HighlightDisplayLevel(HighlightSeverity.ERROR);
66
67   private Icon myIcon;
68   private final HighlightSeverity mySeverity;
69
70   @Nullable
71   public static HighlightDisplayLevel find(String name) {
72     for (Map.Entry<HighlightSeverity, HighlightDisplayLevel> entry : ourMap.entrySet()) {
73       HighlightSeverity severity = entry.getKey();
74       HighlightDisplayLevel displayLevel = entry.getValue();
75       if (Comparing.strEqual(severity.getName(), name)) {
76         return displayLevel;
77       }
78     }
79     return null;
80   }
81
82   public static HighlightDisplayLevel find(HighlightSeverity severity) {
83     return ourMap.get(severity);
84   }
85
86   public HighlightDisplayLevel(@NotNull HighlightSeverity severity, @NotNull Icon icon) {
87     this(severity);
88     myIcon = icon;
89     ourMap.put(mySeverity, this);
90   }
91
92   public HighlightDisplayLevel(@NotNull HighlightSeverity severity) {
93     mySeverity = severity;
94   }
95
96
97   public String toString() {
98     return mySeverity.toString();
99   }
100
101   @NotNull
102   public String getName() {
103     return mySeverity.getName();
104   }
105
106   public Icon getIcon() {
107     return myIcon;
108   }
109
110   @NotNull
111   public HighlightSeverity getSeverity(){
112     return mySeverity;
113   }
114
115   public static void registerSeverity(@NotNull HighlightSeverity severity, @NotNull TextAttributesKey key, @Nullable Icon icon) {
116     Icon severityIcon = icon != null ? icon : createIconByKey(key);
117     final HighlightDisplayLevel level = ourMap.get(severity);
118     if (level == null) {
119       new HighlightDisplayLevel(severity, severityIcon);
120     }
121     else {
122       level.myIcon = severityIcon;
123     }
124   }
125
126   public static int getEmptyIconDim() {
127     return JBUI.scale(14);
128   }
129
130   public static Icon createIconByKey(@NotNull TextAttributesKey key) {
131     return new SingleColorIcon(key);
132   }
133
134   @NotNull
135   public static Icon createIconByMask(final Color renderColor) {
136     return new MyColorIcon(getEmptyIconDim(), renderColor);
137   }
138
139   private static class MyColorIcon extends ColorIcon implements ColoredIcon {
140     public MyColorIcon(int size, @NotNull Color color) {
141       super(size, color);
142     }
143
144     @Override
145     public Color getColor() {
146       return getIconColor();
147     }
148   }
149
150   public interface ColoredIcon {
151     Color getColor();
152   }
153
154   public static class SingleColorIcon implements Icon, ColoredIcon {
155     private final TextAttributesKey myKey;
156
157     public SingleColorIcon(@NotNull TextAttributesKey key) {
158       myKey = key;
159     }
160
161     @NotNull
162     public Color getColor() {
163       return ObjectUtils.notNull(getColorInner(), JBColor.GRAY);
164     }
165
166     @Nullable
167     public Color getColorInner() {
168       final EditorColorsManager manager = EditorColorsManager.getInstance();
169       if (manager != null) {
170         TextAttributes attributes = manager.getGlobalScheme().getAttributes(myKey);
171         Color stripe = attributes.getErrorStripeColor();
172         if (stripe != null) return stripe;
173         return attributes.getEffectColor();
174       }
175       TextAttributes defaultAttributes = myKey.getDefaultAttributes();
176       if (defaultAttributes == null) defaultAttributes = TextAttributes.ERASE_MARKER;
177       return defaultAttributes.getErrorStripeColor();
178     }
179
180     @Override
181     public void paintIcon(Component c, Graphics g, int x, int y) {
182       g.setColor(getColor());
183       g.fillRect(x + 2, y + 2, 10, 10);
184     }
185
186     @Override
187     public int getIconWidth() {
188       return getEmptyIconDim();
189     }
190
191     @Override
192     public int getIconHeight() {
193       return getEmptyIconDim();
194     }
195   }
196 }