/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 * 
 *************************************************************/



#ifndef __com_sun_star_datatransfer_dnd_XAutoscroll_idl__
#define __com_sun_star_datatransfer_dnd_XAutoscroll_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

//=============================================================================

module com { module sun { module star { module datatransfer { module dnd {

//=============================================================================
/** Interface for autoscroll support.

	<p>During Drag and Drop operations it is possible that a user may wish to drop the 
	subject of the operation on a region of a scrollable GUI control that is
	not currently visible to the user.</p>	

	<p>In such situations it is desirable that the GUI control detect this and
	institute a scroll operation in order to make obscured region(s) visible to
	the user. This feature is known as autoscrolling.</p>

	<p>If a GUI control is both an active DropTarget and is also scrollable, 
	it can receive notifications of autoscrolling gestures by the user from
	the Drag and Drop system by implementing this interface.</p>

	<p>An autoscrolling gesture is initiated by the user by keeping the drag 
	cursor motionless with a border region of the Component, referred to as
	the "autoscrolling region", for a predefined period of time, this will
	result in repeated scroll requests to the Component until the drag Cursor
	resumes its motion. </p>
*/

published interface XAutoscroll: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** Notify the component to autoscroll.

		@param cursorLocationX
		X location of the cursor in pixel.

		@param cursorLocationY
		Y location of the cursor in pixel.
	*/
	
	[oneway] void autoscroll( [in] long cursorLocationX, [in] long cursorLocationY );
    
    //-------------------------------------------------------------------------
	/** Returns the regions describing the autoscrolling region.

		@returns 
		The regions describing the autoscrolling region or border 
		relative to the geometry of the implementing component.
	*/
	
	any getAutoscrollRegion(); 
};

//=============================================================================

}; }; }; }; };

#endif
