blob: ba8373af04149d86582f8de2d539f1bc509571c6 [file] [log] [blame]
/*
* 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;
}
}