sc/inc/markdata.hxx              |    4 ++++
 sc/source/core/data/markdata.cxx |   37 +++++++++++++++++++++++++++++++++++++
 sc/source/ui/view/tabview2.cxx   |   38 ++++++++++++++++++++++++++++++++++++++
 sc/source/ui/view/viewdata.cxx   |    6 ++++++
 4 files changed, 85 insertions(+)

New commits:
commit c82634d5a222120b3a95cff1b950a7f7a1f5ded1
Author:     Ahmet Hakan Çelik <ahmethce...@gmail.com>
AuthorDate: Sun Jul 25 12:31:28 2021 +0300
Commit:     Heiko Tietze <heiko.tie...@documentfoundation.org>
CommitDate: Tue Feb 1 11:18:13 2022 +0100

    tdf#64345: EDITING: Selected area looses selection when switching sheet
    
    Change-Id: Idf59c3968319053431741394e2ad218d7be6463d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119478
    Tested-by: Jenkins
    Reviewed-by: Heiko Tietze <heiko.tie...@documentfoundation.org>

diff --git a/sc/inc/markdata.hxx b/sc/inc/markdata.hxx
index 69a7acfde8ab..027ca939d8df 100644
--- a/sc/inc/markdata.hxx
+++ b/sc/inc/markdata.hxx
@@ -46,6 +46,8 @@ public:
 private:
     MarkedTabsType  maTabMarked;
 
+    std::vector<std::vector<std::pair<SCTAB, ScRange>>>  maSheetsMark;
+
     ScRange         aMarkRange;             // area
     ScRange         aMultiRange;            // maximum area altogether
     ScMultiSel      aMultiSel;              // multi selection
@@ -128,6 +130,8 @@ public:
     std::vector<sc::ColRowSpan> GetMarkedRowSpans() const;
     std::vector<sc::ColRowSpan> GetMarkedColSpans() const;
 
+    std::vector<std::vector<std::pair<SCTAB, ScRange>>>& GetSheetsMark() { 
return maSheetsMark; }
+
     bool        IsColumnMarked( SCCOL nCol ) const;
     bool        IsRowMarked( SCROW nRow ) const;
     bool        IsAllMarked( const ScRange& rRange ) const;     // Multi
diff --git a/sc/source/core/data/markdata.cxx b/sc/source/core/data/markdata.cxx
index 65d1375d4c23..fd5c20cad3c3 100644
--- a/sc/source/core/data/markdata.cxx
+++ b/sc/source/core/data/markdata.cxx
@@ -28,6 +28,7 @@
 #include <columnspanset.hxx>
 #include <fstalgorithm.hxx>
 #include <unordered_map>
+#include <tabview.hxx>
 
 #include <osl/diagnose.h>
 
@@ -170,13 +171,21 @@ void ScMarkData::SetAreaTab( SCTAB nTab )
 
 void ScMarkData::SelectTable( SCTAB nTab, bool bNew )
 {
+    std::vector<std::vector<std::pair<SCTAB, ScRange>>>& 
vMark(GetSheetsMark());
+
     if ( bNew )
     {
         maTabMarked.insert( nTab );
+
+        for (auto &a : vMark)
+            if (a[0].first == nTab)
+                SetMarkArea(a[0].second);
     }
     else
     {
         maTabMarked.erase( nTab );
+        if (IsMarked())
+            ResetMark();
     }
 }
 
