summaryrefslogtreecommitdiff
path: root/editeng/source
diff options
context:
space:
mode:
Diffstat (limited to 'editeng/source')
-rw-r--r--editeng/source/editeng/impedit.hxx2
-rw-r--r--editeng/source/editeng/impedit2.cxx2
-rw-r--r--editeng/source/editeng/impedit4.cxx54
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 );