public void mouseMoved(MouseEvent e) {
   JTable table = (JTable) e.getSource();
   Object tag = getTagAt(e);
   if (tag == myTag) {
     table.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
   } else {
     table.setCursor(Cursor.getDefaultCursor());
   }
 }
    @Nullable
    private SvnFileRevision getSelectedRevision(final MouseEvent e) {
      JTable table = (JTable) e.getSource();
      int row = table.rowAtPoint(e.getPoint());
      int column = table.columnAtPoint(e.getPoint());

      final Object value = table.getModel().getValueAt(row, column);
      if (value instanceof SvnFileRevision) {
        return (SvnFileRevision) value;
      }
      return null;
    }
    protected void customizeCellRenderer(
        final JTable table,
        final Object value,
        final boolean selected,
        final boolean hasFocus,
        final int row,
        final int column) {
      if (myListener == null) {
        myListener = new MergeSourceDetailsLinkListener(MERGE_SOURCE_DETAILS_TAG, myFile);
        myListener.install(table);
      }
      if (!(value instanceof SvnFileRevision)) {
        append("", SimpleTextAttributes.REGULAR_ATTRIBUTES);
        return;
      }
      final SvnFileRevision revision = (SvnFileRevision) value;
      final String text = getText(revision);
      if (text.length() == 0) {
        append("", SimpleTextAttributes.REGULAR_ATTRIBUTES);
        return;
      }

      append(
          cutString(text, table.getCellRect(row, column, false).getWidth()),
          SimpleTextAttributes.REGULAR_ATTRIBUTES);
    }