diff options
-rw-r--r-- | sw/qa/extras/layout/layout.cxx | 20 | ||||
-rw-r--r-- | sw/source/core/text/txtfrm.cxx | 30 |
2 files changed, 46 insertions, 4 deletions
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index d29cc476f9cc..cb94560ab03a 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -2816,6 +2816,26 @@ void SwLayoutWriter::testBtlrCell() // 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"); + + // Test the position of the cursor after doc load. + // We expect that it's inside the first text frame in the first cell. + // More precisely, this is a bottom to top vertical frame, so we expect it's at the start, which + // means it's at the lower half of the text frame rectangle (vertically). + SwWrtShell* pWrtShell = pShell->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + const SwRect& rCharRect = pWrtShell->GetCharRect(); + SwTwips nFirstParaTop + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[1]/infos/bounds", "top").toInt32(); + SwTwips nFirstParaHeight + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[1]/infos/bounds", "height") + .toInt32(); + SwTwips nFirstParaMiddle = nFirstParaTop + nFirstParaHeight / 2; + SwTwips nFirstParaBottom = nFirstParaTop + nFirstParaHeight; + // Without the accompanying fix in place, this test would have failed: the lower half (vertical) + // range was 2273 -> 2835, the good vertical position is 2730, the bad one was 1830. + CPPUNIT_ASSERT_GREATER(nFirstParaMiddle, rCharRect.Top()); + CPPUNIT_ASSERT_LESS(nFirstParaBottom, rCharRect.Top()); #endif } diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index 17d1d6f321fc..8902ca0483ca 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -478,8 +478,18 @@ void SwTextFrame::SwitchHorizontalToVertical( SwRect& rRect ) const long nOfstX, nOfstY; if ( IsVertLR() ) { - nOfstX = rRect.Left() - getFrameArea().Left(); - nOfstY = rRect.Top() - getFrameArea().Top(); + if (IsVertLRBT()) + { + // X and Y offsets here mean the position of the point that will be the top left corner + // after the switch. + nOfstX = rRect.Left() + rRect.Width() - getFrameArea().Left(); + nOfstY = rRect.Top() - getFrameArea().Top(); + } + else + { + nOfstX = rRect.Left() - getFrameArea().Left(); + nOfstY = rRect.Top() - getFrameArea().Top(); + } } else { @@ -491,7 +501,12 @@ void SwTextFrame::SwitchHorizontalToVertical( SwRect& rRect ) const const long nHeight = rRect.Height(); if ( IsVertLR() ) - rRect.Left(getFrameArea().Left() + nOfstY); + { + if (IsVertLRBT()) + rRect.Left(getFrameArea().Left() + nOfstY); + else + rRect.Left(getFrameArea().Left() + nOfstY); + } else { if ( mbIsSwapped ) @@ -501,7 +516,14 @@ void SwTextFrame::SwitchHorizontalToVertical( SwRect& rRect ) const rRect.Left( getFrameArea().Left() + getFrameArea().Width() - nOfstY ); } - rRect.Top( getFrameArea().Top() + nOfstX ); + if (IsVertLRBT()) + { + SAL_WARN_IF(!mbIsSwapped, "sw.core", + "SwTextFrame::SwitchHorizontalToVertical, IsVertLRBT, not swapped"); + rRect.Top(getFrameArea().Top() + getFrameArea().Width() - nOfstX); + } + else + rRect.Top(getFrameArea().Top() + nOfstX); rRect.Width( nHeight ); rRect.Height( nWidth ); } |