@@ -623,6 +632,9 @@ bool ScMarkData::HasAnyMultiMarks() const
 
 void ScMarkData::InsertTab( SCTAB nTab )
 {
+    std::vector<std::vector<std::pair<SCTAB, ScRange>>>& 
vMark(GetSheetsMark());
+    std::vector<std::pair<SCTAB, ScRange>> tempVect;
+
     std::set<SCTAB> tabMarked;
     for (const auto& rTab : maTabMarked)
     {
@@ -632,10 +644,29 @@ void ScMarkData::InsertTab( SCTAB nTab )
             tabMarked.insert(rTab + 1);
     }
     maTabMarked.swap(tabMarked);
+
+    ScRange emptScRange;
+    // update sheets mark after insert
+    for (size_t i=0; i<vMark.size(); i++)
+    {
+        if (vMark[i][0].first == nTab)
+        {
+            for (size_t k=nTab; k<vMark.size(); k++)
+                vMark[k][0].first++;
+
+            tempVect.emplace_back(i, emptScRange);
+            vMark.emplace(vMark.begin()+i, tempVect);
+            break;
+        }
+    }
+    if (IsMarked())
+        ResetMark();
 }
 
 void ScMarkData::DeleteTab( SCTAB nTab )
 {
+    std::vector<std::vector<std::pair<SCTAB, ScRange>>>& 
vMark(GetSheetsMark());
+
     std::set<SCTAB> tabMarked;
     for (const auto& rTab : maTabMarked)
     {
@@ -645,6 +676,12 @@ void ScMarkData::DeleteTab( SCTAB nTab )
             tabMarked.insert(rTab - 1);
     }
     maTabMarked.swap(tabMarked);
+
+    if (!vMark.empty())
+        vMark.clear();
+
+    if (IsMarked())
+        ResetMark();
 }
 
 void ScMarkData::ShiftCols(const ScDocument& rDoc, SCCOL nStartCol, sal_Int32 
nColOffset)
diff --git a/sc/source/ui/view/tabview2.cxx b/sc/source/ui/view/tabview2.cxx
index aae991eaf799..bf2f1603815b 100644
--- a/sc/source/ui/view/tabview2.cxx
+++ b/sc/source/ui/view/tabview2.cxx
@@ -595,6 +595,44 @@ void ScTabView::MarkCursor( SCCOL nCurX, SCROW nCurY, 
SCTAB nCurZ,
 
     if ( !bCols && !bRows )
         aHdrFunc.SetAnchorFlag( false );
+
+    std::vector<std::vector<std::pair<SCTAB, ScRange>>>& 
vMark(rMark.GetSheetsMark());
+    std::vector<std::pair<SCTAB, ScRange>> tempVect;
+
+    bool bFound = false;
+    for (size_t i=0; i<vMark.size(); i++)
+    {
+        if (vMark[i][0].first == nCurZ)
+        {
+            vMark[i][0].second = aMarkRange;
+            bFound = true;
+            break;
+        }
+    }
+
+    if (!bFound)
+    {
+        tempVect.emplace_back(nCurZ, aMarkRange);
+        vMark.emplace_back(tempVect);
+    }
+
+    // Sorting sheets
+    if (vMark.size() > 2)
+    {
+        for (size_t k=0; k<vMark.size()-1; k++)
+        {
+            auto rFirst = vMark[k];
+            for (size_t j=k; j<vMark.size(); j++)
+            {
+                auto rSecond = vMark[j];
+                if (rSecond[0].first < rFirst[0].first)
+                {
+                    vMark[k] = rSecond;
+                    vMark[j] = rFirst;
+                }
+            }
+        }
+    }
 }
 
 void ScTabView::GetPageMoveEndPosition(SCCOL nMovX, SCROW nMovY, SCCOL& 
rPageX, SCROW& rPageY)
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index 539013b79372..0ee8ef57d91e 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -940,6 +940,8 @@ void ScViewData::DeleteTabs( SCTAB nTab, SCTAB nSheets )
 
 void ScViewData::CopyTab( SCTAB nSrcTab, SCTAB nDestTab )
 {
+    std::vector<std::vector<std::pair<SCTAB, ScRange>>>& 
vMark(maMarkData.GetSheetsMark());
+
     if (nDestTab==SC_TAB_APPEND)
         nDestTab = mrDoc.GetTableCount() - 1;   // something had to have been 
copied
 
@@ -961,6 +963,10 @@ void ScViewData::CopyTab( SCTAB nSrcTab, SCTAB nDestTab )
 
     UpdateCurrentTab();
     maMarkData.InsertTab(nDestTab);
+
+    if (!vMark.empty())
+        vMark.clear();
+
 }
 
 void ScViewData::MoveTab( SCTAB nSrcTab, SCTAB nDestTab )

Reply via email to