editeng/qa/unit/core-test.cxx | 33 +++++++++++++++++++++++++++++++++ editeng/source/editeng/editeng.cxx | 4 ++-- editeng/source/editeng/impedit.hxx | 2 +- editeng/source/editeng/impedit2.cxx | 4 ++-- editeng/source/editeng/impedit3.cxx | 4 ++-- include/editeng/editeng.hxx | 2 +- 6 files changed, 41 insertions(+), 8 deletions(-)
New commits: commit edca2b8eecf14d6e9b10acb501985d68f6b992d4 Author: Tamás Zolnai <tamas.zol...@collabora.com> Date: Tue Feb 20 00:30:27 2018 +0100 tdf#115639: Handle alignment correctly for multiple paragraph case I used the wrong calculator method to get the line width. This commit also fixes the crashes found by crashtest. Reviewed-on: https://gerrit.libreoffice.org/49994 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Tamás Zolnai <tamas.zol...@collabora.com> (cherry picked from commit f0485ba2d90aae0312f5775588f22789016165d2) Change-Id: I25392f86af912ee54c07b14480d82282210ac346 Reviewed-on: https://gerrit.libreoffice.org/50018 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx index b6da4d4a1a8d..892293f43117 100644 --- a/editeng/qa/unit/core-test.cxx +++ b/editeng/qa/unit/core-test.cxx @@ -740,6 +740,39 @@ void Test::testHoriAlignIgnoreTrailingWhitespace() EditLine* pLine = &pParaPortion->GetLines()[0]; CPPUNIT_ASSERT_DOUBLES_EQUAL(static_cast<long>(8815), pLine->GetStartPosX(), 10); } + + // Test multiple paragraph case + { + // Set initial text + aText = "Some text \nMore Text "; + aTextLen = aText.getLength(); + aEditEngine.SetText(aText); + + // Assert changes - text insertion + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uLong>(aTextLen - 1), rDoc.GetTextLen()); + CPPUNIT_ASSERT_EQUAL(OUString("Some text "), rDoc.GetParaAsString(static_cast<sal_Int32>(0))); + CPPUNIT_ASSERT_EQUAL(OUString("More Text "), rDoc.GetParaAsString(static_cast<sal_Int32>(1))); + + aEditEngine.SetHoriAlignIgnoreTrailingWhitespace(true); + std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(aEditEngine.GetEmptyItemSet())); + pSet->Put(SvxAdjustItem( SVX_ADJUST_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); + + // Get one line paragraphs + aEditEngine.SetPaperSize(Size(10000, 6000)); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aEditEngine.GetLineCount(0)); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aEditEngine.GetLineCount(1)); + + // Check horizontal position + ParaPortion* pParaPortion = aEditEngine.GetParaPortions()[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(static_cast<long>(4527), pParaPortion->GetLines()[0].GetStartPosX(), 50); + pParaPortion = aEditEngine.GetParaPortions()[1]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(static_cast<long>(8815), pParaPortion->GetLines()[0].GetStartPosX(), 50); + } } CPPUNIT_TEST_SUITE_REGISTRATION(Test); diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index dca25cc94873..330b57822f7c 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -1434,13 +1434,13 @@ sal_uInt32 EditEngine::GetTextHeightNTP() const return pImpEditEngine->GetTextHeightNTP(); } -sal_uInt32 EditEngine::CalcTextWidth(bool bIgnoreTrailingWhiteSpaces) +sal_uInt32 EditEngine::CalcTextWidth() { if ( !pImpEditEngine->IsFormatted() ) pImpEditEngine->FormatDoc(); - sal_uInt32 nWidth = !IsVertical() ? pImpEditEngine->CalcTextWidth( true, bIgnoreTrailingWhiteSpaces ) : pImpEditEngine->GetTextHeight(); + sal_uInt32 nWidth = !IsVertical() ? pImpEditEngine->CalcTextWidth( true ) : pImpEditEngine->GetTextHeight(); return nWidth; } diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index c1bdddbece80..70704890b752 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -824,7 +824,7 @@ public: sal_uInt32 CalcTextHeight( sal_uInt32* pHeightNTP ); sal_uInt32 GetTextHeight() const; sal_uInt32 GetTextHeightNTP() const; - sal_uInt32 CalcTextWidth( bool bIgnoreExtraSpace, bool bIgnoreTrailingWhiteSpaces = false ); + sal_uInt32 CalcTextWidth( bool bIgnoreExtraSpace ); 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; diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index a6e3542547bd..76009022f7f4 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -3042,7 +3042,7 @@ sal_uInt32 ImpEditEngine::GetTextHeight() const return nCurTextHeight; } -sal_uInt32 ImpEditEngine::CalcTextWidth( bool bIgnoreExtraSpace, bool bIgnoreTrailingWhiteSpaces ) +sal_uInt32 ImpEditEngine::CalcTextWidth( bool bIgnoreExtraSpace ) { // If still not formatted and not in the process. // Will be brought in the formatting for AutoPageSize. @@ -3089,7 +3089,7 @@ sal_uInt32 ImpEditEngine::CalcTextWidth( bool bIgnoreExtraSpace, bool bIgnoreTra } } nCurWidth += GetXValue( rLRItem.GetRight() ); - nCurWidth += CalcLineWidth( pPortion, &rLine, bIgnoreExtraSpace, bIgnoreTrailingWhiteSpaces ); + nCurWidth += CalcLineWidth( pPortion, &rLine, bIgnoreExtraSpace ); if ( nCurWidth > nMaxWidth ) { nMaxWidth = nCurWidth; diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index 7f53110bccd6..e021aac81082 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -1471,7 +1471,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) { long n; if(IsHoriAlignIgnoreTrailingWhitespace()) - n = ( nMaxLineWidth - CalcTextWidth( true, true ) ) / 2; + n = ( nMaxLineWidth - CalcLineWidth( pParaPortion, pLine, false, true ) ) / 2; else n = ( nMaxLineWidth - aTextSize.Width() ) / 2; n += nStartX; // Indentation is kept. @@ -1484,7 +1484,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) // the blank must not be displayed! long n; if(IsHoriAlignIgnoreTrailingWhitespace()) - n = nMaxLineWidth - CalcTextWidth( true, true ); + n = nMaxLineWidth - CalcLineWidth( pParaPortion, pLine, false, true ); else n = nMaxLineWidth - aTextSize.Width(); n += nStartX; // Indentation is kept. diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx index 8846d0f73c10..22b47393c75b 100644 --- a/include/editeng/editeng.hxx +++ b/include/editeng/editeng.hxx @@ -278,7 +278,7 @@ public: sal_uInt32 GetTextLen() const; sal_uInt32 GetTextHeight() const; sal_uInt32 GetTextHeightNTP() const; - sal_uInt32 CalcTextWidth( bool bIgnoreTrailingWhiteSpaces = false ); + sal_uInt32 CalcTextWidth(); OUString GetText( sal_Int32 nParagraph ) const; sal_Int32 GetTextLen( sal_Int32 nParagraph ) const; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits