diff options
Diffstat (limited to 'editeng/source')
-rw-r--r-- | editeng/source/editeng/impedit.hxx | 2 | ||||
-rw-r--r-- | editeng/source/editeng/impedit2.cxx | 2 | ||||
-rw-r--r-- | editeng/source/editeng/impedit4.cxx | 54 |
3 files changed, 54 insertions, 4 deletions
diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index 988c446aca57..6c6ddf43f135 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -727,7 +727,7 @@ private: EditPaM ReadXML( SvStream& rInput, EditSelection aSel ); EditPaM ReadHTML( SvStream& rInput, const OUString& rBaseURL, EditSelection aSel, SvKeyValueIterator* pHTTPHeaderAttrs ); ErrCode WriteText( SvStream& rOutput, EditSelection aSel ); - ErrCode WriteRTF( SvStream& rOutput, EditSelection aSel ); + ErrCode WriteRTF( SvStream& rOutput, EditSelection aSel, bool bClipboard ); void WriteXML(SvStream& rOutput, const EditSelection& rSel); void WriteItemAsRTF( const SfxPoolItem& rItem, SvStream& rOutput, sal_Int32 nPara, sal_Int32 nPos, diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index 048226658d4e..50b8a34b0663 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -3839,7 +3839,7 @@ uno::Reference< datatransfer::XTransferable > ImpEditEngine::CreateTransferable( pDataObj->GetString() = convertLineEnd(GetSelected(aSelection), GetSystemLineEnd()); // System specific - WriteRTF( pDataObj->GetRTFStream(), aSelection ); + WriteRTF( pDataObj->GetRTFStream(), aSelection, /*bClipboard=*/true ); pDataObj->GetRTFStream().Seek( 0 ); WriteXML( pDataObj->GetODFStream(), aSelection ); diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx index 637aebe81f45..d3dc29892d6a 100644 --- a/editeng/source/editeng/impedit4.cxx +++ b/editeng/source/editeng/impedit4.cxx @@ -77,6 +77,7 @@ #include <memory> #include <unordered_map> #include <vector> +#include <set> using namespace ::com::sun::star; using namespace ::com::sun::star::uno; @@ -186,7 +187,7 @@ void ImpEditEngine::Write(SvStream& rOutput, EETextFormat eFormat, const EditSel if ( eFormat == EETextFormat::Text ) WriteText( rOutput, rSel ); else if ( eFormat == EETextFormat::Rtf ) - WriteRTF( rOutput, rSel ); + WriteRTF( rOutput, rSel, /*bClipboard=*/false ); else if ( eFormat == EETextFormat::Xml ) WriteXML( rOutput, rSel ); else if ( eFormat == EETextFormat::Html ) @@ -271,7 +272,7 @@ void ImpEditEngine::WriteXML(SvStream& rOutput, const EditSelection& rSel) SvxWriteXML( *GetEditEnginePtr(), rOutput, aESel ); } -ErrCode ImpEditEngine::WriteRTF( SvStream& rOutput, EditSelection aSel ) +ErrCode ImpEditEngine::WriteRTF( SvStream& rOutput, EditSelection aSel, bool bClipboard ) { assert( IsUpdateLayout() && "WriteRTF for UpdateMode = sal_False!" ); CheckIdleFormatter(); @@ -432,6 +433,50 @@ ErrCode ImpEditEngine::WriteRTF( SvStream& rOutput, EditSelection aSel ) nId++; } + // Collect used paragraph styles when copying to the clipboard. + std::set<SfxStyleSheetBase*> aUsedParagraphStyles; + if (bClipboard) + { + for (sal_Int32 nNode = nStartNode; nNode <= nEndNode; nNode++) + { + ContentNode* pNode = maEditDoc.GetObject(nNode); + if (!pNode) + { + continue; + } + + SfxStyleSheet* pParaStyle = pNode->GetStyleSheet(); + if (!pParaStyle) + { + continue; + } + + aUsedParagraphStyles.insert(pParaStyle); + + const OUString& rParent = pParaStyle->GetParent(); + if (!rParent.isEmpty()) + { + auto pParent = static_cast<SfxStyleSheet*>( + GetStyleSheetPool()->Find(rParent, pParaStyle->GetFamily())); + if (pParent) + { + aUsedParagraphStyles.insert(pParent); + } + } + + const OUString& rFollow = pParaStyle->GetFollow(); + if (!rFollow.isEmpty()) + { + auto pFollow = static_cast<SfxStyleSheet*>( + GetStyleSheetPool()->Find(rFollow, pParaStyle->GetFamily())); + if (pFollow) + { + aUsedParagraphStyles.insert(pFollow); + } + } + } + } + if ( aSSSIterator->Count() ) { @@ -441,6 +486,11 @@ ErrCode ImpEditEngine::WriteRTF( SvStream& rOutput, EditSelection aSel ) for ( SfxStyleSheetBase* pStyle = aSSSIterator->First(); pStyle; pStyle = aSSSIterator->Next() ) { + if (bClipboard && !aUsedParagraphStyles.contains(pStyle)) + { + // Don't write unused paragraph styles in the clipboard case. + continue; + } rOutput << endl; rOutput.WriteChar( '{' ).WriteOString( OOO_STRING_SVTOOLS_RTF_S ); |