replaced <code></code> with more concise {@code}
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / editor / impl / ArrowPainter.java
1 /*
2  * Copyright 2000-2014 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.openapi.editor.impl;
17
18 import com.intellij.openapi.util.Computable;
19 import com.intellij.util.ui.UIUtil;
20 import org.jetbrains.annotations.NotNull;
21
22 import java.awt.*;
23
24 /**
25  * Encapsulates logic of drawing arrows at graphics buffer (primary usage is to draw tabulation symbols representation arrows).
26  *
27  * @author Denis Zhdanov
28  * @since Jul 2, 2010 11:35:23 AM
29  */
30 public class ArrowPainter {
31
32   private final ColorProvider myColorHolder;
33   private final Computable<Integer> myWidthProvider;
34   private final Computable<Integer> myHeightProvider;
35
36   /**
37    * Creates an ArrowPainter with specified parameters.
38    *
39    * @param colorHolder defines arrow color
40    * @param widthProvider defines character width, it is used to calculate an inset for the arrow's tip
41    * @param heightProvider defines character height, it's used to calculate an arrow's width and height
42    */
43   public ArrowPainter(@NotNull ColorProvider colorHolder, @NotNull Computable<Integer> widthProvider, @NotNull Computable<Integer> heightProvider) {
44     myColorHolder = colorHolder;
45     myWidthProvider = widthProvider;
46     myHeightProvider = heightProvider;
47   }
48
49   /**
50    * Paints arrow at the given graphics buffer using given coordinate parameters.
51    *
52    * @param g       target graphics buffer to use
53    * @param y       defines baseline of the row where the arrow should be painted
54    * @param start   starting {@code 'x'} position to use during drawing
55    * @param stop    ending {@code 'x'} position to use during drawing
56    */
57   public void paint(Graphics g, int y, int start, int stop) {
58     stop -= myWidthProvider.compute() / 4;
59     Color oldColor = g.getColor();
60     g.setColor(myColorHolder.getColor());
61     final int height = myHeightProvider.compute();
62     final int halfHeight = height / 2;
63     int mid = y - halfHeight;
64     int top = y - height;
65     UIUtil.drawLine(g, start, mid, stop, mid);
66     UIUtil.drawLine(g, stop, y, stop, top);
67     g.fillPolygon(new int[]{stop - halfHeight, stop - halfHeight, stop}, new int[]{y, y - height, y - halfHeight}, 3);
68     g.setColor(oldColor);
69   }
70 }