summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/inc/markdata.hxx4
-rw-r--r--sc/source/core/data/markdata.cxx37
-rw-r--r--sc/source/ui/view/tabview2.cxx38
-rw-r--r--sc/source/ui/view/viewdata.cxx6
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 )