20 #include <com/sun/star/embed/XEmbedObjectClipboardCreator.hpp>
21 #include <com/sun/star/embed/Aspects.hpp>
22 #include <com/sun/star/embed/MSOLEObjectSystemCreator.hpp>
44 #include <osl/thread.h>
52 #include <viewfunc.hxx>
54 #include <drawview.hxx>
59 #include <globstr.hrc>
63 #include <compiler.hxx>
77 const uno::Reference<datatransfer::XTransferable>& rxTransferable,
78 SCCOL nPosX,
SCROW nPosY,
const Point* pLogicPos,
bool bLink,
bool bAllowDialogs )
80 ScDocument& rDoc = GetViewData().GetDocument();
90 nFormatId == SotClipboardFormatId::RTF );
95 SCTAB nTab = GetViewData().GetTabNo();
102 aPos =
Point( static_cast<tools::Long>(nXT *
HMM_PER_TWIPS), static_cast<tools::Long>(nYT * HMM_PER_TWIPS) );
111 if ( nFormatId == SotClipboardFormatId::EMBED_SOURCE ||
112 nFormatId == SotClipboardFormatId::LINK_SOURCE ||
113 nFormatId == SotClipboardFormatId::EMBED_SOURCE_OLE ||
114 nFormatId == SotClipboardFormatId::LINK_SOURCE_OLE ||
115 nFormatId == SotClipboardFormatId::EMBEDDED_OBJ_OLE )
117 uno::Reference < io::XInputStream > xStm;
136 if (xDocShRef->
DoLoad(pMedium))
147 SCCOL nFirstCol, nLastCol;
148 SCROW nFirstRow, nLastRow;
149 if ( rSrcDoc.
GetDataStart( nSrcTab, nFirstCol, nFirstRow ) )
150 rSrcDoc.
GetCellArea( nSrcTab, nLastCol, nLastRow );
153 nFirstCol = nLastCol = 0;
154 nFirstRow = nLastRow = 0;
156 ScClipParam aClipParam(
ScRange(nFirstCol, nFirstRow, nSrcTab, nLastCol, nLastRow, nSrcTab),
false);
157 rSrcDoc.
CopyToClip(aClipParam, pClipDoc.get(), &aSrcMark,
false,
false);
160 SetCursor( nPosX, nPosY );
174 uno::Reference < embed::XEmbeddedObject > xObj = GetViewData().GetViewShell()->GetObjectShell()->
175 GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName );
184 if (aDataHelper.
GetGDIMetaFile(SotClipboardFormatId::GDIMETAFILE, aMetafile, 100000))
186 nGrFormat = SotClipboardFormatId::GDIMETAFILE;
187 aGraphic = aMetafile;
191 if ( nGrFormat != SotClipboardFormatId::NONE )
193 datatransfer::DataFlavor aDataFlavor;
195 PasteObject( aPos, xObj, &aObjDesc.
maSize, &aGraphic, aDataFlavor.MimeType, aObjDesc.
mnViewAspect );
198 PasteObject( aPos, xObj, &aObjDesc.
maSize );
204 OSL_FAIL(
"Error in CreateAndLoad");
213 uno::Reference < embed::XEmbeddedObject > xObj;
214 xStm = aDataHelper.
GetInputStream(SotClipboardFormatId::EMBED_SOURCE_OLE, OUString());
216 aDataHelper.
GetInputStream(SotClipboardFormatId::EMBEDDED_OBJ_OLE, OUString());
220 xObj = GetViewData().GetDocShell()->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName );
227 uno::Reference < embed::XEmbedObjectClipboardCreator > xClipboardCreator =
230 embed::InsertedObjectInfo aInfo = xClipboardCreator->createInstanceInitFromClipboard(
233 uno::Sequence< beans::PropertyValue >() );
239 GetViewData().GetDocShell()->GetEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aName );
241 catch( uno::Exception& )
253 if( aDataHelper.
GetGraphic( SotClipboardFormatId::SVXB, aGraphic ) )
254 nGrFormat = SotClipboardFormatId::SVXB;
255 else if( aDataHelper.
GetGraphic( SotClipboardFormatId::GDIMETAFILE, aGraphic ) )
256 nGrFormat = SotClipboardFormatId::GDIMETAFILE;
257 else if( aDataHelper.
GetGraphic( SotClipboardFormatId::BITMAP, aGraphic ) )
258 nGrFormat = SotClipboardFormatId::BITMAP;
262 if ( nGrFormat != SotClipboardFormatId::NONE )
264 datatransfer::DataFlavor aDataFlavor;
266 PasteObject( aPos, xObj, &aObjDesc.
maSize, &aGraphic, aDataFlavor.MimeType, aObjDesc.
mnViewAspect );
269 PasteObject( aPos, xObj, &aObjDesc.
maSize );
277 OSL_FAIL(
"Error creating external OLE object");
283 else if ( nFormatId == SotClipboardFormatId::LINK )
285 bRet = PasteLink( rxTransferable );
288 nFormatId == SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT )
290 if ( nFormatId == SotClipboardFormatId::RTF && ( aDataHelper.
HasFormat( SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT ) ) )
293 PasteRTF( nPosX, nPosY, rxTransferable );
298 ScAddress aCellPos( nPosX, nPosY, GetViewData().GetTabNo() );
299 auto pObj = std::make_shared<ScImportExport>(GetViewData().GetDocument(), aCellPos);
300 pObj->SetOverwriting(
true );
303 auto pStrBuffer = std::make_shared<OUString>();
307 if (nFormatId == SotClipboardFormatId::HTML &&
323 pObj->SetExtOptions(aOptions);
332 bRet = pObj->ImportStream( *xStream, OUString(), nFormatId );
335 else if ((nFormatId == SotClipboardFormatId::STRING || nFormatId == SotClipboardFormatId::STRING_TSVC)
336 && aDataHelper.
GetString( nFormatId, *pStrBuffer ))
340 sal_Int32 nDelim = pStrBuffer->indexOf(
'\n');
342 && nDelim >= 0 && nDelim != pStrBuffer->getLength () - 1)
346 auto pStrm = std::make_shared<ScImportStringStream>(*pStrBuffer);
352 bAllowDialogs = bAllowDialogs && !
SC_MOD()->IsInExecuteDrop();
354 pDlg->
StartExecuteAsync([
this, pDlg, &rDoc, pStrm, nFormatId, pStrBuffer, pObj, bAllowDialogs](sal_Int32 nResult){
355 bool bShowErrorDialog = bAllowDialogs;
361 pObj->SetExtOptions( aOptions );
362 pObj->ImportString( *pStrBuffer, nFormatId );
367 bShowErrorDialog = bShowErrorDialog && pObj->IsOverflow();
371 bShowErrorDialog =
false;
377 GetViewData().UpdateInputHandler();
381 if (bShowErrorDialog)
382 ErrorMessage(STR_PASTE_ERROR);
388 bRet = pObj->ImportString( *pStrBuffer, nFormatId );
390 else if ((nFormatId != SotClipboardFormatId::STRING && nFormatId != SotClipboardFormatId::STRING_TSVC)
391 && aDataHelper.
GetString( nFormatId, *pStrBuffer ))
392 bRet = pObj->ImportString( *pStrBuffer, nFormatId );
395 GetViewData().UpdateInputHandler();
398 else if (nFormatId == SotClipboardFormatId::SBA_DATAEXCHANGE)
409 aDescAny <<= aProperties;
412 ScDocShell* pDocSh = GetViewData().GetDocShell();
413 SCTAB nTab = GetViewData().GetTabNo();
415 ClickCursor(nPosX, nPosY,
false);
431 bool bAreaIsNew = !pDBData;
436 rDisp.
ExecuteList(SID_SBA_IMPORT, SfxCallMode::ASYNCHRON,
437 { &aDataDesc, &aTarget, &aAreaNew });
442 else if (nFormatId == SotClipboardFormatId::SBA_FIELDDATAEXCHANGE)
453 Point aInsPos = aPos;
455 aInsPos.AdjustX( -(aRect.GetSize().Width() / 2) );
456 aInsPos.AdjustY( -(aRect.GetSize().Height() / 2) );
457 if ( aInsPos.X() < 0 ) aInsPos.
setX( 0 );
458 if ( aInsPos.Y() < 0 ) aInsPos.setY( 0 );
459 aRect.SetPos(aInsPos);
460 pObj->SetLogicRect(aRect);
462 if ( dynamic_cast<const SdrUnoObj*>( pObj.get() ) !=
nullptr )
466 if (dynamic_cast<const SdrObjGroup*>( pObj.get() ) !=
nullptr)
472 if ( dynamic_cast<const SdrUnoObj*>( pSubObj) !=
nullptr )
476 pSubObj = aIter.
Next();
482 GetViewData().GetViewShell()->SetDrawShell(
true );
487 else if (nFormatId == SotClipboardFormatId::BITMAP || nFormatId == SotClipboardFormatId::PNG || nFormatId == SotClipboardFormatId::JPEG)
490 if( aDataHelper.
GetBitmapEx( SotClipboardFormatId::BITMAP, aBmpEx ) )
491 bRet = PasteBitmapEx( aPos, aBmpEx );
493 else if (nFormatId == SotClipboardFormatId::GDIMETAFILE)
496 if( aDataHelper.
GetGDIMetaFile( SotClipboardFormatId::GDIMETAFILE, aMtf ) )
497 bRet = PasteMetaFile( aPos, aMtf );
499 else if (nFormatId == SotClipboardFormatId::SVXB)
510 else if ( nFormatId == SotClipboardFormatId::DRAWING )
520 std::unique_ptr<FmFormModel> pModel(
523 aDragShellRef.
get()));
525 pModel->GetItemPool().FreezeIdRanges();
532 size_t nObjCount = 0;
533 sal_uInt16 nPages = pModel->GetPageCount();
534 for (sal_uInt16
i=0;
i<nPages;
i++)
536 SdrPage* pPage = pModel->GetPage(
i);
541 if ( dynamic_cast<const SdrUnoObj*>( pObject) !=
nullptr )
545 pObject = aIter.
Next();
551 PasteDraw(aPos, pModel.get(), (nObjCount > 1),
u"A",
u"B");
557 else if ( (nFormatId == SotClipboardFormatId::BIFF_5) || (nFormatId == SotClipboardFormatId::BIFF_8) )
561 uno::Reference <io::XInputStream> xStm = aDataHelper.
GetInputStream(nFormatId, OUString());
566 pInsDoc->ResetClip( &rDoc, nSrcTab );
587 OSL_FAIL(
"no dimension");
588 SCCOL nFirstCol, nLastCol;
589 SCROW nFirstRow, nLastRow;
590 if ( pInsDoc->GetDataStart( nSrcTab, nFirstCol, nFirstRow ) )
591 pInsDoc->GetCellArea( nSrcTab, nLastCol, nLastRow );
594 nFirstCol = nLastCol = 0;
595 nFirstRow = nLastRow = 0;
597 aSource =
ScRange( nFirstCol, nFirstRow, nSrcTab,
598 nLastCol, nLastRow, nSrcTab );
608 pInsDoc->SetClipArea( aSource );
616 else if ( nFormatId == SotClipboardFormatId::SIMPLE_FILE )
619 if ( aDataHelper.
GetString( nFormatId, aFile ) )
620 bRet = PasteFile( aPos, aFile, bLink );
622 else if ( nFormatId == SotClipboardFormatId::FILE_LIST )
625 if ( aDataHelper.
GetFileList( nFormatId, aFileList ) )
630 OUString aFile = aFileList.
GetFile(
i );
632 PasteFile( aPos, aFile, bLink );
640 else if ( nFormatId == SotClipboardFormatId::SOLK ||
641 nFormatId == SotClipboardFormatId::UNIFORMRESOURCELOCATOR ||
642 nFormatId == SotClipboardFormatId::NETSCAPE_BOOKMARK ||
643 nFormatId == SotClipboardFormatId::FILEGRPDESCRIPTOR )
645 bRet = PasteBookmark( nFormatId, rxTransferable, nPosX, nPosY );
660 uno::Sequence<sal_Int8> aSequence = aDataHelper.
GetSequence(SotClipboardFormatId::LINK, OUString());
661 if (!aSequence.hasElements())
663 OSL_FAIL(
"DDE Data not found.");
669 sal_uInt16 nCols = 1;
670 sal_uInt16 nRows = 1;
671 if ( aDataHelper.
HasFormat( SotClipboardFormatId::STRING ) )
674 if ( aDataHelper.
GetString( SotClipboardFormatId::STRING, aDataStr ) )
679 sal_Int32 nLen = aDataStr.getLength();
680 if (nLen && aDataStr[nLen-1] ==
'\n')
681 aDataStr = aDataStr.copy(0, nLen-1);
683 if (!aDataStr.isEmpty())
686 OUString aLine = aDataStr.getToken( 0,
'\n' );
687 if (!aLine.isEmpty())
695 sal_Int32 nSeqLen = aSequence.getLength();
696 const char*
p =
reinterpret_cast<const char*
>(aSequence.getConstArray());
698 rtl_TextEncoding eSysEnc = osl_getThreadTextEncoding();
702 ::std::vector<OUString> aStrs;
703 const char* pStart = p;
704 sal_Int32 nStart = 0;
705 for (sal_Int32
i = 0;
i < nSeqLen; ++
i, ++p)
709 sal_Int32 nLen =
i - nStart;
710 aStrs.emplace_back(pStart, nLen, eSysEnc);
716 if (aStrs.size() < 3)
719 const OUString& pApp = aStrs[0];
720 const OUString& pTopic = aStrs[1];
721 const OUString& pItem = aStrs[2];
722 const OUString* pExtra =
nullptr;
723 if (aStrs.size() > 3)
726 if ( pExtra && *pExtra ==
"calc:extref" )
746 +
"\"" + pTopic +
"\""
748 +
"\"" + pItem +
"\""
755 SCTAB nTab = GetViewData().GetTabNo();
756 SCCOL nCurX = GetViewData().GetCurX();
757 SCROW nCurY = GetViewData().GetCurY();
760 InitBlockMode( nCurX, nCurY, nTab );
761 MarkCursor( nCurX+static_cast<SCCOL>(nCols)-1, nCurY+static_cast<SCROW>(nRows)-1, nTab );
bool GetGraphic(SotClipboardFormatId nFormat, Graphic &rGraphic)
SC_DLLPUBLIC void Format(OStringBuffer &r, ScRefFlags nFlags, const ScDocument *pDocument=nullptr, const Details &rDetails=detailsOOOa1) const
const SfxPoolItem * ExecuteList(sal_uInt16 nSlot, SfxCallMode nCall, std::initializer_list< SfxPoolItem const * > args, std::initializer_list< SfxPoolItem const * > internalargs=std::initializer_list< SfxPoolItem const * >())
bool GetSotStorageStream(SotClipboardFormatId nFormat, tools::SvRef< SotTempStream > &rStreamRef)
TOOLS_DLLPUBLIC OString convertLineEnd(const OString &rIn, LineEnd eLineEnd)
SC_DLLPUBLIC bool GetDataStart(SCTAB nTab, SCCOL &rStartCol, SCROW &rStartRow) const
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
bool isLOKMobilePhone() const
void readGraphic(Graphic &rGraphic)
SC_DLLPUBLIC bool IsNegativePage(SCTAB nTab) const
OUString GetTitle(sal_uInt16 nMaxLen=0) const
static css::uno::Reference< css::embed::XStorage > GetStorageFromInputStream(const css::uno::Reference< css::io::XInputStream > &xStream, const css::uno::Reference< css::uno::XComponentContext > &rxContext=css::uno::Reference< css::uno::XComponentContext >())
static bool IsFormatSupported(SotClipboardFormatId nFormat)
::std::vector< DataFlavorEx > DataFlavorExVector
virtual void GetOptions(ScAsciiOptions &rOpt)=0
ScRange maUsedArea
Used area in the sheet (columns/rows only).
size_t GetObjCount() const
Extended options held by an ScDocument containing additional settings for filters.
css::uno::Sequence< css::beans::PropertyValue > const & createPropertyValueSequence()
ScDBData * GetDBData(const ScRange &rMarked, ScGetDBMode eMode, ScGetDBSelection eSel)
virtual short Execute()=0
EmbeddedObjectRef * pObject
bool HasFormat(SotClipboardFormatId nFormat) const
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
bool PasteLink(const css::uno::Reference< css::datatransfer::XTransferable > &rxTransferable)
sal_Int32 getTokenCount(const OString &rIn, char cTok)
SC_DLLPUBLIC sal_uInt16 GetRowHeight(SCROW nRow, SCTAB nTab, bool bHiddenAsZero=true) const
weld::Window * GetFrameWeld() const
Keep selection as is, expand to used data area if no selection.
void SetDetectSpecialNumber(bool bSet)
PropertiesInfo aProperties
static SfxViewShell * Current()
static bool extractColumnDescriptor(const TransferableDataHelper &_rData, OUString &_rDatasource, OUString &_rDatabaseLocation, OUString &_rConnectionResource, sal_Int32 &_nCommandType, OUString &_rCommand, OUString &_rFieldName)
SC_DLLPUBLIC bool HasTable(SCTAB nTab) const
#define SO3_SC_CLASSID_60
static bool canExtractColumnDescriptor(const DataFlavorExVector &_rFlavors, ColumnTransferFormatFlags _nFormats)
SC_DLLPUBLIC bool GetCellArea(SCTAB nTab, SCCOL &rEndCol, SCROW &rEndRow) const
static SC_DLLPUBLIC OUString GetAbsDocName(const OUString &rFileName, const SfxObjectShell *pShell)
#define SFX_TITLE_FULLNAME
static css::uno::Reference< css::embed::XStorage > GetTemporaryStorage(const css::uno::Reference< css::uno::XComponentContext > &rxContext=css::uno::Reference< css::uno::XComponentContext >())
static void SetClipDocName(const OUString &rNew)
bool PasteDataFormat(SotClipboardFormatId nFormatId, const css::uno::Reference< css::datatransfer::XTransferable > &rxTransferable, SCCOL nPosX, SCROW nPosY, const Point *pLogicPos, bool bLink=false, bool bAllowDialogs=false)
static bool canExtractObjectDescriptor(const DataFlavorExVector &_rFlavors)
void SetLanguage(LanguageType e)
std::unique_ptr< ScDocument, o3tl::default_delete< ScDocument > > ScDocumentUniquePtr
bool GetString(SotClipboardFormatId nFormat, OUString &rStr)
ScSheetLimits & GetSheetLimits() const
void SelectOneTable(SCTAB nTab)
const OUString & GetName() const
OUString GetFile(size_t nIndex) const
SfxItemSet * GetItemSet() const
const ScExtTabSettings * GetTabSettings(SCTAB nTab) const
bool StartExecuteAsync(const std::function< void(sal_Int32)> &rEndDialogFn)
Extended settings for a sheet, used in import/export filters.
virtual VclPtr< AbstractScTextImportOptionsDlg > CreateScTextImportOptionsDlg(weld::Window *pParent)=0
virtual LanguageType GetLanguageType() const =0
bool InsertObjectSafe(SdrObject *pObj, SdrPageView &rPV)
bool GetGDIMetaFile(SotClipboardFormatId nFormat, GDIMetaFile &rMtf, size_t nMaxActions=0)
virtual bool IsDateConversionSet() const =0
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
Any makeAny(Color const &value)
virtual VclPtr< AbstractScImportAsciiDlg > CreateScImportAsciiDlg(weld::Window *pParent, const OUString &aDatName, SvStream *pInStream, ScImportAsciiCall eCall)=0
constexpr SdrLayerID SC_LAYER_FRONT(0)
static SC_DLLPUBLIC ScAbstractDialogFactory * Create()
bool DoInitNew(SfxMedium *pMedium=nullptr)
bool GetBitmapEx(SotClipboardFormatId nFormat, BitmapEx &rBmp)
css::uno::Reference< css::io::XInputStream > GetInputStream(SotClipboardFormatId nFormat, const OUString &rDestDoc)
bool GetFileList(SotClipboardFormatId nFormat, FileList &rFileList)
Reference< XComponentContext > getProcessComponentContext()
const ScDocument & GetDocument() const
std::unique_ptr< SdrObject, SdrObjectFreeOp > SdrObjectUniquePtr
SdrPageView * GetSdrPageView() const
SVXCORE_DLLPUBLIC bool SvxDrawingLayerImport(SdrModel *pModel, const css::uno::Reference< css::io::XInputStream > &xInputStream)
bool GetTransferableObjectDescriptor(SotClipboardFormatId nFormat, TransferableObjectDescriptor &rDesc)
bool DoLoad(SfxMedium *pMedium)
virtual void SaveParameters()=0
This struct stores general clipboard parameters associated with a ScDocument instance created in clip...
SCTAB GetVisibleTab() const
SC_DLLPUBLIC sal_uInt16 GetColWidth(SCCOL nCol, SCTAB nTab, bool bHiddenAsZero=true) const
static ODataAccessDescriptor extractObjectDescriptor(const TransferableDataHelper &_rData)
constexpr SdrLayerID SC_LAYER_CONTROLS(3)
css::uno::Sequence< sal_Int8 > GetSequence(SotClipboardFormatId nFormat, const OUString &rDestDoc)
SC_DLLPUBLIC void CopyToClip(const ScClipParam &rClipParam, ScDocument *pClipDoc, const ScMarkData *pMarks, bool bKeepScenarioFlags, bool bIncludeObjects)
void SetPastingDrawFromOtherDoc(bool bVal)
virtual void NbcSetLayer(SdrLayerID nLayer)
static bool GetFormatDataFlavor(SotClipboardFormatId nFormat, css::datatransfer::DataFlavor &rFlavor)
const DataFlavorExVector & GetDataFlavorExVector() const