/*******************************************************************************
 * Copyright (c) 2015, 2020 Dirk Fauth.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
 ******************************************************************************/
package org.eclipse.nebula.widgets.nattable.ui.util;

import org.eclipse.nebula.widgets.nattable.layer.ILayer;
import org.eclipse.swt.events.MouseEvent;

/**
 * Helper class that provides methods for checking {@link MouseEvent}
 * correlations.
 *
 * @since 1.4
 */
public final class MouseEventHelper {

    private MouseEventHelper() {
        // private default constructor for helper class
    }

    /**
     * Checks if the mouse down event and the mouse up event was triggered with
     * an accidental movement which causes a drag behavior. If the up event is
     * in an area of 5 pixels around the down event, we suspect it was a click
     * rather than a drag operation.
     *
     * @param downEvent
     *            The {@link MouseEvent} for mouse down.
     * @param upEvent
     *            The {@link MouseEvent} for mouse up.
     * @return <code>true</code> if the mouse down event and the mouse up event
     *         are too close to be a drag operation and should therefore be
     *         treated as a click, <code>false</code> if the {@link MouseEvent}
     *         properties are quite different so a user drag operation is
     *         assumed.
     */
    public static boolean treatAsClick(MouseEvent downEvent, MouseEvent upEvent) {

        if (((upEvent.x > (downEvent.x + 5)) || (upEvent.x < (downEvent.x - 5)))
                || ((upEvent.y > (downEvent.y + 5)) || (upEvent.y < (downEvent.y - 5)))) {
            return false;
        }

        return true;
    }

    /**
     * Checks if the mouse down event was processed on the same cell as the
     * mouse up event. Is used to handle small mouse movements when clicking as
     * a click and not as a drag operation.
     *
     * @param layer
     *            The layer needed to identify the column and row position
     *            according to the {@link MouseEvent} coordinates. Typically a
     *            NatTable instance.
     * @param downEvent
     *            The {@link MouseEvent} for mouse down.
     * @param upEvent
     *            The {@link MouseEvent} for mouse up.
     * @return <code>true</code> if the mouse up event was triggered on the same
     *         cell as the initial mouse down event.
     */
    public static boolean eventOnSameCell(ILayer layer, MouseEvent downEvent, MouseEvent upEvent) {
        int startCol = layer.getColumnPositionByX(downEvent.x);
        int startRow = layer.getRowPositionByY(downEvent.y);

        int col = layer.getColumnPositionByX(upEvent.x);
        int row = layer.getRowPositionByY(upEvent.y);

        return (startCol == col && startRow == row);
    }

}
