From d33685207bfed56796ed002d2bb3fe98193c19c5 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 18 Nov 2014 18:44:07 +0300 Subject: [PATCH] editor scrollbar reworking (IDEA-131263) --- .../HighlightDisplayLevel.java | 2 +- .../icons/src/actions/inspectionsPause.png | Bin 94 -> 0 bytes .../icons/src/actions/inspectionsPause@2x.png | Bin 104 -> 0 bytes .../src/actions/inspectionsPause@2x_dark.png | Bin 106 -> 0 bytes .../src/actions/inspectionsPause_dark.png | Bin 94 -> 0 bytes platform/icons/src/general/eye.png | Bin 0 -> 267 bytes platform/icons/src/general/eye@2x.png | Bin 0 -> 539 bytes platform/icons/src/general/eye@2x_dark.png | Bin 0 -> 533 bytes platform/icons/src/general/eye_dark.png | Bin 0 -> 274 bytes .../src/general/inspectionInProgress.png | Bin 217 -> 0 bytes .../src/general/inspectionInProgress@2x.png | Bin 513 -> 0 bytes .../icons/src/general/inspectionsPause.png | Bin 0 -> 93 bytes .../icons/src/general/inspectionsPause@2x.png | Bin 0 -> 104 bytes .../src/general/inspectionsPause@2x_dark.png | Bin 0 -> 106 bytes .../src/general/inspectionsPause_dark.png | Bin 0 -> 93 bytes platform/icons/src/general/noAnalysis.png | Bin 187 -> 0 bytes .../icons/src/general/noAnalysis_dark.png | Bin 93 -> 0 bytes platform/icons/src/general/safeMode.png | Bin 0 -> 164 bytes platform/icons/src/general/safeMode@2x.png | Bin 0 -> 498 bytes .../icons/src/general/safeMode@2x_dark.png | Bin 0 -> 499 bytes platform/icons/src/general/safeMode_dark.png | Bin 0 -> 163 bytes .../daemon/impl/TrafficLightRenderer.java | 18 ++- .../util/ui/ButtonlessScrollBarUI.java | 18 +-- .../openapi/editor/impl/EditorImpl.java | 8 +- .../editor/impl/EditorMarkupModelImpl.java | 127 +++++++++++------- .../util/src/com/intellij/icons/AllIcons.java | 6 +- 26 files changed, 102 insertions(+), 77 deletions(-) delete mode 100755 platform/icons/src/actions/inspectionsPause.png delete mode 100644 platform/icons/src/actions/inspectionsPause@2x.png delete mode 100644 platform/icons/src/actions/inspectionsPause@2x_dark.png delete mode 100755 platform/icons/src/actions/inspectionsPause_dark.png create mode 100644 platform/icons/src/general/eye.png create mode 100644 platform/icons/src/general/eye@2x.png create mode 100644 platform/icons/src/general/eye@2x_dark.png create mode 100644 platform/icons/src/general/eye_dark.png delete mode 100644 platform/icons/src/general/inspectionInProgress.png delete mode 100644 platform/icons/src/general/inspectionInProgress@2x.png create mode 100644 platform/icons/src/general/inspectionsPause.png create mode 100644 platform/icons/src/general/inspectionsPause@2x.png create mode 100644 platform/icons/src/general/inspectionsPause@2x_dark.png create mode 100644 platform/icons/src/general/inspectionsPause_dark.png delete mode 100644 platform/icons/src/general/noAnalysis.png delete mode 100644 platform/icons/src/general/noAnalysis_dark.png create mode 100644 platform/icons/src/general/safeMode.png create mode 100644 platform/icons/src/general/safeMode@2x.png create mode 100644 platform/icons/src/general/safeMode@2x_dark.png create mode 100644 platform/icons/src/general/safeMode_dark.png diff --git a/platform/analysis-api/src/com/intellij/codeHighlighting/HighlightDisplayLevel.java b/platform/analysis-api/src/com/intellij/codeHighlighting/HighlightDisplayLevel.java index c4488674602f..189aa1f31217 100644 --- a/platform/analysis-api/src/com/intellij/codeHighlighting/HighlightDisplayLevel.java +++ b/platform/analysis-api/src/com/intellij/codeHighlighting/HighlightDisplayLevel.java @@ -111,7 +111,7 @@ public class HighlightDisplayLevel { } } - private static final int EMPTY_ICON_DIM = 12; + private static final int EMPTY_ICON_DIM = 13; public static Icon createIconByKey(@NotNull TextAttributesKey key) { for (IconCreator creator : Extensions.getExtensions(IconCreator.EXTENSION_POINT_NAME)) { diff --git a/platform/icons/src/actions/inspectionsPause.png b/platform/icons/src/actions/inspectionsPause.png deleted file mode 100755 index e7158a7d3545809954831b6415efcaea5f9bf65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kRZkbkkcwN$KmPx>XV#q2n8Ryb r_U1r$VdfA1qY{4tc}uQ37(8NFaK3xPVczAfKn)C@u6{1-oD!MmW$1C(0n|;eup_X>U&du78p14b;lu>FVdQ&MBb@04z%+ AApigX diff --git a/platform/icons/src/actions/inspectionsPause@2x_dark.png b/platform/icons/src/actions/inspectionsPause@2x_dark.png deleted file mode 100644 index c3e261762957c1952ec993ca2f180dfd76414623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjhMq2tAr-fhfBgS%&#Y^Bcm?ZX zu?xqV-n@D9KSLst&$;eOQy{mSuEf@aD@_-<+6CAc9)B~77JI?(1=P&o>FVdQ&MBb@ E0AM;I#Q*>R diff --git a/platform/icons/src/actions/inspectionsPause_dark.png b/platform/icons/src/actions/inspectionsPause_dark.png deleted file mode 100755 index 5cdeb146168a7072ef5b26e80bea9a2a86604ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kRZkbkkcwN$KmPx>XV#q2n8SPX r=FJL2J>LHdC7SJ5HLjE5aFbz3+T+~N`A>QhPy>UftDnm{r-UW|ZOI%? diff --git a/platform/icons/src/general/eye.png b/platform/icons/src/general/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..a762227beceb775260600638b99b71bf7882d35a GIT binary patch literal 267 zcmV+m0rdWfP)CS4$Y48+NXLqtI%G|HP?M6}rrq4_1+>A#+Yi~Mcp!d?ZW9C4 z&DVf_+V0)7<)rK6t6#iYww(a^5gH&W*aCt98cMLx`w3NC2@O@$&>Ord0sxy1jJziE Rx!nK&002ovPDHLkV1ny;c^Loz literal 0 HcmV?d00001 diff --git a/platform/icons/src/general/eye@2x.png b/platform/icons/src/general/eye@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c234032e0c803db9de8385df00dde5dee1d26918 GIT binary patch literal 539 zcmV+$0_6RPP)G%_-15k;dmBi(K! ze;K{~FydLooUZPLdZ&JMYIxaZq()Y`QCjG?XQ!)^=mAZkTxa18^jffOiz%TfWC4ZX zo2vb<7sF1i7-oJHgUhMBu{8IEay?X5FV@787E4@?XA;-~g8qP;wA!#i;eQI6pD^@Z|si002ovPDHLkV1o7l?>+zk literal 0 HcmV?d00001 diff --git a/platform/icons/src/general/eye@2x_dark.png b/platform/icons/src/general/eye@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e41e2263871df04601b05f06b9a0ac8042fc4343 GIT binary patch literal 533 zcmV+w0_y#VP)BcTNK)G6tq zmE?~SI=IceW@S-(nt>+|9~5_XzPq#E8Fh>?T`$n}h5ABGLdj%O3nQ=tq=72%4%`Dy zz@W9aQ=u{78ekgKfDka+tarbLF|STxBbiO+@4AFszj*rUKah zA~XQ(2`4_X29#a1|Am=+dB#6~zUSFWP;o=NAy_eOx>--HH%Fa^E=Qy2&$F%&|PR4T2dEX5g%GTH9Wk$?oy4w&0s!N zR3QM(u+U%zeLH)jHID_mdY6NWi`-SWI0vndEg;07aFI?M)+U^=cypVHV3W?C=PS^# zADfriJ8WWHqZn-NwQfhy2#uFon=y0+jQ?lWaSSv-ALs^E8n7;InvRER|BtUP)H9)P Xgr1>A5qJNh00000NkvXXu0mjfW(e+W literal 0 HcmV?d00001 diff --git a/platform/icons/src/general/eye_dark.png b/platform/icons/src/general/eye_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e27c69cfa37eacaf1809eeb4f940d20ef5ae907c GIT binary patch literal 274 zcmV+t0qy>YP)p138?6^hnLTP4-b$3UcQ0NklY5+skT z*av9B%W2c59R!)^00000NkvXXu0mjfd0|+@ diff --git a/platform/icons/src/general/inspectionInProgress@2x.png b/platform/icons/src/general/inspectionInProgress@2x.png deleted file mode 100644 index 581dddff93bcdbc6e9660b870d8343d17804f9e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmV+c0{;DpP)mLFv#pP!bOo3UvrN)Gd-I z!jz(9>2TUekn)!HekU#kKk;YyAeR;c9=O<@d|@x50Y7zClyiGqsj=4Mu+i7GVb- zpaf-jf<0J*iJpUD09N7EY&I)?zdxBurEZGF;wzNW>GVS&5ID71EP2fNfOQz`7CZ_^ zMx*g96bfBeDix~N>m*4Mx!rDZxm*;B#fa~-a5yaST-02^bf@59NI4viD@9RCBw99` zC0Ulq>2x+F5(#yfa=BdDZntMqd&>)J7rgE9c#dne8fhD^l*0@LLj(8up0-u1RYGl& z&!b)NzR%}7<4HdW_IkZ1$k=TcJOv82Lc&%wm(6>s-3Atq$D5&;Tjd(m-oaR>!<&Og zlgacRjYehlkT{$VuJ!ODk;uI`yi1tr_PCA1Ce*A}Yd#nZo@X+dr!rchP$-MX?Tp7T zrwAJ`)XQ_MnuQfOfM=+P7ep2>$TCc}*8P9z|1S6wR<*2VfqP=F00000NkvXXu0mjf Dw(IM+ diff --git a/platform/icons/src/general/inspectionsPause.png b/platform/icons/src/general/inspectionsPause.png new file mode 100644 index 0000000000000000000000000000000000000000..5635f94a6723695da9304d4b73864d6610a76016 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k6;Bt(kcwN$KmPx>XV#q2_)n_r r&5e)pU6KnV&d6VNn8>!uU4~(1=klPei9coo)iZdy`njxgN@xNAdr}>P literal 0 HcmV?d00001 diff --git a/platform/icons/src/general/inspectionsPause@2x.png b/platform/icons/src/general/inspectionsPause@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cb94ad040fe9067f77622d3da64674aee49012db GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj`kpS1Ar-fhfBgS%&#Y^Bcm?ZX zu?yFlWUb5oxF1_`sz1sg>mW$1C(0n|;Q<2%<~OH*OD#EG2-M2p>FVdQ&MBb@03ORD AVgLXD literal 0 HcmV?d00001 diff --git a/platform/icons/src/general/inspectionsPause@2x_dark.png b/platform/icons/src/general/inspectionsPause@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..388917cccc70394f3d1fc3d9e8ab3f6570fdee2b GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjhMq2tAr-fhfBgS%&#Y^Bcm?ZX zu?yFl-n@D9KSLst&$;eOQy{mSuEf@aD@_-<*u~ix{u!A?=Vq}L0W~vty85}Sb4q9e E080}gs{jB1 literal 0 HcmV?d00001 diff --git a/platform/icons/src/general/inspectionsPause_dark.png b/platform/icons/src/general/inspectionsPause_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b89b52504b4bc3e15c08f4bc932808c7c14e791b GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k6;Bt(kcwN$KmPx>XV#q2_)lun q=FR_|4Vgune=e5Nxa9D)gPFn1r7=g5>H7_!dInEdKbLh*2~7ZI;2eJd literal 0 HcmV?d00001 diff --git a/platform/icons/src/general/noAnalysis.png b/platform/icons/src/general/noAnalysis.png deleted file mode 100644 index b7a501a4261cd77e59eb7a04044b50510d63a64e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^JRr;gBp8b2n5}_Slc$SgNX0GR6KA=a93)yF?)=|+ z{bE!UOXn1gUIo2h3riL*Yvt0C>b2;sn^zK;{?)EsbH8A4M}|z5=Bf;~UBabhKa*ta z=4NzVV0^Y;Gx$G)&fMeS!Y@+0>sZv8C%j#KX8y$IuMX_iyQK1^uZCOY`+@y)WA{Zf kn{7X{cU|rkQNv%iS*(hxF9sNj#)4es>FVdQ&MBb@09N)$Q2+n{ diff --git a/platform/icons/src/general/noAnalysis_dark.png b/platform/icons/src/general/noAnalysis_dark.png deleted file mode 100644 index 285e48e8114bfab7aa3477d25d92ee4d7a923e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k6;Bt(kcwN$D^{)g<*(D%)AQ#% qLy}GXzZzr1ijczr*BF#M4l>kKZfg%b~!Lfrn+giPs|L zw_*7$Eg-g^IZJk*wu!7!B1hmuQZ+eWL|weTr$yfX?_Xg?!V>>E>wyg0b0x8 M>FVdQ&MBb@0JJ?nS^xk5 literal 0 HcmV?d00001 diff --git a/platform/icons/src/general/safeMode@2x.png b/platform/icons/src/general/safeMode@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d19d95e7cf7fda41c7ce99a4ad4d44677daecc GIT binary patch literal 498 zcmVTxP3huTgS16|L(meA7GZ=z(4-sO z3fzMVi<^9QLzCGGpHr$R4ZepkWh$a)S{4PsBuTL7nCyZp5Cujp`L|7}<;}q;mq9S`~*T~0$7f=IxE=60+)!3uRo;{)n z7tt$yp&OArGhX(JIEl(iU=ytULL_)_63y`xKIFp7p+TaIR4cLv;GI3S8&;fApP&V% zrSX$KB5?97hntAtAYEkS{-d{5t zGQIf946Hj`^Ex(|DZ9C0mpIRDP~aX3YU+Y~S72?MCx)@8`}fqP-TuXv}&QuisgQP>)L=+o1rgSY^*8~0lBmR9+BNdA;008{u1nDdb5-^zv1gYk z!bS8-U+6|8&y1J7B2FSp39N&aUx)+`PNEr}!UtSJv1< zq%?lqLnQ8?5$O(VvPZPv$&loqla1>;mVx1&Z7wK}}td?~1H#@x(9|b^e~3wA;VfbQ#QpEsk~G p*ED~tk!TuJTpXYkW}HRC;0G-X%aa%UAEf{Q002ovPDHLkV1i3_+D`xg literal 0 HcmV?d00001 diff --git a/platform/icons/src/general/safeMode_dark.png b/platform/icons/src/general/safeMode_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e185016fbcb797283e7db8ac6748f02595f25a51 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@1o-U3d6}P5NI>~!Lfrn+giIwss zX>WOv$1Uy?Hm^~BZpfs=~wla9S L`njxgN@xNA`iMA+ literal 0 HcmV?d00001 diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java index dd115ef45e34..69074f96c82a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java @@ -47,6 +47,8 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiCompiledElement; import com.intellij.psi.PsiFile; +import com.intellij.ui.ColorUtil; +import com.intellij.ui.JBColor; import com.intellij.ui.LayeredIcon; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; @@ -64,6 +66,7 @@ import java.util.*; import java.util.List; public class TrafficLightRenderer implements ErrorStripeRenderer, Disposable { + private static final Icon NO_ANALYSIS = HighlightDisplayLevel.createIconByMask(new JBColor(ColorUtil.fromHex("E1E1E1"), ColorUtil.fromHex("757575"))); private final Project myProject; private final Document myDocument; private final PsiFile myFile; @@ -284,12 +287,7 @@ public class TrafficLightRenderer implements ErrorStripeRenderer, Disposable { public void paint(Component c, Graphics g, Rectangle r) { DaemonCodeAnalyzerStatus status = getDaemonCodeAnalyzerStatus(mySeverityRegistrar); Icon icon = getIcon(status); - - int height = icon.getIconHeight(); - int width = icon.getIconWidth(); - int x = r.x + (r.width - width) / 2; - int y = r.y + (r.height - height) / 2; - icon.paintIcon(c, g, x, y); + icon.paintIcon(c, g, r.x, r.y); } @NotNull @@ -302,7 +300,7 @@ public class TrafficLightRenderer implements ErrorStripeRenderer, Disposable { double progress = getOverallProgress(status); TruncatingIcon trunc = new TruncatingIcon(icon, icon.getIconWidth(), (int)(icon.getIconHeight() * progress)); - return new LayeredIcon(trunc, AllIcons.General.InspectionInProgress); + return new LayeredIcon(trunc, AllIcons.General.Eye); } private static double getOverallProgress(@NotNull DaemonCodeAnalyzerStatus status) { @@ -334,7 +332,7 @@ public class TrafficLightRenderer implements ErrorStripeRenderer, Disposable { if (PowerSaveMode.isEnabled()) { statusLabel = "Code analysis is disabled in power save mode"; status.errorAnalyzingFinished = true; - icon = AllIcons.Nodes.Plugin; + icon = AllIcons.General.SafeMode; return result; } if (status.reasonWhyDisabled != null) { @@ -342,7 +340,7 @@ public class TrafficLightRenderer implements ErrorStripeRenderer, Disposable { statusExtraLine = "(" + status.reasonWhyDisabled + ")"; passStatusesVisible = true; progressBarsCompleted = Boolean.FALSE; - icon = AllIcons.General.NoAnalysis; + icon = NO_ANALYSIS; return result; } if (status.reasonWhySuspended != null) { @@ -350,7 +348,7 @@ public class TrafficLightRenderer implements ErrorStripeRenderer, Disposable { statusExtraLine = "(" + status.reasonWhySuspended + ")"; passStatusesVisible = true; progressBarsCompleted = Boolean.FALSE; - icon = AllIcons.Actions.InspectionsPause; + icon = AllIcons.General.InspectionsPause; return result; } diff --git a/platform/platform-api/src/com/intellij/util/ui/ButtonlessScrollBarUI.java b/platform/platform-api/src/com/intellij/util/ui/ButtonlessScrollBarUI.java index d512bd166047..54f16e547d94 100644 --- a/platform/platform-api/src/com/intellij/util/ui/ButtonlessScrollBarUI.java +++ b/platform/platform-api/src/com/intellij/util/ui/ButtonlessScrollBarUI.java @@ -43,11 +43,11 @@ import java.lang.reflect.Method; public class ButtonlessScrollBarUI extends BasicScrollBarUI { private static final Logger LOG = Logger.getInstance("#" + ButtonlessScrollBarUI.class.getName()); - private JBColor getGradientLightColor() { + protected JBColor getGradientLightColor() { return jbColor(Gray._251, Gray._95); } - private JBColor getGradientDarkColor() { + protected JBColor getGradientDarkColor() { return jbColor(Gray._215, Gray._80); } @@ -712,8 +712,8 @@ public class ButtonlessScrollBarUI extends BasicScrollBarUI { if (alwaysPaintThumb()) { //noinspection UseJBColor g2d.setColor(new Color(baseColor.getRed(), baseColor.getGreen(), baseColor.getBlue(), isDark() ? 100 : 40)); - //g2d.fillRoundRect(thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height, arc, arc); - g2d.drawRoundRect(thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height, arc, arc); + g2d.fillRoundRect(thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height, arc, arc); + //g2d.drawRoundRect(thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height, arc, arc); } if (!myMacScrollbarHidden) { @@ -731,7 +731,7 @@ public class ButtonlessScrollBarUI extends BasicScrollBarUI { return alwaysShowTrack(); } - private Rectangle getMacScrollBarBounds(Rectangle baseBounds, boolean thumb) { + protected Rectangle getMacScrollBarBounds(Rectangle baseBounds, boolean thumb) { boolean vertical = isVertical(); int borderSize = 2; @@ -768,12 +768,12 @@ public class ButtonlessScrollBarUI extends BasicScrollBarUI { return new Rectangle(x, y, width, height); } - private void paintMaxiThumb(Graphics2D g, Rectangle thumbBounds) { + protected void paintMaxiThumb(Graphics2D g, Rectangle thumbBounds) { final boolean vertical = isVertical(); int hGap = vertical ? 2 : 1; int vGap = vertical ? 1 : 2; - int w = adjustThumbWidth(thumbBounds.width - hGap * 2); + int w = thumbBounds.width - hGap * 2; int h = thumbBounds.height - vGap * 2; // leave one pixel between thumb and right or bottom edge @@ -810,10 +810,6 @@ public class ButtonlessScrollBarUI extends BasicScrollBarUI { return true; } - protected int adjustThumbWidth(int width) { - return width; - } - protected Color adjustColor(Color c) { if (isMacOverlayScrollbar()) { int alpha = (int)((120 + myMouseOverScrollbarExpandLevel * 20) * (1 - myMacScrollbarFadeLevel)); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 6922f7bb7e3f..5d12c0e10a42 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -517,6 +517,12 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi super.paintThumb(g, c, thumbBounds); } } + + protected void paintMaxiThumb(Graphics2D g, Rectangle thumbBounds) { + int arc = 3; + g.setColor(adjustColor(getGradientDarkColor())); + g.fillRoundRect(2, 0, thumbBounds.width, thumbBounds.height, arc, arc); + } }); myPanel = new JPanel(); @@ -582,7 +588,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi @NotNull static Color adjustThumbColor(@NotNull Color base, boolean dark) { - return ColorUtil.withAlpha(ColorUtil.shift(base, dark ? 1.1 : 0.9), dark ? 0.85 : 0.7); + return ColorUtil.withAlpha(ColorUtil.shift(base, dark ? 1.3 : 0.9), 0.7); } boolean isDarkEnough() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java index a72366df3b1e..4386eabd7238 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java @@ -82,20 +82,23 @@ import static com.intellij.openapi.editor.ex.util.EditorUtil.isRealFileEditor; public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMarkupModel { private static final TooltipGroup ERROR_STRIPE_TOOLTIP_GROUP = new TooltipGroup("ERROR_STRIPE_TOOLTIP_GROUP", 0); - private static final int ERROR_ICON_WIDTH = 12; - private static final int ERROR_ICON_HEIGHT = 12; + private static final int ERROR_ICON_WIDTH = 13; + private static final int ERROR_ICON_HEIGHT = 13; + private static final int THIN_GAP = 2; private static final int PREFERRED_WIDTH = ERROR_ICON_WIDTH + 3; - public static final int MAX_STRIPE_SIZE = 3; - private final EditorImpl myEditor; + private static final int MAX_STRIPE_SIZE = 4; + private static final int MAC_MAC_THUMB_WIDTH = 10; + + @NotNull private final EditorImpl myEditor; // null renderer means we should not show traffic light icon - private ErrorStripeRenderer myErrorStripeRenderer; + @Nullable private ErrorStripeRenderer myErrorStripeRenderer; private final List myErrorMarkerListeners = ContainerUtil.createLockFreeCopyOnWriteList(); private boolean dimensionsAreValid; private int myEditorScrollbarTop = -1; private int myEditorTargetHeight = -1; private int myEditorSourceHeight = -1; - private ProperTextRange myDirtyYPositions; + @Nullable private ProperTextRange myDirtyYPositions; private static final ProperTextRange WHOLE_DOCUMENT = new ProperTextRange(0, 0); @NotNull private ErrorStripTooltipRendererProvider myTooltipRendererProvider = new BasicTooltipRendererProvider(); @@ -103,8 +106,8 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark private int myMinMarkHeight;// height for horizontal, width for vertical stripes private static final int myPreviewLines = 5;// Actually preview has myPreviewLines * 2 + 1 lines (above + below + current one) private static final int myCachePreviewLines = 100;// Actually cache image has myCachePreviewLines * 2 + 1 lines (above + below + current one) - private LightweightHint myEditorPreviewHint = null; - private final EditorFragmentRenderer myEditorFragmentRenderer; + @Nullable private LightweightHint myEditorPreviewHint = null; + @NotNull private final EditorFragmentRenderer myEditorFragmentRenderer; private int myRowAdjuster = 0; private int myWheelAccumulator = 0; @@ -115,7 +118,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark setMinMarkHeight(DaemonCodeAnalyzerSettings.getInstance().ERROR_STRIPE_MARK_MIN_HEIGHT); } - private int offsetToLine(int offset, Document document) { + private int offsetToLine(int offset, @NotNull Document document) { if (offset < 0) { return 0; } @@ -164,7 +167,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } } - private boolean showToolTipByMouseMove(final MouseEvent e) { + private boolean showToolTipByMouseMove(@NotNull final MouseEvent e) { if (myEditor.getVisibleLineCount() == 0) return false; MouseEvent me = new MouseEvent(e.getComponent(), e.getID(), e.getWhen(), e.getModifiers(), 0, e.getY() + 1, e.getClickCount(), e.isPopupTrigger()); @@ -217,7 +220,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark .setShowImmediately(true).setAnimationEnabled(false); } - private int getVisualLineByEvent(MouseEvent e) { + private int getVisualLineByEvent(@NotNull MouseEvent e) { return fitLineToEditor(myEditor.offsetToVisualLine(yPositionToOffset(e.getY() + myWheelAccumulator, true))); } @@ -230,12 +233,12 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark return startLine? myEditor.getDocument().getLineStartOffset(logicalLine) : myEditor.getDocument().getLineEndOffset(logicalLine); } - private void collectRangeHighlighters(MarkupModelEx markupModel, final int visualLine, final Collection highlighters) { + private void collectRangeHighlighters(@NotNull MarkupModelEx markupModel, final int visualLine, @NotNull final Collection highlighters) { final int startOffset = getOffset(fitLineToEditor(visualLine - myPreviewLines), true); final int endOffset = getOffset(fitLineToEditor(visualLine + myPreviewLines), false); markupModel.processRangeHighlightersOverlappingWith(startOffset, endOffset, new Processor() { @Override - public boolean process(RangeHighlighterEx highlighter) { + public boolean process(@NotNull RangeHighlighterEx highlighter) { if (!highlighter.getEditorFilter().avaliableIn(myEditor)) return true; if (highlighter.getErrorStripeMarkColor() != null) { @@ -249,7 +252,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } @Nullable - private RangeHighlighter getNearestRangeHighlighter(final MouseEvent e) { + private RangeHighlighter getNearestRangeHighlighter(@NotNull final MouseEvent e) { List highlighters = new ArrayList(); getNearestHighlighters(this, e.getY(), highlighters); getNearestHighlighters((MarkupModelEx)DocumentMarkupModel.forDocument(myEditor.getDocument(), myEditor.getProject(), true), e.getY(), @@ -267,14 +270,14 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark return nearestMarker; } - private void getNearestHighlighters(MarkupModelEx markupModel, + private void getNearestHighlighters(@NotNull MarkupModelEx markupModel, final int scrollBarY, - final Collection nearest) { + @NotNull final Collection nearest) { int startOffset = yPositionToOffset(scrollBarY - myMinMarkHeight, true); int endOffset = yPositionToOffset(scrollBarY + myMinMarkHeight, false); markupModel.processRangeHighlightersOverlappingWith(startOffset, endOffset, new Processor() { @Override - public boolean process(RangeHighlighterEx highlighter) { + public boolean process(@NotNull RangeHighlighterEx highlighter) { if (!highlighter.getEditorFilter().avaliableIn(myEditor)) return true; if (highlighter.getErrorStripeMarkColor() != null) { @@ -289,7 +292,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark }); } - private void doClick(final MouseEvent e) { + private void doClick(@NotNull final MouseEvent e) { RangeHighlighter marker = getNearestRangeHighlighter(e); int offset; LogicalPosition logicalPositionToScroll = null; @@ -391,6 +394,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark ApplicationManagerEx.getApplicationEx().assertIsDispatchThread(); } + @Nullable @Override public ErrorStripeRenderer getErrorStripeRenderer() { return myErrorStripeRenderer; @@ -426,7 +430,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark return myEditor.isMirrored(); } - private static final Dimension STRIPE_BUTTON_PREFERRED_SIZE = new Dimension(ERROR_ICON_WIDTH, ERROR_ICON_HEIGHT); + private static final Dimension STRIPE_BUTTON_PREFERRED_SIZE = new Dimension(ERROR_ICON_WIDTH + THIN_GAP, ERROR_ICON_HEIGHT + THIN_GAP); private class ErrorStripeButton extends JButton { private ErrorStripeButton() { @@ -436,19 +440,18 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark @Override public void paint(@NotNull Graphics g) { ((ApplicationImpl)ApplicationManager.getApplication()).editorPaintStart(); - - final Rectangle bounds = getBounds(); - final Rectangle errorIconBounds = new Rectangle(0, 0, ERROR_ICON_WIDTH, ERROR_ICON_HEIGHT); - errorIconBounds.x = (bounds.width - errorIconBounds.width) / 2 + 2; - errorIconBounds.y = (bounds.height - errorIconBounds.height) / 2 - 1; try { if (!transparent()) { g.setColor(getEditor().getColorsScheme().getDefaultBackground()); - g.fillRect(0, 0, bounds.width, bounds.height); + Rectangle bounds = getBounds(); + g.fillRect(bounds.x, bounds.y, bounds.height, bounds.width); } + if (myErrorStripeRenderer != null) { - myErrorStripeRenderer.paint(this, g, errorIconBounds); + int x = THIN_GAP + myMinMarkHeight; + final Rectangle b = new Rectangle(x, 0, ERROR_ICON_WIDTH, ERROR_ICON_HEIGHT); + myErrorStripeRenderer.paint(this, g, b); } } finally { @@ -456,21 +459,23 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } } + @NotNull @Override public Dimension getPreferredSize() { return STRIPE_BUTTON_PREFERRED_SIZE; } } - private boolean transparent() { + private static boolean transparent() { return Registry.is("editor.transparent.scrollbar", false); } private class MyErrorPanel extends ButtonlessScrollBarUI implements MouseMotionListener, MouseListener, MouseWheelListener, UISettingsListener { private PopupHandler myHandler; private JButton myErrorStripeButton; - private BufferedImage myCachedTrack; + @Nullable private BufferedImage myCachedTrack; + @NotNull @Override protected JButton createDecreaseButton(int orientation) { myErrorStripeButton = myErrorStripeRenderer == null ? super.createDecreaseButton(orientation) : new ErrorStripeButton(); @@ -533,7 +538,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } @Override - protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { + protected void paintThumb(@NotNull Graphics g, @NotNull JComponent c, Rectangle thumbBounds) { if (isMacOverlayScrollbar()) { if (!isMirrored()) { super.paintThumb(g, c, thumbBounds); @@ -568,14 +573,30 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark return super.alwaysPaintThumb(); } + @Override + protected Rectangle getMacScrollBarBounds(Rectangle baseBounds, boolean thumb) { + Rectangle bounds = super.getMacScrollBarBounds(baseBounds, thumb); + bounds.width = Math.min(bounds.width, MAC_MAC_THUMB_WIDTH); + int b2 = bounds.width / 2; + bounds.x = THIN_GAP + myMinMarkHeight+ ERROR_ICON_WIDTH /2 - b2; + + return bounds; + } + + @Override + protected void paintMaxiThumb(@NotNull Graphics2D g, @NotNull Rectangle thumbBounds) { + int arc = 3; + g.setColor(adjustColor(getGradientDarkColor())); + g.fillRoundRect(isMirrored() ? -3 : 2, 0, thumbBounds.width, thumbBounds.height, arc, arc); + } + @Override protected int getThickness() { - int fix = isMacOverlayScrollbar() ? -2 : 0; - return super.getThickness() + myMinMarkHeight - 1 + fix; + return ERROR_ICON_WIDTH + THIN_GAP + myMinMarkHeight; } @Override - protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) { + protected void paintTrack(@NotNull Graphics g, @NotNull JComponent c, @NotNull Rectangle trackBounds) { if (transparent()) { doPaintTrack(g, c, trackBounds); } @@ -585,7 +606,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } @Override - protected void doPaintTrack(Graphics g, JComponent c, Rectangle bounds) { + protected void doPaintTrack(@NotNull Graphics g, @NotNull JComponent c, @NotNull Rectangle bounds) { if (isMacScrollbarHiddenAndDistractionFreeEnabled()) { paintTrackBasement(g, bounds); return; @@ -622,18 +643,19 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark UIUtil.drawImage(g, myCachedTrack, null, 0, 0); } - private void paintTrackBasement(Graphics g, Rectangle bounds) { + private void paintTrackBasement(@NotNull Graphics g, @NotNull Rectangle bounds) { if (transparent()) return; g.setColor(EditorColorsManager.getInstance().getGlobalScheme().getDefaultBackground()); g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height); } + @NotNull @Override protected Color adjustColor(Color c) { return isMacOverlayScrollbar() ? super.adjustColor(c) : EditorImpl.adjustThumbColor(super.adjustColor(c), isDark()); } - private void repaint(final Graphics g, int gutterWidth, final int stripeWidth, ProperTextRange yrange) { + private void repaint(@NotNull final Graphics g, int gutterWidth, final int stripeWidth, @NotNull ProperTextRange yrange) { final Rectangle clip = new Rectangle(0, yrange.getStartOffset(), gutterWidth, yrange.getLength() + myMinMarkHeight); paintTrackBasement(g, clip); @@ -646,7 +668,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark (MarkupModelEx)DocumentMarkupModel.forDocument(document, myEditor.getProject(), true)); } - private void drawMarkup(final Graphics g, final int width, int startOffset, int endOffset, MarkupModelEx markup) { + private void drawMarkup(@NotNull final Graphics g, final int width, int startOffset, int endOffset, @NotNull MarkupModelEx markup) { final Queue thinEnds = new PriorityQueue(5, new Comparator() { @Override public int compare(@NotNull PositionedStripe o1, @NotNull PositionedStripe o2) { @@ -667,7 +689,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark markup.processRangeHighlightersOverlappingWith(startOffset, endOffset, new Processor() { @Override - public boolean process(RangeHighlighterEx highlighter) { + public boolean process(@NotNull RangeHighlighterEx highlighter) { if (!highlighter.getEditorFilter().avaliableIn(myEditor)) return true; Color color = highlighter.getErrorStripeMarkColor(); @@ -729,9 +751,9 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } private int drawStripesEndingBefore(int ys, - Queue ends, - List stripes, - Graphics g, int width, int yStart) { + @NotNull Queue ends, + @NotNull List stripes, + @NotNull Graphics g, int width, int yStart) { while (!ends.isEmpty()) { PositionedStripe endingStripe = ends.peek(); if (endingStripe.yEnd > ys) break; @@ -749,7 +771,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark return yStart; } - private void drawSpot(Graphics g, int width, boolean thinErrorStripeMark, int yStart, int yEnd, Color color) { + private void drawSpot(@NotNull Graphics g, int width, boolean thinErrorStripeMark, int yStart, int yEnd, @Nullable Color color) { if (color == null) return; int paintWidth; int x; @@ -763,7 +785,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } } else { - x = myMinMarkHeight + 1; + x = myMinMarkHeight + THIN_GAP; paintWidth = width; } g.setColor(color); @@ -797,7 +819,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark return scrollbar.getWidth(); } - private void doMouseClicked(MouseEvent e) { + private void doMouseClicked(@NotNull MouseEvent e) { myEditor.getContentComponent().requestFocus(); int lineCount = getDocument().getLineCount() + myEditor.getSettings().getAdditionalLinesCount(); if (lineCount == 0) { @@ -836,7 +858,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } @Override - public void mouseWheelMoved(MouseWheelEvent e) { + public void mouseWheelMoved(@NotNull MouseWheelEvent e) { if (myEditorPreviewHint == null) return; myWheelAccumulator += e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL ? e.getUnitsToScroll() * e.getScrollAmount() : e.getWheelRotation() < 0 ? -e.getScrollAmount() : e.getScrollAmount(); @@ -844,9 +866,9 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark showToolTipByMouseMove(e); } - private TrafficTooltipRenderer myTrafficTooltipRenderer; + @Nullable private TrafficTooltipRenderer myTrafficTooltipRenderer; - private void showTrafficLightTooltip(MouseEvent e) { + private void showTrafficLightTooltip(@NotNull MouseEvent e) { if (myTrafficTooltipRenderer == null) { myTrafficTooltipRenderer = myTooltipRendererProvider.createTrafficTooltipRenderer(new Runnable() { @Override @@ -908,7 +930,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } } - private void showTooltip(MouseEvent e, final TooltipRenderer tooltipObject, @NotNull HintHint hintHint) { + private void showTooltip(@NotNull MouseEvent e, final TooltipRenderer tooltipObject, @NotNull HintHint hintHint) { TooltipController tooltipController = TooltipController.getInstance(); tooltipController.showTooltipByMouseMove(myEditor, new RelativePoint(e), tooltipObject, myEditor.getVerticalScrollbarOrientation() == EditorEx.VERTICAL_SCROLLBAR_RIGHT, @@ -1003,6 +1025,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark public void repaintTooltipWindow() { } + @NotNull @Override public LightweightHint show(@NotNull Editor editor, @NotNull Point p, @@ -1096,8 +1119,8 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark private int myVisualLine; private boolean myShowInstantly; private final List myHighlighters = new ArrayList(); - private BufferedImage myCacheLevel1; - private BufferedImage myCacheLevel2; + @Nullable private BufferedImage myCacheLevel1; + @Nullable private BufferedImage myCacheLevel2; private int myCacheStartLine; private int myCacheEndLine; private int myStartVisualLine; @@ -1112,7 +1135,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark update(-1, Collections.emptyList(), false); } - void update(int visualLine, Collection rangeHighlighters, boolean showInstantly) { + void update(int visualLine, @NotNull Collection rangeHighlighters, boolean showInstantly) { myVisualLine = visualLine; myShowInstantly = showInstantly; myHighlighters.clear(); @@ -1135,6 +1158,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark }); } + @Nullable @Override public LightweightHint show(@NotNull final Editor editor, @NotNull Point p, @@ -1148,6 +1172,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark final JPanel editorFragmentPreviewPanel = new JPanel() { private static final int R = 6; + @NotNull @Override public Dimension getPreferredSize() { int width = myEditor.getGutterComponentEx().getWidth() + myEditor.getScrollingModel().getVisibleArea().width; @@ -1311,7 +1336,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark return myEditorPreviewHint; } - private void showEditorHint(HintManagerImpl hintManager, Point point, HintHint hintInfo) { + private void showEditorHint(@NotNull HintManagerImpl hintManager, @NotNull Point point, HintHint hintInfo) { int flags = HintManager.HIDE_BY_ANY_KEY | HintManager.HIDE_BY_TEXT_CHANGE | HintManager.HIDE_BY_MOUSEOVER | HintManager.HIDE_BY_ESCAPE | HintManager.HIDE_BY_SCROLLING; hintManager.showEditorHint(myEditorPreviewHint, myEditor, point, flags, 0, false, hintInfo); diff --git a/platform/util/src/com/intellij/icons/AllIcons.java b/platform/util/src/com/intellij/icons/AllIcons.java index f5feaa2b58e0..d4a06b3d5659 100644 --- a/platform/util/src/com/intellij/icons/AllIcons.java +++ b/platform/util/src/com/intellij/icons/AllIcons.java @@ -85,7 +85,6 @@ public class AllIcons { public static final Icon GroupByPrefix = IconLoader.getIcon("/actions/GroupByPrefix.png"); // 16x16 public static final Icon GroupByTestProduction = IconLoader.getIcon("/actions/groupByTestProduction.png"); // 16x16 public static final Icon Help = IconLoader.getIcon("/actions/help.png"); // 16x16 - public static final Icon InspectionsPause = IconLoader.getIcon("/actions/inspectionsPause.png"); // 12x12 public static final Icon Install = IconLoader.getIcon("/actions/install.png"); // 16x16 public static final Icon IntentionBulb = IconLoader.getIcon("/actions/intentionBulb.png"); // 16x16 public static final Icon Left = IconLoader.getIcon("/actions/left.png"); // 16x16 @@ -409,6 +408,7 @@ public class AllIcons { public static final Icon ExportSettings = IconLoader.getIcon("/general/ExportSettings.png"); // 32x32 public static final Icon ExternalTools = IconLoader.getIcon("/general/externalTools.png"); // 32x32 public static final Icon ExternalToolsSmall = IconLoader.getIcon("/general/externalToolsSmall.png"); // 16x16 + public static final Icon Eye = IconLoader.getIcon("/general/eye.png"); // 13x13 public static final Icon Filter = IconLoader.getIcon("/general/filter.png"); // 16x16 public static final Icon Floating = IconLoader.getIcon("/general/floating.png"); // 14x14 public static final Icon Gear = IconLoader.getIcon("/general/gear.png"); // 21x16 @@ -439,8 +439,8 @@ public class AllIcons { public static final Icon Information = IconLoader.getIcon("/general/information.png"); // 16x16 public static final Icon InformationDialog = IconLoader.getIcon("/general/informationDialog.png"); // 32x32 public static final Icon InheritedMethod = IconLoader.getIcon("/general/inheritedMethod.png"); // 11x14 - public static final Icon InspectionInProgress = IconLoader.getIcon("/general/inspectionInProgress.png"); // 11x11 public static final Icon InspectionsOff = IconLoader.getIcon("/general/inspectionsOff.png"); // 16x16 + public static final Icon InspectionsPause = IconLoader.getIcon("/general/inspectionsPause.png"); // 12x12 public static final Icon Jdk = IconLoader.getIcon("/general/jdk.png"); // 16x16 public static final Icon JetbrainsTvIdea = IconLoader.getIcon("/general/jetbrainsTvIdea.png"); // 32x32 public static final Icon KeyboardShortcut = IconLoader.getIcon("/general/keyboardShortcut.png"); // 13x13 @@ -456,7 +456,6 @@ public class AllIcons { public static final Icon MoreTabs = IconLoader.getIcon("/general/moreTabs.png"); // 16x16 public static final Icon Mouse = IconLoader.getIcon("/general/mouse.png"); // 32x32 public static final Icon MouseShortcut = IconLoader.getIcon("/general/mouseShortcut.png"); // 13x13 - public static final Icon NoAnalysis = IconLoader.getIcon("/general/noAnalysis.png"); // 12x12 public static final Icon NotificationError = IconLoader.getIcon("/general/notificationError.png"); // 24x24 public static final Icon NotificationInfo = IconLoader.getIcon("/general/notificationInfo.png"); // 24x24 public static final Icon NotificationWarning = IconLoader.getIcon("/general/notificationWarning.png"); // 24x24 @@ -481,6 +480,7 @@ public class AllIcons { public static final Icon Reset = IconLoader.getIcon("/general/reset.png"); // 16x16 public static final Icon Run = IconLoader.getIcon("/general/run.png"); // 7x10 public static final Icon RunWithCoverage = IconLoader.getIcon("/general/runWithCoverage.png"); // 16x16 + public static final Icon SafeMode = IconLoader.getIcon("/general/safeMode.png"); // 13x13 public static final Icon SearchEverywhereGear = IconLoader.getIcon("/general/searchEverywhereGear.png"); // 16x16 public static final Icon SecondaryGroup = IconLoader.getIcon("/general/secondaryGroup.png"); // 16x16 public static final Icon SeparatorH = IconLoader.getIcon("/general/separatorH.png"); // 17x11