From c62a77d3f26557ec07c5a76d411028cdb6bfc203 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Thu, 16 May 2019 14:57:19 +0300 Subject: [PATCH] IDEA-212625 diff: fix rendering near soft wrapped lines GitOrigin-RevId: e0e9151219608890299f26be3cd8ca8f519420a8 --- .../com/intellij/diff/util/DiffDrawUtil.java | 14 ++++++++++---- .../testData/diff/painting/borderLineMarker.png | Bin 357 -> 356 bytes .../painting/emptyRangeLastLineSoftWraps.png | Bin 342 -> 343 bytes .../diff/painting/lastLineSoftWraps.png | Bin 309 -> 303 bytes .../tests/testData/diff/painting/lineMarker.png | Bin 351 -> 353 bytes .../openapi/editor/impl/view/EditorPainter.java | 11 +++++------ .../painting/softWrapWithWithLineSeparator.png | Bin 286 -> 288 bytes 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/util/DiffDrawUtil.java b/platform/diff-impl/src/com/intellij/diff/util/DiffDrawUtil.java index 68f8c3230cbe..5ac08df41882 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/DiffDrawUtil.java +++ b/platform/diff-impl/src/com/intellij/diff/util/DiffDrawUtil.java @@ -3,6 +3,7 @@ package com.intellij.diff.util; import com.intellij.codeInsight.folding.impl.FoldingUtil; import com.intellij.diff.fragments.DiffFragment; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.colors.EditorColors; @@ -31,6 +32,8 @@ import java.util.List; import static com.intellij.diff.util.DiffUtil.getLineCount; public class DiffDrawUtil { + private static final Logger LOG = Logger.getInstance(DiffDrawUtil.class); + public static final int STRIPE_LAYER = HighlighterLayer.ERROR - 1; public static final int DEFAULT_LAYER = HighlighterLayer.SELECTION - 3; public static final int INLINE_LAYER = HighlighterLayer.SELECTION - 2; @@ -165,7 +168,7 @@ public class DiffDrawUtil { public static int lineToY(@NotNull Editor editor, int line) { Document document = editor.getDocument(); if (line >= getLineCount(document)) { - int y = lineToY(editor, getLineCount(document) - 1); + int y = editor.logicalPositionToXY(editor.offsetToLogicalPosition(document.getTextLength())).y; return y + editor.getLineHeight() * (line - getLineCount(document) + 1); } return editor.logicalPositionToXY(editor.offsetToLogicalPosition(document.getLineStartOffset(line))).y; @@ -237,9 +240,12 @@ public class DiffDrawUtil { int x2 = gutter.getWidth(); int y = r.y; - if (placement == SeparatorPlacement.BOTTOM) y += editor.getLineHeight(); + if (placement == SeparatorPlacement.BOTTOM) { + LOG.warn("BOTTOM gutter line renderers are not supported"); + y += editor.getLineHeight() - 1; + } - drawChunkBorderLine(g2, x1, x2, y - 1, type.getColor(editor), doubleLine, resolved); + drawChunkBorderLine(g2, x1, x2, y, type.getColor(editor), doubleLine, resolved); } @NotNull @@ -323,7 +329,7 @@ public class DiffDrawUtil { @NotNull public static List createLineMarker(@NotNull final Editor editor, int line, @NotNull final TextDiffType type) { if (line == 0) return Collections.emptyList(); - return new LineMarkerBuilder(editor, line - 1, SeparatorPlacement.BOTTOM) + return new LineMarkerBuilder(editor, line, SeparatorPlacement.TOP) .withType(type) .withDefaultRenderer(false) .withDefaultGutterRenderer(false) diff --git a/platform/diff-impl/tests/testData/diff/painting/borderLineMarker.png b/platform/diff-impl/tests/testData/diff/painting/borderLineMarker.png index b3fbf769502ac55814199083937ef5b0703c9478..64986294e8b23fe547ebcaba3e365e41d3b99b85 100644 GIT binary patch delta 297 zcmV+^0oMNI0^|aaBmpatB_w};li4)Y=$9FMh8q8VdFis&dJWg{EdvN3_dup;5(hEH z{8Vv-%{fgBVl7FK8UR@!S~>)f%u%^BR*&nD@Hc<}k_NegLWhj-l*wIu!(&LQM0Y^0 zfjH;9bS)rCK7atyImq%z1OyO3q(F8Fb!3q6Tz~+Q2HAZ_hjiE>hp&I@1r}A3D$)Hx zAoDzn6dl6I08$oY-SCzGY5igs1qmT)qI3ar1SAF05=K497UeWumQ1qJ7*|H--y5w8 zqG?f$-Dr~zX@OA!B)5~YKqPaBDv<4;?rL{RYEey%LGwkGqzVWifB*srAbV)y?8=j0X=6khEl00000NkvXXu0mjf#LIcI delta 298 zcmV+_0oDHG0_6gbBmpduB_w~p$!wa|)Gssmh#LQXdFis&dJX^MTLut7?tx6xBo1PX z`KjUvn{%2N#9ERdH2|_ev~&m{nWJ)NtRB}P;dcN5Bn@%}g$^0vE|a_XhQA@H65Rp0 z2I8Fa(zSpnIRF8qbCBhh2nZm6NP+AU>c}ABxc~tq4YK=;4(YH%4!3{n1r}A3D$)Hx zAoDzn6dl6I08$oYec&wt(t2YT1qmT)qI3ar1SAF05=K497UeWumQ1qJ7*|H--wUk@ zqG?f$U1*aIX@OA!B)5~YKqPaBDv<3A;5<6E4s{jB107*qoM6N<$f*E3aJ^%m! diff --git a/platform/diff-impl/tests/testData/diff/painting/emptyRangeLastLineSoftWraps.png b/platform/diff-impl/tests/testData/diff/painting/emptyRangeLastLineSoftWraps.png index d68230c5285a40fa4d38dc707226f1ba23762c86..edb67dee2315429d55b972bdc99fc6723a8c45bd 100644 GIT binary patch delta 316 zcmV-C0mJ^*0@nhNB!3=BL_t(|+U?j;4uc>JfZ^W%2Hwg$>;gRR1v8Q*Zc(XdrPkl1 zPnHC~RG>(HzjE&w$1!`DheZg$0LKO%hM_yKi2Q_m)Y%+m3-%j5f$sp?1ni}P0X78Q zvovUPuUKxvRq%h#+8AvfzyS9LUK*#(1DFcF{uI%&8J>l?6n}Jbw8{VjtN~6b<=#<% zgFXNQ46rG1Ir7v#LXmSR>TEs$1FQ%30v!@~j=VNzvEu@G{}Q2v1K0qV3N{38t#p6^ zJ_cOdoV35a#U@vqADtYnGQa=>3^2d|b6weVP6hae*Og&`JwiX~x>EE0?2hk|*Ohy~ zj{X$@8?WsE8#Qm705`7Fp@7f2uGHo}YLlar19%%af6Bje6krGQu!spJfMM=`18>D0b^)IE!ZMR3Y|&AXS}eaw zpDYP}sXz(&`N-B0W6UGWLn8vf0Q&}Bmc<-6gzy!^qZV@v|6o6134908Cg4#j7+^)< zBTIuc_lo7lT?PN7%a^{0rI&9E2dR)5gR(JFfZewVXxtiS`z zLn8pz22Lqu>sW!EJ^;@SydHUKA0f!O6t$QSzyQmEM}c+;Tq5s{+3dIgKE6aq;Q&?u zrh*lLTPq!4fX@NfHYe$Cud&J1=0_(-s|+x}00Rs#z+6{0ol^n6;dP~3;1Qvxx~`PG z@7?iDd0lw~>@@6O0kHDg4zTjZ32@^&?FzWpb)__Ss!fhg4q$*SpBEs2w-*#2NFo3L N002ovPDHLkV1hNYjVAyA diff --git a/platform/diff-impl/tests/testData/diff/painting/lastLineSoftWraps.png b/platform/diff-impl/tests/testData/diff/painting/lastLineSoftWraps.png index e2d2e07998c1fb0a8a1d46ee5add8c59a8175543..c625d3a47da3979551ca42041676ba6866d25ccc 100644 GIT binary patch delta 276 zcmV+v0qg#?0Zm*XJ#^I zgcLncliKW4Yi%n$N5m1p0OtlSrA!Cb&siST0{n*koSDGdv1)g!V1NUG|7i`@yCd37 zx(b%@GaB^m02tusz0N)L#-rwWogh^bLU00Rs#z{Hg< zE3W|FJFZL%EP&_6mDayYd2W11#+4e_uK^D3?EnW4PJlc6bShx4xYBy}s3FHD2Qa`h a&kJlnVKAAmm0b89T`_@;k*WT@@xlq^2G^o=bTOjJSwjAo;~W4 gW0M0I;K+IbkrP{I*Vy{VUjP6A07*qoM6N<$g4j%ZbN~PV diff --git a/platform/diff-impl/tests/testData/diff/painting/lineMarker.png b/platform/diff-impl/tests/testData/diff/painting/lineMarker.png index d9253b610934532d991c1d1f9bb5623d418049a8..65f338d42cd881c3b804c724ffc52f773fbbe530 100644 GIT binary patch delta 326 zcmV-M0lEI)0^tIXB!4JLL_t(|+U?rS4TCTYhGFl&LAGLtF2K2$R3IVIK$DU`JMbd; zQnjc&vcrdh`1i|e*ECJu!v9!G00E>7#5t!9A|hW^9btD)i9u|o3DN=}3&cu?0FpT> zC1Z8F4hg>l2q0;YD=2ix6Yes(i*NWFk}A<1kZU0GJbUe0L4S-KfB-T$$a+fz1Q0;9 zKn@A@$spmm00AToa`=o68L&f6AJ;1^sw7pSJ0Ld#S!UWm(IJdXA;`AjtpU>e!7d6C zLbOB~0^|%x3#2EEd5}HI&vaQc$!cR<8JT}Cv?++CMKyMzT{@%(Mh%eMPRat&%ps;g z_AlMF?v&J`nm-zY?u#l(6%arG0R#|000E@#ruXAP!X!K7&Rq)-Mg|Z-00D#?0*Hy@ Y1KTYAle=WKqyPW_07*qoM6N<$g8e~-&Hw-a delta 324 zcmV-K0lWU;0^b6VB!4DJL_t(|+U?p+4uc>NhT*yY4Y-we=mlJNL!*fa#UCmHGnCh4 zHce~llVSV}ihsYnc1_ddE&PwA1Q0-;fjH;XK}6)MiX#N)lq-m>G(l99i%AJ+>ERgx;v9S}eO0mK-{w&AS-()z*f5+sJG ziP8ng5s(&0OBnMYAT*`5I_I{1Q0*~DZA-CJV=~myWF{}0m7021Q0*~A%_5B;`jh* Wr~?GUleaqn0000kr8Ywi~N<2J!js+N={dDOl^hsf|V zU78xPydB%;v+YJo++)*yTI0nU1945p9S|M*Jxs?WPJ)2EI1eTs$N4+AT)T5 zXRZ=Yn`&BeselL;+**2wMBO8{6b^UT(k+^rgQ#uMHDYV469Q9`iw5^>iy_Nt?vhD* zhpOF4@KfQdUB|OsX-4eTn#>1hpr_=@_-}7v%5qADJzoV+Q9wSjlLGoHOn!CmRI43BjYDwu!9@;nP7$SbA zriq;`-_ODrCRlJNY-Zay4i>+|Bi^wL^fc93=p~#UF=eW2EH$|%TF3usC5-i(^AX%W z*=$l6aRatrs2+E4iI3cX^-O7f90GeIhQi(pz6