diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 05:03:24 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 05:03:24 +0000 |
commit | e3cf16e6fbf8d39cad8762f002b6db1d4f61ed36 (patch) | |
tree | 3c1753125149dcf36ba42a57f1574369e8524225 /sc/source/ui/view | |
parent | Adding debian version 4:24.2.2-3. (diff) | |
download | libreoffice-e3cf16e6fbf8d39cad8762f002b6db1d4f61ed36.tar.xz libreoffice-e3cf16e6fbf8d39cad8762f002b6db1d4f61ed36.zip |
Merging upstream version 4:24.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sc/source/ui/view')
-rw-r--r-- | sc/source/ui/view/output2.cxx | 14 | ||||
-rw-r--r-- | sc/source/ui/view/tabview.cxx | 22 | ||||
-rw-r--r-- | sc/source/ui/view/tabview4.cxx | 45 | ||||
-rw-r--r-- | sc/source/ui/view/viewfun3.cxx | 3 |
4 files changed, 66 insertions, 18 deletions
diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx index d419981d8e..877675c0ac 100644 --- a/sc/source/ui/view/output2.cxx +++ b/sc/source/ui/view/output2.cxx @@ -1877,8 +1877,7 @@ void ScOutputData::LayoutStrings(bool bPixelToLogic) // Cells to the left are marked directly, cells to the // right are handled by the flag for nX2 SCCOL nMarkX = ( nCellX <= nX2 ) ? nCellX : nX2; - RowInfo* pMarkRowInfo = ( nCellY == nY ) ? pThisRowInfo : &pRowInfo[0]; - pMarkRowInfo->basicCellInfo(nMarkX).bEditEngine = true; + pThisRowInfo->basicCellInfo(nMarkX).bEditEngine = true; bDoCell = false; // don't draw here } if ( bDoCell ) @@ -4429,14 +4428,17 @@ void ScOutputData::DrawEdit(bool bPixelToLogic) SCROW nCellY = nY; bool bDoCell = false; + // if merged cell contains hidden row or column or both + const ScMergeFlagAttr* pMergeFlag = mpDoc->GetAttr(nX, nY, nTab, ATTR_MERGE_FLAG); + bool bOverlapped = (pMergeFlag->IsHorOverlapped() || pMergeFlag->IsVerOverlapped()); + tools::Long nPosY = nRowPosY; - if ( nArrY == 0 ) + if (bOverlapped) { - nPosY = nScrY; - nY = pRowInfo[1].nRowNo; + nY = pRowInfo[nArrY].nRowNo; SCCOL nOverX; // start of the merged cells SCROW nOverY; - if (GetMergeOrigin( nX,nY, 1, nOverX,nOverY, true )) + if (GetMergeOrigin( nX,nY, nArrY, nOverX,nOverY, true )) { nCellX = nOverX; nCellY = nOverY; diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx index 9eff50195e..a69ab1447f 100644 --- a/sc/source/ui/view/tabview.cxx +++ b/sc/source/ui/view/tabview.cxx @@ -1091,7 +1091,7 @@ void ScTabView::ScrollHdl(ScrollAdaptor* pScroll) nViewPos = aViewData.GetPosY( (pScroll == aVScrollTop.get()) ? SC_SPLIT_TOP : SC_SPLIT_BOTTOM ); - bool bLayoutRTL = aViewData.GetDocument().IsLayoutRTL( aViewData.GetTabNo() ); + bool bLayoutRTL = bHoriz && aViewData.GetDocument().IsLayoutRTL( aViewData.GetTabNo() ); ScrollType eType = pScroll->GetScrollType(); if ( eType == ScrollType::Drag ) @@ -1129,7 +1129,7 @@ void ScTabView::ScrollHdl(ScrollAdaptor* pScroll) nScrollMin = aViewData.GetFixPosX(); if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == aVScrollBottom.get() ) nScrollMin = aViewData.GetFixPosY(); - tools::Long nScrollPos = GetScrollBarPos( *pScroll ) + nScrollMin; + tools::Long nScrollPos = GetScrollBarPos( *pScroll, bLayoutRTL ) + nScrollMin; OUString aHelpStr; tools::Rectangle aRect; @@ -1162,6 +1162,22 @@ void ScTabView::ScrollHdl(ScrollAdaptor* pScroll) else bDragging = false; + if ( bHoriz && bLayoutRTL ) + { + // change scroll type so visible/previous cells calculation below remains the same + switch ( eType ) + { + case ScrollType::LineUp: eType = ScrollType::LineDown; break; + case ScrollType::LineDown: eType = ScrollType::LineUp; break; + case ScrollType::PageUp: eType = ScrollType::PageDown; break; + case ScrollType::PageDown: eType = ScrollType::PageUp; break; + default: + { + // added to avoid warnings + } + } + } + tools::Long nDelta(0); switch ( eType ) { @@ -1194,7 +1210,7 @@ void ScTabView::ScrollHdl(ScrollAdaptor* pScroll) if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == aVScrollBottom.get() ) nScrollMin = aViewData.GetFixPosY(); - tools::Long nScrollPos = GetScrollBarPos( *pScroll ) + nScrollMin; + tools::Long nScrollPos = GetScrollBarPos( *pScroll, bLayoutRTL ) + nScrollMin; nDelta = nScrollPos - nViewPos; // tdf#152406 Disable anti-jitter code for scroll wheel events diff --git a/sc/source/ui/view/tabview4.cxx b/sc/source/ui/view/tabview4.cxx index a7de6bdf67..5c19b6cf07 100644 --- a/sc/source/ui/view/tabview4.cxx +++ b/sc/source/ui/view/tabview4.cxx @@ -352,16 +352,45 @@ void ScTabView::SetScrollBar( ScrollAdaptor& rScroll, tools::Long nRangeMax, too if ( nVisible == 0 ) nVisible = 1; // #i59893# don't use visible size 0 - rScroll.SetRange( Range( 0, nRangeMax ) ); - rScroll.SetVisibleSize( nVisible ); - rScroll.SetThumbPos( nPos ); + // RTL layout uses a negative range to simulate a mirrored scroll bar. + // SetScrollBar/GetScrollBarPos hide this so outside of these functions normal cell + // addresses can be used. + if ( bLayoutRTL ) + { + rScroll.SetRange( Range( -nRangeMax, 0 ) ); + rScroll.SetVisibleSize( nVisible ); + rScroll.SetThumbPos( -nPos - nVisible ); + } + else + { + rScroll.SetRange( Range( 0, nRangeMax ) ); + rScroll.SetVisibleSize( nVisible ); + rScroll.SetThumbPos( nPos ); + } - rScroll.EnableRTL( bLayoutRTL ); + // Related: tdf#93352 always disable RTL for scrollbars + // Enabling RTL causes the following bugs when clicking or + // dragging the mouse in scrollbars in Calc's RTL UI: + // - Click or drag events get mirrored so you must click or + // drag in unexpected locations to move the scrollbar thumb + // in the desired direction + // - Repeatedly dragging the scrollbar thumb leftward can only + // move no highter than the R, S, or T columns + rScroll.EnableRTL( false ); + + // Related: tdf#93352 swap arrows if layout is RTL + // We cannot use EnableRTL(true) to signal that the arrows + // should be swapped (see comment above) so explicitly enable + // or disable arrow swapping. + rScroll.SetSwapArrows( bLayoutRTL ); } -tools::Long ScTabView::GetScrollBarPos( const ScrollAdaptor& rScroll ) +tools::Long ScTabView::GetScrollBarPos( const ScrollAdaptor& rScroll, bool bLayoutRTL ) { - return rScroll.GetThumbPos(); + if ( bLayoutRTL ) + return -rScroll.GetThumbPos() - rScroll.GetVisibleSize(); + else + return rScroll.GetThumbPos(); } // UpdateScrollBars - set visible area and scroll width of scroll bars @@ -425,7 +454,7 @@ void ScTabView::UpdateScrollBars( HeaderType eHeaderType ) nVisYB = aViewData.VisibleCellsY( SC_SPLIT_BOTTOM ); tools::Long nMaxYB = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_BOTTOM), nVisYB, rDoc.MaxRow(), nStartY ); - SetScrollBar( *aVScrollBottom, nMaxYB, nVisYB, aViewData.GetPosY( SC_SPLIT_BOTTOM ) - nStartY, bLayoutRTL ); + SetScrollBar( *aVScrollBottom, nMaxYB, nVisYB, aViewData.GetPosY( SC_SPLIT_BOTTOM ) - nStartY, false ); if (bRight) { @@ -438,7 +467,7 @@ void ScTabView::UpdateScrollBars( HeaderType eHeaderType ) { nVisYT = aViewData.VisibleCellsY( SC_SPLIT_TOP ); tools::Long nMaxYT = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_TOP), nVisYT, rDoc.MaxRow(), 0 ); - SetScrollBar( *aVScrollTop, nMaxYT, nVisYT, aViewData.GetPosY( SC_SPLIT_TOP ), bLayoutRTL ); + SetScrollBar( *aVScrollTop, nMaxYT, nVisYT, aViewData.GetPosY( SC_SPLIT_TOP ), false ); } // test the range diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx index 7a6403237b..e52357f808 100644 --- a/sc/source/ui/view/viewfun3.cxx +++ b/sc/source/ui/view/viewfun3.cxx @@ -885,7 +885,8 @@ bool ScViewFunc::PasteFromClip( InsertDeleteFlags nFlags, ScDocument* pClipDoc, // undo: save all or no content InsertDeleteFlags nContFlags = InsertDeleteFlags::NONE; - if (nFlags & InsertDeleteFlags::CONTENTS) + // tdf#160765 - save content for undo when pasting notes, even if no content was changed + if (nFlags & (InsertDeleteFlags::CONTENTS | InsertDeleteFlags::ADDNOTES)) nContFlags |= InsertDeleteFlags::CONTENTS; if (nFlags & InsertDeleteFlags::ATTRIB) nContFlags |= InsertDeleteFlags::ATTRIB; |