diff options
-rw-r--r-- | dtrans/source/win32/dnd/dnd.xml | 2 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/dndentry.cxx | 76 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/globals.cxx | 4 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/globals.hxx | 27 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/makefile.mk | 10 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/source.cxx | 249 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/source.hxx | 62 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/sourcecontext.cxx | 89 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/sourcecontext.hxx | 26 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/target.cxx | 68 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/target.hxx | 35 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/targetdragcontext.cxx | 8 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/targetdragcontext.hxx | 8 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/targetdropcontext.cxx | 28 | ||||
-rw-r--r-- | dtrans/source/win32/dnd/targetdropcontext.hxx | 16 |
15 files changed, 501 insertions, 207 deletions
diff --git a/dtrans/source/win32/dnd/dnd.xml b/dtrans/source/win32/dnd/dnd.xml index 7bab1af4a290..88315256c86e 100644 --- a/dtrans/source/win32/dnd/dnd.xml +++ b/dtrans/source/win32/dnd/dnd.xml @@ -53,6 +53,8 @@ <Type> com.sun.star.uno.XWeak </Type> <Type> com.sun.star.uno.XAggregation </Type> <Type> com.sun.star.registry.XRegistryKey </Type> +<Type> com.sun.star.awt.MouseButton </Type> +<Type> com.sun.star.awt.MouseEvent </Type> </COMPONENTDESCRIPTION> diff --git a/dtrans/source/win32/dnd/dndentry.cxx b/dtrans/source/win32/dnd/dndentry.cxx index dccc1f001ad3..f4cb30ffc666 100644 --- a/dtrans/source/win32/dnd/dndentry.cxx +++ b/dtrans/source/win32/dnd/dndentry.cxx @@ -2,9 +2,9 @@ * * $RCSfile: dndentry.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:15 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -58,9 +58,6 @@ * * ************************************************************************/ -//______________________________________________________________________________________________________________ -// includes of other projects -//______________________________________________________________________________________________________________ #ifndef _CPPUHELPER_FACTORY_HXX_ #include <cppuhelper/factory.hxx> @@ -75,44 +72,28 @@ #endif #include "source.hxx" -//----------------------------------------------------------------- -// some defines -//----------------------------------------------------------------- - - - -//----------------------------------------------------------------------------------------------------------- -// namespace directives -//----------------------------------------------------------------------------------------------------------- +#include "target.hxx" using namespace ::rtl ; using namespace ::com::sun::star::uno ; using namespace ::com::sun::star::registry ; using namespace ::cppu ; using namespace ::com::sun::star::lang; -//using namespace ::com::sun::star::datatransfer::clipboard; -//----------------------------------------------------------------- -// create a static object to initialize the shell9x library -//----------------------------------------------------------------- -//----------------------------------------------------------------------------------------------------------- -// functions to create a new Clipboad instance; is needed by factory helper implementation -// @param rServiceManager - service manager, useful if the component needs other uno services -// so we should give it to every UNO-Implementation component -//----------------------------------------------------------------------------------------------------------- - Reference< XInterface > SAL_CALL createDragSource( const Reference< XMultiServiceFactory >& rServiceManager ) { DragSource* pSource= new DragSource( rServiceManager ); return Reference<XInterface>( static_cast<XInitialization*>(pSource), UNO_QUERY); } +Reference< XInterface > SAL_CALL createDropTarget( const Reference< XMultiServiceFactory >& rServiceManager ) +{ + DropTarget* pTarget= new DropTarget( rServiceManager ); + return Reference<XInterface>( static_cast<XInitialization*>(pTarget), UNO_QUERY); +} -//----------------------------------------------------------------------------------------------------------- -// the 3 important functions which will be exported -//----------------------------------------------------------------------------------------------------------- extern "C" { @@ -143,6 +124,10 @@ sal_Bool SAL_CALL component_writeInfo( void* pServiceManager, void* pRegistryKey try { Reference< XRegistryKey > pXNewKey( static_cast< XRegistryKey* >( pRegistryKey ) ); + pXNewKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( DNDSOURCE_REGKEY_NAME ) ) ); + bRetVal = sal_True; + + pXNewKey= static_cast< XRegistryKey* >( pRegistryKey ); pXNewKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( DNDTARGET_REGKEY_NAME ) ) ); bRetVal = sal_True; } @@ -164,28 +149,37 @@ sal_Bool SAL_CALL component_writeInfo( void* pServiceManager, void* pRegistryKey void* SAL_CALL component_getFactory( const sal_Char* pImplName, uno_Interface* pSrvManager, uno_Interface* pRegistryKey ) { void* pRet = 0; + Reference< XSingleServiceFactory > xFactory; - if ( pSrvManager && ( 0 == rtl_str_compare( pImplName, DNDTARGET_IMPL_NAME ) ) ) + if ( pSrvManager && ( 0 == rtl_str_compare( pImplName, DNDSOURCE_IMPL_NAME ) ) ) { Sequence< OUString > aSNS( 1 ); - aSNS.getArray( )[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( DNDTARGET_SERVICE_NAME ) ); + aSNS.getArray( )[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( DNDSOURCE_SERVICE_NAME ) ); -// Reference< XSingleServiceFactory > xFactory ( createSingleFactory( -// reinterpret_cast< XMultiServiceFactory* > ( pSrvManager ), -// OUString::createFromAscii( pImplName ), -// createDragSource, -// aSNS ) ); - Reference< XSingleServiceFactory > xFactory ( createOneInstanceFactory( + xFactory= createSingleFactory( reinterpret_cast< XMultiServiceFactory* > ( pSrvManager ), OUString::createFromAscii( pImplName ), createDragSource, - aSNS)); + aSNS); - if ( xFactory.is() ) - { - xFactory->acquire(); - pRet = xFactory.get(); - } + } + else if( pSrvManager && ( 0 == rtl_str_compare( pImplName, DNDTARGET_IMPL_NAME ) ) ) + { + Sequence< OUString > aSNS( 1 ); + aSNS.getArray( )[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( DNDTARGET_SERVICE_NAME ) ); + + xFactory= createSingleFactory( + reinterpret_cast< XMultiServiceFactory* > ( pSrvManager ), + OUString::createFromAscii( pImplName ), + createDropTarget, + aSNS); + + } + + if ( xFactory.is() ) + { + xFactory->acquire(); + pRet = xFactory.get(); } return pRet; diff --git a/dtrans/source/win32/dnd/globals.cxx b/dtrans/source/win32/dnd/globals.cxx index 12af71a6382d..be169bc52dc1 100644 --- a/dtrans/source/win32/dnd/globals.cxx +++ b/dtrans/source/win32/dnd/globals.cxx @@ -2,9 +2,9 @@ * * $RCSfile: globals.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:16 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses diff --git a/dtrans/source/win32/dnd/globals.hxx b/dtrans/source/win32/dnd/globals.hxx index daf7a1ab3573..04ae97f32b06 100644 --- a/dtrans/source/win32/dnd/globals.hxx +++ b/dtrans/source/win32/dnd/globals.hxx @@ -2,9 +2,9 @@ * * $RCSfile: globals.hxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:16 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -61,9 +61,24 @@ #ifndef _GLOBALS_HXX_ #define _GLOBALS_HXX_ +#ifndef _OSL_MUTEX_H_ +#include <osl/mutex.hxx> +#endif + #include <wtypes.h> #include <sal/types.h> + +#define DNDSOURCE_SERVICE_NAME "com.sun.star.datatransfer.dnd.OleDragAndDropSource" +#define DNDSOURCE_IMPL_NAME "com.sun.star.comp.datatransfer.dnd.OleDragAndDropSource_V1" +#define DNDSOURCE_REGKEY_NAME "/com.sun.star.comp.datatransfer.dnd.OleDragAndDropSource_V1/UNO/SERVICES/com.sun.star.datatransfer.dnd.OleDragAndDropSource" + +#define DNDTARGET_SERVICE_NAME "com.sun.star.datatransfer.dnd.OleDragAndDropTarget" +#define DNDTARGET_IMPL_NAME "com.sun.star.comp.datatransfer.dnd.OleDragAndDropTarget_V1" +#define DNDTARGET_REGKEY_NAME "/com.sun.star.comp.datatransfer.dnd.OleDragAndDropTarget_V1/UNO/SERVICES/com.sun.star.datatransfer.dnd.OleDragAndDropTarget" + + + // This maps key states as occur as parameter, e.g. in IDropTarget::DragEnter, // IDropSource::QueryContinueDrag, to actions as are declared in // com::sun::star::datatransfer::dnd::DNDConstants ( ACTION_MOVE etc). @@ -98,4 +113,12 @@ DWORD dndActionsToDropEffects( sal_Int8 actions); // or Alt). DWORD dndActionsToSingleDropEffect( sal_Int8 actions); + + +struct MutexDummy +{ + osl::Mutex m_mutex; +}; + + #endif
\ No newline at end of file diff --git a/dtrans/source/win32/dnd/makefile.mk b/dtrans/source/win32/dnd/makefile.mk index b2e3cef7aadc..095b1530f9ff 100644 --- a/dtrans/source/win32/dnd/makefile.mk +++ b/dtrans/source/win32/dnd/makefile.mk @@ -2,9 +2,9 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.1.1.1 $ +# $Revision: 1.2 $ # -# last change: $Author: mh $ $Date: 2001-01-31 15:37:17 $ +# last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ # # The Contents of this file are made available subject to the terms of # either of the following licenses @@ -84,7 +84,11 @@ stoponerror=tr .INCLUDE : ..$/..$/cppumaker.mk -CFLAGS+=/GR -DUNICODE -D_UNICODE +#CFLAGS+=/GR -DUNICODE -D_UNICODE + +#DBG_CONSOLE_OUT: when IDropTarget or IDropSource are called we write to a console +#DBG_CLIPBOARD_DATA: To provide DoDragDrop with an data object we call OleGetClipboard +CFLAGS+= -DDBG_CONSOLE_OUT SLOFILES= $(OBJ)$/dndentry.obj \ $(OBJ)$/target.obj \ diff --git a/dtrans/source/win32/dnd/source.cxx b/dtrans/source/win32/dnd/source.cxx index 32c038bf972a..0c73f9ec9407 100644 --- a/dtrans/source/win32/dnd/source.cxx +++ b/dtrans/source/win32/dnd/source.cxx @@ -2,9 +2,9 @@ * * $RCSfile: source.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:17 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -65,13 +65,23 @@ #ifndef _COM_SUN_STAR_DATATRANSFER_XTRANSFERABLE_HPP_ #include <com/sun/star/datatransfer/XTransferable.hpp> #endif +#ifndef _COM_SUN_STAR_AWT_MOUSEBUTTON_HPP_ +#include <com/sun/star/awt/MouseButton.hpp> +#endif +#ifndef _COM_SUN_STAR_AWT_MOUSEEVENT_HPP_ +#include <com/sun/star/awt/MouseEvent.hpp> +#endif + #include "source.hxx" -#include "target.hxx" #include "globals.hxx" #include "sourcecontext.hxx" #include "TransferableWrapper.hxx" #include <rtl/ustring.h> +#include <comdef.h> +#include <process.h> +#include <winuser.h> +#include <stdio.h> using namespace rtl; using namespace cppu; @@ -80,10 +90,19 @@ using namespace com::sun::star::datatransfer; using namespace com::sun::star::datatransfer::dnd; using namespace com::sun::star::datatransfer::dnd::DNDConstants; using namespace com::sun::star::uno; +using namespace com::sun::star::awt::MouseButton; +using namespace com::sun::star::awt; +using namespace com::sun::star::lang; + +DWORD WINAPI DndOleSTAFunc(LPVOID pParams); + DragSource::DragSource( const Reference<XMultiServiceFactory>& sf): m_serviceFactory( sf), - WeakComponentImplHelper3<XInitialization,XDragSource,XDropTargetFactory>(m_mutex) + WeakComponentImplHelper2< XDragSource, XInitialization >(m_mutex), + m_pcurrentContext_impl(0), + m_hAppWindow(0), + m_MouseButton(0) { } @@ -97,6 +116,9 @@ DragSource::~DragSource() void SAL_CALL DragSource::initialize( const Sequence< Any >& aArguments ) throw(Exception, RuntimeException) { + if( aArguments.getLength() >=2) + m_hAppWindow= *(HWND*)aArguments[1].getValue(); + OSL_ASSERT( IsWindow( m_hAppWindow) ); } // XDragSource @@ -112,7 +134,8 @@ sal_Int32 SAL_CALL DragSource::getDefaultCursor( sal_Int8 dragAction ) return 0; } -void SAL_CALL DragSource::startDrag( const DragGestureEvent& trigger, +// Notifies the XDragSourceListener by calling dragDropEnd +void SAL_CALL DragSource::executeDrag( const DragGestureEvent& trigger, sal_Int8 sourceActions, sal_Int32 cursor, sal_Int32 image, @@ -120,32 +143,116 @@ void SAL_CALL DragSource::startDrag( const DragGestureEvent& trigger, const Reference<XDragSourceListener >& listener ) throw( InvalidDNDOperationException, RuntimeException) { - m_sourceListener= listener; + // The actions supported by the drag source m_sourceActions= sourceActions; + // We need the to know which mouse button triggered the operation. + // If it was the left one, then the drop occurs when that button + // has been released and if it was the right one then the drop + // occurs when the right button has been released. If the event is not + // set then we assume that the left button is pressed. + MouseEvent evtMouse; + trigger.Event >>= evtMouse; + m_MouseButton= evtMouse.Buttons; + + // The SourceContext class administers the XDragSourceListener s and + // fires events to them. An instance only exists in the scope of this + // functions. However, the drag and drop operation causes callbacks + // to the IDropSource interface implemented in this class (but only + // while this function executes). The source context is also used + // in DragSource::QueryContinueDrag. + m_pcurrentContext_impl= new SourceContext( + static_cast<DragSource*>(this), listener ); + m_currentContext= static_cast<XDragSourceContext*>( m_pcurrentContext_impl); + + // Convert the XTransferable data object into an IDataObject object; +#ifdef DBG_CLIPBOARD_DATA + IDataObject* pData; + OleGetClipboard( &pData); +#else + IDataObject* pData= static_cast<IDataObject*>( new CXTDataObject( trans)); +#endif + pData->AddRef(); + + // Obtain the id of the thread that created the window + DWORD processId; + DWORD threadIdWindow= GetWindowThreadProcessId( m_hAppWindow, &processId); - DWORD effect=0; - HRESULT hr; - hr= DoDragDrop( - static_cast<IDataObject*>( new CXTDataObject( trans)), - static_cast<IDropSource*>( this), - dndActionsToDropEffects( sourceActions), - &effect); + HRESULT hrDoDragDrop= DRAGDROP_S_CANCEL; - DragSourceDropEvent e; - if( hr == DRAGDROP_S_DROP) + // DoDragDrop needs an Ole STA appartment. + // Determine what kind of apartment this thread belongs to. If it is an OLE STA + // then we assume that this thread created the window. If not then the thread + // must be an MTA. All other cases are not handled. + HRESULT hrInit= OleInitialize( NULL); + + DWORD dropEffect= 0; + if( hrInit == S_OK || hrInit == S_FALSE) + { + // OleInitialize has not been called before we called it. However if this + // is the thread of the window then we do DnD. + if( threadIdWindow == GetCurrentThreadId() ) { - e.DropAction= dndOleDropEffectsToActions( effect); - e.DropSuccess= sal_True; + hrDoDragDrop= DoDragDrop( + pData, + static_cast<IDropSource*>( this), + dndActionsToDropEffects( sourceActions), + &dropEffect); } else - { - e.DropAction= ACTION_NONE; - e.DropSuccess= sal_False; - } - e.DragSourceContext= static_cast<XDragSourceContext*>( new SourceContext( - static_cast<DragSource*>(this) ) ); - m_sourceListener->dragDropEnd( e); + OSL_ENSURE( false, "calling thread is nor the window thread and neither a MTA thread"); + if( hrInit == S_OK) + OleUninitialize(); + } + else if( hrInit == RPC_E_CHANGED_MODE) + { + // This function runs currently in an MTA, so we need to create an OLE STA + // thread in which we call DoDragDrop + + // The structure contains all in an out parameter necessary for the + // DoDragDrop function and it is past as parameter to the thread function. + DndParams params; + params.data= pData; + params.source= static_cast<IDropSource*>( this); + // The effects ( DROPEFFECT ) that is supported by the source and which + // are passed as paramater to the DoDragDrop function + params.dwOkEffects= dndActionsToDropEffects( sourceActions); + // dwEffect is the effect which is choosen by the drop target ( IDropTarget). + // It is passed as argument to DoDragDrop + params.dwEffect= DROPEFFECT_NONE; + // The return value of DoDragDrop is copied to this member. + params.hr= S_OK; + // The thread id of the thread which created the window in which the drag & drop + // operation started. + params.threadIdCreator= threadIdWindow; + // We are currently running in an MTA. The window has been created in a different + // thread which must be an Ole STA. + DWORD idThread; + HANDLE holeThread= CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)DndOleSTAFunc, + ¶ms, 0, &idThread); + // Is function shall only return when the drag and drop operation has finished. + // Therefore we wait for the termination of the thread we created above. + DWORD stat= WaitForSingleObject( holeThread, INFINITE); + + hrDoDragDrop= params.hr; + dropEffect= params.dwEffect; + } + else + { + OSL_ASSERT( false); + } + + OSL_ENSURE( hrDoDragDrop != E_INVALIDARG, "IDataObject impl does not contain valid data"); + + + //Fire event + sal_Int8 action= hrDoDragDrop == DRAGDROP_S_DROP ? dndOleDropEffectsToActions( dropEffect) : ACTION_NONE; + m_pcurrentContext_impl->fire_dragDropEnd( hrDoDragDrop == DRAGDROP_S_DROP ? sal_True : sal_False, + ACTION_NONE); + // Destroy SourceContextslkfgj + m_currentContext= 0; + // Destroy the XTransferable wrapper + pData->Release(); } #ifdef DEBUG @@ -155,21 +262,10 @@ void SAL_CALL DragSource::release() { int a = m_refCount; } - WeakComponentImplHelper3<XInitialization,XDragSource,XDropTargetFactory>::release(); - + WeakComponentImplHelper2< XDragSource, XInitialization>::release(); } #endif -// XDropTargetFactory ------------------------------------------------------------------- - -Reference<XDropTarget > SAL_CALL DragSource::createDropTarget( const Sequence< sal_Int8 >& windowId ) - throw( RuntimeException) -{ - Sequence<sal_Int8>& seqWin= const_cast<Sequence<sal_Int8> & >( windowId); - HWND h= *(HWND*) (const HWND*)seqWin.getConstArray(); - DropTarget* pTarget= new DropTarget(m_serviceFactory, h); - return Reference<XDropTarget>(static_cast<XDropTarget*>( pTarget), UNO_QUERY); -} //IDropTarget --------------------------------------------------------------------------- @@ -179,9 +275,9 @@ HRESULT STDMETHODCALLTYPE DragSource::QueryInterface( REFIID riid, void **ppvOb return E_POINTER; *ppvObject= NULL; - if( IsEqualGUID( riid, __uuidof( IUnknown))) + if( riid == __uuidof( IUnknown) ) *ppvObject= static_cast<IUnknown*>( this); - else if ( IsEqualGUID( riid, __uuidof( IDropSource))) + else if ( riid == __uuidof( IDropSource) ) *ppvObject= static_cast<IDropSource*>( this); if(*ppvObject) @@ -219,24 +315,81 @@ HRESULT STDMETHODCALLTYPE DragSource::QueryContinueDrag( } else { - if (!(grfKeyState & MK_LBUTTON)) + if( ( m_MouseButton == MouseButton::RIGHT && !(grfKeyState & MK_RBUTTON) ) || + ( m_MouseButton == MouseButton::MIDDLE && !(grfKeyState & MK_MBUTTON) ) || + ( m_MouseButton == MouseButton::LEFT && !(grfKeyState & MK_LBUTTON) ) || + ( m_MouseButton == 0 && !(grfKeyState & MK_LBUTTON) ) ) { -// DragSourceDropEvent e; -// e.DropAction= dndOleKeysToAction(grfKeyState); -// e.DropSuccess= sal_True; -// e.DragSourceContext= static_cast<XDragSourceContext*>( new SourceContext( -// static_cast<DragSource*>(this) ) ); -// -// m_sourceListener->dragDropEnd( e); - retVal= DRAGDROP_S_DROP; } } + + sal_Int8 dropAction= fEscapePressed ? ACTION_NONE : + ( m_sourceActions & dndOleKeysToAction( grfKeyState)); + sal_Int8 userAction= fEscapePressed ? ACTION_NONE : + dndOleKeysToAction( grfKeyState); + m_pcurrentContext_impl->fire_dropActionChanged( dropAction, userAction); + +#if DBG_CONSOLE_OUT + printf("\nDragSource::QueryContinueDrag"); +#endif return retVal; } HRESULT STDMETHODCALLTYPE DragSource::GiveFeedback( /* [in] */ DWORD dwEffect) { +#if DBG_CONSOLE_OUT + printf("\nDragSource::GiveFeedback"); +#endif + return DRAGDROP_S_USEDEFAULTCURSORS; -}
\ No newline at end of file +} + + + +// This function is called as extra thread from DragSource::executeDrag. +// The function carries out a drag and drop operation by calling +// DoDragDrop +DWORD WINAPI DndOleSTAFunc(LPVOID pParams) +{ + // The structure contains all arguments for DoDragDrop and other + DndParams *params= (DndParams*)pParams; + // Drag and drop only works in a thread in which OleInitialize is called. + params->hr= OleInitialize( NULL); + if( SUCCEEDED( params->hr) ) + { + // We force the creation of a thread message queue. This is necessary + // for a later call to AttachThreadInput + MSG msgtemp; + PeekMessage( &msgtemp, NULL, WM_USER, WM_USER, PM_NOREMOVE); + + DWORD threadId= GetCurrentThreadId(); + // This thread is attached to the thread that created the window. Hence + // this thread also receives all mouse and keyboard messages which are + // needed by DoDragDrop + AttachThreadInput( threadId , params->threadIdCreator, TRUE ); + +#ifdef DBG_CLIPBOARD_DATA + IDataObject* pData; + OleGetClipboard( &pData); + params->data= pData; +#endif + + params->hr= DoDragDrop( + params->data, + params->source, + params->dwOkEffects, + ¶ms->dwEffect); + + // Detach this thread from the window thread + AttachThreadInput( threadId, params->threadIdCreator, FALSE); + + OleUninitialize(); + } + return 0; +} + + + + diff --git a/dtrans/source/win32/dnd/source.hxx b/dtrans/source/win32/dnd/source.hxx index 55ebf6e95fc8..0c6c4b5b6bac 100644 --- a/dtrans/source/win32/dnd/source.hxx +++ b/dtrans/source/win32/dnd/source.hxx @@ -2,9 +2,9 @@ * * $RCSfile: source.hxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:17 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -68,32 +68,21 @@ #ifndef _COM_SUN_STAR_DATATRANSFER_DND_XDROPTARGETFACTORY_HPP_ #include <com/sun/star/datatransfer/dnd/XDropTargetFactory.hpp> #endif +#ifndef _COM_SUN_STAR_DATATRANSFER_DND_XDRAGSOURCECONTEXT_HPP_ +#include <com/sun/star/datatransfer/dnd/XDragSourceContext.hpp> +#endif #ifndef _COM_SUN_STAR_LANG_XINITIALIZATION_HPP_ #include <com/sun/star/lang/XInitialization.hpp> #endif #ifndef _OSL_MUTEX_H_ #include <osl/mutex.hxx> #endif -#ifndef _CPPUHELPER_COMPBASE3_HXX_ -#include <cppuhelper/compbase3.hxx> +#ifndef _CPPUHELPER_COMPBASE2_HXX_ +#include <cppuhelper/compbase2.hxx> #endif - - -#include <wtypes.h> +#include "globals.hxx" #include <oleidl.h> -// the service names -#define DNDTARGET_SERVICE_NAME "com.sun.star.datatransfer.dnd.OleDragAndDrop" - -// the implementation names -#define DNDTARGET_IMPL_NAME "com.sun.star.comp.datatransfer.dnd.OleDragAndDrop_V1" - -// the registry key names -// a key under which this service will be registered, Format: -> "/ImplName/UNO/SERVICES/ServiceName" -// < Implementation-Name ></UNO/SERVICES/>< Service-Name -// TargetW32 > -#define DNDTARGET_REGKEY_NAME "/com.sun.star.comp.datatransfer.dnd.OleDragAndDrop_V1/UNO/SERVICES/com.sun.star.datatransfer.dnd.OleDragAndDrop" - using namespace ::com::sun::star::lang; @@ -103,28 +92,42 @@ using namespace osl; using namespace ::com::sun::star::datatransfer; using namespace ::com::sun::star::datatransfer::dnd; -struct MutexDummy + +struct DndParams { - Mutex m_mutex; + IDataObject* data; + IDropSource* source; + DWORD dwOkEffects; + DWORD dwEffect; + HRESULT hr; + DWORD threadIdCreator; }; +class SourceContext; // RIGHT MOUSE BUTTON drag and drop not supportet currently. // ALT modifier is considered to effect a user selection of effects class DragSource: public MutexDummy, - public WeakComponentImplHelper3<XInitialization, XDragSource, - XDropTargetFactory>, + public WeakComponentImplHelper2<XDragSource, XInitialization>, public IDropSource { Reference<XMultiServiceFactory> m_serviceFactory; - Reference<XDragSourceListener > m_sourceListener; + // only valid for one dnd operation + // The context notifies the XDragSourceListener s + Reference<XDragSourceContext> m_currentContext; + SourceContext* m_pcurrentContext_impl; + // From com::sun::star::datatransfer::dnd::DNDConstants sal_Int8 m_sourceActions; + HWND m_hAppWindow; + + // The mouse button that set off the drag and drop operation + short m_MouseButton; - DragSourcet(); + DragSource(); DragSource(const DragSource&); DragSource &operator= ( const DragSource&); @@ -144,7 +147,7 @@ public: virtual sal_Bool SAL_CALL isDragImageSupported( ) throw(RuntimeException); virtual sal_Int32 SAL_CALL getDefaultCursor( sal_Int8 dragAction ) throw( IllegalArgumentException, RuntimeException); - virtual void SAL_CALL startDrag( const DragGestureEvent& trigger, + virtual void SAL_CALL executeDrag( const DragGestureEvent& trigger, sal_Int8 sourceActions, sal_Int32 cursor, sal_Int32 image, @@ -152,7 +155,9 @@ public: const Reference<XDragSourceListener >& listener ) throw( InvalidDNDOperationException, RuntimeException); - // XDropTargetFactory + + + virtual HRESULT STDMETHODCALLTYPE QueryInterface( /* [in] */ REFIID riid, /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); @@ -161,8 +166,6 @@ public: virtual ULONG STDMETHODCALLTYPE Release( ); - virtual Reference<XDropTarget > SAL_CALL createDropTarget( const Sequence< sal_Int8 >& windowId ) - throw( RuntimeException); // IDropSource virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag( @@ -174,4 +177,5 @@ public: }; + #endif
\ No newline at end of file diff --git a/dtrans/source/win32/dnd/sourcecontext.cxx b/dtrans/source/win32/dnd/sourcecontext.cxx index 92831ab7d24d..b6833ee9e1ed 100644 --- a/dtrans/source/win32/dnd/sourcecontext.cxx +++ b/dtrans/source/win32/dnd/sourcecontext.cxx @@ -2,9 +2,9 @@ * * $RCSfile: sourcecontext.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:18 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -60,26 +60,39 @@ ************************************************************************/ - - - +#ifndef _COM_SUN_STAR_DATATRANSFER_DND_DNDCONSTANTS_HPP_ +#include <com/sun/star/datatransfer/dnd/DNDConstants.hpp> +#endif #include "sourcecontext.hxx" -SourceContext::SourceContext( DragSource* pSource): m_pDragSource( pSource) +using namespace com::sun::star::datatransfer::dnd; +using namespace com::sun::star::datatransfer::dnd::DNDConstants; + +SourceContext::SourceContext( DragSource* pSource, + const Reference<XDragSourceListener>& listener): + WeakComponentImplHelper1<XDragSourceContext>(m_mutex), + m_pDragSource( pSource), + m_dragSource( static_cast<XDragSource*>( m_pDragSource) ) { +#ifdef DEBUG + if( listener.is()) +#endif + rBHelper.addListener( ::getCppuType( &listener ), listener ); } SourceContext::~SourceContext() { } -void SAL_CALL SourceContext::addDragSourceListener( const Reference<XDragSourceListener >& dsl ) +void SAL_CALL SourceContext::addDragSourceListener( + const Reference<XDragSourceListener >& dsl ) throw( RuntimeException) { } -void SAL_CALL SourceContext::removeDragSourceListener( const Reference<XDragSourceListener >& dsl ) +void SAL_CALL SourceContext::removeDragSourceListener( + const Reference<XDragSourceListener >& dsl ) throw( RuntimeException) { } @@ -106,3 +119,63 @@ void SAL_CALL SourceContext::transferablesFlavorsChanged( ) } +// non -interface functions +// Fires XDragSourceListener::dragDropEnd events. +void SourceContext::fire_dragDropEnd( sal_Bool success, sal_Int8 effect) +{ + + DragSourceDropEvent e; + + if( success == sal_True) + { + e.DropAction= effect; + e.DropSuccess= sal_True; + } + else + { + e.DropAction= ACTION_NONE; + e.DropSuccess= sal_False; + } + e.DragSource= m_dragSource; + e.DragSourceContext= static_cast<XDragSourceContext*>( this); + e.Source= Reference<XInterface>( static_cast<XDragSourceContext*>( this), UNO_QUERY); + + OInterfaceContainerHelper* pContainer= rBHelper.getContainer( + getCppuType( (Reference<XDragSourceListener>* )0 ) ); + + if( pContainer) + { + OInterfaceIteratorHelper iter( *pContainer); + while( iter.hasMoreElements()) + { + Reference<XDragSourceListener> listener( + static_cast<XDragSourceListener*>( iter.next())); + listener->dragDropEnd( e); + } + } +} + + +void SourceContext::fire_dropActionChanged( sal_Int8 dropAction, sal_Int8 userAction) +{ + DragSourceDragEvent e; + e.DropAction= dropAction; + e.UserAction= userAction; + e.DragSource= m_dragSource; + e.DragSourceContext= static_cast<XDragSourceContext*>( this); + e.Source= Reference<XInterface>( static_cast<XDragSourceContext*>( this), UNO_QUERY); + + OInterfaceContainerHelper* pContainer= rBHelper.getContainer( + getCppuType( (Reference<XDragSourceListener>* )0 ) ); + + if( pContainer) + { + OInterfaceIteratorHelper iter( *pContainer); + while( iter.hasMoreElements()) + { + Reference<XDragSourceListener> listener( + static_cast<XDragSourceListener*>( iter.next())); + listener->dropActionChanged( e); + } + } +}
\ No newline at end of file diff --git a/dtrans/source/win32/dnd/sourcecontext.hxx b/dtrans/source/win32/dnd/sourcecontext.hxx index 1c3124265256..e8d282db61ed 100644 --- a/dtrans/source/win32/dnd/sourcecontext.hxx +++ b/dtrans/source/win32/dnd/sourcecontext.hxx @@ -2,9 +2,9 @@ * * $RCSfile: sourcecontext.hxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:18 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -67,6 +67,10 @@ #ifndef _COM_SUN_STAR_DATATRANSFER_DND_XDRAGSOURCECONTEXT_HPP_ #include <com/sun/star/datatransfer/dnd/XDragSourceContext.hpp> #endif +#ifndef _CPPUHELPER_COMPBASE1_HXX_ +#include <cppuhelper/compbase1.hxx> +#endif + #include "source.hxx" @@ -76,16 +80,24 @@ using namespace ::cppu; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; -class SourceContext: public WeakImplHelper1<XDragSourceContext> + +// This class fires events to XDragSourceListener implementations. +// Of that interface only dragDropEnd and dropActionChanged are called. +// The functions dragEnter, dragExit and dragOver are not supported +// currently +class SourceContext: public MutexDummy, + public WeakComponentImplHelper1<XDragSourceContext> { DragSource* m_pDragSource; + Reference<XDragSource> m_dragSource; SourceContext(); SourceContext( const SourceContext&); SourceContext &operator= (const SourceContext& ); + public: - SourceContext( DragSource* pSource); + SourceContext( DragSource* pSource, const Reference<XDragSourceListener>& listener); ~SourceContext(); virtual void SAL_CALL addDragSourceListener( const Reference<XDragSourceListener >& dsl ) @@ -101,6 +113,12 @@ public: virtual void SAL_CALL transferablesFlavorsChanged( ) throw( RuntimeException); + + + // non - interface functions + void fire_dragDropEnd( sal_Bool success, sal_Int8 byte); + void fire_dropActionChanged( sal_Int8 dropAction, sal_Int8 userAction); + }; diff --git a/dtrans/source/win32/dnd/target.cxx b/dtrans/source/win32/dnd/target.cxx index ba3b711f152f..05b00076f003 100644 --- a/dtrans/source/win32/dnd/target.cxx +++ b/dtrans/source/win32/dnd/target.cxx @@ -2,9 +2,9 @@ * * $RCSfile: target.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:19 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -65,7 +65,7 @@ #ifndef _COM_SUN_STAR_DATATRANSFER_XTRANSFERABLE_HPP_ #include <com/sun/star/datatransfer/XTransferable.hpp> #endif - +#include <stdio.h> #include "target.hxx" #include "globals.hxx" #include "targetdropcontext.hxx" @@ -80,20 +80,24 @@ using namespace com::sun::star::datatransfer; using namespace com::sun::star::datatransfer::dnd; using namespace com::sun::star::datatransfer::dnd::DNDConstants; -DropTarget::DropTarget( const Reference<XMultiServiceFactory>& sf, HWND hwin): - m_hWnd( hwin), +DropTarget::DropTarget( const Reference<XMultiServiceFactory>& sf): + m_hWnd( NULL), m_serviceFactory( sf), - WeakComponentImplHelper1<XDropTarget>(m_mutex), + WeakComponentImplHelper2<XInitialization,XDropTarget>(m_mutex), m_bDropTargetRegistered(sal_False), m_nDefaultActions(ACTION_COPY|ACTION_MOVE|ACTION_LINK), m_nListenerDropAction( ACTION_NONE), m_currentEventId(0) { - OSL_ASSERT( IsWindow(m_hWnd)); } DropTarget::~DropTarget() { + if( m_bDropTargetRegistered) + { + RevokeDragDrop(m_hWnd); + CoLockObjectExternal( static_cast<IDropTarget*>(this), FALSE, TRUE); + } } @@ -104,38 +108,24 @@ void SAL_CALL DropTarget::release() { int a = m_refCount; } - WeakComponentImplHelper1<XDropTarget>::release(); + WeakComponentImplHelper2<XInitialization, XDropTarget>::release(); } #endif -void SAL_CALL DropTarget::disposing() + +void SAL_CALL DropTarget::initialize( const Sequence< Any >& aArguments ) + throw(Exception, RuntimeException) { - if( m_bDropTargetRegistered) + if( aArguments.getLength() > 0) { - RevokeDragDrop(m_hWnd); - CoLockObjectExternal( static_cast<IDropTarget*>(this), FALSE, TRUE); + m_hWnd= *(HWND*)aArguments[0].getValue(); + OSL_ASSERT( IsWindow( m_hWnd) ); } } -// XInitialization -//void SAL_CALL DropTarget::initialize( const Sequence< Any >& aArguments ) -// throw(Exception, RuntimeException) -//{ -// -// -// m_hWnd= *(HWND*)aArguments[0].getValue(); -// OSL_ASSERT( IsWindow(m_hWnd)); -// -// if( ! IsWindow( m_hWnd)) -// throw Exception( OUString::createFromAscii("Initialization of DropTarget ") -// + OUString( RTL_CONSTASCII_USTRINGPARAM( DNDTARGET_SERVICE_NAME) ) -// + OUString::createFromAscii("service failed"), -// Reference<XInterface>((XInitialization*)this, UNO_QUERY)); -// -//} - -// XDropTarget + +// XDropTarget ---------------------------------------------------------------- void SAL_CALL DropTarget::addDropTargetListener( const Reference< XDropTargetListener >& dtl ) throw(RuntimeException) { @@ -232,6 +222,11 @@ STDMETHODIMP DropTarget::DragEnter( IDataObject __RPC_FAR *pDataObj, POINTL pt, DWORD *pdwEffect) { +#if DBG_CONSOLE_OUT + printf("\nDropTarget::DragEnter state: %x effect %d", grfKeyState, *pdwEffect); +#endif + + // Dont consider the allowed source action at this point. Because if pdwEffect is COPY // and grfKeyState is only MK_LBUTTON ( default is ACTION_MOVE ) than we give the listener the chance to change // the action to COPY or something. Otherwise the source would display a NONE from the beginning. @@ -271,6 +266,7 @@ STDMETHODIMP DropTarget::DragEnter( IDataObject __RPC_FAR *pDataObj, { *pdwEffect= DROPEFFECT_NONE; } + return S_OK; } @@ -278,6 +274,10 @@ STDMETHODIMP DropTarget::DragOver( DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) { +#if DBG_CONSOLE_OUT + printf("\nDropTarget::DragOver"); +#endif + // A listener can change this value during fire_dragOver m_nListenerDropAction= getFilteredActions( grfKeyState); @@ -327,6 +327,10 @@ STDMETHODIMP DropTarget::DragOver( DWORD grfKeyState, STDMETHODIMP DropTarget::DragLeave( void) { +#if DBG_CONSOLE_OUT + printf("\nDropTarget::DragLeave"); +#endif + m_currentData=0; if( m_nDefaultActions != ACTION_NONE) { @@ -343,6 +347,10 @@ STDMETHODIMP DropTarget::Drop( IDataObject *pDataObj, POINTL pt, DWORD __RPC_FAR *pdwEffect) { +#if DBG_CONSOLE_OUT + printf("\nDropTarget::Drop"); +#endif + m_bDropComplete= sal_False; m_nListenerDropAction= getFilteredActions( grfKeyState); diff --git a/dtrans/source/win32/dnd/target.hxx b/dtrans/source/win32/dnd/target.hxx index af2e28c10876..4c3370ab38ce 100644 --- a/dtrans/source/win32/dnd/target.hxx +++ b/dtrans/source/win32/dnd/target.hxx @@ -2,9 +2,9 @@ * * $RCSfile: target.hxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:19 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -67,8 +67,8 @@ #ifndef _COM_SUN_STAR_DATATRANSFER_DND_XDROPTARGET_HPP_ #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> #endif -#ifndef _CPPUHELPER_COMPBASE1_HXX_ -#include <cppuhelper/compbase1.hxx> +#ifndef _CPPUHELPER_COMPBASE2_HXX_ +#include <cppuhelper/compbase2.hxx> #endif #ifndef _CPPUHELPER_INTERFACECONTAINER_HXX_ #include <cppuhelper/interfacecontainer.hxx> @@ -77,10 +77,8 @@ #include <osl/mutex.hxx> #endif -#include <wtypes.h> #include <oleidl.h> -#include "source.hxx" -// the service names +#include "globals.hxx" using namespace ::com::sun::star::lang; @@ -91,29 +89,22 @@ using namespace ::com::sun::star::datatransfer; using namespace ::com::sun::star::datatransfer::dnd; - -//struct MutexDummy -//{ -// Mutex m_mutex; -//}; - - // DropTarget is a singleton, that is one cannot count on its destructor // do do the cleanup because the factory will hold a reference. The client // has to call XComponent::dispose before the HWND becomes invalid. class DropTarget: public MutexDummy, - public WeakComponentImplHelper1< XDropTarget>, + public WeakComponentImplHelper2< XInitialization, XDropTarget>, public IDropTarget { private: + // The native window for which acts as drop target. HWND m_hWnd; // set by initialize - IDataObject* m_pData; Reference<XMultiServiceFactory> m_serviceFactory; sal_Bool m_bDropTargetRegistered; sal_Int8 m_nDefaultActions; - // This value is set when a XDropTargetListener calls acceptDrop or rejectDrop on - // the XDropTargetDropContext or acceptDrag or rejectDrag on XDropTargetDragContext. + // This value is set when a XDropTargetListener calls accept or reject on + // the XDropTargetDropContext or XDropTargetDragContext. // The values are from the DNDConstants group. sal_Int8 m_nListenerDropAction; Reference<XTransferable> m_currentData; @@ -134,18 +125,16 @@ private: DropTarget &operator= (DropTarget&); public: - DropTarget(const Reference<XMultiServiceFactory>& sf, HWND); + DropTarget(const Reference<XMultiServiceFactory>& sf); virtual ~DropTarget(); #ifdef DEBUG virtual void SAL_CALL release(); #endif - // overriding WeakComponentImplHelper, called from XComponent::dispose - void SAL_CALL disposing(); // XInitialization -// virtual void SAL_CALL initialize( const Sequence< Any >& aArguments ) -// throw(Exception, RuntimeException); + virtual void SAL_CALL initialize( const Sequence< Any >& aArguments ) + throw(Exception, RuntimeException); // XDropTarget virtual void SAL_CALL addDropTargetListener( const Reference< XDropTargetListener >& dtl ) diff --git a/dtrans/source/win32/dnd/targetdragcontext.cxx b/dtrans/source/win32/dnd/targetdragcontext.cxx index bcc137e25e1c..da37560b11fb 100644 --- a/dtrans/source/win32/dnd/targetdragcontext.cxx +++ b/dtrans/source/win32/dnd/targetdragcontext.cxx @@ -2,9 +2,9 @@ * * $RCSfile: targetdragcontext.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:19 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -74,13 +74,13 @@ TargetDragContext::~TargetDragContext() m_pDropTarget->release(); } -void SAL_CALL TargetDragContext::acceptDrag( sal_Int8 dragOperation ) +void SAL_CALL TargetDragContext::accept( sal_Int8 dragOperation ) throw(InvalidDNDOperationException, RuntimeException) { m_pDropTarget->_acceptDrag( dragOperation, m_id); } -void SAL_CALL TargetDragContext::rejectDrag( ) +void SAL_CALL TargetDragContext::reject( ) throw(InvalidDNDOperationException, RuntimeException) { m_pDropTarget->_rejectDrag( m_id); diff --git a/dtrans/source/win32/dnd/targetdragcontext.hxx b/dtrans/source/win32/dnd/targetdragcontext.hxx index 4648689dd577..0f3dbcf8a46d 100644 --- a/dtrans/source/win32/dnd/targetdragcontext.hxx +++ b/dtrans/source/win32/dnd/targetdragcontext.hxx @@ -2,9 +2,9 @@ * * $RCSfile: targetdragcontext.hxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:19 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -94,9 +94,9 @@ public: TargetDragContext( DropTarget* pTarget, sal_uInt32 id); ~TargetDragContext(); - virtual void SAL_CALL acceptDrag( sal_Int8 dragOperation ) + virtual void SAL_CALL accept( sal_Int8 dragOperation ) throw(InvalidDNDOperationException, RuntimeException); - virtual void SAL_CALL rejectDrag( ) + virtual void SAL_CALL reject( ) throw(InvalidDNDOperationException, RuntimeException); virtual Sequence< DataFlavor > SAL_CALL getCurrentDataFlavors( ) throw(RuntimeException); diff --git a/dtrans/source/win32/dnd/targetdropcontext.cxx b/dtrans/source/win32/dnd/targetdropcontext.cxx index 4cbdc5aa96cd..4f4017c2f87a 100644 --- a/dtrans/source/win32/dnd/targetdropcontext.cxx +++ b/dtrans/source/win32/dnd/targetdropcontext.cxx @@ -2,9 +2,9 @@ * * $RCSfile: targetdropcontext.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:19 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -61,6 +61,11 @@ #include "targetdropcontext.hxx" +using namespace ::com::sun::star::datatransfer::dnd; +using namespace ::cppu; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; + TargetDropContext::TargetDropContext( DropTarget* p, sal_uInt32 id): m_id( id) { m_pDropTarget= p; @@ -72,18 +77,31 @@ TargetDropContext::~TargetDropContext() m_pDropTarget->release(); } -void SAL_CALL TargetDropContext::acceptDrop( sal_Int8 dropOperation ) +void SAL_CALL TargetDropContext::accept( sal_Int8 dropOperation ) throw(InvalidDNDOperationException, RuntimeException) { m_pDropTarget->_acceptDrop( dropOperation, m_id); } - -void SAL_CALL TargetDropContext::rejectDrop( ) +// +void SAL_CALL TargetDropContext::reject( ) throw(InvalidDNDOperationException, RuntimeException) { m_pDropTarget->_rejectDrop( m_id); } +Sequence< DataFlavor > SAL_CALL TargetDropContext::getCurrentDataFlavors( ) + throw(RuntimeException) +{ + return m_pDropTarget->_getCurrentDataFlavors( m_id); +} + +sal_Bool SAL_CALL TargetDropContext::isDataFlavorSupported( const DataFlavor& df ) + throw(RuntimeException) +{ + return m_pDropTarget->_isDataFlavorSupported( df, m_id); +} + + void SAL_CALL TargetDropContext::dropComplete( sal_Bool success ) throw(InvalidDNDOperationException, RuntimeException) { diff --git a/dtrans/source/win32/dnd/targetdropcontext.hxx b/dtrans/source/win32/dnd/targetdropcontext.hxx index a79994d990de..07ea552aa523 100644 --- a/dtrans/source/win32/dnd/targetdropcontext.hxx +++ b/dtrans/source/win32/dnd/targetdropcontext.hxx @@ -2,9 +2,9 @@ * * $RCSfile: targetdropcontext.hxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mh $ $Date: 2001-01-31 15:37:20 $ + * last change: $Author: jl $ $Date: 2001-02-08 14:30:48 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -90,10 +90,18 @@ public: TargetDropContext( DropTarget* pTarget, sal_uInt32 id); ~TargetDropContext(); - virtual void SAL_CALL acceptDrop( sal_Int8 dropOperation ) + // XDropTargetDragContext + virtual void SAL_CALL accept( sal_Int8 dropOperation ) throw(InvalidDNDOperationException, RuntimeException); - virtual void SAL_CALL rejectDrop( ) + virtual void SAL_CALL reject( ) throw(InvalidDNDOperationException, RuntimeException); + virtual Sequence< DataFlavor > SAL_CALL getCurrentDataFlavors( ) + throw(RuntimeException); + virtual sal_Bool SAL_CALL isDataFlavorSupported( const DataFlavor& df ) + throw(RuntimeException); + + + // XDropTargetDropContext (inherits XDropTargetDragContext) virtual void SAL_CALL dropComplete( sal_Bool success ) throw(InvalidDNDOperationException, RuntimeException); }; |