/* * Copyright 2000-2016 Vaadin Ltd. * * 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.vaadin.ui.components.grid; import com.vaadin.shared.Registration; import com.vaadin.shared.ui.dnd.DropEffect; import com.vaadin.shared.ui.grid.DropMode; import com.vaadin.shared.ui.grid.GridDropTargetRpc; import com.vaadin.shared.ui.grid.GridDropTargetState; import com.vaadin.ui.Grid; import com.vaadin.ui.dnd.DropTargetExtension; /** * Makes the rows of a Grid HTML5 drop targets. This is the server side * counterpart of GridDropTargetExtensionConnector. * * @param <T> * Type of the Grid bean. * @author Vaadin Ltd * @since 8.1 */ public class GridDropTarget<T> extends DropTargetExtension<Grid<T>> { /** * Extends a Grid and makes it's rows drop targets for HTML5 drag and drop. * * @param target * Grid to be extended. * @param dropMode * Drop mode that describes the allowed drop locations within the * Grid's row. * @see GridDropEvent#getDropLocation() */ public GridDropTarget(Grid<T> target, DropMode dropMode) { super(target); setDropMode(dropMode); } /** * Sets the drop mode of this drop target. * * @param dropMode * Drop mode that describes the allowed drop locations within the * Grid's row. * @see GridDropEvent#getDropLocation() */ public void setDropMode(DropMode dropMode) { if (dropMode == null) { throw new IllegalArgumentException("Drop mode cannot be null"); } getState().dropMode = dropMode; } /** * Gets the drop mode of this drop target. * * @return Drop mode that describes the allowed drop locations within the * Grid's row. */ public DropMode getDropMode() { return getState(false).dropMode; } /** * Attaches drop listener for the current drop target. * {@link GridDropListener#drop(GridDropEvent)} is called when drop event * happens on the client side. * * @param listener * Listener to handle drop event. * @return Handle to be used to remove this listener. */ public Registration addGridDropListener(GridDropListener<T> listener) { return addListener(GridDropEvent.class, listener, GridDropListener.DROP_METHOD); } /** * Sets the threshold between drop locations from the top and the bottom of * a row in pixels. * <p> * Dropping an element * <ul> * <li>within {@code threshold} pixels from the top of a row results in a * drop event with {@link com.vaadin.shared.ui.grid.DropLocation#ABOVE * DropLocation.ABOVE}</li> * <li>within {@code threshold} pixels from the bottom of a row results in a * drop event with {@link com.vaadin.shared.ui.grid.DropLocation#BELOW * DropLocation.BELOW}</li> * <li>anywhere else within the row results in a drop event with * {@link com.vaadin.shared.ui.grid.DropLocation#ON_TOP * DropLocation.ON_TOP}</li> * </ul> * The value only has an effect when drop mode is set to * {@link DropMode#ON_TOP_OR_BETWEEN}. * <p> * Default is 5 pixels. * * @param threshold * The threshold from the top and bottom of the row in pixels. */ public void setDropThreshold(int threshold) { getState().dropThreshold = threshold; } /** * Gets the threshold between drop locations from the top and the bottom of * the row. * * @return The threshold in pixels. */ public int getDropThreshold() { return getState(false).dropThreshold; } @Override protected void registerDropTargetRpc() { registerRpc((GridDropTargetRpc) (dataTransferText, dropEffect, rowKey, dropLocation) -> { T dropTargetRow = getParent().getDataCommunicator().getKeyMapper() .get(rowKey); GridDropEvent<T> event = new GridDropEvent<>(getParent(), dataTransferText, DropEffect.valueOf(dropEffect.toUpperCase()), getUI().getActiveDragSource(), dropTargetRow, dropLocation); fireEvent(event); }); } @Override protected GridDropTargetState getState() { return (GridDropTargetState) super.getState(); } @Override protected GridDropTargetState getState(boolean markAsDirty) { return (GridDropTargetState) super.getState(markAsDirty); } }