diff options
author | Bakos Attila <bakos.attilakaroly@nisz.hu> | 2020-06-30 15:03:31 +0200 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2020-07-10 14:44:50 +0200 |
commit | b216fc5b583050cfb1cdf9bd82ec3c1bd2e09d70 (patch) | |
tree | eab1bebbba923457c2a57da3db0615514487da9f /writerfilter | |
parent | bb303e79091f07c7a5b553a4be63fa0034ba2b9c (diff) |
tdf#118701 DOCX import: fix image position on page break
If an image anchored to an empty paragraph only with
section properties, don't remove that paragraph to keep
the image on the page before the page break.
IsLastParaEmpty() tries to move a text cursor over the
empty paragraph marked for deletion. If it contains an
image anchored as a character, the cursor won't reach
the end of the previous paragraph by goLeft(2).
Co-authored-by: Attila Bánhegyi (NISZ)
Change-Id: Ic22c7553948eb06739232d7e35fc49ad14f96518
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97518
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 2 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 16 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 1 |
3 files changed, 18 insertions, 1 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index d07f045de806..5df7bb33b1ae 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -3516,7 +3516,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) } m_pImpl->SetParaSectpr(false); finishParagraph(bRemove); - if (bRemove) + if (bRemove && m_pImpl->IsLastParaEmpty()) m_pImpl->RemoveLastParagraph(); } else diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 04e087fc4d30..16b56a6ecae8 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -474,6 +474,22 @@ void DomainMapper_Impl::AddDummyParaForTableInSection() } } +bool DomainMapper_Impl::IsLastParaEmpty() +{ + bool bRet = true; + if (!m_aTextAppendStack.empty() && m_aTextAppendStack.top().xTextAppend) + { + //creating cursor for finding text content + uno::Reference<text::XTextCursor> xCursor = m_aTextAppendStack.top().xTextAppend->createTextCursor(); + xCursor->gotoEnd(false); + //selecting the last 2 characters in the document + xCursor->goLeft(2, true); + //the last paragraph is empty, if they are newlines + bRet = xCursor->getString().match(OUString(SAL_NEWLINE_STRING).concat(SAL_NEWLINE_STRING)); + } + return bRet; +} + void DomainMapper_Impl::RemoveLastParagraph( ) { if (m_bDiscardHeaderFooter) diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index db0a03fa7792..e145547f3ddd 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -626,6 +626,7 @@ public: void RemoveDummyParaForTableInSection(); void AddDummyParaForTableInSection(); + bool IsLastParaEmpty(); void RemoveLastParagraph( ); void SetIsLastParagraphInSection( bool bIsLast ); bool GetIsLastParagraphInSection() const { return m_bIsLastParaInSection;} |