1cc13e73eSYuri Dario /************************************************************** 2cc13e73eSYuri Dario * 3cc13e73eSYuri Dario * Licensed to the Apache Software Foundation (ASF) under one 4cc13e73eSYuri Dario * or more contributor license agreements. See the NOTICE file 5cc13e73eSYuri Dario * distributed with this work for additional information 6cc13e73eSYuri Dario * regarding copyright ownership. The ASF licenses this file 7cc13e73eSYuri Dario * to you under the Apache License, Version 2.0 (the 8cc13e73eSYuri Dario * "License"); you may not use this file except in compliance 9cc13e73eSYuri Dario * with the License. You may obtain a copy of the License at 10cc13e73eSYuri Dario * 11cc13e73eSYuri Dario * http://www.apache.org/licenses/LICENSE-2.0 12cc13e73eSYuri Dario * 13cc13e73eSYuri Dario * Unless required by applicable law or agreed to in writing, 14cc13e73eSYuri Dario * software distributed under the License is distributed on an 15cc13e73eSYuri Dario * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16cc13e73eSYuri Dario * KIND, either express or implied. See the License for the 17cc13e73eSYuri Dario * specific language governing permissions and limitations 18cc13e73eSYuri Dario * under the License. 19cc13e73eSYuri Dario * 20cc13e73eSYuri Dario *************************************************************/ 21cc13e73eSYuri Dario 22cc13e73eSYuri Dario 23cc13e73eSYuri Dario // MARKER(update_precomp.py): autogen include statement, do not remove 24cc13e73eSYuri Dario #include "precompiled_dtrans.hxx" 25cc13e73eSYuri Dario #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp> 26cc13e73eSYuri Dario #include <com/sun/star/datatransfer/XTransferable.hpp> 27cc13e73eSYuri Dario #include <rtl/ustring.h> 28cc13e73eSYuri Dario #include <cppuhelper/implbase1.hxx> 29cc13e73eSYuri Dario 30cc13e73eSYuri Dario #include <vcl/window.hxx> 31cc13e73eSYuri Dario 32cc13e73eSYuri Dario #include "globals.hxx" 33cc13e73eSYuri Dario #include "DropTarget.hxx" 34cc13e73eSYuri Dario #include "DragSource.hxx" 35cc13e73eSYuri Dario #include "OTransferable.hxx" 36cc13e73eSYuri Dario 37cc13e73eSYuri Dario 38cc13e73eSYuri Dario using namespace com::sun::star; 39cc13e73eSYuri Dario using namespace com::sun::star::io; 40cc13e73eSYuri Dario using namespace com::sun::star::datatransfer::dnd::DNDConstants; 41cc13e73eSYuri Dario 42cc13e73eSYuri Dario 43cc13e73eSYuri Dario DropTarget::DropTarget( const Reference<XMultiServiceFactory>& sf): 44cc13e73eSYuri Dario WeakComponentImplHelper5< XInitialization, 45cc13e73eSYuri Dario XDropTarget, 46cc13e73eSYuri Dario XDropTargetDragContext, 47cc13e73eSYuri Dario XDropTargetDropContext, 48cc13e73eSYuri Dario XServiceInfo>(m_aMutex), 49cc13e73eSYuri Dario m_serviceFactory( sf), 50cc13e73eSYuri Dario dragEnterEmulation( true), 51cc13e73eSYuri Dario mbActive(false), 52cc13e73eSYuri Dario mDragSourceSupportedActions(ACTION_NONE), 53cc13e73eSYuri Dario mSelectedDropAction(ACTION_NONE), 54cc13e73eSYuri Dario mDefaultActions(ACTION_COPY_OR_MOVE | ACTION_LINK | ACTION_DEFAULT) 55cc13e73eSYuri Dario { 56cc13e73eSYuri Dario g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); 57cc13e73eSYuri Dario } 58cc13e73eSYuri Dario 59cc13e73eSYuri Dario DropTarget::~DropTarget() 60cc13e73eSYuri Dario { 61cc13e73eSYuri Dario debug_printf("DropTarget::~DropTarget"); 62cc13e73eSYuri Dario 63cc13e73eSYuri Dario // This will free the previous instance if present, 64cc13e73eSYuri Dario // so it removes the tmp file 65cc13e73eSYuri Dario mXTransferable = Reference<XTransferable>(); 66cc13e73eSYuri Dario 67cc13e73eSYuri Dario g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); 68cc13e73eSYuri Dario } 69cc13e73eSYuri Dario 70cc13e73eSYuri Dario void SAL_CALL DropTarget::initialize(const Sequence< Any >& aArguments) 71cc13e73eSYuri Dario throw(Exception) 72cc13e73eSYuri Dario { 73cc13e73eSYuri Dario if (aArguments.getLength() < 2) { 74cc13e73eSYuri Dario throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("DropTarget::initialize: Cannot install window event handler")), 75cc13e73eSYuri Dario static_cast<OWeakObject*>(this)); 76cc13e73eSYuri Dario } 77cc13e73eSYuri Dario 78cc13e73eSYuri Dario m_hWnd = *(HWND*) aArguments[0].getValue(); 79cc13e73eSYuri Dario debug_printf("DropTarget::initialize hwnd %x", m_hWnd); 80cc13e73eSYuri Dario 81cc13e73eSYuri Dario // subclass window to allow intercepting D&D messages 82cc13e73eSYuri Dario defWndProc = WinSubclassWindow( m_hWnd, dndFrameProc); 83cc13e73eSYuri Dario SetWindowDropTargetPtr( m_hWnd, this); 84cc13e73eSYuri Dario } 85cc13e73eSYuri Dario 86cc13e73eSYuri Dario // called from WeakComponentImplHelperX::dispose 87cc13e73eSYuri Dario // WeakComponentImplHelper calls disposing before it destroys 88cc13e73eSYuri Dario // itself. 89cc13e73eSYuri Dario void SAL_CALL DropTarget::disposing() 90cc13e73eSYuri Dario { 91cc13e73eSYuri Dario debug_printf("DropTarget::disposing hwnd %x", m_hWnd); 92cc13e73eSYuri Dario 93cc13e73eSYuri Dario // revert window subclassing 94cc13e73eSYuri Dario WinSubclassWindow( m_hWnd, defWndProc); 95cc13e73eSYuri Dario defWndProc = NULL; 96cc13e73eSYuri Dario SetWindowDropTargetPtr( m_hWnd, 0); 97cc13e73eSYuri Dario } 98cc13e73eSYuri Dario 99cc13e73eSYuri Dario void SAL_CALL DropTarget::addDropTargetListener(const uno::Reference<XDropTargetListener>& dtl) 100cc13e73eSYuri Dario throw(RuntimeException) 101cc13e73eSYuri Dario { 102cc13e73eSYuri Dario debug_printf("DropTarget::addDropTargetListener hwnd %x", m_hWnd); 103cc13e73eSYuri Dario rBHelper.addListener(::getCppuType(&dtl), dtl); 104cc13e73eSYuri Dario } 105cc13e73eSYuri Dario 106cc13e73eSYuri Dario void SAL_CALL DropTarget::removeDropTargetListener(const uno::Reference<XDropTargetListener>& dtl) 107cc13e73eSYuri Dario throw(RuntimeException) 108cc13e73eSYuri Dario { 109cc13e73eSYuri Dario debug_printf("DropTarget::removeDropTargetListener hwnd %x", m_hWnd); 110cc13e73eSYuri Dario rBHelper.removeListener(::getCppuType(&dtl), dtl); 111cc13e73eSYuri Dario } 112cc13e73eSYuri Dario 113cc13e73eSYuri Dario sal_Bool SAL_CALL DropTarget::isActive( ) throw(RuntimeException) 114cc13e73eSYuri Dario { 115cc13e73eSYuri Dario debug_printf("DropTarget::isActive %d", mbActive); 116cc13e73eSYuri Dario return mbActive; 117cc13e73eSYuri Dario } 118cc13e73eSYuri Dario 119cc13e73eSYuri Dario void SAL_CALL DropTarget::setActive(sal_Bool active) throw(RuntimeException) 120cc13e73eSYuri Dario { 121cc13e73eSYuri Dario debug_printf("DropTarget::setActive %d", active); 122cc13e73eSYuri Dario mbActive = active; 123cc13e73eSYuri Dario } 124cc13e73eSYuri Dario 125cc13e73eSYuri Dario sal_Int8 SAL_CALL DropTarget::getDefaultActions() throw(RuntimeException) 126cc13e73eSYuri Dario { 127cc13e73eSYuri Dario debug_printf("DropTarget::getDefaultActions %d", mDefaultActions); 128cc13e73eSYuri Dario return mDefaultActions; 129cc13e73eSYuri Dario } 130cc13e73eSYuri Dario 131cc13e73eSYuri Dario void SAL_CALL DropTarget::setDefaultActions(sal_Int8 actions) throw(RuntimeException) 132cc13e73eSYuri Dario { 133cc13e73eSYuri Dario OSL_ENSURE( actions < 8, "No valid default actions"); 134cc13e73eSYuri Dario mDefaultActions= actions; 135cc13e73eSYuri Dario } 136cc13e73eSYuri Dario 137cc13e73eSYuri Dario // 138cc13e73eSYuri Dario // XDropTargetDragContext 139cc13e73eSYuri Dario // 140cc13e73eSYuri Dario // Non - interface functions ============================================================ 141cc13e73eSYuri Dario // DropTarget fires events to XDropTargetListeners. The event object can contains an 142cc13e73eSYuri Dario // XDropTargetDragContext implementaion. When the listener calls on that interface 143cc13e73eSYuri Dario // then the calls are delegated from DragContext (XDropTargetDragContext) to these 144cc13e73eSYuri Dario // functions. 145cc13e73eSYuri Dario // Only one listener which visible area is affected is allowed to call on 146cc13e73eSYuri Dario // XDropTargetDragContext 147cc13e73eSYuri Dario 148cc13e73eSYuri Dario void SAL_CALL DropTarget::acceptDrag(sal_Int8 dragOperation) throw (RuntimeException) 149cc13e73eSYuri Dario { 150cc13e73eSYuri Dario debug_printf("DropTarget::acceptDrag hwnd %x, dragOperation %d", m_hWnd, dragOperation); 151cc13e73eSYuri Dario mSelectedDropAction = dragOperation; 152cc13e73eSYuri Dario } 153cc13e73eSYuri Dario 154cc13e73eSYuri Dario void SAL_CALL DropTarget::rejectDrag() throw (RuntimeException) 155cc13e73eSYuri Dario { 156cc13e73eSYuri Dario debug_printf("DropTarget::rejectDrag hwnd %x", m_hWnd); 157cc13e73eSYuri Dario mSelectedDropAction = ACTION_NONE; 158cc13e73eSYuri Dario } 159cc13e73eSYuri Dario 160cc13e73eSYuri Dario // 161cc13e73eSYuri Dario // XDropTargetDropContext 162cc13e73eSYuri Dario // 163cc13e73eSYuri Dario // Non - interface functions ============================================================ 164cc13e73eSYuri Dario // DropTarget fires events to XDropTargetListeners. The event object contains an 165cc13e73eSYuri Dario // XDropTargetDropContext implementaion. When the listener calls on that interface 166cc13e73eSYuri Dario // then the calls are delegated from DropContext (XDropTargetDropContext) to these 167cc13e73eSYuri Dario // functions. 168cc13e73eSYuri Dario // Only one listener which visible area is affected is allowed to call on 169cc13e73eSYuri Dario // XDropTargetDropContext 170cc13e73eSYuri Dario // Returning sal_False would cause the XDropTargetDropContext or ..DragContext implementation 171cc13e73eSYuri Dario // to throw an InvalidDNDOperationException, meaning that a Drag is not currently performed. 172cc13e73eSYuri Dario // return sal_False results in throwing a InvalidDNDOperationException in the caller. 173cc13e73eSYuri Dario // 174cc13e73eSYuri Dario void SAL_CALL DropTarget::acceptDrop(sal_Int8 dropOperation) throw( RuntimeException) 175cc13e73eSYuri Dario { 176cc13e73eSYuri Dario debug_printf("DropTarget::acceptDrop hwnd %x, dragOperation %d", m_hWnd, dropOperation); 177cc13e73eSYuri Dario mSelectedDropAction = dropOperation; 178cc13e73eSYuri Dario } 179cc13e73eSYuri Dario 180cc13e73eSYuri Dario void SAL_CALL DropTarget::rejectDrop() throw (RuntimeException) 181cc13e73eSYuri Dario { 182cc13e73eSYuri Dario debug_printf("DropTarget::rejectDrop hwnd %x", m_hWnd); 183cc13e73eSYuri Dario mSelectedDropAction = ACTION_NONE; 184cc13e73eSYuri Dario } 185cc13e73eSYuri Dario 186cc13e73eSYuri Dario void SAL_CALL DropTarget::dropComplete(sal_Bool success) throw (RuntimeException) 187cc13e73eSYuri Dario { 188cc13e73eSYuri Dario debug_printf("DropTarget::dropComplete hwnd %x", m_hWnd); 189cc13e73eSYuri Dario 190cc13e73eSYuri Dario // reset action flags 191cc13e73eSYuri Dario mDragSourceSupportedActions = ACTION_NONE; 192cc13e73eSYuri Dario mSelectedDropAction = ACTION_NONE; 193cc13e73eSYuri Dario // enable drag enter emulation again 194cc13e73eSYuri Dario dragEnterEmulation = true; 195cc13e73eSYuri Dario // free local transferable list on next d&d or destruction 196cc13e73eSYuri Dario 197cc13e73eSYuri Dario // post a dummy message to source window to allow DragSource 198cc13e73eSYuri Dario // release resources and close internal d&d 199cc13e73eSYuri Dario if (DragSource::g_DragSourceHwnd != NULLHANDLE) { 200cc13e73eSYuri Dario debug_printf("DropTarget::renderComplete post DM_AOO_ENDCONVERSATION to source"); 201cc13e73eSYuri Dario WinPostMsg( DragSource::g_DragSourceHwnd, DM_AOO_ENDCONVERSATION, 0, 202cc13e73eSYuri Dario MPFROMSHORT(success ? DMFL_TARGETSUCCESSFUL : DMFL_TARGETFAIL)); 203cc13e73eSYuri Dario } 204cc13e73eSYuri Dario 205cc13e73eSYuri Dario } 206cc13e73eSYuri Dario 207cc13e73eSYuri Dario // 208cc13e73eSYuri Dario // XServiceInfo 209cc13e73eSYuri Dario // 210cc13e73eSYuri Dario OUString SAL_CALL DropTarget::getImplementationName() throw (RuntimeException) 211cc13e73eSYuri Dario { 212*94f40e84Smseidel return OUString(RTL_CONSTASCII_USTRINGPARAM(OS2_DNDTARGET_IMPL_NAME)); 213cc13e73eSYuri Dario } 214cc13e73eSYuri Dario 215cc13e73eSYuri Dario sal_Bool SAL_CALL DropTarget::supportsService( const OUString& ServiceName ) throw (RuntimeException) 216cc13e73eSYuri Dario { 217cc13e73eSYuri Dario return ServiceName.equals(OUString(RTL_CONSTASCII_USTRINGPARAM( OS2_DNDTARGET_SERVICE_NAME))); 218cc13e73eSYuri Dario } 219cc13e73eSYuri Dario 220cc13e73eSYuri Dario Sequence< OUString > SAL_CALL DropTarget::getSupportedServiceNames( ) throw (RuntimeException) 221cc13e73eSYuri Dario { 222cc13e73eSYuri Dario OUString names[1]= {OUString(RTL_CONSTASCII_USTRINGPARAM( OS2_DNDTARGET_SERVICE_NAME))}; 223cc13e73eSYuri Dario return Sequence<OUString>(names, 1); 224cc13e73eSYuri Dario } 225cc13e73eSYuri Dario 226cc13e73eSYuri Dario // 227cc13e73eSYuri Dario // AOO private interface events 228cc13e73eSYuri Dario // 229cc13e73eSYuri Dario void DropTarget::fire_drop( const DropTargetDropEvent& dte) 230cc13e73eSYuri Dario { 231cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) ); 232cc13e73eSYuri Dario if( pContainer) 233cc13e73eSYuri Dario { 234cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer); 235cc13e73eSYuri Dario while( iter.hasMoreElements()) 236cc13e73eSYuri Dario { 237cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next())); 238cc13e73eSYuri Dario 239cc13e73eSYuri Dario try { listener->drop( dte); } 240cc13e73eSYuri Dario catch(RuntimeException&) {} 241cc13e73eSYuri Dario } 242cc13e73eSYuri Dario } 243cc13e73eSYuri Dario debug_printf("DropTarget::fire_drop fired"); 244cc13e73eSYuri Dario } 245cc13e73eSYuri Dario 246cc13e73eSYuri Dario void DropTarget::fire_dragEnter(const DropTargetDragEnterEvent& e) 247cc13e73eSYuri Dario { 248cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) ); 249cc13e73eSYuri Dario if( pContainer) 250cc13e73eSYuri Dario { 251cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer); 252cc13e73eSYuri Dario while( iter.hasMoreElements()) 253cc13e73eSYuri Dario { 254cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next())); 255cc13e73eSYuri Dario 256cc13e73eSYuri Dario try { listener->dragEnter( e); } 257cc13e73eSYuri Dario catch (RuntimeException&) {} 258cc13e73eSYuri Dario } 259cc13e73eSYuri Dario } 260cc13e73eSYuri Dario debug_printf("DropTarget::fire_dragEnter fired"); 261cc13e73eSYuri Dario } 262cc13e73eSYuri Dario 263cc13e73eSYuri Dario void DropTarget::fire_dragExit(const DropTargetEvent& dte) 264cc13e73eSYuri Dario { 265cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) ); 266cc13e73eSYuri Dario 267cc13e73eSYuri Dario if( pContainer) 268cc13e73eSYuri Dario { 269cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer); 270cc13e73eSYuri Dario while( iter.hasMoreElements()) 271cc13e73eSYuri Dario { 272cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next())); 273cc13e73eSYuri Dario 274cc13e73eSYuri Dario try { listener->dragExit( dte); } 275cc13e73eSYuri Dario catch (RuntimeException&) {} 276cc13e73eSYuri Dario } 277cc13e73eSYuri Dario } 278cc13e73eSYuri Dario debug_printf("DropTarget::fire_dragExit fired"); 279cc13e73eSYuri Dario } 280cc13e73eSYuri Dario 281cc13e73eSYuri Dario void DropTarget::fire_dragOver(const DropTargetDragEvent& dtde) 282cc13e73eSYuri Dario { 283cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) ); 284cc13e73eSYuri Dario if( pContainer) 285cc13e73eSYuri Dario { 286cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer ); 287cc13e73eSYuri Dario while( iter.hasMoreElements()) 288cc13e73eSYuri Dario { 289cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next())); 290cc13e73eSYuri Dario 291cc13e73eSYuri Dario try { listener->dragOver( dtde); } 292cc13e73eSYuri Dario catch (RuntimeException&) {} 293cc13e73eSYuri Dario } 294cc13e73eSYuri Dario } 295cc13e73eSYuri Dario debug_printf("DropTarget::fire_dragOver fired"); 296cc13e73eSYuri Dario } 297cc13e73eSYuri Dario 298cc13e73eSYuri Dario void DropTarget::fire_dropActionChanged(const DropTargetDragEvent& dtde) 299cc13e73eSYuri Dario { 300cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) ); 301cc13e73eSYuri Dario if( pContainer) 302cc13e73eSYuri Dario { 303cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer); 304cc13e73eSYuri Dario while( iter.hasMoreElements()) 305cc13e73eSYuri Dario { 306cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next())); 307cc13e73eSYuri Dario 308cc13e73eSYuri Dario try { listener->dropActionChanged( dtde); } 309cc13e73eSYuri Dario catch (RuntimeException&) {} 310cc13e73eSYuri Dario } 311cc13e73eSYuri Dario } 312cc13e73eSYuri Dario debug_printf("DropTarget::fire_dropActionChanged fired"); 313cc13e73eSYuri Dario } 314cc13e73eSYuri Dario 315cc13e73eSYuri Dario // 316cc13e73eSYuri Dario // OS/2 specific platform code 317cc13e73eSYuri Dario // 318cc13e73eSYuri Dario 319cc13e73eSYuri Dario MRESULT DropTarget::dragEnter( PDRAGINFO dragInfo) 320cc13e73eSYuri Dario { 321cc13e73eSYuri Dario debug_printf("DropTarget::dragEnter start hwnd 0x%x", m_hWnd); 322cc13e73eSYuri Dario 323cc13e73eSYuri Dario // disable drag enter emulation until next DM_DRAGLEAVE 324cc13e73eSYuri Dario dragEnterEmulation = false; 325cc13e73eSYuri Dario 326cc13e73eSYuri Dario // Get access to the DRAGINFO data structure 327cc13e73eSYuri Dario DrgAccessDraginfo( dragInfo); 328cc13e73eSYuri Dario 329cc13e73eSYuri Dario // Initially when DnD will be started no modifier key can be pressed yet 330cc13e73eSYuri Dario // thus we are getting all actions that the drag source supports, we save 331cc13e73eSYuri Dario // this value because later the system masks the drag source actions if 332cc13e73eSYuri Dario // a modifier key will be pressed 333cc13e73eSYuri Dario mDragSourceSupportedActions = 334cc13e73eSYuri Dario SystemToOfficeDragActions( dragInfo->usOperation); 335cc13e73eSYuri Dario 336cc13e73eSYuri Dario // Only if the drop target is really interested in the drag actions 337cc13e73eSYuri Dario // supported by the source 338cc13e73eSYuri Dario if (mDragSourceSupportedActions & mDefaultActions) { 339cc13e73eSYuri Dario 340cc13e73eSYuri Dario //sal_Int8 currentAction = determineDropAction(mDragSourceSupportedActions, sender); 341cc13e73eSYuri Dario sal_Int8 currentAction = mDragSourceSupportedActions; 342cc13e73eSYuri Dario 343cc13e73eSYuri Dario // map from desktop to client window 344cc13e73eSYuri Dario MapWindowPoint( m_hWnd, dragInfo, &ptlMouse); 345cc13e73eSYuri Dario 346cc13e73eSYuri Dario // This will free the previous instance if present, 347cc13e73eSYuri Dario // so it removes the tmp file 348cc13e73eSYuri Dario mXTransferable = Reference<XTransferable>(); 349cc13e73eSYuri Dario 350cc13e73eSYuri Dario // if g_XTransferable is empty this is an external drop operation, 351cc13e73eSYuri Dario // create a new transferable set 352cc13e73eSYuri Dario mXTransferable = DragSource::g_XTransferable; 353cc13e73eSYuri Dario if (!mXTransferable.is()) { 354cc13e73eSYuri Dario mXTransferable = 355cc13e73eSYuri Dario //new OTransferable( OUString::createFromAscii( "TestString" ) ); 356cc13e73eSYuri Dario new OTransferable( m_hWnd, dragInfo); 357cc13e73eSYuri Dario } 358cc13e73eSYuri Dario 359cc13e73eSYuri Dario #if 1 360cc13e73eSYuri Dario // dump data flavours 361cc13e73eSYuri Dario Sequence<DataFlavor> seq = mXTransferable->getTransferDataFlavors(); 362cc13e73eSYuri Dario for( int i=0; i<seq.getLength(); i++) { 363cc13e73eSYuri Dario DataFlavor df = seq[i]; 364cc13e73eSYuri Dario debug_printf("DropTarget::dragEnter mimetype %s", 365cc13e73eSYuri Dario ::rtl::OUStringToOString( df.MimeType, RTL_TEXTENCODING_UTF8 ).getStr()); 366cc13e73eSYuri Dario } 367cc13e73eSYuri Dario #endif 368cc13e73eSYuri Dario 369cc13e73eSYuri Dario debug_printf("DropTarget::dragEnter (%dx%d) mDragSourceSupportedActions %d", 370cc13e73eSYuri Dario ptlMouse.x, ptlMouse.y, 371cc13e73eSYuri Dario mDragSourceSupportedActions); 372cc13e73eSYuri Dario 373cc13e73eSYuri Dario DropTargetDragEnterEvent dtdee(static_cast<OWeakObject*>(this), 374cc13e73eSYuri Dario 0, this, currentAction, 375cc13e73eSYuri Dario ptlMouse.x, ptlMouse.y, 376cc13e73eSYuri Dario mDragSourceSupportedActions, 377cc13e73eSYuri Dario mXTransferable->getTransferDataFlavors()); 378cc13e73eSYuri Dario fire_dragEnter(dtdee); 379cc13e73eSYuri Dario } 380cc13e73eSYuri Dario 381cc13e73eSYuri Dario // Release the draginfo data structure 382cc13e73eSYuri Dario DrgFreeDraginfo(dragInfo); 383cc13e73eSYuri Dario 384cc13e73eSYuri Dario return OfficeToSystemDragActions( mSelectedDropAction); 385cc13e73eSYuri Dario } 386cc13e73eSYuri Dario 387cc13e73eSYuri Dario MRESULT DropTarget::dragOver( PDRAGINFO dragInfo) 388cc13e73eSYuri Dario { 389cc13e73eSYuri Dario MRESULT dragOp = MRFROM2SHORT( DOR_NODROPOP, 0); 390cc13e73eSYuri Dario 391cc13e73eSYuri Dario if (dragEnterEmulation) 392cc13e73eSYuri Dario return dragEnter( dragInfo); 393cc13e73eSYuri Dario 394cc13e73eSYuri Dario // Get access to the DRAGINFO data structure 395cc13e73eSYuri Dario DrgAccessDraginfo( dragInfo); 396cc13e73eSYuri Dario 397cc13e73eSYuri Dario sal_Int8 currentDragSourceActions = 398cc13e73eSYuri Dario SystemToOfficeDragActions( dragInfo->usOperation); 399cc13e73eSYuri Dario 400cc13e73eSYuri Dario // Only if the drop target is really interessted in the drag actions 401cc13e73eSYuri Dario // supported by the source 402cc13e73eSYuri Dario if (currentDragSourceActions & mDefaultActions) { 403cc13e73eSYuri Dario //sal_Int8 currentAction = determineDropAction(mDragSourceSupportedActions, sender); 404cc13e73eSYuri Dario sal_Int8 currentAction = currentDragSourceActions; 405cc13e73eSYuri Dario 406cc13e73eSYuri Dario // map from desktop to client window 407cc13e73eSYuri Dario MapWindowPoint( m_hWnd, dragInfo, &ptlMouse); 408cc13e73eSYuri Dario 409cc13e73eSYuri Dario DropTargetDragEvent dtde(static_cast<OWeakObject*>(this), 410cc13e73eSYuri Dario 0, this, currentAction, 411cc13e73eSYuri Dario ptlMouse.x, ptlMouse.y, 412cc13e73eSYuri Dario mDragSourceSupportedActions); 413cc13e73eSYuri Dario // firing the event will result in a XDropTargetDragContext event 414cc13e73eSYuri Dario fire_dragOver(dtde); 415cc13e73eSYuri Dario 416cc13e73eSYuri Dario dragOp = OfficeToSystemDragActions(mSelectedDropAction); 417cc13e73eSYuri Dario } 418cc13e73eSYuri Dario 419cc13e73eSYuri Dario // Release the draginfo data structure 420cc13e73eSYuri Dario DrgFreeDraginfo(dragInfo); 421cc13e73eSYuri Dario return dragOp; 422cc13e73eSYuri Dario } 423cc13e73eSYuri Dario 424cc13e73eSYuri Dario MRESULT DropTarget::dragLeave( PDRAGINFO /* dragInfo */) 425cc13e73eSYuri Dario { 426cc13e73eSYuri Dario debug_printf("DropTarget::dragLeave"); 427cc13e73eSYuri Dario 428cc13e73eSYuri Dario DropTargetEvent dte(static_cast<OWeakObject*>(this), 0); 429cc13e73eSYuri Dario fire_dragExit(dte); 430cc13e73eSYuri Dario 431cc13e73eSYuri Dario // reset action flags 432cc13e73eSYuri Dario mDragSourceSupportedActions = ACTION_NONE; 433cc13e73eSYuri Dario mSelectedDropAction = ACTION_NONE; 434cc13e73eSYuri Dario // enable drag enter emulation again 435cc13e73eSYuri Dario dragEnterEmulation = true; 436cc13e73eSYuri Dario // free local transferable list on next d&d or destruction 437cc13e73eSYuri Dario 438cc13e73eSYuri Dario return 0; 439cc13e73eSYuri Dario } 440cc13e73eSYuri Dario 441cc13e73eSYuri Dario MRESULT DropTarget::drop( PDRAGINFO dragInfo) 442cc13e73eSYuri Dario { 443cc13e73eSYuri Dario debug_printf("DropTarget::drop"); 444cc13e73eSYuri Dario 445cc13e73eSYuri Dario // Get access to the DRAGINFO data structure 446cc13e73eSYuri Dario DrgAccessDraginfo( dragInfo); 447cc13e73eSYuri Dario 448cc13e73eSYuri Dario MRESULT dropOp = MRFROM2SHORT( DOR_NODROPOP, 0); 449cc13e73eSYuri Dario 450cc13e73eSYuri Dario if (mSelectedDropAction != ACTION_NONE) { 451cc13e73eSYuri Dario 452cc13e73eSYuri Dario bool rr = false; 453cc13e73eSYuri Dario 454cc13e73eSYuri Dario // map from desktop to client window 455cc13e73eSYuri Dario MapWindowPoint( m_hWnd, dragInfo, &ptlMouse); 456cc13e73eSYuri Dario 457cc13e73eSYuri Dario // if external d&d, request rendering 458cc13e73eSYuri Dario OTransferable* ot = dynamic_cast<OTransferable*>(mXTransferable.get()); 459cc13e73eSYuri Dario if (ot != NULL) { 460cc13e73eSYuri Dario // request rendering, if operation is already possible it 461cc13e73eSYuri Dario // will return false 462cc13e73eSYuri Dario rr = ot->requestRendering(); 463cc13e73eSYuri Dario debug_printf("DropTarget::drop requestRendering=%d", rr); 464cc13e73eSYuri Dario } 465cc13e73eSYuri Dario 466cc13e73eSYuri Dario // no rendering requested, post a DM_RENDERCOMPLETE to ourselves 467cc13e73eSYuri Dario // to fire AOO drop event 468cc13e73eSYuri Dario if (rr == false) 469cc13e73eSYuri Dario WinPostMsg( m_hWnd, DM_RENDERCOMPLETE, 0, 0); 470cc13e73eSYuri Dario 471cc13e73eSYuri Dario dropOp = OfficeToSystemDragActions(mSelectedDropAction); 472cc13e73eSYuri Dario } 473cc13e73eSYuri Dario 474cc13e73eSYuri Dario // Release the draginfo data structure 475cc13e73eSYuri Dario DrgFreeDraginfo(dragInfo); 476cc13e73eSYuri Dario 477cc13e73eSYuri Dario return dropOp; 478cc13e73eSYuri Dario 479cc13e73eSYuri Dario } 480cc13e73eSYuri Dario 481cc13e73eSYuri Dario MRESULT DropTarget::renderComplete( PDRAGTRANSFER dragTransfer) 482cc13e73eSYuri Dario { 483cc13e73eSYuri Dario debug_printf("DropTarget::renderComplete dragTransfer 0x%x", dragTransfer); 484cc13e73eSYuri Dario 485cc13e73eSYuri Dario if (dragTransfer != NULL) { 486cc13e73eSYuri Dario OTransferable* ot = dynamic_cast<OTransferable*>(mXTransferable.get()); 487cc13e73eSYuri Dario // DM_RENDERCOMPLETE cannot be received in internal AOO d&d 488cc13e73eSYuri Dario if (ot == NULL) { 489cc13e73eSYuri Dario debug_printf("DropTarget::renderComplete INTERNAL ERROR null dragtransfer"); 490cc13e73eSYuri Dario return 0; 491cc13e73eSYuri Dario } 492cc13e73eSYuri Dario 493cc13e73eSYuri Dario // set rendered data 494cc13e73eSYuri Dario ot->renderComplete( dragTransfer); 495cc13e73eSYuri Dario } 496cc13e73eSYuri Dario 497cc13e73eSYuri Dario debug_printf("DropTarget::renderComplete mXTransferable.is() %d", mXTransferable.is()); 498cc13e73eSYuri Dario 499cc13e73eSYuri Dario // complete AOO drop event, this will make AOO call 500cc13e73eSYuri Dario // XTransferable::getTransferData() for external ops, 501cc13e73eSYuri Dario // then acceptDrop(), dropComplete() are called from listeners 502cc13e73eSYuri Dario DropTargetDropEvent dtde( static_cast<OWeakObject*>(this), 503cc13e73eSYuri Dario 0, this, mSelectedDropAction, 504cc13e73eSYuri Dario ptlMouse.x, ptlMouse.y, 505cc13e73eSYuri Dario mDragSourceSupportedActions, 506cc13e73eSYuri Dario mXTransferable); 507cc13e73eSYuri Dario fire_drop(dtde); 508cc13e73eSYuri Dario 509cc13e73eSYuri Dario // Reserved value, should be 0 510cc13e73eSYuri Dario return 0; 511cc13e73eSYuri Dario } 512