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>
54 #include <viewfunc.hxx>
56 #include <drawview.hxx>
61 #include <globstr.hrc>
65 #include <compiler.hxx>
79 const uno::Reference<datatransfer::XTransferable>& rxTransferable,
80 SCCOL nPosX,
SCROW nPosY,
const Point* pLogicPos,
bool bLink,
bool bAllowDialogs )
82 ScDocument& rDoc = GetViewData().GetDocument();
92 nFormatId == SotClipboardFormatId::RTF );
97 SCTAB nTab = GetViewData().GetTabNo();
114 if ( nFormatId == SotClipboardFormatId::EMBED_SOURCE ||
115 nFormatId == SotClipboardFormatId::LINK_SOURCE ||
116 nFormatId == SotClipboardFormatId::EMBED_SOURCE_OLE ||
117 nFormatId == SotClipboardFormatId::LINK_SOURCE_OLE ||
118 nFormatId == SotClipboardFormatId::EMBEDDED_OBJ_OLE )
120 uno::Reference < io::XInputStream > xStm;
139 if (xDocShRef->
DoLoad(pMedium))
150 SCCOL nFirstCol, nLastCol;
151 SCROW nFirstRow, nLastRow;
152 if ( rSrcDoc.
GetDataStart( nSrcTab, nFirstCol, nFirstRow ) )
154 rSrcDoc.
GetCellArea( nSrcTab, nLastCol, nLastRow );
155 if (nLastCol < nFirstCol)
156 nLastCol = nFirstCol;
157 if (nLastRow < nFirstRow)
158 nLastRow = nFirstRow;
162 nFirstCol = nLastCol = 0;
163 nFirstRow = nLastRow = 0;
166 bool bIncludeObjects =
false;
168 if (nFormatId == SotClipboardFormatId::EMBED_SOURCE)
171 SCCOL nPrintEndCol = nFirstCol;
172 SCROW nPrintEndRow = nFirstRow;
173 bool bHasObjects = pDraw && pDraw->
HasObjects();
175 if (bHasObjects && rSrcDoc.
GetPrintArea(nSrcTab, nPrintEndCol, nPrintEndRow,
true))
177 nLastCol = std::max<SCCOL>(nLastCol, nPrintEndCol);
178 nLastRow = std::max<SCROW>(nLastRow, nPrintEndRow);
181 bIncludeObjects = bHasObjects;
184 ScClipParam aClipParam(
ScRange(nFirstCol, nFirstRow, nSrcTab, nLastCol, nLastRow, nSrcTab),
false);
185 rSrcDoc.
CopyToClip(aClipParam, pClipDoc.get(), &aSrcMark,
false, bIncludeObjects);
188 SetCursor( nPosX, nPosY );
202 uno::Reference < embed::XEmbeddedObject > xObj = GetViewData().GetViewShell()->GetObjectShell()->
203 GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName );
212 if (aDataHelper.
GetGDIMetaFile(SotClipboardFormatId::GDIMETAFILE, aMetafile, 100000))
214 nGrFormat = SotClipboardFormatId::GDIMETAFILE;
215 aGraphic = aMetafile;
219 if ( nGrFormat != SotClipboardFormatId::NONE )
221 datatransfer::DataFlavor aDataFlavor;
223 PasteObject( aPos, xObj, &aObjDesc.
maSize, &aGraphic, aDataFlavor.MimeType, aObjDesc.
mnViewAspect );
226 PasteObject( aPos, xObj, &aObjDesc.
maSize );
232 OSL_FAIL(
"Error in CreateAndLoad");
241 uno::Reference < embed::XEmbeddedObject > xObj;
242 xStm = aDataHelper.
GetInputStream(SotClipboardFormatId::EMBED_SOURCE_OLE, OUString());
244 aDataHelper.
GetInputStream(SotClipboardFormatId::EMBEDDED_OBJ_OLE, OUString());
248 xObj = GetViewData().GetDocShell()->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName );
255 uno::Reference < embed::XEmbedObjectClipboardCreator > xClipboardCreator =
258 embed::InsertedObjectInfo aInfo = xClipboardCreator->createInstanceInitFromClipboard(
261 uno::Sequence< beans::PropertyValue >() );
267 GetViewData().GetDocShell()->GetEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aName );
269 catch( uno::Exception& )
281 if( aDataHelper.
GetGraphic( SotClipboardFormatId::SVXB, aGraphic ) )
282 nGrFormat = SotClipboardFormatId::SVXB;
283 else if( aDataHelper.
GetGraphic( SotClipboardFormatId::GDIMETAFILE, aGraphic ) )
284 nGrFormat = SotClipboardFormatId::GDIMETAFILE;
285 else if( aDataHelper.
GetGraphic( SotClipboardFormatId::BITMAP, aGraphic ) )
286 nGrFormat = SotClipboardFormatId::BITMAP;
290 if ( nGrFormat != SotClipboardFormatId::NONE )
292 datatransfer::DataFlavor aDataFlavor;
294 PasteObject( aPos, xObj, &aObjDesc.
maSize, &aGraphic, aDataFlavor.MimeType, aObjDesc.
mnViewAspect );
297 PasteObject( aPos, xObj, &aObjDesc.
maSize );
305 OSL_FAIL(
"Error creating external OLE object");
311 else if ( nFormatId == SotClipboardFormatId::LINK )
313 bRet = PasteLink( rxTransferable );
316 nFormatId == SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT )
318 if ( nFormatId == SotClipboardFormatId::RTF && ( aDataHelper.
HasFormat( SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT ) ) )
321 PasteRTF( nPosX, nPosY, rxTransferable );
326 ScAddress aCellPos( nPosX, nPosY, GetViewData().GetTabNo() );
327 auto pObj = std::make_shared<ScImportExport>(GetViewData().GetDocument(), aCellPos);
328 pObj->SetOverwriting(
true );
331 auto pStrBuffer = std::make_shared<OUString>();
337 static bool bHaveSavedPreferences =
false;
339 static bool bSavedDateConversion;
341 if (nFormatId == SotClipboardFormatId::HTML &&
344 if (bHaveSavedPreferences)
349 pObj->SetExtOptions(aOptions);
368 bHaveSavedPreferences =
true;
372 pObj->SetExtOptions(aOptions);
382 bRet = pObj->ImportStream( *xStream, OUString(), nFormatId );
385 else if ((nFormatId == SotClipboardFormatId::STRING || nFormatId == SotClipboardFormatId::STRING_TSVC)
386 && aDataHelper.
GetString( nFormatId, *pStrBuffer ))
390 sal_Int32 nDelim = pStrBuffer->indexOf(
'\n');
392 && nDelim >= 0 && nDelim != pStrBuffer->getLength () - 1)
396 auto pStrm = std::make_shared<ScImportStringStream>(*pStrBuffer);
402 bAllowDialogs = bAllowDialogs && !
SC_MOD()->IsInExecuteDrop();
404 pDlg->
StartExecuteAsync([
this, pDlg, &rDoc, pStrm, nFormatId, pStrBuffer, pObj, bAllowDialogs](sal_Int32 nResult){
405 bool bShowErrorDialog = bAllowDialogs;
411 pObj->SetExtOptions( aOptions );
412 pObj->ImportString( *pStrBuffer, nFormatId );
417 bShowErrorDialog = bShowErrorDialog && pObj->IsOverflow();
421 bShowErrorDialog =
false;
427 GetViewData().UpdateInputHandler();
431 if (bShowErrorDialog)
432 ErrorMessage(STR_PASTE_ERROR);
438 bRet = pObj->ImportString( *pStrBuffer, nFormatId );
440 else if ((nFormatId != SotClipboardFormatId::STRING && nFormatId != SotClipboardFormatId::STRING_TSVC)
441 && aDataHelper.
GetString( nFormatId, *pStrBuffer ))
442 bRet = pObj->ImportString( *pStrBuffer, nFormatId );
445 GetViewData().UpdateInputHandler();
448 else if (nFormatId == SotClipboardFormatId::SBA_DATAEXCHANGE)
459 aDescAny <<= aProperties;
462 ScDocShell* pDocSh = GetViewData().GetDocShell();
463 SCTAB nTab = GetViewData().GetTabNo();
465 ClickCursor(nPosX, nPosY,
false);
481 bool bAreaIsNew = !pDBData;
486 rDisp.
ExecuteList(SID_SBA_IMPORT, SfxCallMode::ASYNCHRON,
487 { &aDataDesc, &aTarget, &aAreaNew });
492 else if (nFormatId == SotClipboardFormatId::SBA_FIELDDATAEXCHANGE)
503 Point aInsPos = aPos;
505 aInsPos.AdjustX( -(aRect.GetSize().Width() / 2) );
506 aInsPos.AdjustY( -(aRect.GetSize().Height() / 2) );
507 if ( aInsPos.X() < 0 ) aInsPos.setX( 0 );
508 if ( aInsPos.Y() < 0 ) aInsPos.setY( 0 );
510 pObj->SetLogicRect(aRect);
512 if ( dynamic_cast<const SdrUnoObj*>( pObj.get() ) !=
nullptr )
516 if (dynamic_cast<const SdrObjGroup*>( pObj.get() ) !=
nullptr)
522 if ( dynamic_cast<const SdrUnoObj*>( pSubObj) !=
nullptr )
526 pSubObj = aIter.
Next();
532 GetViewData().GetViewShell()->SetDrawShell(
true );
537 else if (nFormatId == SotClipboardFormatId::BITMAP || nFormatId == SotClipboardFormatId::PNG || nFormatId == SotClipboardFormatId::JPEG)
540 if( aDataHelper.
GetBitmapEx( SotClipboardFormatId::BITMAP, aBmpEx ) )
541 bRet = PasteBitmapEx( aPos, aBmpEx );
543 else if (nFormatId == SotClipboardFormatId::GDIMETAFILE)
546 if( aDataHelper.
GetGDIMetaFile( SotClipboardFormatId::GDIMETAFILE, aMtf ) )
547 bRet = PasteMetaFile( aPos, aMtf );
549 else if (nFormatId == SotClipboardFormatId::SVXB)
557 bRet = PasteGraphic( aPos, aGraphic, OUString() );
560 else if ( nFormatId == SotClipboardFormatId::DRAWING )
570 std::unique_ptr<FmFormModel> pModel(
573 aDragShellRef.
get()));
575 pModel->GetItemPool().FreezeIdRanges();
582 size_t nObjCount = 0;
583 sal_uInt16 nPages = pModel->GetPageCount();
584 for (sal_uInt16
i=0;
i<nPages;
i++)
586 SdrPage* pPage = pModel->GetPage(
i);
591 if ( dynamic_cast<const SdrUnoObj*>( pObject) !=
nullptr )
595 pObject = aIter.
Next();
601 PasteDraw(aPos, pModel.get(), (nObjCount > 1),
u"A",
u"B");
607 else if ( (nFormatId == SotClipboardFormatId::BIFF_5) || (nFormatId == SotClipboardFormatId::BIFF_8) )
611 uno::Reference <io::XInputStream> xStm = aDataHelper.
GetInputStream(nFormatId, OUString());
637 OSL_FAIL(
"no dimension");
638 SCCOL nFirstCol, nLastCol;
639 SCROW nFirstRow, nLastRow;
640 if ( aInsDoc.
GetDataStart( nSrcTab, nFirstCol, nFirstRow ) )
641 aInsDoc.
GetCellArea( nSrcTab, nLastCol, nLastRow );
644 nFirstCol = nLastCol = 0;
645 nFirstRow = nLastRow = 0;
647 aSource =
ScRange( nFirstCol, nFirstRow, nSrcTab,
648 nLastCol, nLastRow, nSrcTab );
666 else if ( nFormatId == SotClipboardFormatId::SIMPLE_FILE )
669 if ( aDataHelper.
GetString( nFormatId, aFile ) )
670 bRet = PasteFile( aPos, aFile, bLink );
672 else if ( nFormatId == SotClipboardFormatId::FILE_LIST )
675 if ( aDataHelper.
GetFileList( nFormatId, aFileList ) )
680 OUString aFile = aFileList.
GetFile(
i );
682 PasteFile( aPos, aFile, bLink );
690 else if ( nFormatId == SotClipboardFormatId::SOLK ||
691 nFormatId == SotClipboardFormatId::UNIFORMRESOURCELOCATOR ||
692 nFormatId == SotClipboardFormatId::NETSCAPE_BOOKMARK ||
693 nFormatId == SotClipboardFormatId::FILEGRPDESCRIPTOR )
695 bRet = PasteBookmark( nFormatId, rxTransferable, nPosX, nPosY );
710 uno::Sequence<sal_Int8> aSequence = aDataHelper.
GetSequence(SotClipboardFormatId::LINK, OUString());
711 if (!aSequence.hasElements())
713 OSL_FAIL(
"DDE Data not found.");
719 sal_uInt16 nCols = 1;
720 sal_uInt16 nRows = 1;
721 if ( aDataHelper.
HasFormat( SotClipboardFormatId::STRING ) )
724 if ( aDataHelper.
GetString( SotClipboardFormatId::STRING, aDataStr ) )
729 sal_Int32 nLen = aDataStr.getLength();
730 if (nLen && aDataStr[nLen-1] ==
'\n')
731 aDataStr = aDataStr.copy(0, nLen-1);
733 if (!aDataStr.isEmpty())
745 sal_Int32 nSeqLen = aSequence.getLength();
746 const char*
p =
reinterpret_cast<const char*
>(aSequence.getConstArray());
748 rtl_TextEncoding eSysEnc = osl_getThreadTextEncoding();
752 ::std::vector<OUString> aStrs;
753 const char* pStart = p;
754 sal_Int32 nStart = 0;
755 for (sal_Int32
i = 0;
i < nSeqLen; ++
i, ++p)
759 sal_Int32 nLen =
i - nStart;
760 aStrs.emplace_back(pStart, nLen, eSysEnc);
766 if (aStrs.size() < 3)
769 const OUString& pApp = aStrs[0];
770 const OUString& pTopic = aStrs[1];
771 const OUString& pItem = aStrs[2];
772 const OUString* pExtra =
nullptr;
773 if (aStrs.size() > 3)
776 if ( pExtra && *pExtra ==
"calc:extref" )
796 +
"\"" + pTopic +
"\""
798 +
"\"" + pItem +
"\""
805 SCTAB nTab = GetViewData().GetTabNo();
806 SCCOL nCurX = GetViewData().GetCurX();
807 SCROW nCurY = GetViewData().GetCurY();
810 InitBlockMode( nCurX, nCurY, nTab );
811 MarkCursor( nCurX+static_cast<SCCOL>(nCols)-1, nCurY+static_cast<SCROW>(nRows)-1, nTab );
SC_DLLPUBLIC bool GetPrintArea(SCTAB nTab, SCCOL &rEndCol, SCROW &rEndRow, bool bNotes=true) const
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 * >())
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
bool GetBitmapEx(SotClipboardFormatId nFormat, BitmapEx &rBmp) 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
constexpr Point convert(const Point &rPoint, o3tl::Length eFrom, o3tl::Length eTo)
ScRange maUsedArea
Used area in the sheet (columns/rows only).
size_t GetObjCount() const
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)
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)
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()
virtual bool IsKeepAskingSet() const =0
bool GetFileList(SotClipboardFormatId nFormat, FileList &rFileList) const
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
SC_DLLPUBLIC void ResetClip(ScDocument *pSourceDoc, const ScMarkData *pMarks)
static bool canExtractColumnDescriptor(const DataFlavorExVector &_rFlavors, ColumnTransferFormatFlags _nFormats)
sal_Int32 getTokenCount(std::string_view rIn, char cTok)
css::uno::Sequence< sal_Int8 > GetSequence(SotClipboardFormatId nFormat, const OUString &rDestDoc) const
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
SC_DLLPUBLIC ScDrawLayer * GetDrawLayer()
void SetClipArea(const ScRange &rArea, bool bCut=false)
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
ScSheetLimits & GetSheetLimits() const
void SelectOneTable(SCTAB nTab)
const OUString & GetName() const
OUString GetFile(size_t nIndex) const
SfxItemSet * GetItemSet() const
bool GetString(SotClipboardFormatId nFormat, OUString &rStr) const
const ScExtTabSettings * GetTabSettings(SCTAB nTab) const
bool StartExecuteAsync(const std::function< void(sal_Int32)> &rEndDialogFn)
bool GetGraphic(SotClipboardFormatId nFormat, Graphic &rGraphic) const
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)
virtual bool IsDateConversionSet() const =0
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
bool GetSotStorageStream(SotClipboardFormatId nFormat, tools::SvRef< SotTempStream > &rStreamRef) const
virtual VclPtr< AbstractScImportAsciiDlg > CreateScImportAsciiDlg(weld::Window *pParent, const OUString &aDatName, SvStream *pInStream, ScImportAsciiCall eCall)=0
constexpr SdrLayerID SC_LAYER_FRONT(0)
bool GetGDIMetaFile(SotClipboardFormatId nFormat, GDIMetaFile &rMtf, size_t nMaxActions=0) const
static SC_DLLPUBLIC ScAbstractDialogFactory * Create()
ScExtDocOptions * GetExtDocOptions()
css::uno::Reference< css::io::XInputStream > GetInputStream(SotClipboardFormatId nFormat, const OUString &rDestDoc) const
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)
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