const char* QDropEvent::format( int n ) const { #ifdef DEBUG_QDND_WIN qDebug( "QDropEvent::format ( %d )", n ); #endif if ( !pIDataObject ) return NULL; FORMATETC fmtMemory = { 0, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; if ( n >= 0 ) { QPtrList<QWindowsMime> all = QWindowsMime::all(); for ( QWindowsMime * c = all.first(); c ; c = all.next() ) { for ( int i = 0; i < c->countCf(); i++ ) { int cf = c->cf( i ); fmtMemory.cfFormat = cf; if ( pIDataObject->QueryGetData( &fmtMemory ) == S_OK ) { if ( n == 0 ) { #ifdef DEBUG_QDND_WIN qDebug( "format: %s", c->mimeFor( cf ) ); #endif return c->mimeFor( cf ); } n--; } } } } return NULL; }
STDMETHODIMP QOleDropTarget::Drop( LPDATAOBJECT pIDataSource, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect ) { #ifdef DEBUG_QDND_TGT qDebug( "QOleDropTarget::Drop( %p, %d, %d/%d, %d )", pIDataSource, grfKeyState, pt.x, pt.y, *pdwEffect ); qDebug( "widget: %p, winID: %08x", widget, widget ? widget->winId() : 0 ); #endif if ( !qt_tryModalHelper( widget ) ) { *pdwEffect = DROPEFFECT_NONE; return NOERROR; } lastPoint = widget->mapFromGlobal( QPoint( pt.x, pt.y ) ); // grfKeyState does not all ways contain button state in the drop so if // it doesn't then use the last known button state; if ( ( grfKeyState & KEY_STATE_BUTTON_MASK ) == 0 ) grfKeyState |= lastKeyState & KEY_STATE_BUTTON_MASK; lastKeyState = grfKeyState; FORMATETC s_fmtMemory = { 0, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; /* Can we convert the data? */ bool found = false; QPtrList<QWindowsMime> all = QWindowsMime::all(); for ( QWindowsMime * c = all.first(); c && !found; c = all.next() ) { for ( int i = 0; i < c->countCf(); i++ ) { int cf = c->cf( i ); s_fmtMemory.cfFormat = cf; if ( pIDataSource->QueryGetData( &s_fmtMemory ) == S_OK ) { found = true; break; } } } if ( !found ) { return S_OK; } /* Just to be sure */ pIDataObject = pIDataSource; pIDataObject->AddRef(); QDropEvent de( lastPoint ); de.setAction( translateKeyStateToQDropAction( grfKeyState, *pdwEffect ) ); if ( global_src ) global_src->setTarget( widget ); QApplication::sendEvent( widget, &de ); pIDataObject->Release(); pIDataObject = NULL; return S_OK; }