void TestWidget::ReceiveWithFeedback ( JBroadcaster* sender, Message* message ) { JXWindowIcon* windowIcon = NULL; if (GetWindow()->GetIconWidget(&windowIcon) && sender == windowIcon && message->Is(JXWindowIcon::kAcceptDrop)) { JXWindowIcon::AcceptDrop* data = dynamic_cast<JXWindowIcon::AcceptDrop*>(message); assert( data != NULL ); if (!data->WillAcceptDrop()) { data->ShouldAcceptDrop( WillAcceptDrop(data->GetTypeList(), data->GetActionPtr(), data->GetPoint(), data->GetTime(), data->GetSource())); } } else { JXScrollableWidget::ReceiveWithFeedback(sender, message); } }
//-------------------------------------------------------------------// // OnDragOver() // //-------------------------------------------------------------------// // This function takes a drag over request, determines if we are over // an item, and passes the request to WillAcceptDrop. //-------------------------------------------------------------------// DROPEFFECT OleListCtrl::OnDragOver( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point ) { DROPEFFECT deReturn = DROPEFFECT_NONE; bool bInsertAfter = false; int nUnderCursor = 0; UINT nHitFlags; if ( pDataObject->IsDataAvailable( ClipFormat ) ) { // Get item under cursor. nUnderCursor = HitTest( point, &nHitFlags ); // Adjust based on where point is. // If we're in the top half of the item, insert before. CRect ItemRect; GetItemRect( nUnderCursor, &ItemRect, FALSE ); ItemRect.DeflateRect( 0, 0, 0, ItemRect.Height()/2 ); bInsertAfter = ( ItemRect.PtInRect( point ) == FALSE ); deReturn = WillAcceptDrop( nUnderCursor, bInsertAfter, nHitFlags, pDataObject, dwKeyState, true ); // We don't currently handle text drops. // } else if ( pDataObject->IsDataAvailable( CF_TEXT ) ) { } // TO DO // Note that this next section is tailored to lists in // REPORT mode. Other modes may still need further work. // Convert to always insert AFTER nUnderCursor. // Note that first we adjust nUnderCursor for drags BELOW // the bottom item. if ( nHitFlags & LVHT_NOWHERE ) { nUnderCursor = GetItemCount() - 1; } else if ( !bInsertAfter ) nUnderCursor--; // Indicate where the drop would be inserted. if ( ( deReturn == DROPEFFECT_COPY || deReturn == DROPEFFECT_MOVE || deReturn == DROPEFFECT_LINK ) && nUnderCursor > -1 ) DrawInsertionLine( nUnderCursor ); else { if ( m_nItemAboveLine > -1 ) { // Erase the old line. RedrawItems( m_nItemAboveLine, m_nItemAboveLine ); UpdateWindow(); m_nItemAboveLine = -1; } } return deReturn; }