diff options
author | Ahmet Hakan Çelik <ahmethcelik@gmail.com> | 2021-07-25 12:31:28 +0300 |
---|---|---|
committer | Heiko Tietze <heiko.tietze@documentfoundation.org> | 2022-02-01 11:18:13 +0100 |
commit | c82634d5a222120b3a95cff1b950a7f7a1f5ded1 (patch) | |
tree | 574994061b9be010a0ede1ed40c4a5621d4ca716 /sc | |
parent | ddaebfb270c4b52ddebaf678a9352312c75247fa (diff) |
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.tietze@documentfoundation.org>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/markdata.hxx | 4 | ||||
-rw-r--r-- | sc/source/core/data/markdata.cxx | 37 | ||||
-rw-r--r-- | sc/source/ui/view/tabview2.cxx | 38 | ||||
-rw-r--r-- | sc/source/ui/view/viewdata.cxx | 6 |
4 files changed, 85 insertions, 0 deletions
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 ) |