@NotNull
 public Set<Node> getUpRefNodes(@NotNull GraphElement graphElement) {
   Set<Node> nodes = new HashSet<Node>();
   for (Node node : getGraphModel().getFragmentManager().getUpNodes(graphElement)) {
     if (getRefsModel().isBranchRef(node.getCommitHash())) {
       nodes.add(node);
     }
   }
   return nodes;
 }
 @Nullable
 public Node getNodeByHash(Hash hash) {
   Graph graph = getGraphModel().getGraph();
   for (int i = 0; i < graph.getNodeRows().size(); i++) {
     Node node = graph.getCommitNodeInRow(i);
     if (node != null && node.getCommitHash().equals(hash)) {
       return node;
     }
   }
   return null;
 }
 public boolean isSameBranch(@NotNull Node nodeA, @NotNull Node nodeB) {
   Node up, down;
   if (nodeA.getRowIndex() > nodeB.getRowIndex()) {
     up = nodeB;
     down = nodeA;
   } else {
     up = nodeA;
     down = nodeB;
   }
   return getGraphModel().getFragmentManager().getUpNodes(down).contains(up);
 }
 public List<Node> getCommitsInBranchAboveBase(Node base, Node branchHead) {
   List<Node> result = new ArrayList<Node>();
   Node node = branchHead;
   while (node != base) {
     result.add(node);
     // TODO: multiple edges must not appear
     // TODO: if there are no edges, we are in the wrong branch
     node = node.getDownEdges().get(0).getDownNode();
   }
   // Collections.reverse(result);
   return result;
 }
 private List<Node> getAllAncestors(Node a, Predicate<Node> stop) {
   Set<Node> all = new LinkedHashSet<Node>();
   Queue<Node> queue = new ArrayDeque<Node>();
   queue.add(a);
   while (!queue.isEmpty()) {
     Node aNode = queue.remove();
     all.add(aNode);
     if (stop.apply(aNode)) {
       return new ArrayList<Node>(all);
     }
     for (Edge edge : aNode.getDownEdges()) {
       queue.add(edge.getDownNode());
     }
   }
   return new ArrayList<Node>(all);
 }
 @Override
 public void mouseClicked(MouseEvent e) {
   if (e.getClickCount() == 1) {
     Node jumpToNode = arrowToNode(e);
     if (jumpToNode != null) {
       jumpToRow(jumpToNode.getRowIndex());
       return;
     }
     GraphElement graphElement = overCell(e);
     myUI.click(graphElement);
     if (graphElement == null) {
       myUI.click(PositionUtil.getRowIndex(e));
     }
   }
   myTableListener.onClick(e, e.getClickCount());
 }
 public int getRowByHash(Hash commitHash) {
   Node node = getNodeByHash(commitHash);
   return node == null ? -1 : node.getRowIndex();
 }