| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.intellij.vcs.log.printer.idea; |
| |
| import com.intellij.vcs.log.graph.SimplePrintElement; |
| import org.jetbrains.annotations.NotNull; |
| |
| import java.awt.*; |
| |
| import static com.intellij.vcs.log.printer.idea.PrintParameters.*; |
| |
| public class PositionUtil { |
| private static float distance(int x1, int y1, int x2, int y2) { |
| return (float)Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); |
| } |
| |
| public static boolean overUpEdge(int upPosition, int downPosition, int x, int y) { |
| float thick = THICK_LINE; |
| int x1 = WIDTH_NODE * downPosition + WIDTH_NODE / 2; |
| int y1 = HEIGHT_CELL / 2; |
| int x2 = WIDTH_NODE * upPosition + WIDTH_NODE / 2; |
| int y2 = -HEIGHT_CELL / 2; |
| //return true; |
| return (distance(x1, y1, x, y) + distance(x2, y2, x, y) < distance(x1, y1, x2, y2) + thick); |
| } |
| |
| public static boolean overDownEdge(int upPosition, int downPosition, int x, int y) { |
| float thick = THICK_LINE; |
| int x1 = WIDTH_NODE * upPosition + WIDTH_NODE / 2; |
| int y1 = HEIGHT_CELL / 2; |
| int x2 = WIDTH_NODE * downPosition + WIDTH_NODE / 2; |
| int y2 = HEIGHT_CELL + HEIGHT_CELL / 2; |
| return distance(x1, y1, x, y) + distance(x2, y2, x, y) < distance(x1, y1, x2, y2) + thick; |
| } |
| |
| public static boolean overNode(int position, int x, int y, SimplePrintElement.Type type) { |
| int r = CIRCLE_RADIUS; |
| int x0 = WIDTH_NODE * position + WIDTH_NODE / 2; |
| int y0 = HEIGHT_CELL / 2; |
| if (type == SimplePrintElement.Type.DOWN_ARROW) |
| y0 = PrintParameters.HEIGHT_CELL - r; |
| if (type == SimplePrintElement.Type.UP_ARROW) |
| y0 = r; |
| |
| return distance(x0, y0, x, y) <= r; |
| } |
| |
| public static int getYInsideRow(@NotNull Point point) { |
| return point.y - getRowIndex(point) * HEIGHT_CELL; |
| } |
| |
| public static int getRowIndex(@NotNull Point point) { |
| return point.y / HEIGHT_CELL; |
| } |
| |
| } |