diff --git a/sw/qa/extras/rtftok/data/fdo48104.rtf b/sw/qa/extras/rtftok/data/fdo48104.rtf new file mode 100644 index 000000000000..64d5e5979e4f --- /dev/null +++ b/sw/qa/extras/rtftok/data/fdo48104.rtf @@ -0,0 +1,6 @@ +{\rtf1 +first page\par +\page +{second page first line\par} +second page second line\par +} diff --git a/sw/qa/extras/rtftok/rtftok.cxx b/sw/qa/extras/rtftok/rtftok.cxx index f13e15dc81b0..7f9b4989e20f 100644 --- a/sw/qa/extras/rtftok/rtftok.cxx +++ b/sw/qa/extras/rtftok/rtftok.cxx @@ -75,6 +75,7 @@ public: void testFdo47036(); void testFdo46955(); void testFdo45394(); + void testFdo48104(); CPPUNIT_TEST_SUITE(RtfModelTest); #if !defined(MACOSX) && !defined(WNT) @@ -93,6 +94,7 @@ public: CPPUNIT_TEST(testFdo47036); CPPUNIT_TEST(testFdo46955); CPPUNIT_TEST(testFdo45394); + CPPUNIT_TEST(testFdo48104); #endif CPPUNIT_TEST_SUITE_END(); @@ -471,6 +473,16 @@ void RtfModelTest::testFdo45394() CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); } +void RtfModelTest::testFdo48104() +{ + load(OUString(RTL_CONSTASCII_USTRINGPARAM("fdo48104.rtf"))); + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY); + xCursor->jumpToLastPage(); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xCursor->getPage()); +} + CPPUNIT_TEST_SUITE_REGISTRATION(RtfModelTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index e63c4512b843..038ead9792d7 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -280,7 +280,6 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference const& x m_bFormField(false), m_bWasInFrame(false), m_bIsInFrame(false), - m_bHasPage(false), m_aUnicodeBuffer(), m_aHexBuffer() { @@ -424,7 +423,6 @@ void RTFDocumentImpl::checkNeedPap() { dispatchSymbol(RTF_PAR); m_bNeedPap = false; - m_aStates.top().aParagraphSprms.erase(NS_sprm::LN_PFPageBreakBefore); } Mapper().props(pParagraphProperties); if (hasBreakBeforeFrame) @@ -1377,12 +1375,6 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) m_bWasInFrame = m_aStates.top().aFrame.inFrame(); if (!m_bWasInFrame) m_bNeedPar = false; - if (m_bHasPage) - { - // this has to be reset even without a pard, since it's a symbol in RTF terms - m_aStates.top().aParagraphSprms.erase(NS_sprm::LN_PFPageBreakBefore); - m_bHasPage = false; - } } break; case RTF_SECT: @@ -1506,10 +1498,10 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) break; case RTF_PAGE: { - RTFValue::Pointer_t pValue(new RTFValue(1)); - dispatchSymbol(RTF_PAR); - m_aStates.top().aParagraphSprms->push_back(make_pair(NS_sprm::LN_PFPageBreakBefore, pValue)); - m_bHasPage = true; + sal_uInt8 sBreak[] = { 0xc }; + Mapper().text(sBreak, 1); + if (!m_bNeedPap) + parBreak(); } break; default: @@ -1728,7 +1720,7 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) case RTF_KEEP: if (m_pCurrentBuffer != &m_aTableBuffer) nParam = NS_sprm::LN_PFKeep; break; case RTF_KEEPN: if (m_pCurrentBuffer != &m_aTableBuffer) nParam = NS_sprm::LN_PFKeepFollow; break; case RTF_INTBL: m_pCurrentBuffer = &m_aTableBuffer; nParam = NS_sprm::LN_PFInTable; break; - case RTF_PAGEBB: nParam = NS_sprm::LN_PFPageBreakBefore; m_bHasPage = false; break; + case RTF_PAGEBB: nParam = NS_sprm::LN_PFPageBreakBefore; break; default: break; } if (nParam >= 0) diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index eb7e27a21fb8..461b88ec96d1 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -473,8 +473,6 @@ namespace writerfilter { bool m_bWasInFrame; /// If a frame start token is already sent to dmapper (nesting them is not OK). bool m_bIsInFrame; - /// If we should reset the page break property when we start the next paragraph. - bool m_bHasPage; // Unicode characters are collected here so we don't have to send them one by one. rtl::OUStringBuffer m_aUnicodeBuffer; /// Same for hex characters.