diff options
-rw-r--r-- | sw/CppunitTest_sw_core_text.mk | 2 | ||||
-rw-r--r-- | sw/qa/core/text/text.cxx | 44 | ||||
-rw-r--r-- | sw/source/core/inc/rootfrm.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/text/frmform.cxx | 18 |
4 files changed, 65 insertions, 1 deletions
diff --git a/sw/CppunitTest_sw_core_text.mk b/sw/CppunitTest_sw_core_text.mk index b0c4d03fac38..aeb8d30f939d 100644 --- a/sw/CppunitTest_sw_core_text.mk +++ b/sw/CppunitTest_sw_core_text.mk @@ -21,9 +21,11 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_core_text, \ comphelper \ cppu \ cppuhelper \ + editeng \ sal \ sfx \ sw \ + svl \ swqahelper \ test \ unotest \ diff --git a/sw/qa/core/text/text.cxx b/sw/qa/core/text/text.cxx index 7d0495cbb69c..f9cd7c6bda93 100644 --- a/sw/qa/core/text/text.cxx +++ b/sw/qa/core/text/text.cxx @@ -14,6 +14,9 @@ #include <docsh.hxx> #include <unotxdoc.hxx> #include <wrtsh.hxx> +#include <fmtfsize.hxx> +#include <IDocumentRedlineAccess.hxx> +#include <rootfrm.hxx> char const DATA_DIRECTORY[] = "/sw/qa/core/text/data/"; @@ -83,6 +86,47 @@ CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testTabOverMarginSection) CPPUNIT_ASSERT_LESS(static_cast<sal_Int32>(5000), nWidth); } +CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testRedlineDelete) +{ + // Given a document with A4 paper size, some text, redlining on, but hidden: + SwDoc* pDoc = createSwDoc(); + SwDocShell* pDocShell = pDoc->GetDocShell(); + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + { + // Set page size to A4. + size_t nCurIdx = pWrtShell->GetCurPageDesc(); + SwPageDesc aPageDesc(pWrtShell->GetPageDesc(nCurIdx)); + SwFrameFormat& rMaster = aPageDesc.GetMaster(); + SwFormatFrameSize aSize(SwFrameSize::Fixed); + aSize.SetSize(Size(11906, 16838)); + rMaster.SetFormatAttr(aSize); + pWrtShell->ChgPageDesc(nCurIdx, aPageDesc); + } + OUString aBefore("aaaaaaaaa aaaaaaaaaa aa aa aa "); + OUString aDelete("delete eeeeeeeeeee ee eeeeeeeeeee ee eeeeee"); + pWrtShell->Insert(aBefore + " " + aDelete + + " zz zzz zzzzzzzzz zzz zzzz zzzz zzzzzzzzz zzzzzz zzz zzzzzzzzzzz zzz"); + // Enable redlining. + pDocShell->SetChangeRecording(/*bActivate=*/true); + // Hide redlining. + pWrtShell->StartAllAction(); + pWrtShell->GetLayout()->SetHideRedlines(true); + pWrtShell->EndAllAction(); + + // When deleting content in the middle of the paragraph: + pWrtShell->SttEndDoc(/*bStt=*/true); + pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/false, /*nCount=*/aBefore.getLength(), + /*bBasicCall=*/false); + pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, /*nCount=*/aDelete.getLength(), + /*bBasicCall=*/false); + // Without the accompanying fix in place, this test would have crashed: + pWrtShell->Delete(); + + // Then make sure that the redline is created: + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), + pDoc->getIDocumentRedlineAccess().GetRedlineTable().size()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/inc/rootfrm.hxx b/sw/source/core/inc/rootfrm.hxx index fbc95b8a8691..7039e0d2eece 100644 --- a/sw/source/core/inc/rootfrm.hxx +++ b/sw/source/core/inc/rootfrm.hxx @@ -79,7 +79,7 @@ using SwDestroyList = o3tl::sorted_vector<SwSectionFrame*>; /// The root element of a Writer document layout. Lower frames are expected to /// be SwPageFrame instances. -class SAL_DLLPUBLIC_RTTI SwRootFrame: public SwLayoutFrame +class SW_DLLPUBLIC SwRootFrame: public SwLayoutFrame { // Needs to disable the Superfluous temporarily friend void AdjustSizeChgNotify( SwRootFrame *pRoot ); diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx index ac9c2f95da05..59c0f57906c5 100644 --- a/sw/source/core/text/frmform.cxx +++ b/sw/source/core/text/frmform.cxx @@ -1603,9 +1603,27 @@ void SwTextFrame::Format_( SwTextFormatter &rLine, SwTextFormatInfo &rInf, // If we're finished formatting the text and we still // have other line objects left, these are superfluous // now because the text has gotten shorter. + bool bTruncLines = false; if( rLine.GetStart() + rLine.GetLength() >= nStrLen && rLine.GetCurr()->GetNext() ) { + bTruncLines = true; + } + else if (GetMergedPara() && rLine.GetCurr()->GetNext()) + { + // We can also have superfluous lines with redlining in case the current line is shorter + // than the text length, but the total length of lines is still more than expected. + // Truncate in this case as well. + TextFrameIndex nLen(0); + for (const SwLineLayout* pLine = pPara; pLine; pLine = pLine->GetNext()) + { + nLen += pLine->GetLen(); + } + bTruncLines = nLen > nStrLen; + } + + if (bTruncLines) + { rLine.TruncLines(); rLine.SetTruncLines( true ); } |