/*
* Copyright 2009 Fred Sauer
*
* 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.allen_sauer.gwt.dnd.client;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Widget;
/**
* Common interface which all drag controllers must implement.
*/
public interface DragController extends FiresDragEvents {
/**
* Register a drag handler which will listen for {@link DragStartEvent DragStartEvents} and and
* {@link DragEndEvent DragEndEvents}.
* @param handler the drag handler to register
*
* @see #removeDragHandler(DragHandler)
*/
@Override
void addDragHandler(DragHandler handler);
/**
* All currently selected widgets are deselected.
*/
void clearSelection();
/**
* Callback method for {@link MouseDragHandler}.
*/
void dragEnd();
/**
* Callback method for {@link MouseDragHandler}.
*/
void dragMove();
/**
* Callback method for {@link MouseDragHandler} when a drag operation is initiated for this drag
* controller.
*/
void dragStart();
/**
* Whether or not any selected regions should be unselected by dragging.
*
* @return <code>true</code> if cancel selections behavior in on
*/
boolean getBehaviorCancelDocumentSelections();
/**
* Determine whether or not drag operations are constrained to the boundary panel.
*
* @return <code>true</code> if drags are constrained to the boundary panel
*/
boolean getBehaviorConstrainedToBoundaryPanel();
/**
* Gets the number of pixels the mouse must be moved to initiate a drag operation.
*
* @return number of pixels or <code>0</code> (zero) if mouse down starts the drag
*/
int getBehaviorDragStartSensitivity();
/**
* Determines whether multiple widget selection behavior is enabled.
*
* @return <code>true</code> if multiple widget selection behavior is enabled
*/
boolean getBehaviorMultipleSelection();
/**
* Determines whether containing panels and the browser window should be scrolled during dragging
* in order to keep draggable widgets visible.
*
* @return <code>true</code> if containing panels and the browser window are to be scrolled during
* dragging to keep draggable widgets visible
*/
boolean getBehaviorScrollIntoView();
/**
* Get the boundary panel provided in the constructor.
*
* @return the AbsolutePanel provided in the constructor
*/
AbsolutePanel getBoundaryPanel();
/**
* Enable dragging on widget. Call this method for each widget that you would like to make
* draggable under this drag controller.
*
* @param draggable the widget to be made draggable
*/
void makeDraggable(Widget draggable);
/**
* Enable dragging on widget, specifying the child widget serving as a drag handle.
*
* @param draggable the widget to be made draggable
* @param dragHandle the widget by which widget can be dragged
*/
void makeDraggable(Widget draggable, Widget dragHandle);
/**
* Performs the reverse of {@link #makeDraggable(Widget)}, making the widget no longer draggable
* by this drag controller.
*
* @param widget the widget which should no longer be draggable
*/
void makeNotDraggable(Widget widget);
/**
* Callback method for {@link MouseDragHandler}.
*
* @throws VetoDragException if the proposed operation is unacceptable
*/
void previewDragEnd() throws VetoDragException;
/**
* Callback method for {@link MouseDragHandler}.
*
* @throws VetoDragException if the proposed operation is unacceptable
*/
void previewDragStart() throws VetoDragException;
/**
* Unregister drag handler.
*
* @param handler the drag handler to remove
* @see #addDragHandler(DragHandler)
*/
@Override
void removeDragHandler(DragHandler handler);
/**
* Reset the internal drop controller (drop target) cache which is initialized primarily by
* {@link AbstractDragController#dragStart()}. This method should be called when a drop target's
* size and/or location changes, or when drop target eligibility changes.
*/
void resetCache();
/**
* Set whether or not document selections should be canceled by dragging. The default is
* <code>true</code>.
*
* @param cancelDocumentSelections <code>true</code> if dragging should cancel document selections
*/
void setBehaviorCancelDocumentSelections(boolean cancelDocumentSelections);
/**
* Set whether or not movable widget is to be constrained to the boundary panel during dragging.
* The default is not to constrain the draggable or drag proxy.
*
* @param constrainedToBoundaryPanel whether or not to constrain to the boundary panel
*/
void setBehaviorConstrainedToBoundaryPanel(boolean constrainedToBoundaryPanel);
/**
* Sets the number of pixels the mouse must be moved in either horizontal or vertical direction in
* order to initiate a drag operation. Defaults to <code>0</code> (zero). Use a value of at least
* <code>1</code> (one) in order to allow registered click listeners to receive click events.
*
* @param pixels number of pixels or <code>0</code> (zero) to start dragging on mouse down
*/
void setBehaviorDragStartSensitivity(int pixels);
/**
* Sets whether multiple widgets can be selected for dragging at one time via <code>CTRL</code>/
* <code>META</code>-click. Defaults to <code>true</code>.
*
* @param multipleSelectionAllowed whether multiple selections are enabled
*/
void setBehaviorMultipleSelection(boolean multipleSelectionAllowed);
/**
* Set whether or not to scroll containing panels and the browser window during drag operations in
* order to keep the draggable widgets visible. The default is <code>true</code>.
*
* @param scrollIntoView whether or not to scroll panels and browser window to keep draggable
* widgets visible
*/
void setBehaviorScrollIntoView(boolean scrollIntoView);
/**
* Toggle the selection of the specified widget.
*
* @param draggable the widget whose selection is to be toggled
*/
void toggleSelection(Widget draggable);
}