sw/qa/uitest/writer_tests5/titlePageWizard.py | 83 +++++++++++++++++++++++++- sw/source/ui/misc/titlepage.cxx | 47 ++++++++++---- 2 files changed, 116 insertions(+), 14 deletions(-)
New commits: commit 22ee887346ef870fbf9b758fe2bcaa9aeae04a82 Author: Justin Luth <justin.l...@collabora.com> AuthorDate: Mon Dec 28 17:15:06 2020 +0300 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Thu Jan 21 09:20:16 2021 +0100 tdf#138907 sw TitlePageDlg: Goto correct (existing) page If the starting page for the new Title pages is beyond the end of the document, then insert the new pages after the last page. Also, handle the "physical" blank pages which threw off calculations for Index pages. 1.) It was wrongly inserting before the last page. 2.) Cap InsertPosition() to document-end. 3.) An odd/even blank filler page would cause missing or mis-applied styles. NOTE: The wizard is still completely useless when adding pages, because GotoPage does not recognize that the document has inserted pages, and so it goes by pre-wizard page coordinates. This is just the first step in correcting the overall problem (which I don't know how to do). make UITest_writer_tests5 UITEST_TEST_NAME=\ titlePageWizard.tdf138907.test_tdf138907 Change-Id: Ie138c4ab3126bc6d3fae16028b41a80bda329f1c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108332 Tested-by: Jenkins Reviewed-by: Justin Luth <justin_l...@sil.org> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/sw/qa/uitest/writer_tests5/titlePageWizard.py b/sw/qa/uitest/writer_tests5/titlePageWizard.py index ca391a6d4010..24d3ff4c53cb 100644 --- a/sw/qa/uitest/writer_tests5/titlePageWizard.py +++ b/sw/qa/uitest/writer_tests5/titlePageWizard.py @@ -8,7 +8,9 @@ from uitest.framework import UITestCase from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file from libreoffice.uno.propertyvalue import mkPropertyValues -# This tests the Format->Title Page wizard, specifically the reset page number portion. +# This tests the Format->Title Page wizard, specifically the reset page number portion, +# replacing some pages with title pages, +# and inserting at the very end of the document. class tdf138907(UITestCase): def test_tdf138907(self): self.ui_test.load_file(get_url_for_data_file("tdf138907_titlePageDialog.odt")) @@ -23,6 +25,16 @@ class tdf138907(UITestCase): Para2 = Paragraphs.nextElement() self.assertEqual(Para2.String, "7") self.assertEqual(Para2.PageDescName, None) + Para3 = Paragraphs.nextElement() + self.assertEqual(Para3.String, "8") + self.assertEqual(Para3.PageDescName, None) + Para4 = Paragraphs.nextElement() + self.assertEqual(Para4.String, "9") + self.assertEqual(Para4.PageDescName, None) + Para5 = Paragraphs.nextElement() + self.assertEqual(Para5.String, "10") + self.assertEqual(Para5.PageDescName, None) + #dialog Title Page self.ui_test.execute_dialog_through_command(".uno:TitlePageDialog") @@ -54,7 +66,7 @@ class tdf138907(UITestCase): # Without this fix, re-running the wizard was failing with the title page restarting at page 2. Paragraphs = document.Text.createEnumeration() Para1 = Paragraphs.nextElement() - #self.assertEqual(Para1.String, "6") + self.assertEqual(Para1.String, "6") self.assertEqual(Para1.PageDescName, "First Page") Para2 = Paragraphs.nextElement() self.assertEqual(Para2.String, "2") @@ -63,6 +75,73 @@ class tdf138907(UITestCase): #Note: 6 virtual pages, including blank, even page seen in book view self.assertEqual(document.CurrentController.PageCount, 6) + #Now test replacing several pages with title and index styles + + #dialog Title Page + self.ui_test.execute_dialog_through_command(".uno:TitlePageDialog") + xDialog = self.xUITest.getTopFocusWindow() + print(xDialog.getChildren()) + #Insert thre title/index pages at page two. + xPageCount = xDialog.getChild("NF_PAGE_COUNT") + for _ in range(0,2): + xPageCount.executeAction("UP", tuple()) + xUseStartingPage = xDialog.getChild("RB_PAGE_START") + xUseStartingPage.executeAction("CLICK", tuple()) + xStartingPage = xDialog.getChild("NF_PAGE_START") + xStartingPage.executeAction("UP", tuple()) #Start at page 2. + + xOKBtn = xDialog.getChild("ok") + self.ui_test.close_dialog_through_button(xOKBtn) + + Paragraphs = document.Text.createEnumeration() + Para1 = Paragraphs.nextElement() + self.assertEqual(Para1.String, "6") + self.assertEqual(Para1.PageDescName, "First Page") + # Without the fix, the following results are all off by one. + Para2 = Paragraphs.nextElement() + self.assertEqual(Para2.String, "6") + self.assertEqual(Para2.PageDescName, "First Page") + Para3 = Paragraphs.nextElement() + self.assertEqual(Para3.String, "7") + self.assertEqual(Para3.PageDescName, "Index") + Para4 = Paragraphs.nextElement() + self.assertEqual(Para4.String, "8") + self.assertEqual(Para4.PageDescName, "Index") + Para5 = Paragraphs.nextElement() + self.assertEqual(Para5.String, "2") + self.assertEqual(Para5.PageDescName, "Landscape") + + #Now test inserting at the end of the document + + #dialog Title Page + self.ui_test.execute_dialog_through_command(".uno:TitlePageDialog") + xDialog = self.xUITest.getTopFocusWindow() + print(xDialog.getChildren()) + #Insert title/index pages at the end of the document. + newPages = xDialog.getChild("RB_INSERT_NEW_PAGES") + newPages.executeAction("CLICK", tuple()) + xPageCount = xDialog.getChild("NF_PAGE_COUNT") + for _ in range(0,2): + xPageCount.executeAction("UP", tuple()) + xUseStartingPage = xDialog.getChild("RB_PAGE_START") + xUseStartingPage.executeAction("CLICK", tuple()) + xStartingPage = xDialog.getChild("NF_PAGE_START") + for _ in range(0,18): + xStartingPage.executeAction("UP", tuple()) #Start at mythical page 20. + + xOKBtn = xDialog.getChild("ok") + self.ui_test.close_dialog_through_button(xOKBtn) + + # Without the fix, the pages were being inserted before the last page. + # NOTE: there are still LOTS of problems here that still need fixing. + text = document.Text.String.replace('\r\n', '\n') + self.assertEqual(text[0:1], "6") + self.assertEqual(text[2:3], "6") + self.assertEqual(text[4:5], "7") + self.assertEqual(text[6:7], "8") + # Without the fix, the new pages were inserted before the last page. + self.assertFalse("\n" in text[8:9]) + self.ui_test.close_doc() # vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sw/source/ui/misc/titlepage.cxx b/sw/source/ui/misc/titlepage.cxx index a05165fe063a..eb431a35d757 100644 --- a/sw/source/ui/misc/titlepage.cxx +++ b/sw/source/ui/misc/titlepage.cxx @@ -91,7 +91,33 @@ namespace rSh.GetPageNumber(0, true, nPhyNum, nVirtNum, sDummy); return nPhyNum; } + +bool lcl_GotoPage(SwWrtShell& rSh, const sal_uInt16 nStartingPage, sal_uInt16 nOffset = 0) +{ + rSh.GotoPage(nStartingPage, /*bRecord=*/false); + + sal_uInt16 nCurrentPage = lcl_GetCurrentPage(rSh); + // return false if at document end (unless that was the requested destination) + if (nCurrentPage == rSh.GetPageCnt()) + return nCurrentPage == nStartingPage + nOffset; + + if (nCurrentPage != nStartingPage) + { + assert(nStartingPage != 1 && "Physical page 1 couldn't be found/moved to?"); + // Probably there is an auto-inserted blank page to handle odd/even, which Goto doesn't understand. + rSh.GotoPage(nStartingPage + 1, /*bRecord=*/false); + + nCurrentPage = lcl_GetCurrentPage(rSh); + assert(nCurrentPage == nStartingPage + 1 && "Impossible, since unknown goes to last page"); + if (nCurrentPage != nStartingPage + 1) + return false; + } + // Now that we have the correct starting point, move to the correct offset. + while (nOffset--) + rSh.SttNxtPg(); + return true; } +} // namespace /* * Only include the Index page in the list if the page count implies one @@ -113,8 +139,6 @@ void SwTitlePageDlg::FillList() sal_uInt16 SwTitlePageDlg::GetInsertPosition() const { sal_uInt16 nPage = 1; - // FIXME: If GetInsertPosition is greater than the current number of pages, - // it needs to be reduced to page-count + 1. if (m_xPageStartNF->get_sensitive()) nPage = m_xPageStartNF->get_value(); return nPage; @@ -139,6 +163,7 @@ SwTitlePageDlg::SwTitlePageDlg(weld::Window *pParent) m_xOkPB->connect_clicked(LINK(this, SwTitlePageDlg, OKHdl)); m_xRestartNumberingCB->connect_toggled(LINK(this, SwTitlePageDlg, RestartNumberingHdl)); m_xSetPageNumberCB->connect_toggled(LINK(this, SwTitlePageDlg, SetPageNumberHdl)); + m_xPageStartNF->set_max(mrSh.GetPageCnt() + 1); sal_uInt16 nSetPage = 1; sal_uInt16 nResetPage = 1; @@ -237,8 +262,6 @@ IMPL_LINK_NOARG(SwTitlePageDlg, EditHdl, weld::Button&, void) IMPL_LINK_NOARG(SwTitlePageDlg, OKHdl, weld::Button&, void) { - // FIXME: This wizard is almost completely non-functional for inserting new pages. - lcl_PushCursor(mrSh); mrSh.StartUndo(); @@ -253,17 +276,17 @@ IMPL_LINK_NOARG(SwTitlePageDlg, OKHdl, weld::Button&, void) sal_uInt16 nNumTitlePages = m_xPageCountNF->get_value(); if (!m_xUseExistingPagesRB->get_active()) { - // FIXME: If the starting page number is larger than the last page, - // probably should add pages AFTER the last page, not before it. - mrSh.GotoPage(GetInsertPosition(), false); + // Assuming that a failure to GotoPage means the end of the document, + // insert new pages after the last page. + if (!lcl_GotoPage(mrSh, GetInsertPosition())) + mrSh.EndPg(); // FIXME: These new pages cannot be accessed currently with GotoPage. It doesn't know they exist. for (sal_uInt16 nI = 0; nI < nNumTitlePages; ++nI) mrSh.InsertPageBreak(); } - mrSh.GotoPage(GetInsertPosition(), false); - mrSh.SetAttrItem(aTitleDesc); - // FIXME: GotoPage is pointing to a page after the newly created index pages, so the wrong pages are getting Index style. + if (lcl_GotoPage(mrSh, GetInsertPosition())) + mrSh.SetAttrItem(aTitleDesc); for (sal_uInt16 nI = 1; nI < nNumTitlePages; ++nI) { if (mrSh.SttNxtPg()) @@ -281,14 +304,14 @@ IMPL_LINK_NOARG(SwTitlePageDlg, OKHdl, weld::Button&, void) { sal_uInt16 nPgNo = m_xRestartNumberingCB->get_active() ? m_xRestartNumberingNF->get_value() : 0; const SwPageDesc* pNewDesc = nNumTitlePages > 1 ? mpNormalDesc : nullptr; - mrSh.GotoPage(GetInsertPosition() + nNumTitlePages, false); + lcl_GotoPage(mrSh, GetInsertPosition(), nNumTitlePages); lcl_ChangePage(mrSh, nPgNo, pNewDesc); } mrSh.EndUndo(); lcl_PopCursor(mrSh); if (!m_xUseExistingPagesRB->get_active()) - mrSh.GotoPage(GetInsertPosition(), false); + lcl_GotoPage(mrSh, GetInsertPosition()); m_xDialog->response(RET_OK); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits