From 128e7b84fdc5e17de50f985f66e6731e847cc50b Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Mon, 13 Mar 2017 18:38:48 +0300 Subject: [PATCH] [vcs-log] disable drag when selecting columns When drag event received, check the direction of drag. If it is mostly vertical, consider it a selection and do not try to drag a column. --- .../vcs/log/ui/table/VcsLogGraphTable.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/table/VcsLogGraphTable.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/table/VcsLogGraphTable.java index b81908604f21..2bd92e4392b5 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/table/VcsLogGraphTable.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/table/VcsLogGraphTable.java @@ -939,6 +939,9 @@ public class VcsLogGraphTable extends TableWithProgress implements DataProvider, // this class redirects events from the table to BasicTableHeaderUI.MouseInputHandler private static class MyBasicTableHeaderUI extends BasicTableHeaderUI implements MouseInputListener { + private int myStartXCoordinate = 0; + private int myStartYCoordinate = 0; + public MyBasicTableHeaderUI(@NotNull JTableHeader tableHeader) { header = tableHeader; mouseInputListener = createMouseInputListener(); @@ -958,6 +961,8 @@ public class VcsLogGraphTable extends TableWithProgress implements DataProvider, @Override public void mousePressed(@NotNull MouseEvent e) { if (isOnBorder(e) || isOnRootColumn(e)) return; + myStartXCoordinate = e.getX(); + myStartYCoordinate = e.getY(); mouseInputListener.mousePressed(convertMouseEvent(e)); } @@ -981,11 +986,19 @@ public class VcsLogGraphTable extends TableWithProgress implements DataProvider, @Override public void mouseDragged(@NotNull MouseEvent e) { if (isOnBorder(e) || isOnRootColumn(e)) return; - mouseInputListener.mouseDragged(convertMouseEvent(e)); - // if I change cursor on mouse pressed, it will change on double-click as well - // and I do not want that - if (header.getDraggedColumn() != null && header.getCursor() == Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)) { - header.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); + int deltaX = Math.abs(e.getX() - myStartXCoordinate); + int deltaY = Math.abs(e.getY() - myStartYCoordinate); + boolean sameColumn = (header.getTable().getColumnModel().getColumn(header.getTable().columnAtPoint(e.getPoint())) == + header.getDraggedColumn()); + // start dragging only if mouse moved horizontally + // or if dragging was already started earlier (it looks weird to stop mid-dragging) + if ((deltaX >= 3 * deltaY && sameColumn) || header.getCursor() == Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)) { + mouseInputListener.mouseDragged(convertMouseEvent(e)); + // if I change cursor on mouse pressed, it will change on double-click as well + // and I do not want that + if (header.getDraggedColumn() != null && header.getCursor() == Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)) { + header.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); + } } }