diff: do not paint over annotations in gutter
[idea/community.git] / platform / diff-impl / src / com / intellij / diff / util / DiffLineMarkerRenderer.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.diff.util;
17
18 import com.intellij.openapi.editor.Editor;
19 import com.intellij.openapi.editor.ex.EditorEx;
20 import com.intellij.openapi.editor.ex.EditorGutterComponentEx;
21 import com.intellij.openapi.editor.markup.LineMarkerRenderer;
22 import org.jetbrains.annotations.NotNull;
23
24 import java.awt.*;
25
26 public class DiffLineMarkerRenderer implements LineMarkerRenderer {
27   @NotNull private final TextDiffType myDiffType;
28   private final boolean myIgnoredFoldingOutline;
29   private final boolean myResolved;
30
31   public DiffLineMarkerRenderer(@NotNull TextDiffType diffType) {
32     this(diffType, false);
33   }
34
35   public DiffLineMarkerRenderer(@NotNull TextDiffType diffType, boolean ignoredFoldingOutline) {
36     this(diffType, ignoredFoldingOutline, false);
37   }
38
39   public DiffLineMarkerRenderer(@NotNull TextDiffType diffType, boolean ignoredFoldingOutline, boolean resolved) {
40     myDiffType = diffType;
41     myIgnoredFoldingOutline = ignoredFoldingOutline;
42     myResolved = resolved;
43   }
44
45   @Override
46   public void paint(Editor editor, Graphics g, Rectangle range) {
47     EditorGutterComponentEx gutter = ((EditorEx)editor).getGutterComponentEx();
48     Graphics2D g2 = (Graphics2D)g;
49     int x1 = 0;
50     int x2 = x1 + gutter.getWidth();
51     int y = range.y;
52     int height = range.height;
53
54     int annotationsOffset = gutter.getAnnotationsAreaOffset();
55     int annotationsWidth = gutter.getAnnotationsAreaWidth();
56     if (annotationsWidth != 0) {
57       drawMarker(editor, g2, x1, annotationsOffset, y, height, false);
58       x1 = annotationsOffset + annotationsWidth;
59     }
60
61     if (myIgnoredFoldingOutline) {
62       int xOutline = gutter.getWhitespaceSeparatorOffset();
63       drawMarker(editor, g2, xOutline, x2, y, height, true);
64       drawMarker(editor, g2, x1, xOutline, y, height, false);
65     } else {
66       drawMarker(editor, g2, x1, x2, y, height, false);
67     }
68   }
69
70   private void drawMarker(Editor editor, Graphics2D g2,
71                           int x1, int x2, int y, int height,
72                           boolean ignoredOutline) {
73     Color color = myDiffType.getColor(editor);
74     if (height > 2) {
75       if (ignoredOutline) {
76         g2.setColor(myDiffType.getIgnoredColor(editor));
77       }
78       else {
79         g2.setColor(color);
80       }
81       if (!myResolved) g2.fillRect(x1, y, x2 - x1, height);
82
83       DiffDrawUtil.drawChunkBorderLine(g2, x1, x2, y - 1, color, false, myResolved);
84       DiffDrawUtil.drawChunkBorderLine(g2, x1, x2, y + height - 1, color, false, myResolved);
85     }
86     else {
87       // range is empty - insertion or deletion
88       // Draw 2 pixel line in that case
89       DiffDrawUtil.drawChunkBorderLine(g2, x1, x2, y - 1, color, true, myResolved);
90     }
91   }
92 }