diff: do not paint over annotations in gutter
authorAleksey Pivovarov <AMPivovarov@gmail.com>
Sat, 20 Jun 2015 13:42:10 +0000 (16:42 +0300)
committerAleksey Pivovarov <AMPivovarov@gmail.com>
Thu, 3 Sep 2015 16:28:06 +0000 (19:28 +0300)
platform/diff-impl/src/com/intellij/diff/util/DiffLineMarkerRenderer.java
platform/diff-impl/src/com/intellij/diff/util/DiffLineSeparatorRenderer.java
platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorGutterComponentEx.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java

index 1da4f7dab9f82e17f1efa3adaf5ae700960a1495..220c5cd8e1eda510be1dc5d285dbe00dc7f3f908 100644 (file)
@@ -44,8 +44,6 @@ public class DiffLineMarkerRenderer implements LineMarkerRenderer {
 
   @Override
   public void paint(Editor editor, Graphics g, Rectangle range) {
-    Color color = myDiffType.getColor(editor);
-
     EditorGutterComponentEx gutter = ((EditorEx)editor).getGutterComponentEx();
     Graphics2D g2 = (Graphics2D)g;
     int x1 = 0;
@@ -53,22 +51,35 @@ public class DiffLineMarkerRenderer implements LineMarkerRenderer {
     int y = range.y;
     int height = range.height;
 
-    if (height > 2) {
-      if (!myResolved) {
-        if (myIgnoredFoldingOutline) {
-          int xOutline = gutter.getWhitespaceSeparatorOffset();
+    int annotationsOffset = gutter.getAnnotationsAreaOffset();
+    int annotationsWidth = gutter.getAnnotationsAreaWidth();
+    if (annotationsWidth != 0) {
+      drawMarker(editor, g2, x1, annotationsOffset, y, height, false);
+      x1 = annotationsOffset + annotationsWidth;
+    }
 
-          g.setColor(myDiffType.getIgnoredColor(editor));
-          g.fillRect(xOutline, y, x2 - xOutline, height);
+    if (myIgnoredFoldingOutline) {
+      int xOutline = gutter.getWhitespaceSeparatorOffset();
+      drawMarker(editor, g2, xOutline, x2, y, height, true);
+      drawMarker(editor, g2, x1, xOutline, y, height, false);
+    } else {
+      drawMarker(editor, g2, x1, x2, y, height, false);
+    }
+  }
 
-          g.setColor(color);
-          g.fillRect(x1, y, xOutline - x1, height);
-        }
-        else {
-          g.setColor(color);
-          g.fillRect(x1, y, x2 - x1, height);
-        }
+  private void drawMarker(Editor editor, Graphics2D g2,
+                          int x1, int x2, int y, int height,
+                          boolean ignoredOutline) {
+    Color color = myDiffType.getColor(editor);
+    if (height > 2) {
+      if (ignoredOutline) {
+        g2.setColor(myDiffType.getIgnoredColor(editor));
       }
+      else {
+        g2.setColor(color);
+      }
+      if (!myResolved) g2.fillRect(x1, y, x2 - x1, height);
+
       DiffDrawUtil.drawChunkBorderLine(g2, x1, x2, y - 1, color, false, myResolved);
       DiffDrawUtil.drawChunkBorderLine(g2, x1, x2, y + height - 1, color, false, myResolved);
     }
index 8006a9829db7ebfeb232d23ea314b540c1e628c8..7570cbb9c33f3f33e1e51c98cdd988fdf2d96a0a 100644 (file)
@@ -17,9 +17,11 @@ package com.intellij.diff.util;
 
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.editor.colors.ColorKey;
+import com.intellij.openapi.editor.colors.EditorColors;
 import com.intellij.openapi.editor.colors.EditorColorsManager;
 import com.intellij.openapi.editor.colors.EditorColorsScheme;
 import com.intellij.openapi.editor.ex.EditorEx;
+import com.intellij.openapi.editor.ex.EditorGutterComponentEx;
 import com.intellij.openapi.editor.markup.LineMarkerRenderer;
 import com.intellij.openapi.editor.markup.LineSeparatorRenderer;
 import com.intellij.openapi.ui.GraphicsConfig;
@@ -103,6 +105,14 @@ public class DiffLineSeparatorRenderer implements LineMarkerRenderer, LineSepara
     int y = r.y;
     int lineHeight = myEditor.getLineHeight();
 
+    EditorGutterComponentEx gutter = ((EditorEx)editor).getGutterComponentEx();
+    int annotationsOffset = gutter.getAnnotationsAreaOffset();
+    int annotationsWidth = gutter.getAnnotationsAreaWidth();
+    if (annotationsWidth != 0) {
+      g.setColor(editor.getColorsScheme().getColor(EditorColors.GUTTER_BACKGROUND));
+      g.fillRect(annotationsOffset, y, annotationsWidth, lineHeight);
+    }
+
     draw(g, 0, y, lineHeight, myEditor.getColorsScheme());
   }
 
@@ -141,6 +151,7 @@ public class DiffLineSeparatorRenderer implements LineMarkerRenderer, LineSepara
     int height = getHeight(lineHeight);
 
     Rectangle clip = g.getClipBounds();
+    if (clip.width <= 0) return;
     int count = (clip.width / step + 3);
     int shift = (clip.x - shiftX) / step;
 
index 6478aaa96ae523d887b849416cdaeafb61937f49..367cb823fca9c378ed2bcc8a227913450fab3db6 100644 (file)
@@ -56,6 +56,10 @@ public abstract class EditorGutterComponentEx extends JComponent implements Edit
 
   public abstract int getIconsAreaWidth();
 
+  public abstract int getAnnotationsAreaOffset();
+
+  public abstract int getAnnotationsAreaWidth();
+
   @Nullable
   public abstract Point getPoint(GutterIconRenderer renderer);
 
index 2cca0857a0593fa4dae2898bbd8c96dd56380a0f..75cddc4a46f0bee17b4acde265e1951b9d7f86ca 100644 (file)
@@ -1198,10 +1198,12 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return 0;
   }
 
+  @Override
   public int getAnnotationsAreaOffset() {
     return getLineNumberAreaOffset() + getLineNumberAreaWidth();
   }
 
+  @Override
   public int getAnnotationsAreaWidth() {
     return myTextAnnotationGuttersSize;
   }