IDEA-299042 Run widget popup: inline actions have incorrect width
[idea/community.git] / platform / util / ui / src / com / intellij / util / ui / JBUI.java
1 // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
2 package com.intellij.util.ui;
3
4 import com.intellij.diagnostic.LoadingState;
5 import com.intellij.icons.AllIcons;
6 import com.intellij.openapi.util.SystemInfoRt;
7 import com.intellij.ui.*;
8 import com.intellij.ui.border.CustomLineBorder;
9 import com.intellij.ui.scale.DerivedScaleType;
10 import com.intellij.ui.scale.JBUIScale;
11 import com.intellij.util.ui.components.BorderLayoutPanel;
12 import org.jetbrains.annotations.NonNls;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15
16 import javax.swing.*;
17 import javax.swing.border.Border;
18 import javax.swing.border.CompoundBorder;
19 import javax.swing.border.EmptyBorder;
20 import javax.swing.plaf.BorderUIResource;
21 import javax.swing.plaf.UIResource;
22 import java.awt.*;
23 import java.awt.font.TextAttribute;
24 import java.util.HashMap;
25 import java.util.Map;
26
27 /**
28  * @author Konstantin Bulenkov
29  * @author tav
30  */
31 @SuppressWarnings("UseJBColor")
32 public final class JBUI {
33   static {
34     LoadingState.BASE_LAF_INITIALIZED.checkOccurred();
35   }
36
37   /**
38    * Returns the pixel scale factor, corresponding to the default monitor device.
39    */
40   public static float pixScale() {
41     return JreHiDpiUtil.isJreHiDPIEnabled() ? JBUIScale.sysScale() * JBUIScale.scale(1f) : JBUIScale.scale(1f);
42   }
43
44   /**
45    * Returns "f" scaled by pixScale().
46    */
47   public static float pixScale(float f) {
48     return pixScale() * f;
49   }
50
51   /**
52    * Returns the pixel scale factor, corresponding to the provided configuration.
53    * In the IDE-managed HiDPI mode defaults to {@link #pixScale()}
54    */
55   public static float pixScale(@Nullable GraphicsConfiguration gc) {
56     return JreHiDpiUtil.isJreHiDPIEnabled() ? JBUIScale.sysScale(gc) * JBUIScale.scale(1f) : JBUIScale.scale(1f);
57   }
58
59   /**
60    * Returns the pixel scale factor, corresponding to the device the provided component is tied to.
61    * In the IDE-managed HiDPI mode defaults to {@link #pixScale()}
62    */
63   public static float pixScale(@Nullable Component comp) {
64     return pixScale(comp != null ? comp.getGraphicsConfiguration() : null);
65   }
66
67   /**
68    * @deprecated use {@link JBUIScale#scale(float)}
69    */
70   @Deprecated
71   public static float scale(float f) {
72     return JBUIScale.scale(f);
73   }
74
75   /**
76    * @return 'i' scaled by the user scale factor
77    */
78   public static int scale(int i) {
79     return JBUIScale.scale(i);
80   }
81
82   public static int scaleFontSize(float fontSize) {
83     return JBUIScale.scaleFontSize(fontSize);
84   }
85
86   public static @NotNull JBValue value(float value) {
87     return new JBValue.Float(value);
88   }
89
90   public static @NotNull JBValue uiIntValue(@NotNull String key, int defValue) {
91     return new JBValue.UIInteger(key, defValue);
92   }
93
94   public static @NotNull JBDimension size(int width, int height) {
95     return new JBDimension(width, height);
96   }
97
98   public static @NotNull JBDimension size(int widthAndHeight) {
99     return new JBDimension(widthAndHeight, widthAndHeight);
100   }
101
102   public static @NotNull JBDimension size(Dimension size) {
103     return JBDimension.size(size);
104   }
105
106   public static @NotNull JBInsets insets(int top, int left, int bottom, int right) {
107     return new JBInsets(top, left, bottom, right);
108   }
109
110   public static @NotNull JBInsets insets(int all) {
111     return new JBInsets(all);
112   }
113
114   public static @NotNull JBInsets insets(@NonNls @NotNull String propName, @NotNull JBInsets defaultValue) {
115     Insets i = UIManager.getInsets(propName);
116     return i != null ? JBInsets.create(i) : defaultValue;
117   }
118
119   public static @NotNull JBInsets insets(int topBottom, int leftRight) {
120     return JBInsets.create(topBottom, leftRight);
121   }
122
123   public static @NotNull JBInsets emptyInsets() {
124     return JBInsets.emptyInsets();
125   }
126
127   public static @NotNull JBInsets insetsTop(int t) {
128     return new JBInsets(t, 0, 0, 0);
129   }
130
131   public static @NotNull JBInsets insetsLeft(int l) {
132     return new JBInsets(0, l, 0, 0);
133   }
134
135   public static @NotNull JBInsets insetsBottom(int b) {
136     return new JBInsets(0, 0, b, 0);
137   }
138
139   public static @NotNull JBInsets insetsRight(int r) {
140     return new JBInsets(0, 0, 0, r);
141   }
142
143   /**
144    * @deprecated Use {@link JBUIScale#scaleIcon(JBScalableIcon)}.
145    */
146   @Deprecated(forRemoval = true)
147   public static @NotNull <T extends JBScalableIcon> T scale(@NotNull T icon) {
148     return JBUIScale.scaleIcon(icon);
149   }
150
151   public static @NotNull JBDimension emptySize() {
152     return new JBDimension(0, 0);
153   }
154
155   public static @NotNull JBInsets insets(@NotNull Insets insets) {
156     return JBInsets.create(insets);
157   }
158
159   /**
160    * @deprecated use {@link JBUIScale#isUsrHiDPI()}
161    */
162   @Deprecated(forRemoval = true)
163   public static boolean isUsrHiDPI() {
164     return JBUIScale.isUsrHiDPI();
165   }
166
167   /**
168    * Returns whether the {@link DerivedScaleType#PIX_SCALE} scale factor assumes HiDPI-awareness in the provided graphics config.
169    * An equivalent of {@code isHiDPI(pixScale(gc))}
170    */
171   public static boolean isPixHiDPI(@Nullable GraphicsConfiguration gc) {
172     return JBUIScale.isHiDPI(pixScale(gc));
173   }
174
175   /**
176    * Returns whether the {@link DerivedScaleType#PIX_SCALE} scale factor assumes HiDPI-awareness in the provided component's device.
177    * An equivalent of {@code isHiDPI(pixScale(comp))}
178    */
179   public static boolean isPixHiDPI(@Nullable Component comp) {
180     return JBUIScale.isHiDPI(pixScale(comp));
181   }
182
183   public static final class Fonts {
184     public static @NotNull JBFont label() {
185       return JBFont.label();
186     }
187
188     public static @NotNull JBFont label(float size) {
189       return JBFont.label().deriveFont(JBUIScale.scale(size));
190     }
191
192     public static @NotNull JBFont smallFont() {
193       return JBFont.label().deriveFont(UIUtil.getFontSize(UIUtil.FontSize.SMALL));
194     }
195
196     public static @NotNull JBFont miniFont() {
197       return JBFont.label().deriveFont(UIUtil.getFontSize(UIUtil.FontSize.MINI));
198     }
199
200     public static @NotNull JBFont create(@NonNls String fontFamily, int size) {
201       return JBFont.create(new Font(fontFamily, Font.PLAIN, size));
202     }
203
204     public static @NotNull JBFont toolbarFont() {
205       return SystemInfoRt.isMac ? smallFont() : JBFont.label();
206     }
207
208     public static @NotNull JBFont toolbarSmallComboBoxFont() {
209       return label(11);
210     }
211   }
212
213   @SuppressWarnings("UseDPIAwareBorders")
214   public static final class Borders {
215     public static @NotNull JBEmptyBorder empty(int top, int left, int bottom, int right) {
216       if (top == 0 && left == 0 && bottom == 0 && right == 0) {
217         return JBEmptyBorder.SHARED_EMPTY_INSTANCE;
218       }
219       return new JBEmptyBorder(top, left, bottom, right);
220     }
221
222     public static @NotNull JBEmptyBorder empty(int topAndBottom, int leftAndRight) {
223       return empty(topAndBottom, leftAndRight, topAndBottom, leftAndRight);
224     }
225
226     public static @NotNull JBEmptyBorder emptyTop(int offset) {
227       return empty(offset, 0, 0, 0);
228     }
229
230     public static @NotNull JBEmptyBorder emptyLeft(int offset) {
231       return empty(0, offset,  0, 0);
232     }
233
234     public static @NotNull JBEmptyBorder emptyBottom(int offset) {
235       return empty(0, 0, offset, 0);
236     }
237
238     public static @NotNull JBEmptyBorder emptyRight(int offset) {
239       return empty(0, 0, 0, offset);
240     }
241
242     public static @NotNull JBEmptyBorder empty() {
243       return empty(0, 0, 0, 0);
244     }
245
246     public static @NotNull Border empty(int offsets) {
247       return empty(offsets, offsets, offsets, offsets);
248     }
249
250     public static @NotNull Border empty(@NotNull Insets insets) {
251       return empty(insets.top, insets.left, insets.bottom, insets.right);
252     }
253
254     public static @NotNull Border customLine(Color color, int top, int left, int bottom, int right) {
255       return new CustomLineBorder(color, new JBInsets(top, left, bottom, right));
256     }
257
258     public static @NotNull Border customLine(Color color, int thickness) {
259       return customLine(color, thickness, thickness, thickness, thickness);
260     }
261
262     public static @NotNull Border customLine(Color color) {
263       return customLine(color, 1);
264     }
265
266     public static @NotNull Border customLineTop(Color color) {
267       return customLine(color, 1, 0, 0, 0);
268     }
269
270     public static @NotNull Border customLineLeft(Color color) {
271       return customLine(color, 0, 1, 0, 0);
272     }
273
274     public static @NotNull Border customLineRight(Color color) {
275       return customLine(color, 0, 0, 0, 1);
276     }
277
278     public static @NotNull Border customLineBottom(Color color) {
279       return customLine(color, 0, 0, 1, 0);
280     }
281
282     public static @Nullable Border compound(@Nullable Border outside, @Nullable Border inside) {
283       return inside == null ? outside : outside == null ? inside : new CompoundBorder(outside, inside);
284     }
285
286     /**
287      * @param borders list of border to be compound from outside to inside
288      */
289     public static @Nullable Border compound(Border @NotNull ... borders) {
290       Border result = null;
291       for (Border border : borders) {
292         if (border != null) {
293           if (result == null) {
294             result = border;
295           } else {
296             result = new CompoundBorder(result, border);
297           }
298         }
299       }
300       return result;
301     }
302
303     public static @NotNull Border merge(@Nullable Border source, @NotNull Border extra, boolean extraIsOutside) {
304       if (source == null) return extra;
305       return new CompoundBorder(extraIsOutside ? extra : source, extraIsOutside? source : extra);
306     }
307   }
308
309   public static final class Panels {
310     public static @NotNull BorderLayoutPanel simplePanel() {
311       return new BorderLayoutPanel();
312     }
313
314     public static @NotNull BorderLayoutPanel simplePanel(Component comp) {
315       return simplePanel().addToCenter(comp);
316     }
317
318     public static @NotNull BorderLayoutPanel simplePanel(int hgap, int vgap) {
319       return new BorderLayoutPanel(hgap, vgap);
320     }
321   }
322
323   public static Border asUIResource(@NotNull Border border) {
324     if (border instanceof UIResource) return border;
325     return new BorderUIResource(border);
326   }
327
328   @SuppressWarnings("UnregisteredNamedColor")
329   public static final class CurrentTheme {
330     public static final class Component {
331       public static final Color FOCUSED_BORDER_COLOR = JBColor.namedColor("Component.focusedBorderColor", 0x87AFDA, 0x466D94);
332     }
333
334     public static final class ActionButton {
335       public static @NotNull Color pressedBackground() {
336         return JBColor.namedColor("ActionButton.pressedBackground", Gray.xCF);
337       }
338
339       public static @NotNull Color pressedBorder() {
340         return JBColor.namedColor("ActionButton.pressedBorderColor", Gray.xCF);
341       }
342
343       public static @NotNull Color focusedBorder() {
344         return JBColor.namedColor("ActionButton.focusedBorderColor", new JBColor(0x62b8de, 0x5eacd0));
345       }
346
347       public static @NotNull Color hoverBackground() {
348         return JBColor.namedColor("ActionButton.hoverBackground", Gray.xDF);
349       }
350
351       public static @NotNull Color hoverBorder() {
352         return JBColor.namedColor("ActionButton.hoverBorderColor", Gray.xDF);
353       }
354
355       public static @NotNull Color hoverSeparatorColor() {
356         return JBColor.namedColor("ActionButton.hoverSeparatorColor", new JBColor(Gray.xB3, Gray.x6B));
357       }
358     }
359
360     public static final class ActionsList {
361       public static final Color MNEMONIC_FOREGROUND = JBColor.namedColor("Component.infoForeground", new JBColor(Gray.x99, Gray.x78));
362
363       public static @NotNull Insets numberMnemonicInsets() {
364         return insets("ActionsList.mnemonicsBorderInsets", insets(0, 8, 1, 6));
365       }
366
367       public static @NotNull Insets mnemonicInsets() {
368         return insets("ActionsList.mnemonicsInsets", insets(0, 0, 0, 8));
369       }
370
371       public static @NotNull Insets cellPadding() {
372         return insets("ActionsList.cellBorderInsets", insets(1, 12, 1, 12));
373       }
374
375       public static int elementIconGap() {
376         return new JBValue.UIInteger("ActionsList.icon.gap", 6).get();
377       }
378
379       public static int mnemonicIconGap() {
380         return new JBValue.UIInteger("ActionsList.mnemonic.icon.gap", 6).get();
381       }
382
383       public static @NotNull Font applyStylesForNumberMnemonic(Font font) {
384         if (SystemInfoRt.isWindows) {
385           Map<TextAttribute, Object> attributes = new HashMap<>(font.getAttributes());
386           attributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
387           return font.deriveFont(attributes);
388         }
389         return font;
390       }
391     }
392
393     public static final class Banner {
394       public static final Color WARNING_BACKGROUND = JBColor.namedColor("Banner.warningBackground", 0xfff8e3, 0x3d3223);
395     }
396
397     public static final class Button {
398       public static @NotNull Color buttonColorStart() {
399         return JBColor.namedColor("Button.startBackground", JBColor.namedColor("Button.darcula.startColor", 0x555a5c));
400       }
401
402       public static @NotNull Color buttonColorEnd() {
403         return JBColor.namedColor("Button.endBackground", JBColor.namedColor("Button.darcula.endColor", 0x414648));
404       }
405
406       public static @NotNull Color defaultButtonColorStart() {
407         return JBColor.namedColor("Button.default.startBackground", JBColor.namedColor("Button.darcula.defaultStartColor", 0x384f6b));
408       }
409
410       public static @NotNull Color defaultButtonColorEnd() {
411         return JBColor.namedColor("Button.default.endBackground", JBColor.namedColor("Button.darcula.defaultEndColor", 0x233143));
412       }
413
414       public static @NotNull Color focusBorderColor(boolean isDefaultButton) {
415         return isDefaultButton ?
416                JBColor.namedColor("Button.default.focusedBorderColor", JBColor.namedColor("Button.darcula.defaultFocusedOutlineColor", 0x87afda)) :
417                JBColor.namedColor("Button.focusedBorderColor", JBColor.namedColor("Button.darcula.focusedOutlineColor", 0x87afda));
418       }
419
420       public static @NotNull Color buttonOutlineColorStart(boolean isDefaultButton) {
421         return isDefaultButton ?
422                JBColor.namedColor("Button.default.startBorderColor", JBColor.namedColor("Button.darcula.outlineDefaultStartColor", Gray.xBF)) :
423                JBColor.namedColor("Button.startBorderColor",  JBColor.namedColor("Button.darcula.outlineStartColor", Gray.xBF));
424       }
425
426       public static @NotNull Color buttonOutlineColorEnd(boolean isDefaultButton) {
427         return isDefaultButton ?
428                JBColor.namedColor("Button.default.endBorderColor", JBColor.namedColor("Button.darcula.outlineDefaultEndColor", Gray.xB8)) :
429                JBColor.namedColor("Button.endBorderColor",  JBColor.namedColor("Button.darcula.outlineEndColor", Gray.xB8));
430       }
431
432       public static @NotNull Color disabledOutlineColor() {
433         return JBColor.namedColor("Button.disabledBorderColor", JBColor.namedColor("Button.darcula.disabledOutlineColor", Gray.xCF));
434       }
435     }
436
437     public interface SegmentedButton {
438       Color SELECTED_START_BORDER_COLOR = JBColor.namedColor("SegmentedButton.selectedStartBorderColor", Gray.xBF);
439       Color SELECTED_END_BORDER_COLOR = JBColor.namedColor("SegmentedButton.selectedEndBorderColor", Gray.xB8);
440
441       Color SELECTED_BUTTON_COLOR = JBColor.namedColor("SegmentedButton.selectedButtonColor", 0x555a5c);
442       Color FOCUSED_SELECTED_BUTTON_COLOR = JBColor.namedColor("SegmentedButton.focusedSelectedButtonColor", 0xDAE4ED);
443     }
444
445     public static final class CustomFrameDecorations {
446       public static @NotNull Color separatorForeground() {
447         return JBColor.namedColor("Separator.separatorColor", new JBColor(0xcdcdcd, 0x515151));
448       }
449
450       public static @NotNull Color titlePaneButtonHoverBackground() {
451         return JBColor.namedColor("TitlePane.Button.hoverBackground",
452                            new JBColor(ColorUtil.withAlpha(Color.BLACK, .1),
453                                        ColorUtil.withAlpha(Color.WHITE, .1)));
454       }
455
456       public static @NotNull Color titlePaneButtonPressBackground() {
457         return titlePaneButtonHoverBackground();
458       }
459
460       public static @NotNull Color titlePaneInactiveBackground() {
461         return JBColor.namedColor("TitlePane.inactiveBackground", titlePaneBackground());
462       }
463
464       public static @NotNull Color titlePaneBackground(boolean active) {
465         return active ? titlePaneBackground() : titlePaneInactiveBackground();
466       }
467
468       public static @NotNull Color titlePaneBackground() {
469         return JBColor.namedColor("TitlePane.background", paneBackground());
470       }
471
472       public static @NotNull Color mainToolbarBackground(boolean active) {
473         JBColor activeBG = JBColor.namedColor("MainToolbar.background", titlePaneBackground());
474         JBColor inactiveBG = JBColor.namedColor("MainToolbar.inactiveBackground", activeBG);
475         return active ? activeBG : inactiveBG;
476       }
477
478       public static @NotNull Color titlePaneInfoForeground() {
479         return JBColor.namedColor("TitlePane.infoForeground", new JBColor(0x616161, 0x919191));
480       }
481
482       public static @NotNull Color titlePaneInactiveInfoForeground() {
483         return JBColor.namedColor("TitlePane.inactiveInfoForeground", new JBColor(0xA6A6A6, 0x737373));
484       }
485
486       public static @NotNull Color paneBackground() {
487         return JBColor.namedColor("Panel.background", Gray.xCD);
488       }
489
490       public static int menuPopupMinWidth() {
491         return JBUI.scale(180);
492       }
493     }
494
495     public static final class DefaultTabs {
496       public static @NotNull Color underlineColor() {
497         return JBColor.namedColor("DefaultTabs.underlineColor", new JBColor(0x4083C9, 0x4A88C7));
498       }
499
500       public static int underlineHeight() {
501         return getInt("DefaultTabs.underlineHeight", JBUIScale.scale(3));
502       }
503
504       public static @NotNull Color inactiveUnderlineColor() {
505         return JBColor.namedColor("DefaultTabs.inactiveUnderlineColor", new JBColor(0x9ca7b8, 0x747a80));
506       }
507
508       public static @NotNull Color borderColor() {
509         return JBColor.namedColor("DefaultTabs.borderColor", UIUtil.CONTRAST_BORDER_COLOR);
510       }
511
512       public static @NotNull Color background() {
513         return JBColor.namedColor("DefaultTabs.background", new JBColor(0xECECEC, 0x3C3F41));
514       }
515
516       public static @NotNull Color hoverBackground() {
517         return JBColor.namedColor("DefaultTabs.hoverBackground",
518                                   new JBColor(ColorUtil.withAlpha(Color.BLACK, .10),
519                                               ColorUtil.withAlpha(Color.BLACK, .35)));
520       }
521
522       public static Color underlinedTabBackground() {
523         return UIManager.getColor("DefaultTabs.underlinedTabBackground");
524       }
525
526       public static @NotNull Color underlinedTabForeground() {
527         return JBColor.namedColor("DefaultTabs.underlinedTabForeground", UIUtil.getLabelForeground());
528       }
529
530       public static @NotNull Color inactiveColoredTabBackground() {
531         return JBColor.namedColor("DefaultTabs.inactiveColoredTabBackground", new JBColor(ColorUtil.withAlpha(Color.BLACK, .07),
532                                                                                           ColorUtil.withAlpha(new Color(0x3C3F41), .60)));
533       }
534     }
535
536     public static final class DebuggerTabs {
537       public static int underlineHeight() {
538         return getInt("DebuggerTabs.underlineHeight", JBUIScale.scale(2));
539       }
540
541       public static Color underlinedTabBackground() {
542         return UIManager.getColor("DebuggerTabs.underlinedTabBackground");
543       }
544     }
545
546     public static final class EditorTabs {
547       public static @NotNull Color underlineColor() {
548         return JBColor.namedColor("EditorTabs.underlineColor", DefaultTabs.underlineColor());
549       }
550
551       public static int underlineHeight() {
552         return getInt("EditorTabs.underlineHeight", DefaultTabs.underlineHeight());
553       }
554
555       public static int underlineArc() {
556         return getInt("EditorTabs.underlineArc", 0);
557       }
558
559       public static @NotNull Color inactiveUnderlineColor() {
560         return JBColor.namedColor("EditorTabs.inactiveUnderlineColor", DefaultTabs.inactiveUnderlineColor());
561       }
562
563       public static Color underlinedTabBackground() {
564         return UIManager.getColor("EditorTabs.underlinedTabBackground");
565       }
566
567       public static Insets tabInsets() {
568         return insets("EditorTabs.tabInsets", insets(0, 8));
569       }
570
571       public static @NotNull Color borderColor() {
572         return JBColor.namedColor("EditorTabs.borderColor", DefaultTabs.borderColor());
573       }
574
575       public static @NotNull Color background() {
576         return JBColor.namedColor("EditorTabs.background", DefaultTabs.background());
577       }
578
579       public static @NotNull Color hoverBackground() {
580         return JBColor.namedColor("EditorTabs.hoverBackground", DefaultTabs.hoverBackground());
581       }
582
583       public static @NotNull Color hoverBackground(boolean selected, boolean active) {
584         String key = selected
585                      ? active ? "EditorTabs.hoverSelectedBackground" : "EditorTabs.hoverSelectedInactiveBackground"
586                      : active ? "EditorTabs.hoverBackground" : "EditorTabs.hoverInactiveBackground";
587
588         return JBColor.namedColor(key, selected ? Gray.TRANSPARENT : DefaultTabs.hoverBackground());
589       }
590
591       public static @NotNull Color inactiveColoredFileBackground() {
592         return JBColor.namedColor("EditorTabs.inactiveColoredFileBackground", DefaultTabs.inactiveColoredTabBackground());
593       }
594
595       public static @NotNull Color underlinedTabForeground() {
596         return JBColor.namedColor("EditorTabs.underlinedTabForeground", DefaultTabs.underlinedTabForeground());
597       }
598     }
599
600     public interface Editor {
601       Color BORDER_COLOR = JBColor.namedColor("Editor.Toolbar.borderColor", JBColor.border());
602
603       interface Tooltip {
604         Color BACKGROUND = JBColor.namedColor("Editor.ToolTip.background", UIUtil.getToolTipBackground());
605         Color FOREGROUND = JBColor.namedColor("Editor.ToolTip.foreground", UIUtil.getToolTipForeground());
606       }
607     }
608
609     public interface DragAndDrop {
610       Color BORDER_COLOR = JBColor.namedColor("DragAndDrop.borderColor", 0x2675BF, 0x2F65CA);
611       Color ROW_BACKGROUND = JBColor.namedColor("DragAndDrop.rowBackground", 0x2675BF26, 0x2F65CA33);
612
613       interface Area {
614         Color FOREGROUND = JBColor.namedColor("DragAndDrop.areaForeground", 0x787878, 0xBABABA);
615         Color BACKGROUND = JBColor.namedColor("DragAndDrop.areaBackground", 0x3D7DCC, 0x404A57);
616       }
617     }
618
619     public interface IconBadge {
620       Color ERROR = JBColor.namedColor("IconBadge.errorBackground", 0xE35252, 0xDB5C5C);
621       Color WARNING = JBColor.namedColor("IconBadge.warningBackground", 0xFCC75B, 0xF2C55C);
622       Color INFORMATION = JBColor.namedColor("IconBadge.infoBackground", 0x588CF3, 0x548AF7);
623       Color SUCCESS = JBColor.namedColor("IconBadge.successBackground", 0x5FB865, 0x5FAD65);
624     }
625
626     public interface Notification {
627       Color FOREGROUND = JBColor.namedColor("Notification.foreground", Label.foreground());
628       Color BACKGROUND = JBColor.namedColor("Notification.background", 0xFFF8D1, 0x1D3857);
629
630       interface Error {
631         Color FOREGROUND = JBColor.namedColor("Notification.errorForeground", Notification.FOREGROUND);
632         Color BACKGROUND = JBColor.namedColor("Notification.errorBackground", 0xF5E6E7, 0x593D41);
633         Color BORDER_COLOR = JBColor.namedColor("Notification.errorBorderColor", 0xE0A8A9, 0x73454B);
634       }
635     }
636
637     public static final class StatusBar {
638       public static final Color BACKGROUND = JBColor.namedColor("StatusBar.background", JBColor.PanelBackground);
639       public static final Color BORDER_COLOR = JBColor.namedColor("StatusBar.borderColor", Gray.x91);
640       /**
641        * @deprecated Use {@link Widget#HOVER_BACKGROUND} instead.
642        */
643       @Deprecated
644       public static Color hoverBackground() {
645         return Widget.HOVER_BACKGROUND;
646       }
647
648       public interface Widget {
649         Color FOREGROUND = JBColor.namedColor("StatusBar.Widget.foreground", UIUtil.getLabelForeground());
650         Color HOVER_FOREGROUND = JBColor.namedColor("StatusBar.Widget.hoverForeground", UIUtil.getLabelForeground());
651         Color HOVER_BACKGROUND = JBColor.namedColor("StatusBar.Widget.hoverBackground", ActionButton.hoverBackground());
652         Color PRESSED_FOREGROUND = JBColor.namedColor("StatusBar.Widget.pressedForeground", UIUtil.getLabelForeground());
653         Color PRESSED_BACKGROUND = JBColor.namedColor("StatusBar.Widget.pressedBackground", ActionButton.pressedBackground());
654
655         static Border iconBorder() {
656           return new JBEmptyBorder(insets("StatusBar.Widget.widgetInsets", insets(0, 4)));
657         }
658
659         static Border border() {
660           return new JBEmptyBorder(insets("StatusBar.Widget.widgetInsets", insets(0, 6)));
661         }
662       }
663
664       public interface Breadcrumbs {
665         Color FOREGROUND = JBColor.namedColor("StatusBar.Breadcrumbs.foreground", StatusBar.Widget.FOREGROUND);
666         Color HOVER_FOREGROUND = JBColor.namedColor("StatusBar.Breadcrumbs.hoverForeground", UIUtil.getLabelForeground());
667         Color HOVER_BACKGROUND = JBColor.namedColor("StatusBar.Breadcrumbs.hoverBackground", ActionButton.hoverBackground());
668         Color SELECTION_FOREGROUND = JBColor.namedColor("StatusBar.Breadcrumbs.selectionForeground", List.Selection.foreground(true));
669         Color SELECTION_BACKGROUND = JBColor.namedColor("StatusBar.Breadcrumbs.selectionBackground", List.Selection.background(true));
670         Color SELECTION_INACTIVE_FOREGROUND = JBColor.namedColor("StatusBar.Breadcrumbs.selectionInactiveForeground", List.Selection.foreground(false));
671         Color SELECTION_INACTIVE_BACKGROUND = JBColor.namedColor("StatusBar.Breadcrumbs.selectionInactiveBackground", List.Selection.background(false));
672
673         Color FLOATING_BACKGROUND = JBColor.namedColor("StatusBar.Breadcrumbs.floatingBackground", List.BACKGROUND);
674         Color FLOATING_FOREGROUND = JBColor.namedColor("StatusBar.Breadcrumbs.floatingForeground", UIUtil.getLabelForeground());
675         JBValue CHEVRON_INSET = new JBValue.UIInteger("StatusBar.Breadcrumbs.chevronInset", 0);
676
677         static Insets floatingBorderInsets() {
678           return insets("StatusBar.Breadcrumbs.floatingToolbarInsets", JBInsets.emptyInsets());
679         }
680       }
681     }
682
683     public static final class ToolWindow {
684       public static @NotNull Color background() {
685         return JBColor.namedColor("ToolWindow.background");
686       }
687
688       public static @NotNull Color borderColor() {
689         return JBColor.namedColor("ToolWindow.HeaderTab.borderColor", DefaultTabs.borderColor());
690       }
691
692       public static @NotNull Color underlinedTabForeground() {
693         return JBColor.namedColor("ToolWindow.HeaderTab.underlinedTabForeground", DefaultTabs.underlinedTabForeground());
694       }
695
696       public static @NotNull Color hoverBackground() {
697         return JBColor.namedColor("ToolWindow.HeaderTab.hoverBackground", DefaultTabs.hoverBackground());
698       }
699
700       public static @NotNull Color inactiveUnderlineColor() {
701         return JBColor.namedColor("ToolWindow.HeaderTab.inactiveUnderlineColor", DefaultTabs.inactiveUnderlineColor());
702       }
703
704       public static @NotNull Color underlineColor() {
705         return JBColor.namedColor("ToolWindow.HeaderTab.underlineColor", DefaultTabs.underlineColor());
706       }
707
708       public static Color underlinedTabBackground() {
709         return UIManager.getColor("ToolWindow.HeaderTab.underlinedTabBackground");
710       }
711
712       public static Color hoverInactiveBackground() {
713         return JBColor.namedColor("ToolWindow.HeaderTab.hoverInactiveBackground", hoverBackground());
714       }
715
716       public static Color underlinedTabInactiveBackground() {
717         return UIManager.getColor("ToolWindow.HeaderTab.underlinedTabInactiveBackground");
718       }
719
720       public static @NotNull Color underlinedTabInactiveForeground() {
721         return JBColor.namedColor("ToolWindow.HeaderTab.underlinedTabInactiveForeground", underlinedTabForeground());
722       }
723
724       public static @NotNull Insets headerTabInsets() {
725         return insets("ToolWindow.HeaderTab.insets", insets(0, 12, 0, 12));
726       }
727
728       public static int headerTabUnderlineArc() {
729         return getInt("ToolWindow.HeaderTab.underlineArc", 4);
730       }
731
732       public static JBInsets headerTabLeftRightInsets() {
733         return insets("ToolWindow.HeaderTab.leftRightInsets", insets(0, 8, 0, 8));
734       }
735
736       public interface DragAndDrop {
737         Color STRIPE_BACKGROUND = JBColor.namedColor("ToolWindow.Button.DragAndDrop.stripeBackground", CurrentTheme.DragAndDrop.Area.BACKGROUND);
738         Color BUTTON_DROP_BACKGROUND = JBColor.namedColor("ToolWindow.Button.DragAndDrop.buttonDropBackground", CurrentTheme.DragAndDrop.Area.BACKGROUND);
739         Color BUTTON_FLOATING_BACKGROUND = JBColor.namedColor("ToolWindow.Button.DragAndDrop.buttonFloatingBackground", ActionButton.pressedBackground());
740       }
741
742       public static @NotNull Color headerBackground(boolean active) {
743         return active ? headerActiveBackground() : headerBackground();
744       }
745
746       public static @NotNull Color headerBackground() {
747         return JBColor.namedColor("ToolWindow.Header.inactiveBackground", JBColor.namedColor("ToolWindow.header.background", 0xECECEC));
748       }
749
750       public static @NotNull Color headerBorderBackground() {
751         return JBColor.namedColor("ToolWindow.Header.borderColor", DefaultTabs.borderColor());
752       }
753
754       public static @NotNull Color headerActiveBackground() {
755         return JBColor.namedColor("ToolWindow.Header.background", JBColor.namedColor("ToolWindow.header.active.background", 0xE2E6EC));
756       }
757
758       public static @NotNull Insets headerInsets() {
759         return insets("ToolWindow.Header.insets", insets(4, 8, 4, 8));
760       }
761
762       public static int headerHeight() {
763         return getInt("ToolWindow.Header.height", 42);
764       }
765
766       public static JBInsets headerLabelLeftRightInsets() {
767         return insets("ToolWindow.Header.labelLeftRightInsets", insets(0, 12, 0, 16));
768       }
769
770       public static JBInsets headerToolbarLeftRightInsets() {
771         return insets("ToolWindow.Header.toolbarLeftRightInsets", insets(0, 12, 0, 8));
772       }
773
774       /**
775        * @deprecated obsolete UI
776        */
777       @Deprecated(forRemoval = true)
778       public static int tabVerticalPadding() {
779         return getInt("ToolWindow.HeaderTab.verticalPadding", JBUIScale.scale(6));
780       }
781
782       public static int underlineHeight() {
783         return getInt("ToolWindow.HeaderTab.underlineHeight", DefaultTabs.underlineHeight());
784       }
785
786
787       public static @NotNull Font headerFont() {
788         return JBFont.label();
789       }
790
791       public static float overrideHeaderFontSizeOffset() {
792         Object offset = UIManager.get("ToolWindow.Header.font.size.offset");
793         if (offset instanceof Integer) {
794           return ((Integer)offset).floatValue();
795         }
796
797         return 0;
798       }
799
800       public static @NotNull Color hoveredIconBackground() {
801         return JBColor.namedColor("ToolWindow.HeaderCloseButton.background", JBColor.namedColor("ToolWindow.header.closeButton.background", 0xB9B9B9));
802       }
803
804       public static @NotNull Icon closeTabIcon(boolean hovered) {
805         return hovered ? getIcon("ToolWindow.header.closeButton.hovered.icon", AllIcons.Actions.CloseHovered)
806                        : getIcon("ToolWindow.header.closeButton.icon", AllIcons.Actions.Close);
807       }
808
809       public static @NotNull Icon comboTabIcon(boolean hovered) {
810         return hovered ? getIcon("ToolWindow.header.comboButton.hovered.icon", AllIcons.General.ArrowDown)
811                        : getIcon("ToolWindow.header.comboButton.icon", AllIcons.General.ArrowDown);
812       }
813     }
814
815     public static final class Label {
816       public static @NotNull Color foreground(boolean selected) {
817         return selected ? JBColor.namedColor("Label.selectedForeground", 0xFFFFFF)
818                         : JBColor.namedColor("Label.foreground", 0x000000);
819       }
820
821       public static @NotNull Color foreground() {
822         return foreground(false);
823       }
824
825       public static @NotNull Color disabledForeground(boolean selected) {
826         return selected ? JBColor.namedColor("Label.selectedDisabledForeground", 0x999999)
827                         : JBColor.namedColor("Label.disabledForeground", JBColor.namedColor("Label.disabledText", 0x999999));
828       }
829
830       public static @NotNull Color disabledForeground() {
831         return disabledForeground(false);
832       }
833     }
834
835     public static final class CompletionPopup {
836
837       public static final class Advertiser {
838
839         public static @NotNull Color background() {
840           return JBColor.namedColor("CompletionPopup.Advertiser.background", CurrentTheme.Advertiser.background());
841         }
842
843         public static @NotNull Color foreground() {
844           return JBColor.namedColor("CompletionPopup.Advertiser.foreground", CurrentTheme.Advertiser.foreground());
845         }
846
847         public static int fontSizeOffset() {
848           return getInt("CompletionPopup.Advertiser.fontSizeOffset", CurrentTheme.Advertiser.FONT_SIZE_OFFSET.get());
849         }
850
851         public static @NotNull Border border() {
852           return new EmptyBorder(insets("CompletionPopup.Advertiser.borderInsets", CurrentTheme.Advertiser.borderInsets()));
853         }
854       }
855     }
856
857     public static final class ComplexPopup {
858
859       public static final Color HEADER_BACKGROUND = JBColor.namedColor("ComplexPopup.Header.background", Popup.BACKGROUND);
860
861       public static Insets headerInsets() {
862         return insets("ComplexPopup.Header.insets", insets(13, 20, 11, 15));
863       }
864
865       public static Insets textFieldBorderInsets() {
866         return insets("ComplexPopup.TextField.borderInsets", insets(0, 12));
867       }
868
869       public static Insets textFieldInputInsets() {
870         return insets("ComplexPopup.TextField.inputInsets", insets(6, 2));
871       }
872
873       public static final int TEXT_FIELD_SEPARATOR_HEIGHT = 1;
874     }
875
876     public static final class Popup {
877       public static int bodyBottomInsetNoAd() {
878         return getInt("Popup.Body.bottomInsetNoAd", 8);
879       }
880
881       public static int bodyBottomInsetBeforeAd() {
882         return getInt("Popup.Body.bottomInsetBeforeAd", 8);
883       }
884
885       public static int bodyTopInsetNoHeader() {
886         return getInt("Popup.Body.topInsetNoHeader", 8);
887       }
888
889       public static Color headerBackground(boolean active) {
890         return active
891                ? JBColor.namedColor("Popup.Header.activeBackground", 0xe6e6e6)
892                : JBColor.namedColor("Popup.Header.inactiveBackground", 0xededed);
893       }
894
895       public static Color headerForeground(boolean active) {
896         return active
897                ? JBColor.namedColor("Popup.Header.activeForeground", UIUtil.getLabelForeground())
898                : JBColor.namedColor("Popup.Header.inactiveForeground", UIUtil.getLabelDisabledForeground());
899       }
900
901       @NotNull
902       public static Insets headerInsets() {
903         return insets("Popup.Header.insets", insets(12, 10, 10, 10));
904       }
905
906       public static int headerHeight(boolean hasControls) {
907         return hasControls ? JBUIScale.scale(28) : JBUIScale.scale(24);
908       }
909
910       public static final Color BACKGROUND = JBColor.namedColor("Popup.background", List.BACKGROUND);
911
912       public static Color borderColor(boolean active) {
913         return active
914                ? JBColor.namedColor("Popup.borderColor", JBColor.namedColor("Popup.Border.color", 0x808080))
915                : JBColor.namedColor("Popup.inactiveBorderColor", JBColor.namedColor("Popup.inactiveBorderColor", 0xaaaaaa));
916       }
917
918       public static float borderWidth() {
919         return getFloat("Popup.borderWidth", 1);
920       }
921
922       public static Insets searchFieldBorderInsets() {
923         return insets("Popup.SearchField.borderInsets", insets(4, 12, 4, 12));
924       }
925
926       public static Insets searchFieldInputInsets() {
927         return insets("Popup.SearchField.inputInsets", insets(4, 8, 8, 2));
928       }
929
930       public static Color toolbarPanelColor() {
931         return JBColor.namedColor("Popup.Toolbar.background", 0xf7f7f7);
932       }
933
934       public static Color toolbarBorderColor() {
935         return JBColor.namedColor("Popup.Toolbar.borderColor", JBColor.namedColor("Popup.Toolbar.Border.color", 0xf7f7f7));
936       }
937
938       public static int toolbarHeight() {
939         return JBUIScale.scale(28);
940       }
941
942       public static Color separatorColor() {
943         return JBColor.namedColor("Popup.separatorColor", new JBColor(Color.gray.brighter(), Gray.x51));
944       }
945
946       public static Insets separatorInsets() {
947         return insets("Popup.separatorInsets", insets(4, 12, 4, 12));
948       }
949
950       public static Insets separatorLabelInsets() {
951         return insets("Popup.separatorLabelInsets", insets(3, 20));
952       }
953
954       public static Color separatorTextColor() {
955         return JBColor.namedColor("Popup.separatorForeground", Color.gray);
956       }
957
958       public static int minimumHintWidth() {
959         return JBUIScale.scale(170);
960       }
961
962       public static Color mnemonicForeground() {
963         return JBColor.namedColor("Popup.mnemonicForeground", ActionsList.MNEMONIC_FOREGROUND);
964       }
965
966       public static class Selection {
967         public static final JBValue ARC = new JBValue.UIInteger("Popup.Selection.arc", 8);
968         public static final JBValue LEFT_RIGHT_INSET = new JBValue.UIInteger("Popup.Selection.leftRightInset", 12);
969
970         @NotNull
971         public static Insets innerInsets() {
972           JBInsets result = insets("Popup.Selection.innerInsets", insets(0, 8));
973           // Top and bottom values are ignored now
974           result.top = 0;
975           result.bottom = 0;
976           return result;
977         }
978       }
979     }
980
981     public static final class Focus {
982       private static final Color GRAPHITE_COLOR = new JBColor(new Color(0x8099979d, true), new Color(0x676869));
983
984       public static @NotNull Color focusColor() {
985         return UIUtil.isGraphite() ? GRAPHITE_COLOR : JBColor.namedColor("Component.focusColor", JBColor.namedColor("Focus.borderColor", 0x8ab2eb));
986       }
987
988       public static @NotNull Color defaultButtonColor() {
989         return StartupUiUtil.isUnderDarcula() ? JBColor.namedColor("Button.default.focusColor",
990                                     JBColor.namedColor("Focus.defaultButtonBorderColor", 0x97c3f3)) : focusColor();
991       }
992
993       public static @NotNull Color errorColor(boolean active) {
994         return active ? JBColor.namedColor("Component.errorFocusColor", JBColor.namedColor("Focus.activeErrorBorderColor", 0xe53e4d)) :
995                         JBColor.namedColor("Component.inactiveErrorFocusColor", JBColor.namedColor("Focus.inactiveErrorBorderColor", 0xebbcbc));
996       }
997
998       public static @NotNull Color warningColor(boolean active) {
999         return active ? JBColor.namedColor("Component.warningFocusColor", JBColor.namedColor("Focus.activeWarningBorderColor", 0xe2a53a)) :
1000                         JBColor.namedColor("Component.inactiveWarningFocusColor", JBColor.namedColor("Focus.inactiveWarningBorderColor", 0xffd385));
1001       }
1002     }
1003
1004     public static final class TabbedPane {
1005       public static final Color ENABLED_SELECTED_COLOR = JBColor.namedColor("TabbedPane.underlineColor", JBColor.namedColor("TabbedPane.selectedColor", 0x4083C9));
1006       public static final Color DISABLED_SELECTED_COLOR = JBColor.namedColor("TabbedPane.disabledUnderlineColor", JBColor.namedColor("TabbedPane.selectedDisabledColor", Gray.xAB));
1007       public static final Color DISABLED_TEXT_COLOR = JBColor.namedColor("TabbedPane.disabledForeground", JBColor.namedColor("TabbedPane.disabledText", Gray.x99));
1008       public static final Color HOVER_COLOR = JBColor.namedColor("TabbedPane.hoverColor", Gray.xD9);
1009       public static final Color FOCUS_COLOR = JBColor.namedColor("TabbedPane.focusColor", 0xDAE4ED);
1010       public static final JBValue TAB_HEIGHT = new JBValue.UIInteger("TabbedPane.tabHeight", 32);
1011       public static final JBValue SELECTION_HEIGHT = new JBValue.UIInteger("TabbedPane.tabSelectionHeight", 3);
1012       public static final JBValue SELECTION_ARC = new JBValue.UIInteger("TabbedPane.tabSelectionArc", 0);
1013     }
1014
1015     public static final class BigPopup {
1016       public static @NotNull Color headerBackground() {
1017         return JBColor.namedColor("SearchEverywhere.Header.background", 0xf2f2f2);
1018       }
1019
1020       public static @NotNull Insets tabInsets() {
1021         return JBInsets.create(0, 12);
1022       }
1023
1024       public static @NotNull Color selectedTabColor() {
1025         return JBColor.namedColor("SearchEverywhere.Tab.selectedBackground", 0xdedede);
1026       }
1027
1028       public static @NotNull Color selectedTabTextColor() {
1029         return JBColor.namedColor("SearchEverywhere.Tab.selectedForeground", 0x000000);
1030       }
1031
1032       public static @NotNull Color searchFieldBackground() {
1033         return JBColor.namedColor("SearchEverywhere.SearchField.background", 0xffffff);
1034       }
1035
1036       public static @NotNull Color searchFieldBorderColor() {
1037         return JBColor.namedColor("SearchEverywhere.SearchField.borderColor", 0xbdbdbd);
1038       }
1039
1040       public static @NotNull Insets searchFieldInsets() {
1041         return insets(0, 6, 0, 5);
1042       }
1043
1044       public static int maxListHeight() {
1045         return JBUIScale.scale(600);
1046       }
1047
1048       public static @NotNull Color listSeparatorColor() {
1049         return JBColor.namedColor("SearchEverywhere.List.separatorColor", Gray.xDC);
1050       }
1051
1052       public static final @NotNull Color LIST_SETTINGS_BACKGROUND =
1053         JBColor.namedColor("SearchEverywhere.List.settingsBackground", LightColors.SLIGHTLY_GRAY);
1054
1055       public static @NotNull Color listTitleLabelForeground() {
1056         return JBColor.namedColor("SearchEverywhere.List.separatorForeground", UIUtil.getLabelDisabledForeground());
1057       }
1058
1059       public static @NotNull Color searchFieldGrayForeground()  {
1060         return JBColor.namedColor("SearchEverywhere.SearchField.infoForeground", JBColor.GRAY);
1061       }
1062
1063       public static @NotNull Color advertiserForeground()  {
1064         return JBColor.namedColor("SearchEverywhere.Advertiser.foreground", JBColor.GRAY);
1065       }
1066
1067       public static @NotNull Border advertiserBorder()  {
1068         return new JBEmptyBorder(insets("SearchEverywhere.Advertiser.borderInsets", insets(5, 10, 5, 15)));
1069       }
1070
1071       public static @NotNull Color advertiserBackground()  {
1072         return JBColor.namedColor("SearchEverywhere.Advertiser.background", 0xf2f2f2);
1073       }
1074     }
1075
1076     public static final class Advertiser {
1077       public static @NotNull Color foreground() {
1078         Color foreground = JBUI.CurrentTheme.BigPopup.advertiserForeground();
1079         return JBColor.namedColor("Popup.Advertiser.foreground", foreground);
1080       }
1081
1082       public static @NotNull Color background() {
1083         Color background = JBUI.CurrentTheme.BigPopup.advertiserBackground();
1084         return JBColor.namedColor("Popup.Advertiser.background", background);
1085       }
1086
1087       public static @NotNull Border border() {
1088         return new EmptyBorder(borderInsets());
1089       }
1090
1091       private static @NotNull JBInsets borderInsets() {
1092         return insets("Popup.Advertiser.borderInsets", insets(5, 10, 5, 15));
1093       }
1094
1095       public static @NotNull Color borderColor() {
1096         return JBColor.namedColor("Popup.Advertiser.borderColor", Gray._135);
1097       }
1098
1099       public static final JBValue FONT_SIZE_OFFSET = new JBValue.UIInteger("Popup.Advertiser.fontSizeOffset", -2);
1100     }
1101
1102     public static final class Validator {
1103       public static @NotNull Color errorBorderColor() {
1104         return JBColor.namedColor("ValidationTooltip.errorBorderColor", 0xE0A8A9);
1105       }
1106
1107       public static @NotNull Color errorBackgroundColor() {
1108         return JBColor.namedColor("ValidationTooltip.errorBackground", JBColor.namedColor("ValidationTooltip.errorBackgroundColor", 0xF5E6E7));
1109       }
1110
1111       public static @NotNull Color warningBorderColor() {
1112         return JBColor.namedColor("ValidationTooltip.warningBorderColor", 0xE0CEA8);
1113       }
1114
1115       public static @NotNull Color warningBackgroundColor() {
1116         return JBColor.namedColor("ValidationTooltip.warningBackground", JBColor.namedColor("ValidationTooltip.warningBackgroundColor", 0xF5F0E6));
1117       }
1118     }
1119
1120     public static final class Link {
1121       public static final @NotNull Color FOCUSED_BORDER_COLOR = JBColor.namedColor("Link.focusedBorderColor", Component.FOCUSED_BORDER_COLOR);
1122
1123       public interface Foreground {
1124         @NotNull Color DISABLED = JBColor.namedColor("Link.disabledForeground", Label.disabledForeground());
1125         @NotNull Color ENABLED = JBColor.namedColor("Link.activeForeground", JBColor.namedColor("link.foreground", 0x589DF6));
1126         @NotNull Color HOVERED = JBColor.namedColor("Link.hoverForeground", JBColor.namedColor("link.hover.foreground", ENABLED));
1127         @NotNull Color PRESSED = JBColor.namedColor("Link.pressedForeground", JBColor.namedColor("link.pressed.foreground", 0xF00000, 0xBA6F25));
1128         @NotNull Color VISITED = JBColor.namedColor("Link.visitedForeground", JBColor.namedColor("link.visited.foreground", 0x800080, 0x9776A9));
1129         @NotNull Color SECONDARY = JBColor.namedColor("Link.secondaryForeground", 0x779DBD, 0x5676A0);
1130       }
1131
1132       /**
1133        * @deprecated use {@link Foreground#ENABLED} instead
1134        */
1135       @Deprecated(forRemoval = true)
1136       public static @NotNull Color linkColor() {
1137         return Foreground.ENABLED;
1138       }
1139
1140       /**
1141        * @deprecated use {@link Foreground#HOVERED} instead
1142        */
1143       @Deprecated(forRemoval = true)
1144       public static @NotNull Color linkHoverColor() {
1145         return Foreground.HOVERED;
1146       }
1147
1148       /**
1149        * @deprecated use {@link Foreground#PRESSED} instead
1150        */
1151       @Deprecated(forRemoval = true)
1152       public static @NotNull Color linkPressedColor() {
1153         return Foreground.PRESSED;
1154       }
1155
1156       /**
1157        * @deprecated use {@link Foreground#VISITED} instead
1158        */
1159       @Deprecated(forRemoval = true)
1160       public static @NotNull Color linkVisitedColor() {
1161         return Foreground.VISITED;
1162       }
1163     }
1164
1165     public static final class Tooltip {
1166       public static final JBValue CORNER_RADIUS = new JBValue.UIInteger("ToolTip.borderCornerRadius", 4);
1167
1168       public static @NotNull Color shortcutForeground () {
1169         return JBColor.namedColor("ToolTip.shortcutForeground", new JBColor(0x787878, 0x999999));
1170       }
1171
1172       /**
1173        * Border color for tooltips except information/question/error tooltips (see {@link com.intellij.codeInsight.hint.HintUtil#HINT_BORDER_COLOR_KEY})
1174        */
1175       public static @NotNull Color borderColor() {
1176         return JBColor.namedColor("ToolTip.borderColor", new JBColor(0xadadad, 0x636569));
1177       }
1178     }
1179
1180     public static final class GotItTooltip {
1181       public static @NotNull Color foreground(boolean useContrastColors) {
1182         if (useContrastColors) {
1183           return JBColor.namedColor("Tooltip.Learning.foreground", 0xF5F5F5);
1184         } else {
1185           return JBColor.namedColor("GotItTooltip.foreground", UIUtil.getToolTipForeground());
1186         }
1187       }
1188
1189       public static @NotNull Color background(boolean useContrastColors) {
1190         if (useContrastColors) {
1191           return JBColor.namedColor("Tooltip.Learning.background");
1192         } else {
1193           return JBColor.namedColor("GotItTooltip.background", UIUtil.getToolTipBackground());
1194         }
1195       }
1196
1197       public static @NotNull Color shortcutForeground(boolean useContrastColors) {
1198         if (useContrastColors) {
1199           return JBColor.namedColor("Tooltip.Learning.spanForeground", 0xF5F5F5);
1200         } else {
1201           return JBColor.namedColor("GotItTooltip.shortcutForeground", Tooltip.shortcutForeground());
1202         }
1203       }
1204
1205       public static @NotNull Color linkForeground() {
1206         return JBColor.namedColor("GotItTooltip.linkForeground", JBUI.CurrentTheme.Link.Foreground.ENABLED);
1207       }
1208
1209       public static @NotNull Color borderColor(boolean useContrastColors) {
1210         if (useContrastColors) {
1211           return JBColor.namedColor("Tooltip.Learning.background", 0x1071E8, 0x0E62CF);
1212         } else {
1213           return JBColor.namedColor("GotItTooltip.borderColor", JBUI.CurrentTheme.Tooltip.borderColor());
1214         }
1215       }
1216
1217       public static @NotNull Color buttonBackgroundContrast() {
1218         return JBColor.namedColor("Tooltip.Learning.spanBackground", 0x0D5CBD, 0x0250B0);
1219       }
1220
1221       public static @NotNull Color buttonForegroundContrast() {
1222         return JBColor.namedColor("Tooltip.Learning.spanForeground", 0xF5F5F5);
1223       }
1224     }
1225
1226     public interface ContextHelp {
1227       @NotNull Color FOREGROUND = JBColor.namedColor("Label.infoForeground", new JBColor(Gray.x78, Gray.x8C));
1228     }
1229
1230     public static final class Arrow {
1231       public static @NotNull Color foregroundColor(boolean enabled) {
1232         return enabled ?
1233                JBColor.namedColor("ComboBox.ArrowButton.iconColor", JBColor.namedColor("ComboBox.darcula.arrowButtonForeground", Gray.x66)) :
1234                JBColor.namedColor("ComboBox.ArrowButton.disabledIconColor", JBColor.namedColor("ComboBox.darcula.arrowButtonDisabledForeground", Gray.xAB));
1235
1236       }
1237
1238       public static @NotNull Color backgroundColor(boolean enabled, boolean editable) {
1239         return enabled ?
1240                editable ? JBColor.namedColor("ComboBox.ArrowButton.background", JBColor.namedColor("ComboBox.darcula.editable.arrowButtonBackground", Gray.xFC)) :
1241                JBColor.namedColor("ComboBox.ArrowButton.nonEditableBackground", JBColor.namedColor("ComboBox.darcula.arrowButtonBackground", Gray.xFC))
1242                        : UIUtil.getPanelBackground();
1243       }
1244     }
1245
1246     public static final class NewClassDialog {
1247       public static @NotNull Color searchFieldBackground() {
1248         return JBColor.namedColor("NewClass.SearchField.background", 0xffffff);
1249       }
1250
1251       public static @NotNull Color panelBackground() {
1252         return JBColor.namedColor("NewClass.Panel.background", 0xf2f2f2);
1253       }
1254
1255       public static @NotNull Color bordersColor() {
1256         return JBColor.namedColor(
1257           "TextField.borderColor",
1258           JBColor.namedColor("Component.borderColor", new JBColor(0xbdbdbd, 0x646464))
1259         );
1260       }
1261
1262       public static int fieldsSeparatorWidth() {
1263         return getInt("NewClass.separatorWidth", JBUIScale.scale(10));
1264       }
1265     }
1266
1267     public static final class NotificationError {
1268       public static @NotNull Color backgroundColor() {
1269         return JBColor.namedColor("Notification.ToolWindow.errorBackground", new JBColor(0xffcccc, 0x704745));
1270       }
1271
1272       public static @NotNull Color foregroundColor() {
1273         return JBColor.namedColor("Notification.ToolWindow.errorForeground", UIUtil.getToolTipForeground());
1274       }
1275
1276       public static @NotNull Color borderColor() {
1277         return JBColor.namedColor("Notification.ToolWindow.errorBorderColor", new JBColor(0xd69696, 0x998a8a));
1278       }
1279     }
1280
1281     public static final class NotificationInfo {
1282       public static @NotNull Color backgroundColor() {
1283         return JBColor.namedColor("Notification.ToolWindow.informativeBackground", new JBColor(0xbaeeba, 0x33412E));
1284       }
1285
1286       public static @NotNull Color foregroundColor() {
1287         return JBColor.namedColor("Notification.ToolWindow.informativeForeground", UIUtil.getToolTipForeground());
1288       }
1289
1290       public static @NotNull Color borderColor() {
1291         return JBColor.namedColor("Notification.ToolWindow.informativeBorderColor", new JBColor(0xa0bf9d, 0x85997a));
1292       }
1293     }
1294         public static final class NotificationWarning {
1295       public static @NotNull Color backgroundColor() {
1296         return JBColor.namedColor("Notification.ToolWindow.warningBackground", new JBColor(0xf9f78e, 0x5a5221));
1297       }
1298
1299       public static @NotNull Color foregroundColor() {
1300         return JBColor.namedColor("Notification.ToolWindow.warningForeground", UIUtil.getToolTipForeground());
1301       }
1302
1303       public static @NotNull Color borderColor() {
1304         return JBColor.namedColor("Notification.ToolWindow.warningBorderColor", new JBColor(0xbab824, 0xa69f63));
1305       }
1306     }
1307
1308     private static final Color DEFAULT_RENDERER_BACKGROUND = new JBColor(0xFFFFFF, 0x3C3F41);
1309     private static final Color DEFAULT_RENDERER_SELECTION_BACKGROUND = new JBColor(0x3875D6, 0x2F65CA);
1310     private static final Color DEFAULT_RENDERER_SELECTION_INACTIVE_BACKGROUND = new JBColor(0xD4D4D4, 0x0D293E);
1311     private static final Color DEFAULT_RENDERER_HOVER_BACKGROUND = new JBColor(0xEDF5FC, 0x464A4D);
1312     private static final Color DEFAULT_RENDERER_HOVER_INACTIVE_BACKGROUND = new JBColor(0xF5F5F5, 0x464A4D);
1313
1314     public interface List {
1315       Color BACKGROUND = JBColor.namedColor("List.background", DEFAULT_RENDERER_BACKGROUND);
1316       Color FOREGROUND = JBColor.namedColor("List.foreground", Label.foreground(false));
1317
1318       static @NotNull Color background(boolean selected, boolean focused) {
1319         return selected ? Selection.background(focused) : BACKGROUND;
1320       }
1321
1322       static @NotNull Color foreground(boolean selected, boolean focused) {
1323         return selected ? Selection.foreground(focused) : FOREGROUND;
1324       }
1325
1326       static int rowHeight() {
1327         int defaultHeight = JBUIScale.scale(24);
1328         int result = getInt("List.rowHeight", defaultHeight);
1329         // Linux doesn't support rowHeight now, use default value. See IDEA-234112
1330         return result <= 0 ? defaultHeight : result;
1331       }
1332
1333       static int buttonLeftRightInsets() {
1334         return getInt("List.Button.leftRightInset", 8);
1335       }
1336
1337       final class Selection {
1338         private static final Color BACKGROUND = JBColor.namedColor("List.selectionBackground", DEFAULT_RENDERER_SELECTION_BACKGROUND);
1339         private static final Color FOREGROUND = JBColor.namedColor("List.selectionForeground", Label.foreground(true));
1340
1341         public static @NotNull Color background(boolean focused) {
1342           //todo[kb] remove?
1343           //if (focused && UIUtil.isUnderDefaultMacTheme()) {
1344           //  double alpha = getInt("List.selectedItemAlpha", 75);
1345           //  if (0 <= alpha && alpha < 100) return ColorUtil.mix(Color.WHITE, BACKGROUND, alpha / 100.0);
1346           //}
1347           return focused ? BACKGROUND : Inactive.BACKGROUND;
1348         }
1349
1350         public static @NotNull Color foreground(boolean focused) {
1351           return focused ? FOREGROUND : Inactive.FOREGROUND;
1352         }
1353
1354         private interface Inactive {
1355           Color BACKGROUND = JBColor.namedColor("List.selectionInactiveBackground", DEFAULT_RENDERER_SELECTION_INACTIVE_BACKGROUND);
1356           Color FOREGROUND = JBColor.namedColor("List.selectionInactiveForeground", List.FOREGROUND);
1357         }
1358       }
1359
1360       final class Hover {
1361         private static final Color BACKGROUND = JBColor.namedColor("List.hoverBackground", DEFAULT_RENDERER_HOVER_BACKGROUND);
1362
1363         public static @NotNull Color background(boolean focused) {
1364           return focused ? BACKGROUND : Inactive.BACKGROUND;
1365         }
1366
1367         private interface Inactive {
1368           Color BACKGROUND = JBColor.namedColor("List.hoverInactiveBackground", DEFAULT_RENDERER_HOVER_INACTIVE_BACKGROUND);
1369         }
1370       }
1371     }
1372
1373     public interface Table {
1374       Color BACKGROUND = JBColor.namedColor("Table.background", DEFAULT_RENDERER_BACKGROUND);
1375       Color FOREGROUND = JBColor.namedColor("Table.foreground", Label.foreground(false));
1376
1377       static @NotNull Color background(boolean selected, boolean focused) {
1378         return selected ? Selection.background(focused) : BACKGROUND;
1379       }
1380
1381       static @NotNull Color foreground(boolean selected, boolean focused) {
1382         return selected ? Selection.foreground(focused) : FOREGROUND;
1383       }
1384
1385       final class Selection {
1386         private static final Color BACKGROUND = JBColor.namedColor("Table.selectionBackground", DEFAULT_RENDERER_SELECTION_BACKGROUND);
1387         private static final Color FOREGROUND = JBColor.namedColor("Table.selectionForeground", Label.foreground(true));
1388
1389         public static @NotNull Color background(boolean focused) {
1390           return focused ? BACKGROUND : Inactive.BACKGROUND;
1391         }
1392
1393         public static @NotNull Color foreground(boolean focused) {
1394           return focused ? FOREGROUND : Inactive.FOREGROUND;
1395         }
1396
1397         private interface Inactive {
1398           Color BACKGROUND = JBColor.namedColor("Table.selectionInactiveBackground", DEFAULT_RENDERER_SELECTION_INACTIVE_BACKGROUND);
1399           Color FOREGROUND = JBColor.namedColor("Table.selectionInactiveForeground", Table.FOREGROUND);
1400         }
1401       }
1402
1403       final class Hover {
1404         private static final Color BACKGROUND = JBColor.namedColor("Table.hoverBackground", DEFAULT_RENDERER_HOVER_BACKGROUND);
1405
1406         public static @NotNull Color background(boolean focused) {
1407           return focused ? BACKGROUND : Inactive.BACKGROUND;
1408         }
1409
1410         private interface Inactive {
1411           Color BACKGROUND = JBColor.namedColor("Table.hoverInactiveBackground", DEFAULT_RENDERER_HOVER_INACTIVE_BACKGROUND);
1412         }
1413       }
1414     }
1415
1416     public interface Tree {
1417       Color BACKGROUND = JBColor.namedColor("Tree.background", DEFAULT_RENDERER_BACKGROUND);
1418       Color FOREGROUND = JBColor.namedColor("Tree.foreground", Label.foreground(false));
1419
1420       static @NotNull Color background(boolean selected, boolean focused) {
1421         return selected ? Selection.background(focused) : BACKGROUND;
1422       }
1423
1424       static @NotNull Color foreground(boolean selected, boolean focused) {
1425         return selected ? Selection.foreground(focused) : FOREGROUND;
1426       }
1427
1428       static int rowHeight() {
1429         int defaultHeight = JBUIScale.scale(24);
1430         int result = getInt("Tree.rowHeight", defaultHeight);
1431         // Linux doesn't support rowHeight now, use default value. See IDEA-234112
1432         return result <= 0 ? defaultHeight : result;
1433       }
1434
1435       final class Selection {
1436         private static final Color BACKGROUND = JBColor.namedColor("Tree.selectionBackground", DEFAULT_RENDERER_SELECTION_BACKGROUND);
1437         private static final Color FOREGROUND = JBColor.namedColor("Tree.selectionForeground", Label.foreground(true));
1438
1439         public static @NotNull Color background(boolean focused) {
1440           return focused ? BACKGROUND : Inactive.BACKGROUND;
1441         }
1442
1443         public static @NotNull Color foreground(boolean focused) {
1444           return focused ? FOREGROUND : Inactive.FOREGROUND;
1445         }
1446
1447         private interface Inactive {
1448           Color BACKGROUND = JBColor.namedColor("Tree.selectionInactiveBackground", DEFAULT_RENDERER_SELECTION_INACTIVE_BACKGROUND);
1449           Color FOREGROUND = JBColor.namedColor("Tree.selectionInactiveForeground", Tree.FOREGROUND);
1450         }
1451       }
1452
1453       final class Hover {
1454         private static final Color BACKGROUND = JBColor.namedColor("Tree.hoverBackground", DEFAULT_RENDERER_HOVER_BACKGROUND);
1455
1456         public static @NotNull Color background(boolean focused) {
1457           return focused ? BACKGROUND : Inactive.BACKGROUND;
1458         }
1459
1460         private interface Inactive {
1461           Color BACKGROUND = JBColor.namedColor("Tree.hoverInactiveBackground", DEFAULT_RENDERER_HOVER_INACTIVE_BACKGROUND);
1462         }
1463       }
1464     }
1465   }
1466
1467   public static int getInt(@NonNls @NotNull String propertyName, int defaultValue) {
1468     Object value = UIManager.get(propertyName);
1469     return value instanceof Integer ? (Integer)value : defaultValue;
1470   }
1471
1472   public static float getFloat(@NonNls @NotNull String propertyName, float defaultValue) {
1473     Object value = UIManager.get(propertyName);
1474     if (value instanceof Float) return (Float)value;
1475     if (value instanceof Double) return ((Double)value).floatValue();
1476     if (value instanceof String) {
1477       try {
1478         return Float.parseFloat((String)value);
1479       } catch (NumberFormatException ignore) {}
1480     }
1481     return defaultValue;
1482   }
1483
1484   private static @NotNull Icon getIcon(@NonNls @NotNull String propertyName, @NotNull Icon defaultIcon) {
1485     Icon icon = UIManager.getIcon(propertyName);
1486     return icon == null ? defaultIcon : icon;
1487   }
1488 }