diff options
author | Tamás Zolnai <tamas.zolnai@collabora.com> | 2018-02-17 06:35:29 +0100 |
---|---|---|
committer | Tamás Zolnai <tamas.zolnai@collabora.com> | 2018-02-17 07:50:00 +0100 |
commit | 1da3a3cb74a415a76fa547ef0c8f61780e260e7f (patch) | |
tree | 0367d452050d136d6612ba708038fb9d4584987b | |
parent | 71545d500e4b88e960a73d499328504ce99397a8 (diff) |
tdf#115639: Align right/center with trailing spaces the same as MS PowerPoint
* Add HoriAlignIgnoreTrailingWhitespace compatibility option.
** For MSO file formats it is set to true
** For ODP format it's set to false by default
** The flag is saved to ODP format as user data if the document
comes from an MSO format.
Change-Id: Ie22233d33a25e605de46120bfc2195038dffd63c
Reviewed-on: https://gerrit.libreoffice.org/49889
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
-rw-r--r-- | editeng/qa/unit/core-test.cxx | 111 | ||||
-rw-r--r-- | editeng/source/editeng/editeng.cxx | 14 | ||||
-rw-r--r-- | editeng/source/editeng/impedit.hxx | 9 | ||||
-rw-r--r-- | editeng/source/editeng/impedit2.cxx | 14 | ||||
-rw-r--r-- | editeng/source/editeng/impedit3.cxx | 12 | ||||
-rw-r--r-- | editeng/source/outliner/outliner.cxx | 10 | ||||
-rw-r--r-- | include/editeng/editeng.hxx | 6 | ||||
-rw-r--r-- | include/editeng/outliner.hxx | 4 | ||||
-rw-r--r-- | include/svx/svdmodel.hxx | 4 | ||||
-rwxr-xr-x | sd/qa/unit/data/odp/tdf115639.odp | bin | 0 -> 11770 bytes | |||
-rwxr-xr-x | sd/qa/unit/data/ppt/tdf115639.ppt | bin | 0 -> 124928 bytes | |||
-rwxr-xr-x | sd/qa/unit/data/pptx/tdf115639.pptx | bin | 0 -> 20893 bytes | |||
-rw-r--r-- | sd/qa/unit/import-tests.cxx | 33 | ||||
-rw-r--r-- | sd/source/ui/docshell/docshel4.cxx | 16 | ||||
-rw-r--r-- | sd/source/ui/view/Outliner.cxx | 1 | ||||
-rw-r--r-- | svx/source/svdraw/svdetc.cxx | 1 | ||||
-rw-r--r-- | svx/source/svdraw/svdmodel.cxx | 22 |
17 files changed, 245 insertions, 12 deletions
diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx index 2e122cc59c1d..195fae1bcb4a 100644 --- a/editeng/qa/unit/core-test.cxx +++ b/editeng/qa/unit/core-test.cxx @@ -33,6 +33,7 @@ #include <svl/srchitem.hxx> #include <editeng/fontitem.hxx> #include <editeng/fhgtitem.hxx> +#include <editeng/adjustitem.hxx> #include <com/sun/star/text/textfield/Type.hpp> @@ -97,6 +98,9 @@ public: void testTransliterate(); + /// Test HoriAlignIgnoreTrailingWhitespace compatibility flag + void testHoriAlignIgnoreTrailingWhitespace(); + DECL_STATIC_LINK( Test, CalcFieldValueHdl, EditFieldInfo*, void ); CPPUNIT_TEST_SUITE(Test); @@ -117,6 +121,7 @@ public: CPPUNIT_TEST(testSectionAttributes); CPPUNIT_TEST(testLargeParaCopyPaste); CPPUNIT_TEST(testTransliterate); + CPPUNIT_TEST(testHoriAlignIgnoreTrailingWhitespace); CPPUNIT_TEST_SUITE_END(); private: @@ -1848,6 +1853,112 @@ void Test::testTransliterate() CPPUNIT_ASSERT_EQUAL(aExpected, aEditEngine.GetText()); } +void Test::testHoriAlignIgnoreTrailingWhitespace() +{ + // Create EditEngine's instance + EditEngine aEditEngine(mpItemPool); + + // Get EditDoc for current EditEngine's instance + EditDoc &rDoc = aEditEngine.GetEditDoc(); + + // Initially no text should be there + CPPUNIT_ASSERT_EQUAL(sal_uLong(0), rDoc.GetTextLen()); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetParaAsString(sal_Int32(0))); + + // Set initial text + OUString aText = "Some text "; + sal_Int32 aTextLen = aText.getLength(); + aEditEngine.SetText(aText); + + // Assert changes - text insertion + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uLong>(aTextLen), rDoc.GetTextLen()); + CPPUNIT_ASSERT_EQUAL(aText, rDoc.GetParaAsString(static_cast<sal_Int32>(0))); + + // First test case: center alignment with compatibility option enabled + { + aEditEngine.SetHoriAlignIgnoreTrailingWhitespace(true); + std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(aEditEngine.GetEmptyItemSet())); + pSet->Put(SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST )); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), pSet->Count()); + + // Select all paragraphs and apply changes + ESelection aSelection(0, 0, 0, aTextLen); + aEditEngine.QuickSetAttribs(*pSet, aSelection); + + // Use a one line paragraph + aEditEngine.SetPaperSize(Size(10000, 6000)); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aEditEngine.GetLineCount(0)); + + // Check horizontal position + ParaPortion* pParaPortion = aEditEngine.GetParaPortions()[0]; + EditLine* pLine = &pParaPortion->GetLines()[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(static_cast<long>(4527), pLine->GetStartPosX(), 10); + } + + // Second test case: center alignment with compatibility option disabled + { + aEditEngine.SetHoriAlignIgnoreTrailingWhitespace(false); + std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(aEditEngine.GetEmptyItemSet())); + pSet->Put(SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST )); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), pSet->Count()); + + // Select all paragraphs and apply changes + ESelection aSelection(0, 0, 0, aTextLen); + aEditEngine.QuickSetAttribs(*pSet, aSelection); + + // Use a one line paragraph + aEditEngine.SetPaperSize(Size(10000, 6000)); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aEditEngine.GetLineCount(0)); + + // Check horizontal position + ParaPortion* pParaPortion = aEditEngine.GetParaPortions()[0]; + EditLine* pLine = &pParaPortion->GetLines()[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(static_cast<long>(4407), pLine->GetStartPosX(), 10); + } + + // Third test case: right alignment with compatibility option enabled + { + aEditEngine.SetHoriAlignIgnoreTrailingWhitespace(true); + std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(aEditEngine.GetEmptyItemSet())); + pSet->Put(SvxAdjustItem( SvxAdjust::Right, EE_PARA_JUST )); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), pSet->Count()); + + // Select all paragraphs and apply changes + ESelection aSelection(0, 0, 0, aTextLen); + aEditEngine.QuickSetAttribs(*pSet, aSelection); + + // Use a one line paragraph + aEditEngine.SetPaperSize(Size(10000, 6000)); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aEditEngine.GetLineCount(0)); + + // Check horizontal position + ParaPortion* pParaPortion = aEditEngine.GetParaPortions()[0]; + EditLine* pLine = &pParaPortion->GetLines()[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(static_cast<long>(9054), pLine->GetStartPosX(), 10); + } + + // Fourth test case: right alignment with compatibility option disabled + { + aEditEngine.SetHoriAlignIgnoreTrailingWhitespace(false); + std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(aEditEngine.GetEmptyItemSet())); + pSet->Put(SvxAdjustItem( SvxAdjust::Right, EE_PARA_JUST )); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), pSet->Count()); + + // Select all paragraphs and apply changes + ESelection aSelection(0, 0, 0, aTextLen); + aEditEngine.QuickSetAttribs(*pSet, aSelection); + + // Use a one line paragraph + aEditEngine.SetPaperSize(Size(10000, 6000)); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aEditEngine.GetLineCount(0)); + + // Check horizontal position + ParaPortion* pParaPortion = aEditEngine.GetParaPortions()[0]; + EditLine* pLine = &pParaPortion->GetLines()[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(static_cast<long>(8815), pLine->GetStartPosX(), 10); + } +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); } diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index dcadbdc03db9..1b9494655818 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -1433,13 +1433,13 @@ sal_uInt32 EditEngine::GetTextHeightNTP() const return pImpEditEngine->GetTextHeightNTP(); } -sal_uInt32 EditEngine::CalcTextWidth() +sal_uInt32 EditEngine::CalcTextWidth(bool bIgnoreTrailingWhiteSpaces) { if ( !pImpEditEngine->IsFormatted() ) pImpEditEngine->FormatDoc(); - sal_uInt32 nWidth = !IsVertical() ? pImpEditEngine->CalcTextWidth( true ) : pImpEditEngine->GetTextHeight(); + sal_uInt32 nWidth = !IsVertical() ? pImpEditEngine->CalcTextWidth( true, bIgnoreTrailingWhiteSpaces ) : pImpEditEngine->GetTextHeight(); return nWidth; } @@ -2805,6 +2805,16 @@ bool EditEngine::IsPageOverflow() { return pImpEditEngine->IsPageOverflow(); } +void EditEngine::SetHoriAlignIgnoreTrailingWhitespace(bool bEnabled) +{ + pImpEditEngine->SetHoriAlignIgnoreTrailingWhitespace(bEnabled); +} + +bool EditEngine::IsHoriAlignIgnoreTrailingWhitespace() const +{ + return pImpEditEngine->IsHoriAlignIgnoreTrailingWhitespace(); +} + EFieldInfo::EFieldInfo() { } diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index dc5ac2ff01b9..fb8a2a542aec 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -536,6 +536,7 @@ private: bool bFirstWordCapitalization:1; // specifies if auto-correction should capitalize the first word or not bool mbLastTryMerge:1; bool mbReplaceLeadingSingleQuotationMark:1; + bool mbHoriAlignIgnoreTrailingWhitespace:1; bool mbNbspRunNext; // can't be a bitfield as it is passed as bool& @@ -832,8 +833,8 @@ public: sal_uInt32 CalcTextHeight( sal_uInt32* pHeightNTP ); sal_uInt32 GetTextHeight() const; sal_uInt32 GetTextHeightNTP() const; - sal_uInt32 CalcTextWidth( bool bIgnoreExtraSpace ); - sal_uInt32 CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, bool bIgnoreExtraSpace ); + sal_uInt32 CalcTextWidth( bool bIgnoreExtraSpace, bool bIgnoreTrailingWhiteSpaces = false ); + sal_uInt32 CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, bool bIgnoreExtraSpace, bool bIgnoreTrailingWhiteSpaces = false ); sal_Int32 GetLineCount( sal_Int32 nParagraph ) const; sal_Int32 GetLineLen( sal_Int32 nParagraph, sal_Int32 nLine ) const; void GetLineBoundaries( /*out*/sal_Int32& rStart, /*out*/sal_Int32& rEnd, sal_Int32 nParagraph, sal_Int32 nLine ) const; @@ -1064,6 +1065,10 @@ public: bool IsNbspRunNext() const { return mbNbspRunNext; } void Dispose(); + + // tdf#115639 compatibility flag + void SetHoriAlignIgnoreTrailingWhitespace(bool bEnabled) { mbHoriAlignIgnoreTrailingWhitespace = bEnabled; } + bool IsHoriAlignIgnoreTrailingWhitespace() const { return mbHoriAlignIgnoreTrailingWhitespace; } }; inline EPaM ImpEditEngine::CreateEPaM( const EditPaM& rPaM ) diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index f89c27e21f92..651ac12d1de5 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -109,6 +109,7 @@ ImpEditEngine::ImpEditEngine( EditEngine* pEE, SfxItemPool* pItemPool ) : bFirstWordCapitalization(true), mbLastTryMerge(false), mbReplaceLeadingSingleQuotationMark(true), + mbHoriAlignIgnoreTrailingWhitespace(false), mbNbspRunNext(false) { pEditEngine = pEE; @@ -3089,7 +3090,7 @@ sal_uInt32 ImpEditEngine::GetTextHeight() const return nCurTextHeight; } -sal_uInt32 ImpEditEngine::CalcTextWidth( bool bIgnoreExtraSpace ) +sal_uInt32 ImpEditEngine::CalcTextWidth( bool bIgnoreExtraSpace, bool bIgnoreTrailingWhiteSpaces ) { // If still not formatted and not in the process. // Will be brought in the formatting for AutoPageSize. @@ -3136,7 +3137,7 @@ sal_uInt32 ImpEditEngine::CalcTextWidth( bool bIgnoreExtraSpace ) } } nCurWidth += GetXValue( rLRItem.GetRight() ); - nCurWidth += CalcLineWidth( pPortion, &rLine, bIgnoreExtraSpace ); + nCurWidth += CalcLineWidth( pPortion, &rLine, bIgnoreExtraSpace, bIgnoreTrailingWhiteSpaces ); if ( nCurWidth > nMaxWidth ) { nMaxWidth = nCurWidth; @@ -3149,7 +3150,7 @@ sal_uInt32 ImpEditEngine::CalcTextWidth( bool bIgnoreExtraSpace ) return static_cast<sal_uInt32>(nMaxWidth); } -sal_uInt32 ImpEditEngine::CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, bool bIgnoreExtraSpace ) +sal_uInt32 ImpEditEngine::CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, bool bIgnoreExtraSpace, bool bIgnoreTrailingWhiteSpaces ) { sal_Int32 nPara = GetEditDoc().GetPos( pPortion->GetNode() ); @@ -3178,7 +3179,7 @@ sal_uInt32 ImpEditEngine::CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, break; case PortionKind::TEXT: { - if ( ( eJustification != SvxAdjust::Block ) || ( !bIgnoreExtraSpace ) ) + if ( (( eJustification != SvxAdjust::Block ) || ( !bIgnoreExtraSpace )) && !bIgnoreTrailingWhiteSpaces ) { nWidth += rTextPortion.GetSize().Width(); } @@ -3188,7 +3189,10 @@ sal_uInt32 ImpEditEngine::CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, SeekCursor( pPortion->GetNode(), nPos+1, aTmpFont ); aTmpFont.SetPhysFont( GetRefDevice() ); ImplInitDigitMode(GetRefDevice(), aTmpFont.GetLanguage()); - nWidth += aTmpFont.QuickGetTextSize( GetRefDevice(), pPortion->GetNode()->GetString(), nPos, rTextPortion.GetLen() ).Width(); + if (bIgnoreTrailingWhiteSpaces) + nWidth += aTmpFont.QuickGetTextSize( GetRefDevice(), pPortion->GetNode()->GetString().trim(), nPos, rTextPortion.GetLen() ).Width(); + else + nWidth += aTmpFont.QuickGetTextSize( GetRefDevice(), pPortion->GetNode()->GetString(), nPos, rTextPortion.GetLen() ).Width(); } } break; diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index 46065dc88fa9..0265c819facd 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -1513,7 +1513,11 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) { case SvxAdjust::Center: { - long n = ( nMaxLineWidth - aTextSize.Width() ) / 2; + long n; + if(IsHoriAlignIgnoreTrailingWhitespace()) + n = ( nMaxLineWidth - CalcTextWidth( true, true ) ) / 2; + else + n = ( nMaxLineWidth - aTextSize.Width() ) / 2; n += nStartX; // Indentation is kept. pLine->SetStartPosX( n ); } @@ -1522,7 +1526,11 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) { // For automatically wrapped lines, which has a blank at the end // the blank must not be displayed! - long n = nMaxLineWidth - aTextSize.Width(); + long n; + if(IsHoriAlignIgnoreTrailingWhitespace()) + n = nMaxLineWidth - CalcTextWidth( true, true ); + else + n = nMaxLineWidth - aTextSize.Width(); n += nStartX; // Indentation is kept. pLine->SetStartPosX( n ); } diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx index 869ecb72a2e2..f89b715cc428 100644 --- a/editeng/source/outliner/outliner.cxx +++ b/editeng/source/outliner/outliner.cxx @@ -366,6 +366,16 @@ sal_Int32 Outliner::GetBulletsNumberingStatus() const : 2; } +void Outliner::SetHoriAlignIgnoreTrailingWhitespace(bool bEnabled) +{ + pEditEngine->SetHoriAlignIgnoreTrailingWhitespace( bEnabled ); +} + +bool Outliner::IsHoriAlignIgnoreTrailingWhitespace() const +{ + return pEditEngine->IsHoriAlignIgnoreTrailingWhitespace(); +} + OutlinerParaObject* Outliner::CreateParaObject( sal_Int32 nStartPara, sal_Int32 nCount ) const { if ( static_cast<sal_uLong>(nStartPara) + nCount > diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx index fc3a6713707a..a8e7b83e8b43 100644 --- a/include/editeng/editeng.hxx +++ b/include/editeng/editeng.hxx @@ -273,7 +273,7 @@ public: sal_uInt32 GetTextLen() const; sal_uInt32 GetTextHeight() const; sal_uInt32 GetTextHeightNTP() const; - sal_uInt32 CalcTextWidth(); + sal_uInt32 CalcTextWidth( bool bIgnoreTrailingWhiteSpaces = false ); OUString GetText( sal_Int32 nParagraph ) const; sal_Int32 GetTextLen( sal_Int32 nParagraph ) const; @@ -620,6 +620,10 @@ public: sal_Int32 GetOverflowingLineNum() const; void ClearOverflowingParaNum(); bool IsPageOverflow(); + + // tdf#115639 compatibility flag + void SetHoriAlignIgnoreTrailingWhitespace(bool bEnabled); + bool IsHoriAlignIgnoreTrailingWhitespace() const; }; #endif // INCLUDED_EDITENG_EDITENG_HXX diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx index 1b65a7bf215f..df2dfb6fa54c 100644 --- a/include/editeng/outliner.hxx +++ b/include/editeng/outliner.hxx @@ -993,6 +993,10 @@ public: // convenient method to determine the bullets/numbering status for all paragraphs sal_Int32 GetBulletsNumberingStatus() const; + + // tdf#115639 compatibility flag + void SetHoriAlignIgnoreTrailingWhitespace(bool bEnabled); + bool IsHoriAlignIgnoreTrailingWhitespace() const; }; #endif diff --git a/include/svx/svdmodel.hxx b/include/svx/svdmodel.hxx index 91df6466d5be..8cd17f31f6f4 100644 --- a/include/svx/svdmodel.hxx +++ b/include/svx/svdmodel.hxx @@ -538,6 +538,10 @@ public: void SetAnchoredTextOverflowLegacy(bool bEnabled); bool IsAnchoredTextOverflowLegacy() const; + // tdf#115639 compatibility flag + void SetHoriAlignIgnoreTrailingWhitespace(bool bEnabled); + bool IsHoriAlignIgnoreTrailingWhitespace() const; + void ReformatAllTextObjects(); SdrOutliner* createOutliner( OutlinerMode nOutlinerMode ); diff --git a/sd/qa/unit/data/odp/tdf115639.odp b/sd/qa/unit/data/odp/tdf115639.odp Binary files differnew file mode 100755 index 000000000000..b732e4e7652b --- /dev/null +++ b/sd/qa/unit/data/odp/tdf115639.odp diff --git a/sd/qa/unit/data/ppt/tdf115639.ppt b/sd/qa/unit/data/ppt/tdf115639.ppt Binary files differnew file mode 100755 index 000000000000..dade453bfeee --- /dev/null +++ b/sd/qa/unit/data/ppt/tdf115639.ppt diff --git a/sd/qa/unit/data/pptx/tdf115639.pptx b/sd/qa/unit/data/pptx/tdf115639.pptx Binary files differnew file mode 100755 index 000000000000..7e00b60cb397 --- /dev/null +++ b/sd/qa/unit/data/pptx/tdf115639.pptx diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index 02ab05d93b0d..85c62dc146a3 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -179,6 +179,7 @@ public: void testTdf115394(); void testTdf115394PPT(); void testTdf51340(); + void testTdf115639(); bool checkPattern(sd::DrawDocShellRef const & rDocRef, int nShapeNumber, std::vector<sal_uInt8>& rExpected); void testPatternImport(); @@ -259,6 +260,7 @@ public: CPPUNIT_TEST(testTdf115394); CPPUNIT_TEST(testTdf115394PPT); CPPUNIT_TEST(testTdf51340); + CPPUNIT_TEST(testTdf115639); CPPUNIT_TEST_SUITE_END(); }; @@ -2483,6 +2485,37 @@ void SdImportTest::testTdf51340() xDocShRef->DoClose(); } + +void SdImportTest::testTdf115639() +{ + // Check whether the new compatibility option is loaded correctly + // For PPTX we have the flag enabled by default + { + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/tdf115639.pptx"), PPTX); + SdDrawDocument *pDoc = xDocShRef->GetDoc(); + CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr ); + CPPUNIT_ASSERT( pDoc->IsHoriAlignIgnoreTrailingWhitespace() ); + } + + // For PPT we have the flag enabled by default + { + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/ppt/tdf115639.ppt"), PPT); + SdDrawDocument *pDoc = xDocShRef->GetDoc(); + CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr ); + CPPUNIT_ASSERT( pDoc->IsHoriAlignIgnoreTrailingWhitespace() ); + xDocShRef->DoClose(); + } + + // For ODP we have the flag disabled by default + { + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/odp/tdf115639.odp"), ODP); + SdDrawDocument *pDoc = xDocShRef->GetDoc(); + CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr ); + CPPUNIT_ASSERT( !pDoc->IsHoriAlignIgnoreTrailingWhitespace() ); + xDocShRef->DoClose(); + } +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sd/source/ui/docshell/docshel4.cxx b/sd/source/ui/docshell/docshel4.cxx index 2d462a44ddb1..2685d68d3c41 100644 --- a/sd/source/ui/docshell/docshel4.cxx +++ b/sd/source/ui/docshell/docshel4.cxx @@ -406,6 +406,14 @@ bool DrawDocShell::ImportFrom(SfxMedium &rMedium, mpDoc->SetSummationOfParagraphs(); } + // Set this flag for MSO formats + if (aFilterName.startsWith("MS PowerPoint 97") || + aFilterName.startsWith("Impress MS PowerPoint 2007 XML") || + aFilterName.startsWith("Impress Office Open XML")) + { + mpDoc->SetHoriAlignIgnoreTrailingWhitespace(true); + } + const bool bRet = SfxObjectShell::ImportFrom(rMedium, xInsertPosition); SfxItemSet* pSet = rMedium.GetItemSet(); @@ -495,6 +503,14 @@ bool DrawDocShell::ConvertFrom( SfxMedium& rMedium ) bRet = SdGRFFilter( rMedium, *this ).Import(); } + // Set this flag for MSO formats + if (aFilterName.startsWith("MS PowerPoint 97") || + aFilterName.startsWith("Impress MS PowerPoint 2007 XML") || + aFilterName.startsWith("Impress Office Open XML")) + { + mpDoc->SetHoriAlignIgnoreTrailingWhitespace(true); + } + FinishedLoading(); // tell SFX to change viewshell when in preview mode diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx index 279f0700d974..45ea0dcec4fa 100644 --- a/sd/source/ui/view/Outliner.cxx +++ b/sd/source/ui/view/Outliner.cxx @@ -226,6 +226,7 @@ SdOutliner::SdOutliner( SdDrawDocument* pDoc, OutlinerMode nMode ) SetHyphenator( xHyphenator ); SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() ); + SetHoriAlignIgnoreTrailingWhitespace( pDoc->IsHoriAlignIgnoreTrailingWhitespace() ); } /// Nothing spectacular in the destructor. diff --git a/svx/source/svdraw/svdetc.cxx b/svx/source/svdraw/svdetc.cxx index 3c6924affdc4..5b1b2695dce6 100644 --- a/svx/source/svdraw/svdetc.cxx +++ b/svx/source/svdraw/svdetc.cxx @@ -343,6 +343,7 @@ SdrOutliner* SdrMakeOutliner(OutlinerMode nOutlinerMode, SdrModel& rModel) pOutl->SetAsianCompressionMode(rModel.GetCharCompressType()); pOutl->SetKernAsianPunctuation(rModel.IsKernAsianPunctuation()); pOutl->SetAddExtLeading(rModel.IsAddExtLeading()); + pOutl->SetHoriAlignIgnoreTrailingWhitespace(rModel.IsHoriAlignIgnoreTrailingWhitespace()); return pOutl; } diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 03330c13720c..2fab5db4323f 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -108,6 +108,7 @@ struct SdrModelImpl SdrUndoFactory* mpUndoFactory; bool mbAnchoredTextOverflowLegacy; // tdf#99729 compatibility flag + bool mbHoriAlignIgnoreTrailingWhitespace; // tdf#115639 compatibility flag }; @@ -118,6 +119,7 @@ void SdrModel::ImpCtor(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* _pEmbe mpImpl->mpUndoManager=nullptr; mpImpl->mpUndoFactory=nullptr; mpImpl->mbAnchoredTextOverflowLegacy = false; + mpImpl->mbHoriAlignIgnoreTrailingWhitespace = false; mbInDestruction = false; aObjUnit=SdrEngineDefaults::GetMapFraction(); eObjUnit=SdrEngineDefaults::GetMapUnit(); @@ -1833,6 +1835,17 @@ bool SdrModel::IsAnchoredTextOverflowLegacy() const return mpImpl->mbAnchoredTextOverflowLegacy; } +void SdrModel::SetHoriAlignIgnoreTrailingWhitespace(bool bEnabled) +{ + mpImpl->mbHoriAlignIgnoreTrailingWhitespace = bEnabled; + pDrawOutliner->SetHoriAlignIgnoreTrailingWhitespace(bEnabled); +} + +bool SdrModel::IsHoriAlignIgnoreTrailingWhitespace() const +{ + return mpImpl->mbHoriAlignIgnoreTrailingWhitespace; +} + void SdrModel::ReformatAllTextObjects() { ImpReformatAllTextObjects(); @@ -1882,6 +1895,13 @@ void SdrModel::ReadUserDataSequenceValue(const css::beans::PropertyValue* pValue mpImpl->mbAnchoredTextOverflowLegacy = bBool; } } + if (pValue->Name == "HoriAlignIgnoreTrailingWhitespace") + { + if (pValue->Value >>= bBool) + { + SetHoriAlignIgnoreTrailingWhitespace(bBool); + } + } } template <typename T> @@ -1894,6 +1914,8 @@ void SdrModel::WriteUserDataSequence(css::uno::Sequence < css::beans::PropertyVa { std::vector< std::pair< OUString, Any > > aUserData; addPair(aUserData, "AnchoredTextOverflowLegacy", IsAnchoredTextOverflowLegacy()); + if (IsHoriAlignIgnoreTrailingWhitespace()) + addPair(aUserData, "HoriAlignIgnoreTrailingWhitespace", IsHoriAlignIgnoreTrailingWhitespace()); const sal_Int32 nOldLength = rValues.getLength(); rValues.realloc(nOldLength + aUserData.size()); |