diff options
-rw-r--r-- | sw/qa/extras/uiwriter/data2/tdf118699.docx | bin | 0 -> 21417 bytes | |||
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter2.cxx | 21 | ||||
-rw-r--r-- | sw/source/core/doc/DocumentRedlineManager.cxx | 32 | ||||
-rw-r--r-- | sw/source/core/inc/DocumentRedlineManager.hxx | 3 |
4 files changed, 56 insertions, 0 deletions
diff --git a/sw/qa/extras/uiwriter/data2/tdf118699.docx b/sw/qa/extras/uiwriter/data2/tdf118699.docx Binary files differnew file mode 100644 index 000000000000..6aea0911aef1 --- /dev/null +++ b/sw/qa/extras/uiwriter/data2/tdf118699.docx diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index 2a106ed74581..b7199d5f1b17 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -1231,4 +1231,25 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testDocxAttributeTableExport) CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(xShape, "HoriOrientRelation")); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf118699_redline_numbering) +{ + load(DATA_DIRECTORY, "tdf118699.docx"); + + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentRedlineAccess& rIDRA(pDoc->getIDocumentRedlineAccess()); + rIDRA.AcceptAllRedline(true); + + uno::Reference<beans::XPropertySet> xProps(getParagraph(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("first paragraph after the first deletion: erroneous numbering", + !xProps->getPropertyValue("NumberingRules").hasValue()); + + CPPUNIT_ASSERT_MESSAGE( + "first paragraph after the second deletion: missing numbering", + getProperty<uno::Reference<container::XIndexAccess>>(getParagraph(5), "NumberingRules") + .is()); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx index 3056f8f27d12..9735e50390e4 100644 --- a/sw/source/core/doc/DocumentRedlineManager.cxx +++ b/sw/source/core/doc/DocumentRedlineManager.cxx @@ -820,6 +820,12 @@ RedlineFlags DocumentRedlineManager::GetRedlineFlags() const void DocumentRedlineManager::SetRedlineFlags( RedlineFlags eMode ) { + if ( m_bFinalizeImport ) + { + FinalizeImport(); + m_bFinalizeImport = false; + } + if( meRedlineFlags != eMode ) { if( (RedlineFlags::ShowMask & meRedlineFlags) != (RedlineFlags::ShowMask & eMode) @@ -1418,6 +1424,8 @@ DocumentRedlineManager::AppendRedline(SwRangeRedline* pNewRedl, bool const bCall // better fix it. n = 0; bDec = true; + // or simply this is an OOXML import + m_bFinalizeImport = true; } mpRedlineTable->DeleteAndDestroy( nToBeDeleted ); @@ -3011,6 +3019,30 @@ void DocumentRedlineManager::SetAutoFormatRedlineComment( const OUString* pText, mnAutoFormatRedlnCommentNo = nSeqNo; } +void DocumentRedlineManager::FinalizeImport() +{ + // tdf#118699 fix numbering after deletion of numbered list items + for( SwRedlineTable::size_type n = 0; n < mpRedlineTable->size(); ++n ) + { + SwRangeRedline* pRedl = (*mpRedlineTable)[ n ]; + if ( nsRedlineType_t::REDLINE_DELETE == pRedl->GetType() ) + { + const SwPosition* pStt = pRedl->Start(), + * pEnd = pStt == pRedl->GetPoint() + ? pRedl->GetMark() : pRedl->GetPoint(); + SwTextNode* pDelNode = pStt->nNode.GetNode().GetTextNode(); + SwTextNode* pTextNode = pEnd->nNode.GetNode().GetTextNode(); + // remove numbering of the first deleted list item + // to avoid of incorrect numbering after the deletion + if ( pDelNode->GetNumRule() && !pTextNode->GetNumRule() ) + { + const SwPaM aPam( *pStt, *pStt ); + m_rDoc.DelNumRules( aPam ); + } + } + } +} + DocumentRedlineManager::~DocumentRedlineManager() { } diff --git a/sw/source/core/inc/DocumentRedlineManager.hxx b/sw/source/core/inc/DocumentRedlineManager.hxx index f962d4fb6a70..56ff92942de9 100644 --- a/sw/source/core/inc/DocumentRedlineManager.hxx +++ b/sw/source/core/inc/DocumentRedlineManager.hxx @@ -127,6 +127,7 @@ public: bool IsHideRedlines() const { return m_bHideRedlines; } void SetHideRedlines(bool const bHideRedlines) { m_bHideRedlines = bHideRedlines; } + void FinalizeImport(); virtual ~DocumentRedlineManager() override; private: @@ -148,6 +149,8 @@ private: /// this flag is necessary for file import because the ViewShell/layout is /// created "too late" and the ShowRedlineChanges item is not below "Views" bool m_bHideRedlines = false; + /// need post-processing, eg. for OOXML import + bool m_bFinalizeImport = false; }; } |