sc/source/ui/inc/tabview.hxx    |    2 +-
 sc/source/ui/undo/undoblk.cxx   |    4 ++--
 sc/source/ui/undo/undoutil.cxx  |    6 +++---
 sc/source/ui/unoobj/viewuno.cxx |    2 +-
 sc/source/ui/view/dbfunc3.cxx   |    6 +++---
 sc/source/ui/view/tabview2.cxx  |   14 +++++++-------
 sc/source/ui/view/tabview3.cxx  |    6 ++++--
 sc/source/ui/view/viewfun2.cxx  |    4 ++--
 sc/source/ui/view/viewfun3.cxx  |    4 ++--
 sc/source/ui/view/viewfunc.cxx  |    7 ++++---
 10 files changed, 29 insertions(+), 26 deletions(-)

New commits:
commit 7055ad90927d0d2e0dc5eab3774322e386fe2b15
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Sun Jan 30 00:56:48 2022 +0100
Commit:     Eike Rathke <er...@redhat.com>
CommitDate: Sun Jan 30 03:08:08 2022 +0100

    Resolves: tdf#146994 InitOwnBlockMode() with current mark range or cursor 
pos
    
    This sets specifically the end position to the correct value. The
    start position and dependent logic if meBlockMode==Own is
    re-initialized in MarkCursor() via InitBlockMode(). Unfortunately
    that (calling MarkCursor()) happens after the end position was
    incremented in ExpandBlock(), previous with the wrong values.
    
    This new own block mode init now also makes it possible to
    expand/shrink the marked range after a paste or undo/redo, as it
    would be expected for any existing selection.
    
    Change-Id: Id26e4aa32896ec0c714e33b99dbf6702df144995
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129158
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins

diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx
index 0bdc143d3e62..81151f10fe48 100644
--- a/sc/source/ui/inc/tabview.hxx
+++ b/sc/source/ui/inc/tabview.hxx
@@ -521,7 +521,7 @@ public:
     void            InitBlockMode( SCCOL nCurX, SCROW nCurY, SCTAB nCurZ,
                                    bool bTestNeg = false,
                                    bool bCols = false, bool bRows = false, 
bool bForceNeg = false );
-    void            InitOwnBlockMode();
+    void            InitOwnBlockMode( const ScRange& rMarkRange );
     void            DoneBlockMode( bool bContinue = false );
 
     bool            IsBlockMode() const;
diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx
index be93e37bd35f..998330bfe632 100644
--- a/sc/source/ui/undo/undoblk.cxx
+++ b/sc/source/ui/undo/undoblk.cxx
@@ -1690,7 +1690,7 @@ void ScUndoUseScenario::Undo()
     if (pViewShell)
     {
         pViewShell->DoneBlockMode();
-        pViewShell->InitOwnBlockMode();
+        pViewShell->InitOwnBlockMode( aRange );
     }
 
     ScDocument& rDoc = pDocShell->GetDocument();
@@ -1747,7 +1747,7 @@ void ScUndoUseScenario::Redo()
     {
         pViewShell->SetTabNo( nTab );
         pViewShell->DoneBlockMode();
-        pViewShell->InitOwnBlockMode();
+        pViewShell->InitOwnBlockMode( aRange );
     }
 
     pDocShell->UseScenario( nTab, aName, false );
diff --git a/sc/source/ui/undo/undoutil.cxx b/sc/source/ui/undo/undoutil.cxx
index fc0e71b69db5..de9a50ef8283 100644
--- a/sc/source/ui/undo/undoutil.cxx
+++ b/sc/source/ui/undo/undoutil.cxx
@@ -43,11 +43,11 @@ void ScUndoUtil::MarkSimpleBlock( const ScDocShell* 
pDocShell,
     if ( nViewTab < nStartZ || nViewTab > nEndZ )
         pViewShell->SetTabNo( nStartZ );
 
+    const ScRange aMarkRange( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ);
     pViewShell->DoneBlockMode();
     pViewShell->MoveCursorAbs( nStartX, nStartY, SC_FOLLOW_JUMP, false, false 
);
-    pViewShell->InitOwnBlockMode();
-    pViewShell->GetViewData().GetMarkData().
-            SetMarkArea( ScRange( nStartX, nStartY, nStartZ, nEndX, nEndY, 
nEndZ ) );
+    pViewShell->InitOwnBlockMode( aMarkRange );
+    pViewShell->GetViewData().GetMarkData().SetMarkArea( aMarkRange );
     pViewShell->MarkDataChanged();
 }
 
