diff options
author | Muhammet Kara <muhammet.kara@collabora.com> | 2019-07-02 23:25:00 +0300 |
---|---|---|
committer | Muhammet Kara <muhammet.kara@collabora.com> | 2019-07-10 16:48:09 +0200 |
commit | 1fedfa62784a4f61b0cf6cede29634dc863a7b60 (patch) | |
tree | a2c0fb351c07c5ceb050b0e588431d1c604337e9 /cui/source/dialogs/pastedlg.cxx | |
parent | 74d56d44804efa3424cff3434d2baf00c60b3cd5 (diff) |
Prepare PasteSpecial for Async-ness (sw, basesh.cxx)
This change is needed to make the paste special dialog async exec
because the current design relies on return values of inner
functions/methods while moving on. After this patch, the dialog creation
and execution will not be so deep, so that it will be able to be
converted to async exec in the usual way.
The duplication in SvPasteObjectDialog::PreGetFormat() coming from
SvPasteObjectDialog::GetFormat() will go away when the conversion is
complete for all modules. It is only temporarily needed.
Change-Id: I55e8aee39c41be6035c89f217f90f79720f32196
Reviewed-on: https://gerrit.libreoffice.org/75016
Tested-by: Jenkins
Reviewed-by: Muhammet Kara <muhammet.kara@collabora.com>
Diffstat (limited to 'cui/source/dialogs/pastedlg.cxx')
-rw-r--r-- | cui/source/dialogs/pastedlg.cxx | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/cui/source/dialogs/pastedlg.cxx b/cui/source/dialogs/pastedlg.cxx index 9b47043138a6..eb8b37c3ec62 100644 --- a/cui/source/dialogs/pastedlg.cxx +++ b/cui/source/dialogs/pastedlg.cxx @@ -72,6 +72,125 @@ void SvPasteObjectDialog::Insert( SotClipboardFormatId nFormat, const OUString& aSupplementMap.insert( std::make_pair( nFormat, rFormatName ) ); } +void SvPasteObjectDialog::PreGetFormat( const TransferableDataHelper &rHelper ) +{ + //TODO/LATER: why is the Descriptor never used?! + TransferableObjectDescriptor aDesc; + if (rHelper.HasFormat(SotClipboardFormatId::OBJECTDESCRIPTOR)) + { + (void)const_cast<TransferableDataHelper&>(rHelper).GetTransferableObjectDescriptor( + SotClipboardFormatId::OBJECTDESCRIPTOR, aDesc); + } + const DataFlavorExVector* pFormats = &rHelper.GetDataFlavorExVector(); + + // create and fill dialog box + OUString aSourceName, aTypeName; + SvGlobalName aEmptyNm; + + //ObjectLB().SetUpdateMode( false ); + ObjectLB().freeze(); + + DataFlavorExVector::iterator aIter( const_cast<DataFlavorExVector&>(*pFormats).begin() ), + aEnd( const_cast<DataFlavorExVector&>(*pFormats).end() ); + while( aIter != aEnd ) + { + SotClipboardFormatId nFormat = (*aIter++).mnSotId; + + std::map< SotClipboardFormatId, OUString >::iterator itName = + aSupplementMap.find( nFormat ); + + // if there is an "Embed Source" or and "Embedded Object" on the + // Clipboard we read the Description and the Source of this object + // from an accompanied "Object Descriptor" format on the clipboard + // Remember: these formats mostly appear together on the clipboard + OUString aName; + const OUString* pName = nullptr; + if ( itName == aSupplementMap.end() ) + { + SvPasteObjectHelper::GetEmbeddedName(rHelper,aName,aSourceName,nFormat); + if ( !aName.isEmpty() ) + pName = &aName; + } + else + { + pName = &(itName->second); + } + + if( pName ) + { + aName = *pName; + + if( SotClipboardFormatId::EMBED_SOURCE == nFormat ) + { + if( aDesc.maClassName != aEmptyNm ) + { + aSourceName = aDesc.maDisplayName; + + if( aDesc.maClassName == aObjClassName ) + aName = aObjName; + else + aName = aTypeName = aDesc.maTypeName; + } + } + else if( SotClipboardFormatId::LINK_SOURCE == nFormat ) + { + continue; + } + else if( aName.isEmpty() ) + aName = SvPasteObjectHelper::GetSotFormatUIName( nFormat ); + + // Show RICHTEXT only in case RTF is not present. + if (nFormat == SotClipboardFormatId::RICHTEXT && + std::any_of(pFormats->begin(), pFormats->end(), + [](const DataFlavorEx& rFlavor) { + return rFlavor.mnSotId == SotClipboardFormatId::RTF; + })) + { + continue; + } + + if (ObjectLB().find_text(aName) == -1) + { + ObjectLB().append(OUString::number(static_cast<sal_uInt32>(nFormat)), aName); + } + } + } + + if( aTypeName.isEmpty() && aSourceName.isEmpty() ) + { + if( aDesc.maClassName != aEmptyNm ) + { + aSourceName = aDesc.maDisplayName; + aTypeName = aDesc.maTypeName; + } + + if( aTypeName.isEmpty() && aSourceName.isEmpty() ) + { + // global resource from svtools (former so3 resource) + aSourceName = SvtResId(STR_UNKNOWN_SOURCE); + } + } + + ObjectLB().thaw(); + SelectObject(); + + if( !aSourceName.isEmpty() ) + { + if( !aTypeName.isEmpty() ) + aTypeName += "\n"; + + aTypeName += aSourceName; + aTypeName = convertLineEnd(aTypeName, GetSystemLineEnd()); + } + + m_xFtObjectSource->set_label(aTypeName); +} + +SotClipboardFormatId SvPasteObjectDialog::GetFormatOnly() +{ + return static_cast<SotClipboardFormatId>(ObjectLB().get_selected_id().toUInt32()); +} + SotClipboardFormatId SvPasteObjectDialog::GetFormat( const TransferableDataHelper& rHelper) { //TODO/LATER: why is the Descriptor never used?! |