/**************************************************************
 * 
 * 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_XDragSourceContext_idl__
#define __com_sun_star_datatransfer_dnd_XDragSourceContext_idl__

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

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

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

 published interface XDragSourceListener;

//=============================================================================
/** The drag source context class is responsible for managing the initiator side 
	of the Drag and Drop protocol. 

	<p>In particular, it is responsible for managing event notifications to the 
	DragSourceListener and providing the Transferable state to enable the data 
	transfer. </p>

	<p>An instance of this class is created as a result of the method <member>XDragSource::startDrag()</member>
	being successfully invoked. This instance is responsible 
	for tracking the state of the operation on behalf of the drag source and 
	dispatching state changes to the drag source listener. </p>

	@see com::sun::star::datatransfer::dnd::XDragSourceContext
	@see com::sun::star::datatransfer::dnd::XDragSourceListener
*/

published interface XDragSourceContext: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** Get the identifier of the currently used cursor.

		@returns 
		The currently selected drag cursor.
	*/
	
	long getCurrentCursor();

	//-------------------------------------------------------------------------
	/** This method sets the current drag cursor.

		<p>This method should only be called to set another cursor than the
		default one for drag action currently selected by the user.</p>
		<p>Invalid cursor identifiers will be ignored.</p>

		@param cursorId
		The identifier the drag source returned when registering the cursor. 
	*/
	
	[oneway] void setCursor( [in] long cursorId );

	//-------------------------------------------------------------------------
	/** This method sets the current drag image. 

		@param dragImage
		The identifier the drag source returned when registering the image (0 = none).
		Invalid identifier will be ignored.
	*/
	
	[oneway] void setImage( [in] long imageId );

	//-------------------------------------------------------------------------
	/** This method notifies the context that the 
		<type scope="com::sun::star::datatransfer">DataFlavor</type> types 
		of the transferable object have changed.
		
		@see com::sun::star::datatransfer::XTransferable	
	*/
	
	[oneway] void transferablesFlavorsChanged();
};

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

}; }; }; }; };

#endif