diff --git a/sc/source/ui/unoobj/viewuno.cxx b/sc/source/ui/unoobj/viewuno.cxx
index e933830534d3..5c6d599dd74f 100644
--- a/sc/source/ui/unoobj/viewuno.cxx
+++ b/sc/source/ui/unoobj/viewuno.cxx
@@ -724,7 +724,7 @@ sal_Bool SAL_CALL ScTabViewObj::select( const uno::Any& 
aSelection )
                 if ( !lcl_TabInRanges( rViewData.GetTabNo(), rRanges ) )
                     pViewSh->SetTabNo( rFirst.aStart.Tab() );
                 pViewSh->DoneBlockMode();
-                pViewSh->InitOwnBlockMode();
+                pViewSh->InitOwnBlockMode( rFirst );    /* TODO: or even the 
overall range? */
                 rViewData.GetMarkData().MarkFromRangeList( rRanges, true );
                 pViewSh->MarkDataChanged();
                 rViewData.GetDocShell()->PostPaintGridAll();   // Marks 
(old&new)
diff --git a/sc/source/ui/view/dbfunc3.cxx b/sc/source/ui/view/dbfunc3.cxx
index 29479c7ef78f..517734290d16 100644
--- a/sc/source/ui/view/dbfunc3.cxx
+++ b/sc/source/ui/view/dbfunc3.cxx
@@ -587,10 +587,10 @@ void ScDBFunc::DoSubTotals( const ScSubTotalParam& 
rParam, bool bRecord,
     pDBData->SetArea( nTab, aNewParam.nCol1,aNewParam.nRow1, 
aNewParam.nCol2,aNewParam.nRow2 );
     rDoc.CompileDBFormula();
 
+    const ScRange aMarkRange( aNewParam.nCol1, aNewParam.nRow1, nTab, 
aNewParam.nCol2, aNewParam.nRow2, nTab);
     DoneBlockMode();
-    InitOwnBlockMode();
-    rMark.SetMarkArea( ScRange( aNewParam.nCol1,aNewParam.nRow1,nTab,
-                                aNewParam.nCol2,aNewParam.nRow2,nTab ) );
+    InitOwnBlockMode( aMarkRange );
+    rMark.SetMarkArea( aMarkRange );
     MarkDataChanged();
 
     pDocSh->PostPaint(ScRange(0, 0, nTab, rDoc.MaxCol(), rDoc.MaxRow(), nTab),
diff --git a/sc/source/ui/view/tabview2.cxx b/sc/source/ui/view/tabview2.cxx
index ecfcd036c750..aae991eaf799 100644
--- a/sc/source/ui/view/tabview2.cxx
+++ b/sc/source/ui/view/tabview2.cxx
@@ -329,7 +329,7 @@ bool ScTabView::IsMarking( SCCOL nCol, SCROW nRow, SCTAB 
nTab ) const
         && nBlockStartZ == nTab;
 }
 
-void ScTabView::InitOwnBlockMode()
+void ScTabView::InitOwnBlockMode( const ScRange& rMarkRange )
 {
     if (IsBlockMode())
         return;
@@ -340,12 +340,12 @@ void ScTabView::InitOwnBlockMode()
         GetSelEngine()->CursorPosChanging( false, false );
 
     meBlockMode = Own;
-    nBlockStartX = 0;
-    nBlockStartY = 0;
-    nBlockStartZ = 0;
-    nBlockEndX = 0;
-    nBlockEndY = 0;
-    nBlockEndZ = 0;
+    nBlockStartX = rMarkRange.aStart.Col();
+    nBlockStartY = rMarkRange.aStart.Row();
+    nBlockStartZ = rMarkRange.aStart.Tab();
+    nBlockEndX = rMarkRange.aEnd.Col();
+    nBlockEndY = rMarkRange.aEnd.Row();
+    nBlockEndZ = rMarkRange.aEnd.Tab();
 
     SelectionChanged();     // status is checked with mark set
 }
diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx
index 7e6fec2f93f1..4471b3662c35 100644
--- a/sc/source/ui/view/tabview3.cxx
+++ b/sc/source/ui/view/tabview3.cxx
@@ -1241,7 +1241,7 @@ void ScTabView::MoveCursorAbs( SCCOL nCurX, SCROW nCurY, 
ScFollowMode eMode,
             {
                 rMark.ResetMark();
                 DoneBlockMode();
-                InitOwnBlockMode();
+                InitOwnBlockMode( ScRange( nCurX, nCurY, 
aViewData.GetTabNo()));
                 MarkDataChanged();
             }
         }
@@ -1737,7 +1737,9 @@ void ScTabView::Unmark()
 void ScTabView::SetMarkData( const ScMarkData& rNew )
 {
     DoneBlockMode();
-    InitOwnBlockMode();
+    ScRange aMarkArea( ScAddress::UNINITIALIZED );
+    rNew.GetMarkArea( aMarkArea );
+    InitOwnBlockMode( aMarkArea );
     aViewData.GetMarkData() = rNew;
 
     MarkDataChanged();
diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx
index fd19f833540d..49b8fc14f30f 100644
--- a/sc/source/ui/view/viewfun2.cxx
+++ b/sc/source/ui/view/viewfun2.cxx
@@ -2008,7 +2008,7 @@ bool ScViewFunc::SearchAndReplace( const SvxSearchItem* 
pSearchItem,
     }
 
     DoneBlockMode(true);                // don't delete mark
-    InitOwnBlockMode();
+    InitOwnBlockMode( ScRange( nCol, nRow, nStartTab, nCol, nRow, nEndTab));
 
     //  If search starts at the beginning don't ask again whether it shall 
start at the beginning
     bool bFirst = true;
@@ -2359,7 +2359,7 @@ void ScViewFunc::UseScenario( const OUString& rName )
     SCTAB       nTab    = GetViewData().GetTabNo();
 
     DoneBlockMode();
-    InitOwnBlockMode();
+    InitOwnBlockMode( ScRange( GetViewData().GetCurX(), 
GetViewData().GetCurY(), nTab));
     pDocSh->UseScenario( nTab, rName );
 }
 
diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx
index 679557d020b4..5d080719c3e3 100644
--- a/sc/source/ui/view/viewfun3.cxx
+++ b/sc/source/ui/view/viewfun3.cxx
@@ -111,7 +111,7 @@ void ScViewFunc::CutToClip()
         if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )          // mark 
