schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng | 2 sw/qa/extras/layout/data/btlr-cell.odt |binary sw/qa/extras/layout/layout.cxx | 32 +++++ sw/qa/uitest/table/tableProperties.py | 12 +- sw/source/core/layout/newfrm.cxx | 66 ++++++------ sw/source/core/text/itrtxt.cxx | 8 + sw/source/ui/table/tabledlg.cxx | 2 sw/uiconfig/swriter/ui/tabletextflowpage.ui | 7 - 8 files changed, 84 insertions(+), 45 deletions(-)
New commits: commit b82fc5e685fc1472fdc79f67636ee60253118657 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Fri Feb 15 12:07:07 2019 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Jul 2 11:01:31 2019 +0200 sw btlr writing mode layout: fix multiple paragraphs aVerticalLeftToRightBottomToTop was wrong, it mapped from physical to logical, and it should be the other way around. In practice this means that when SwTextFrame::AdjustFrame() is invoked for a second lower, then nAdd will be a small positive (and not a large negative) number, so the warn:legacy.osl:20827:20827:sw/source/core/text/frmform.cxx:479: Ey warning goes away and the second lower becomes visible. Change-Id: I894fef4a89b1feeb333537ff7d76793130007ed8 Reviewed-on: https://gerrit.libreoffice.org/67862 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins (cherry picked from commit 835d054434d0000a5741a5bfa5f577e855594c40) diff --git a/sw/qa/extras/layout/data/btlr-cell.odt b/sw/qa/extras/layout/data/btlr-cell.odt index c010fa9f51b6..17a9c19eef25 100644 Binary files a/sw/qa/extras/layout/data/btlr-cell.odt and b/sw/qa/extras/layout/data/btlr-cell.odt differ diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index 36f4c06f105e..c70b0d13d9da 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -2759,10 +2759,15 @@ void SwLayoutWriter::testBtlrCell() #ifndef MACOSX // macOS fails with actual == 2662 for some reason. // Without the accompanying fix in place, this test would have failed with 'Expected: 1915; - // Actual : 1756', i.e. the AAA text was too close to the left cell border due to an ascent vs + // Actual : 1756', i.e. the AAA1 text was too close to the left cell border due to an ascent vs // descent mismatch when calculating the baseline offset of the text portion. assertXPath(pXmlDoc, "//textarray[1]", "x", "1915"); assertXPath(pXmlDoc, "//textarray[1]", "y", "2707"); + + // Without the accompanying fix in place, this test would have failed with 'Expected: 269; + // Actual : 0', i.e. the AAA2 frame was not visible due to 0 width. + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[2]/infos/bounds", "width", "269"); #endif } diff --git a/sw/source/core/layout/newfrm.cxx b/sw/source/core/layout/newfrm.cxx index 0971c2d95a8e..94e016434e47 100644 --- a/sw/source/core/layout/newfrm.cxx +++ b/sw/source/core/layout/newfrm.cxx @@ -226,62 +226,62 @@ static SwRectFnCollection aVerticalLeftToRight = { /** * This is the same as horizontal, but rotated counter-clockwise by 90 degrees. - * This means logical top is physical right, bottom is left, left is top, - * finally right is bottom. + * This means logical top is physical left, bottom is right, left is bottom, + * finally right is top. Values map from logical to physical. */ static SwRectFnCollection aVerticalLeftToRightBottomToTop = { - /*.fnGetTop =*/&SwRect::Right_, - /*.fnGetBottom =*/&SwRect::Left_, - /*.fnGetLeft =*/&SwRect::Top_, - /*.fnGetRight =*/&SwRect::Bottom_, + /*.fnGetTop =*/&SwRect::Left_, + /*.fnGetBottom =*/&SwRect::Right_, + /*.fnGetLeft =*/&SwRect::Bottom_, + /*.fnGetRight =*/&SwRect::Top_, /*.fnGetWidth =*/&SwRect::Height_, /*.fnGetHeight =*/&SwRect::Width_, - /*.fnGetPos =*/&SwRect::TopRight, + /*.fnGetPos =*/&SwRect::BottomLeft, /*.fnGetSize =*/&SwRect::SwappedSize, - /*.fnSetTop =*/&SwRect::Right_, - /*.fnSetBottom =*/&SwRect::Left_, - /*.fnSetLeft =*/&SwRect::Top_, - /*.fnSetRight =*/&SwRect::Bottom_, + /*.fnSetTop =*/&SwRect::Left_, + /*.fnSetBottom =*/&SwRect::Right_, + /*.fnSetLeft =*/&SwRect::Bottom_, + /*.fnSetRight =*/&SwRect::Top_, /*.fnSetWidth =*/&SwRect::Height_, /*.fnSetHeight =*/&SwRect::Width_, - /*.fnSubTop =*/&SwRect::AddRight, - /*.fnAddBottom =*/&SwRect::SubLeft, - /*.fnSubLeft =*/&SwRect::SubTop, - /*.fnAddRight =*/&SwRect::AddBottom, + /*.fnSubTop =*/&SwRect::SubLeft, + /*.fnAddBottom =*/&SwRect::AddRight, + /*.fnSubLeft =*/&SwRect::AddBottom, + /*.fnAddRight =*/&SwRect::SubTop, /*.fnAddWidth =*/&SwRect::AddHeight, /*.fnAddHeight =*/&SwRect::AddWidth, /*.fnSetPosX =*/&SwRect::SetPosY, /*.fnSetPosY =*/&SwRect::SetPosX, - /*.fnGetTopMargin =*/&SwFrame::GetRightMargin, - /*.fnGetBottomMargin =*/&SwFrame::GetLeftMargin, - /*.fnGetLeftMargin =*/&SwFrame::GetTopMargin, - /*.fnGetRightMargin =*/&SwFrame::GetBottomMargin, + /*.fnGetTopMargin =*/&SwFrame::GetLeftMargin, + /*.fnGetBottomMargin =*/&SwFrame::GetRightMargin, + /*.fnGetLeftMargin =*/&SwFrame::GetBottomMargin, + /*.fnGetRightMargin =*/&SwFrame::GetTopMargin, /*.fnSetXMargins =*/&SwFrame::SetTopBottomMargins, /*.fnSetYMargins =*/&SwFrame::SetLeftRightMargins, - /*.fnGetPrtTop =*/&SwFrame::GetPrtRight, - /*.fnGetPrtBottom =*/&SwFrame::GetPrtLeft, - /*.fnGetPrtLeft =*/&SwFrame::GetPrtTop, - /*.fnGetPrtRight =*/&SwFrame::GetPrtBottom, - /*.fnTopDist =*/&SwRect::GetRightDistance, - /*.fnBottomDist =*/&SwRect::GetLeftDistance, - /*.fnLeftDist =*/&SwRect::GetTopDistance, - /*.fnRightDist =*/&SwRect::GetBottomDistance, - /*.fnSetLimit =*/&SwFrame::SetMinLeft, - /*.fnOverStep =*/&SwRect::OverStepLeft, + /*.fnGetPrtTop =*/&SwFrame::GetPrtLeft, + /*.fnGetPrtBottom =*/&SwFrame::GetPrtRight, + /*.fnGetPrtLeft =*/&SwFrame::GetPrtBottom, + /*.fnGetPrtRight =*/&SwFrame::GetPrtTop, + /*.fnTopDist =*/&SwRect::GetLeftDistance, + /*.fnBottomDist =*/&SwRect::GetRightDistance, + /*.fnLeftDist =*/&SwRect::GetBottomDistance, + /*.fnRightDist =*/&SwRect::GetTopDistance, + /*.fnSetLimit =*/&SwFrame::SetMaxRight, + /*.fnOverStep =*/&SwRect::OverStepRight, - /*.fnSetPos =*/&SwRect::SetUpperRightCorner, - /*.fnMakePos =*/&SwFrame::MakeLeftPos, + /*.fnSetPos =*/&SwRect::SetLowerLeftCorner, + /*.fnMakePos =*/&SwFrame::MakeRightPos, /*.fnXDiff =*/&FirstMinusSecond, /*.fnYDiff =*/&FirstMinusSecond, /*.fnXInc =*/&SwIncrement, /*.fnYInc =*/&SwIncrement, - /*.fnSetLeftAndWidth =*/&SwRect::SetTopAndHeight, - /*.fnSetTopAndHeight =*/&SwRect::SetRightAndWidth + /*.fnSetLeftAndWidth =*/&SwRect::SetBottomAndHeight, + /*.fnSetTopAndHeight =*/&SwRect::SetLeftAndWidth }; SwRectFn fnRectHori = &aHorizontal; commit 741d3a94133d48fe17f9f698745276312e0a6269 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Thu Feb 14 15:35:12 2019 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Jul 2 11:01:04 2019 +0200 sw btlr writing mode layout: fix baseline offset The problem was that the x position of the btlr text had a 159 twips difference (it was too close to the cell border), since the text portion height -> baseline offset calculation worked with the descent, not with the ascent. The position of the text now matches exactly what Word does. As a side-effect this means that multiple portions in a line and also multiple lines in a text frame now work correctly. Change-Id: Ic139db328e2a913e5cae4026886c3410cdab357d Reviewed-on: https://gerrit.libreoffice.org/67823 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmik...@collabora.com> (cherry picked from commit a0bb480364c80192111ecab3501d63584e651ea3) diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index 153f8926b4a6..36f4c06f105e 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -2756,6 +2756,14 @@ void SwLayoutWriter::testBtlrCell() // the orientation was 0 (layout did not take btlr direction request from // doc model). assertXPath(pXmlDoc, "//font[1]", "orientation", "900"); + +#ifndef MACOSX // macOS fails with actual == 2662 for some reason. + // Without the accompanying fix in place, this test would have failed with 'Expected: 1915; + // Actual : 1756', i.e. the AAA text was too close to the left cell border due to an ascent vs + // descent mismatch when calculating the baseline offset of the text portion. + assertXPath(pXmlDoc, "//textarray[1]", "x", "1915"); + assertXPath(pXmlDoc, "//textarray[1]", "y", "2707"); +#endif } CPPUNIT_TEST_SUITE_REGISTRATION(SwLayoutWriter); diff --git a/sw/source/core/text/itrtxt.cxx b/sw/source/core/text/itrtxt.cxx index 53c1c7c91b2b..0f08b824effe 100644 --- a/sw/source/core/text/itrtxt.cxx +++ b/sw/source/core/text/itrtxt.cxx @@ -274,7 +274,13 @@ sal_uInt16 SwTextCursor::AdjustBaseLine( const SwLineLayout& rLine, case SvxParaVertAlignItem::Align::Automatic : if ( bAutoToCentered || GetInfo().GetTextFrame()->IsVertical() ) { - if( GetInfo().GetTextFrame()->IsVertLR() ) + // Vertical text has these cases to calculate the baseline: + // - Implicitly TB and RL: the origo is the top right corner, offset is the + // ascent. + // - (Implicitly TB and) LR: the origo is the top left corner, offset is the + // descent. + // - BT and LR: the origo is the bottom left corner, offset is the ascent. + if (GetInfo().GetTextFrame()->IsVertLR() && !GetInfo().GetTextFrame()->IsVertLRBT()) nOfst += rLine.Height() - ( rLine.Height() - nPorHeight ) / 2 - nPorAscent; else nOfst += ( rLine.Height() - nPorHeight ) / 2 + nPorAscent; commit 976c14ec7d2f2f0629419c16331b908e8d2888c1 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Thu Feb 14 11:49:47 2019 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Jul 2 11:00:48 2019 +0200 sw btlr writing mode: add odf spec proposal URL Change-Id: I7848677cf4c8246fc7a1833bec809945fb541b29 Reviewed-on: https://gerrit.libreoffice.org/67814 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins (cherry picked from commit 3157a3a8332ad342fb2b44659123217fa3450168) diff --git a/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng b/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng index 956ccc2f02e4..19786f82a7e1 100644 --- a/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng +++ b/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng @@ -2323,7 +2323,7 @@ xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1. </rng:optional> </rng:define> - <!-- TODO no proposal --> + <!-- https://issues.oasis-open.org/browse/OFFICE-4030 --> <rng:define name="common-writing-mode-attlist" combine="interleave"> <rng:optional> <rng:attribute name="loext:writing-mode"> commit 494acf1c10678d619f7e494349698ae2d229d720 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Wed Feb 13 18:32:31 2019 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Jul 2 11:00:21 2019 +0200 sw btlr writing mode: add UI for this There was only horizontal and vertical previously, so keep things simple and talk about the BT and TB version of vertical, not mentioning the LR/RL aspect. Also rename the textdirection widget, so it's unique not only within the tab page, but inside the dialog, so we can have uitest coverage for this. Change-Id: Ie396898fde03aca6cd37a29f049099fa4b2c5fc0 Reviewed-on: https://gerrit.libreoffice.org/67789 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins (cherry picked from commit 081b753d4cb4f4a25073ca7de12a7bdaa9fc2be4) diff --git a/sw/qa/uitest/table/tableProperties.py b/sw/qa/uitest/table/tableProperties.py index 009a807aa4b0..882ae0976ab2 100644 --- a/sw/qa/uitest/table/tableProperties.py +++ b/sw/qa/uitest/table/tableProperties.py @@ -121,10 +121,10 @@ class tableProperties(UITestCase): keep.executeAction("CLICK", tuple()) headline = xDialog.getChild("headline") headline.executeAction("CLICK", tuple()) -# textdirection = xDialog.getChild("textdirection") #the name of the ui item is not unique -# props = {"TEXT": "Vertical"} -# actionProps = mkPropertyValues(props) -# textdirection.executeAction("SELECT", actionProps) + textdirection = xDialog.getChild("textorientation") + props = {"TEXT": "Vertical (bottom to top)"} + actionProps = mkPropertyValues(props) + textdirection.executeAction("SELECT", actionProps) vertorient = xDialog.getChild("vertorient") props2 = {"TEXT": "Bottom"} actionProps2 = mkPropertyValues(props2) @@ -147,8 +147,8 @@ class tableProperties(UITestCase): self.assertEqual(get_state_as_dict(keep)["Selected"], "true") headline = xDialog.getChild("headline") self.assertEqual(get_state_as_dict(headline)["Selected"], "true") -# textdirection = xDialog.getChild("textdirection") -# self.assertEqual(get_state_as_dict(textdirection)["SelectEntryText"], "Vertical") + textdirection = xDialog.getChild("textorientation") + self.assertEqual(get_state_as_dict(textdirection)["SelectEntryText"], "Vertical (bottom to top)") vertorient = xDialog.getChild("vertorient") self.assertEqual(get_state_as_dict(vertorient)["SelectEntryText"], "Bottom") xOKBtn = xDialog.getChild("ok") diff --git a/sw/source/ui/table/tabledlg.cxx b/sw/source/ui/table/tabledlg.cxx index b19711eb2502..c38a2f62d4ad 100644 --- a/sw/source/ui/table/tabledlg.cxx +++ b/sw/source/ui/table/tabledlg.cxx @@ -1226,7 +1226,7 @@ SwTextFlowPage::SwTextFlowPage(TabPageParent pParent, const SfxItemSet& rSet) , m_xHeadLineCB(m_xBuilder->weld_check_button("headline")) , m_xRepeatHeaderCombo(m_xBuilder->weld_widget("repeatheader")) , m_xRepeatHeaderNF(m_xBuilder->weld_spin_button("repeatheadernf")) - , m_xTextDirectionLB(m_xBuilder->weld_combo_box("textdirection")) + , m_xTextDirectionLB(m_xBuilder->weld_combo_box("textorientation")) , m_xVertOrientLB(m_xBuilder->weld_combo_box("vertorient")) { m_xPgBrkCB->connect_toggled(LINK(this, SwTextFlowPage, PageBreakHdl_Impl)); diff --git a/sw/uiconfig/swriter/ui/tabletextflowpage.ui b/sw/uiconfig/swriter/ui/tabletextflowpage.ui index 6ac2c41ab08e..ef46e8eafc96 100644 --- a/sw/uiconfig/swriter/ui/tabletextflowpage.ui +++ b/sw/uiconfig/swriter/ui/tabletextflowpage.ui @@ -283,7 +283,7 @@ <property name="can_focus">False</property> <property name="label" translatable="yes" context="tabletextflowpage|label40">Text _orientation</property> <property name="use_underline">True</property> - <property name="mnemonic_widget">textdirection</property> + <property name="mnemonic_widget">textorientation</property> </object> <packing> <property name="left_attach">0</property> @@ -291,13 +291,14 @@ </packing> </child> <child> - <object class="GtkComboBoxText" id="textdirection"> + <object class="GtkComboBoxText" id="textorientation"> <property name="visible">True</property> <property name="can_focus">False</property> <items> <item id="0" translatable="yes" context="tabletextflowpage|liststore1">Horizontal</item> - <item id="2" translatable="yes" context="tabletextflowpage|liststore1">Vertical</item> + <item id="2" translatable="yes" context="tabletextflowpage|liststore1">Vertical (top to bottom)</item> <item id="4" translatable="yes" context="tabletextflowpage|liststore1">Use superordinate object settings</item> + <item id="5" translatable="yes" context="tabletextflowpage|liststore1">Vertical (bottom to top)</item> </items> </object> <packing> commit ac1ca418d1f3a803102d2508f6e0029ad65c4af7 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Wed Feb 13 15:19:56 2019 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Jul 2 10:59:30 2019 +0200 sw btlr writing mode: add a layout-level test Fails with commit e8b9572bf89f55463f2c879a401ed62efc165d95 (sw btlr writing mode: implement initial layout, 2019-02-12) reverted. (cherry picked from commit bef3818dbedba467a257e2573e298d98062be37b) Conflicts: sw/qa/extras/layout/layout.cxx Change-Id: Ic68ef53a8b5bf86678d7e67c9960501f23341268 diff --git a/sw/qa/extras/layout/data/btlr-cell.odt b/sw/qa/extras/layout/data/btlr-cell.odt new file mode 100644 index 000000000000..c010fa9f51b6 Binary files /dev/null and b/sw/qa/extras/layout/data/btlr-cell.odt differ diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index 3239b1cac3aa..153f8926b4a6 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -68,6 +68,7 @@ public: void testTdf115094(); void testTdf118719(); void testTdf123651(); + void testBtlrCell(); CPPUNIT_TEST_SUITE(SwLayoutWriter); CPPUNIT_TEST(testRedlineFootnotes); @@ -108,6 +109,7 @@ public: CPPUNIT_TEST(testTdf115094); CPPUNIT_TEST(testTdf118719); CPPUNIT_TEST(testTdf123651); + CPPUNIT_TEST(testBtlrCell); CPPUNIT_TEST_SUITE_END(); private: @@ -2739,6 +2741,23 @@ void SwLayoutWriter::testTdf123651() assertXPath(pXmlDoc, "//SwAnchoredDrawObject/bounds", "top", "7639"); } +void SwLayoutWriter::testBtlrCell() +{ + SwDoc* pDoc = createDoc("btlr-cell.odt"); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Without the accompanying fix in place, this test would have failed, as + // the orientation was 0 (layout did not take btlr direction request from + // doc model). + assertXPath(pXmlDoc, "//font[1]", "orientation", "900"); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwLayoutWriter); CPPUNIT_PLUGIN_IMPLEMENT(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits