20 #include <config_vclplug.h>
22 #include <osl/mutex.hxx>
28 #include <com/sun/star/datatransfer/clipboard/SystemClipboard.hpp>
29 #include <com/sun/star/datatransfer/dnd/XDropTargetDragContext.hpp>
30 #include <com/sun/star/datatransfer/dnd/XDragGestureRecognizer.hpp>
31 #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
32 #include <com/sun/star/uno/DeploymentException.hpp>
66 const Point aPtPixel( rDGE.DragOriginX, rDGE.DragOriginY );
67 mrParent.StartDrag( rDGE.DragAction, aPtPixel );
84 Reference<XDragGestureRecognizer> xTmp;
86 std::scoped_lock aGuard(
maMutex );
127 ExecuteDropEvent aExecuteEvt( rDTDE.DropAction & ~DNDConstants::ACTION_DEFAULT,
Point( rDTDE.LocationX, rDTDE.LocationY ), rDTDE );
129 aExecuteEvt.
mbDefault = ( ( rDTDE.DropAction & DNDConstants::ACTION_DEFAULT ) != 0 );
135 static_cast<DropTargetEvent&
>(
const_cast<DropTargetDragEvent&
>( aAcceptEvent.
maDragEvent )) = rDTDE;
136 const_cast<DropTargetDragEvent&
>( aAcceptEvent.
maDragEvent ).DropAction = rDTDE.DropAction;
137 const_cast<DropTargetDragEvent&>( aAcceptEvent.
maDragEvent ).LocationX = rDTDE.LocationX;
138 const_cast<DropTargetDragEvent&
>( aAcceptEvent.
maDragEvent ).LocationY = rDTDE.LocationY;
139 const_cast<DropTargetDragEvent&>( aAcceptEvent.
maDragEvent ).SourceActions = rDTDE.SourceActions;
145 if( DNDConstants::ACTION_NONE != nRet )
147 rDTDE.Context->acceptDrop( nRet );
152 nRet =
mrParent.ExecuteDrop( aExecuteEvt );
155 rDTDE.Context->dropComplete( DNDConstants::ACTION_NONE != nRet );
157 mpLastDragOverEvent.reset();
159 catch(
const css::uno::Exception& )
171 mrParent.ImplBeginDrag( rDTDEE.SupportedDataFlavors );
173 catch(
const css::uno::Exception& )
187 mpLastDragOverEvent.reset(
new AcceptDropEvent( rDTDE.DropAction & ~DNDConstants::ACTION_DEFAULT,
Point( rDTDE.LocationX, rDTDE.LocationY ), rDTDE ) );
188 mpLastDragOverEvent->mbDefault = ( ( rDTDE.DropAction & DNDConstants::ACTION_DEFAULT ) != 0 );
192 if( DNDConstants::ACTION_NONE == nRet )
193 rDTDE.Context->rejectDrag();
195 rDTDE.Context->acceptDrag( nRet );
197 catch(
const css::uno::Exception& )
209 if( mpLastDragOverEvent )
211 mpLastDragOverEvent->mbLeaving =
true;
212 mrParent.AcceptDrop( *mpLastDragOverEvent );
213 mpLastDragOverEvent.reset();
218 catch(
const css::uno::Exception& )
237 mxDropTarget( rxDropTarget )
245 Reference< XDropTarget > xTmp;
247 std::scoped_lock aGuard(
maMutex );
286 return DNDConstants::ACTION_NONE;
292 return DNDConstants::ACTION_NONE;
307 struct TDataCntnrEntry_Impl
344 const css::datatransfer::DataFlavor& rFlavor,
const OUString& )
350 for (
auto const& format :
pImpl->aFmtList)
352 if( nFmtId == format.nId )
354 bFnd =
SetAny( format.aAny );
363 case SotClipboardFormatId::STRING:
364 case SotClipboardFormatId::SOLK:
365 case SotClipboardFormatId::NETSCAPE_BOOKMARK:
366 case SotClipboardFormatId::FILECONTENT:
367 case SotClipboardFormatId::FILEGRPDESCRIPTOR:
368 case SotClipboardFormatId::UNIFORMRESOURCELOCATOR:
382 if( !
pImpl->pBookmk )
385 *
pImpl->pBookmk = rBkmk;
387 AddFormat( SotClipboardFormatId::STRING );
389 AddFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK );
390 AddFormat( SotClipboardFormatId::FILECONTENT );
391 AddFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR );
392 AddFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR );
401 TDataCntnrEntry_Impl aEntry;
402 aEntry.nId = nFormatId;
405 memcpy( aSeq.getArray(), pData, nLen );
406 aEntry.aAny <<= aSeq;
407 pImpl->aFmtList.push_back( aEntry );
414 const OString& rStr )
416 CopyAnyData( nFormatId, rStr.getStr(), rStr.getLength() );
422 if( !rStr.isEmpty() )
424 TDataCntnrEntry_Impl aEntry;
426 aEntry.aAny <<= rStr;
427 pImpl->aFmtList.push_back( aEntry );
435 CopyString( SotClipboardFormatId::STRING, rStr );
441 return !
pImpl->aFmtList.empty() ||
442 nullptr !=
pImpl->pBookmk;
450 pImpl->aFinishedLnk = rLnk;
457 pImpl->aFinishedLnk.Call( nDropAction );
471 if (!
data->m_xSystemClipboard.is())
475 data->m_xSystemClipboard = css::datatransfer::clipboard::SystemClipboard::create(
478 catch (DeploymentException
const &) {}
480 return data->m_xSystemClipboard;
482 Reference<XClipboard> xClipboard;
485 xClipboard = css::datatransfer::clipboard::SystemClipboard::create(
488 catch (DeploymentException
const &) {}
495 Reference<XClipboard> xSelection;
502 Sequence< Any >
args{
Any(OUString(
"PRIMARY")) };
503 xSelection.set(xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
504 "com.sun.star.datatransfer.clipboard.SystemClipboard",
args, xContext), UNO_QUERY_THROW);
506 static Reference< XClipboard > s_xSelection(
507 xContext->getServiceManager()->createInstanceWithContext(
508 "com.sun.star.datatransfer.clipboard.GenericClipboard", xContext), UNO_QUERY);
509 xSelection = s_xSelection;
std::unique_ptr< INetBookmark > pBookmk
virtual ~DragGestureListener() override
void CopyINetBookmark(const INetBookmark &rBkmk)
DropTargetHelper()=delete
std::vector< TDataCntnrEntry_Impl > aFmtList
css::uno::Reference< css::datatransfer::dnd::XDragGestureRecognizer > mxDragGestureRecognizer
virtual void DragFinished(sal_Int8 nDropAction) override
DropTargetListener(DropTargetHelper &rDropTargetHelper)
virtual void StartDrag(sal_Int8 nAction, const Point &rPosPixel)
void CopyByteString(SotClipboardFormatId nFormatId, const OString &rStr)
css::uno::Reference< css::datatransfer::dnd::XDropTarget > mxDropTarget
void ImplBeginDrag(const css::uno::Sequence< css::datatransfer::DataFlavor > &rSupportedDataFlavors)
DragSourceHelper(vcl::Window *pWindow)
bool SetINetBookmark(const INetBookmark &rBmk, const css::datatransfer::DataFlavor &rFlavor)
void AddFormat(SotClipboardFormatId nFormat)
std::unique_ptr< TransferDataContainer_Impl > pImpl
virtual ~TransferDataContainer() override
virtual void SAL_CALL dragGestureRecognized(const css::datatransfer::dnd::DragGestureEvent &rDGE) override
Link< sal_Int8, void > aFinishedLnk
virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent &rEvt)
ImplSVData * ImplGetSVData()
void CopyAnyData(SotClipboardFormatId nFormatId, const char *pData, sal_uLong nLen)
TransferDataContainer_Impl()
virtual sal_Int8 AcceptDrop(const AcceptDropEvent &rEvt)
virtual void SAL_CALL dragOver(const css::datatransfer::dnd::DropTargetDragEvent &dtde) override
virtual ~DropTargetHelper()
void CopyString(const OUString &rStr)
void StartDrag(vcl::Window *pWindow, sal_Int8 nDragSourceActions)
Reference< XClipboard > GetSystemClipboard()
DragGestureListener(DragSourceHelper &rDragSourceHelper)
exports com.sun.star.chart2. data
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
void StartDrag(vcl::Window *pWindow, sal_Int8 nDragSourceActions, const Link< sal_Int8, void > &rCallback)
static SotClipboardFormatId GetFormat(const css::datatransfer::DataFlavor &rFlavor)
virtual void SAL_CALL dragExit(const css::datatransfer::dnd::DropTargetEvent &dte) override
static void FillDataFlavorExVector(const css::uno::Sequence< css::datatransfer::DataFlavor > &rDataFlavorSeq, DataFlavorExVector &rDataFlavorExVector)
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
virtual void SAL_CALL dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent &dtdee) override
css::uno::Reference< css::datatransfer::dnd::XDropTargetListener > mxDropTargetListener
virtual void SAL_CALL drop(const css::datatransfer::dnd::DropTargetDropEvent &dtde) override
Reference< XComponentContext > getProcessComponentContext()
Sequence< sal_Int8 > aSeq
virtual void AddSupportedFormats() override
css::uno::Reference< css::datatransfer::dnd::XDragGestureListener > mxDragGestureListener
bool IsDropFormatSupported(SotClipboardFormatId nFormat) const
virtual ~DragSourceHelper()
virtual bool GetData(const css::datatransfer::DataFlavor &rFlavor, const OUString &rDestDoc) override
virtual ~DropTargetListener() override
DataFlavorExVector maFormats
#define DBG_TESTSOLARMUTEX()
bool SetAny(const css::uno::Any &rAny)
BaseContainerNodeSharedPtr & mrParent
virtual void SAL_CALL dropActionChanged(const css::datatransfer::dnd::DropTargetDragEvent &dtde) override
const css::datatransfer::dnd::DropTargetDragEvent maDragEvent
Reference< XClipboard > GetSystemPrimarySelection()