the range if not marked yet
         {
             DoneBlockMode();
-            InitOwnBlockMode();
+            InitOwnBlockMode( aRange );
             rMark.SetMarkArea( aRange );
             MarkDataChanged();
         }
@@ -1270,7 +1270,7 @@ bool ScViewFunc::PasteFromClip( InsertDeleteFlags nFlags, 
ScDocument* pClipDoc,
     if (GetViewData().IsActive())
     {
         DoneBlockMode();
-        InitOwnBlockMode();
+        InitOwnBlockMode( aUserRange );
     }
     rMark.SetMarkArea( aUserRange );
     MarkDataChanged();
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 8d444122a7ed..a9a2b36d6349 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -1063,7 +1063,7 @@ void ScViewFunc::ApplyPatternLines( const ScPatternAttr& 
rAttr, const SvxBoxItem
         aMarkRange = ScRange( GetViewData().GetCurX(),
                             GetViewData().GetCurY(), GetViewData().GetTabNo() 
);
         DoneBlockMode();
-        InitOwnBlockMode();
+        InitOwnBlockMode( aMarkRange );
         aFuncMark.SetMarkArea(aMarkRange);
         MarkDataChanged();
     }
@@ -2366,9 +2366,10 @@ void ScViewFunc::SetMarkedWidthOrHeight( bool bWidth, 
ScSizeMode eMode, sal_uInt
         SCCOL nCol = GetViewData().GetCurX();
         SCROW nRow = GetViewData().GetCurY();
         SCTAB nTab = GetViewData().GetTabNo();
+        const ScRange aMarkRange( nCol, nRow, nTab);
         DoneBlockMode();
-        InitOwnBlockMode();
-        rMark.SetMultiMarkArea( ScRange( nCol,nRow,nTab ) );
+        InitOwnBlockMode( aMarkRange );
+        rMark.SetMultiMarkArea( aMarkRange );
         MarkDataChanged();
     }
 

Reply via email to