27 #include <document.hxx>
30 #include <unordered_map>
32 #include <osl/diagnose.h>
34 #include <mdds/flat_segment_tree.hpp>
40 aMultiSel(rSheetLimits),
41 mrSheetLimits(rSheetLimits)
205 OSL_FAIL(
"GetFirstSelected: nothing selected");
214 OSL_FAIL(
"GetLastSelected: nothing selected");
260 SCROW nStartRow, nEndRow;
264 SCROW nCmpStart, nCmpEnd;
265 for (
SCCOL nCol=nStartCol+1; nCol<=nEndCol && bOk; nCol++)
267 || nCmpStart != nStartRow || nCmpEnd != nEndRow )
345 const ScRange& rRange = rList[ 0 ];
351 for (
size_t i=0;
i < nCount;
i++)
364 : aMultiSel(rLimits),
365 mrSheetLimits(rLimits)
369 for (
const ScRange& rRange : rList)
372 if (rList.size() > 1)
379 else if (rList.size() == 1)
381 const ScRange& rRange = rList[ 0 ];
403 for (
SCCOL nCol=nStartCol; nCol<=nEndCol; nCol++)
412 SCCOL nToCol = nCol+1;
413 for ( ; nToCol <= nEndCol; ++nToCol)
419 ScRange aRange( nCol, 0, nTab, nToCol, 0, nTab );
422 while ( aMultiIter.
Next( nTop, nBottom ) )
426 pList->
Join( aRange );
481 typedef mdds::flat_segment_tree<SCCOLROW, bool> SpansType;
485 SpansType::const_iterator itPos = aSpans.begin();
487 for (
size_t i = 0,
n = aRanges.
size();
i <
n; ++
i)
493 return sc::toSpanArray<SCCOLROW,sc::ColRowSpan>(aSpans);
506 typedef mdds::flat_segment_tree<SCCOLROW, bool> SpansType;
508 SpansType::const_iterator itPos = aSpans.begin();
513 itPos = aSpans.insert(itPos, nStartCol, nEndCol+1,
true).first;
520 for (
SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol)
523 if (pMultiArray && pMultiArray->
HasMarks())
524 itPos = aSpans.insert(itPos, nCol, nCol+1,
true).first;
532 return sc::toSpanArray<SCCOLROW,sc::ColRowSpan>(aSpans);
538 std::vector<sc::ColRowSpan> aVec;
541 aVec.emplace_back( nStartCol, nEndCol);
545 for (
SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol)
548 if (pMultiArray && pMultiArray->
HasMarks())
559 aVec.push_back( aSpan);
566 aVec.push_back( aSpan);
572 std::vector<sc::ColRowSpan> aVec;
594 for (
SCCOL nCol=nStartCol; nCol<=nEndCol && bOk; nCol++)
627 std::set<SCTAB> tabMarked;
631 tabMarked.insert(rTab);
633 tabMarked.insert(rTab + 1);
635 maTabMarked.swap(tabMarked);
640 std::set<SCTAB> tabMarked;
644 tabMarked.insert(rTab);
645 else if (rTab > nTab)
646 tabMarked.insert(rTab - 1);
648 maTabMarked.swap(tabMarked);
685 if ( nStartCol < rRangeDest.
aStart.
Col() )
687 if ( nStartRow < rRangeDest.
aStart.
Row() )
689 if ( nEndCol > rRangeDest.
aEnd.
Col() )
691 if ( nEndRow > rRangeDest.
aEnd.
Row() )
702 nStartCol = ( nStartCol == 0 ) ? nStartCol : nStartCol - 1;
704 std::unique_ptr<ScFlatBoolRowSegments> pPrevColMarkedRows;
705 std::unique_ptr<ScFlatBoolRowSegments> pCurColMarkedRows;
706 std::unordered_map<SCROW,ScFlatBoolColSegments> aRowToColSegmentsInTopEnvelope;
707 std::unordered_map<SCROW,ScFlatBoolColSegments> aRowToColSegmentsInBottomEnvelope;
711 bool bPrevColUnMarked =
false;
713 for (
SCCOL nCol=nStartCol; nCol <= nEndCol; nCol++ )
717 if ( !bCurColUnMarked )
723 pPrevColMarkedRows ? *pPrevColMarkedRows
726 pPrevColMarkedRows ? *pPrevColMarkedRows
728 SCROW nTopPrev = 0, nBottomPrev = 0;
729 while ( aMultiIter.
Next( nTop, nBottom ) )
731 pCurColMarkedRows->setTrue( nTop, nBottom );
732 if( bPrevColUnMarked && ( nCol > nStartCol ))
739 else if( nCol > nStartCol )
741 SCROW nTop1 = nTop, nBottom1 = nTop;
742 while( nTop1 <= nBottom && nBottom1 <= nBottom )
744 bool bRangeMarked =
false;
745 const bool bHasValue = aPrevItr.
getValue( nTop1, bRangeMarked );
755 if( nBottom1 > nBottom )
764 while( nTopPrev <= nBottom && nBottomPrev <= nBottom )
767 const bool bHasValue = aPrevItr1.
getValue( nTopPrev, bRangeMarked );
772 if( nTopPrev < nTop )
774 if( nBottomPrev >= nTop )
776 nBottomPrev = nTop - 1;
781 nTopPrev = nBottomPrev = (nBottom + 1);
789 nTopPrev = ++nBottomPrev;
793 nTopPrev = nBottomPrev = ( nBottom + 1 );
798 nTopPrev = ++nBottomPrev;
807 auto it = aRowToColSegmentsInTopEnvelope.find(nTop - 1);
808 if (it == aRowToColSegmentsInTopEnvelope.end())
810 it->second.setTrue( nCol, nCol );
817 auto it = aRowToColSegmentsInBottomEnvelope.find(nBottom + 1);
818 if (it == aRowToColSegmentsInBottomEnvelope.end())
820 it->second.setTrue( nCol, nCol );
827 const bool bHasValue = aPrevItr1.
getValue( nTopPrev, bRangeMarked );
836 nTopPrev = ++nBottomPrev;
841 nTopPrev = ++nBottomPrev;
845 else if( nCol > nStartCol )
847 bPrevColUnMarked =
true;
848 SCROW nTopPrev = 0, nBottomPrev = 0;
849 bool bRangeMarked =
false;
851 pPrevColMarkedRows ? *pPrevColMarkedRows : aNoRowsMarked);
854 const bool bHasValue = aPrevItr.
getValue(nTopPrev, bRangeMarked);
863 nTopPrev = ++nBottomPrev;
868 nTopPrev = ++nBottomPrev;
872 if ( bCurColUnMarked )
873 pPrevColMarkedRows.reset();
875 pPrevColMarkedRows = std::move( pCurColMarkedRows );
877 for(
auto& rKV : aRowToColSegmentsInTopEnvelope )
879 SCCOL nStart = nStartCol;
881 while( nStart <= nEndCol )
883 if( !rKV.second.getRangeData( nStart, aRange ) )
888 nStart = aRange.
mnCol2 + 1;
891 for(
auto& rKV : aRowToColSegmentsInBottomEnvelope )
893 SCCOL nStart = nStartCol;
895 while( nStart <= nEndCol )
897 if( !rKV.second.getRangeData( nStart, aRange ) )
902 nStart = aRange.
mnCol2 + 1;
909 SCROW nRow1, nRow2, nRow1New, nRow2New;
910 SCCOL nCol1, nCol2, nCol1New, nCol2New;
938 rRange =
ScRange( nCol1New, nRow1New, nTab1, nCol2New, nRow2New, nTab2 );
SCROW GetNextMarked(SCCOL nCol, SCROW nRow, bool bUp) const
May return -1.
void SetMarkArea(SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow, bool bMark)
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
const ScSheetLimits & mrSheetLimits
bool HasOneMark(SCCOL nCol, SCROW &rStartRow, SCROW &rEndRow) const
void SetMultiMarkArea(const ScRange &rRange, bool bMark=true, bool bSetupMulti=false)
void ShiftRows(SCROW nStartRow, sal_Int32 nRowOffset)
bool getValue(SCROW nPos, bool &rVal)
bool setFalse(SCROW nRow1, SCROW nRow2)
std::vector< sc::ColRowSpan > GetMarkedRowSpans() const
void FillRangeListWithMarks(ScRangeList *pList, bool bClear, SCTAB nForTab=-1) const
Create a range list of marks.
const ScMarkArray * GetMultiSelArray(SCCOL nCol) const
void MarkFromRangeList(const ScRangeList &rList, bool bReset)
bool IsCellMarked(SCCOL nCol, SCROW nRow, bool bNoSimple=false) const
void GetMarkArea(ScRange &rRange) const
bool Next(SCROW &rTop, SCROW &rBottom)
bool HasMarks(SCCOL nCol) const
void DeleteTab(SCTAB nTab)
SC_DLLPUBLIC void IncColIfNotLessThan(const ScDocument &rDoc, SCCOL nStartCol, SCCOL nOffset)
bool GetMark(SCCOL nCol, SCROW nRow) const
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
This is a rather odd datastructure.
void ShiftCols(SCCOL nStartCol, sal_Int32 nColOffset)
SCTAB GetSelectCount() const
void SetAreaTab(SCTAB nTab)
void push_back(const ScRange &rRange)
bool IsRowMarked(SCROW nRow) const
static void lcl_AddRanges(ScRange &rRangeDest, const ScRange &rNewRange)
void PutInOrder(T &nStart, T &nEnd)
bool IsRowMarked(SCROW nRow) const
void SetMarkArea(const ScRange &rRange)
bool IsColumnMarked(SCCOL nCol) const
void ExtendRangeListTables(ScRangeList *pList) const
void GetSelectionCover(ScRange &rRange)
const SCROW mnMaxRow
Maximum addressable column.
SCROW GetNextMarked(SCCOL nCol, SCROW nRow, bool bUp) const
void SelectTable(SCTAB nTab, bool bNew)
void ShiftCols(const ScDocument &rDoc, SCCOL nStartCol, sal_Int32 nColOffset)
void SelectOneTable(SCTAB nTab)
ScMarkArray GetMarkArray(SCCOL nCol) const
ScMarkData & operator=(const ScMarkData &rData)
bool HasEqualRowsMarked(SCCOL nCol1, SCCOL nCol2) const
std::set< SCTAB >::iterator iterator
SC_DLLPUBLIC void IncRowIfNotLessThan(const ScDocument &rDoc, SCROW nStartRow, SCROW nOffset)
const ScMarkArray & GetRowSelArray() const
void InsertTab(SCTAB nTab)
void GetVars(SCCOL &nCol1, SCROW &nRow1, SCTAB &nTab1, SCCOL &nCol2, SCROW &nRow2, SCTAB &nTab2) const
ScRangeList aLeftEnvelope
std::set< SCTAB >::const_iterator const_iterator
SC_DLLPUBLIC void PutInOrder()
ScRangeList aBottomEnvelope
void Join(const ScRange &, bool bIsInList=false)
void ShiftRows(const ScDocument &rDoc, SCROW nStartRow, sal_Int32 nRowOffset)
MarkedTabsType maTabMarked
SCTAB GetFirstSelected() const
ScMarkArray GetMarkArray(SCCOL nCol) const
SCTAB GetLastSelected() const
bool IsRowRangeMarked(SCROW nStartRow, SCROW nEndRow) const
ScRangeList GetMarkedRangesForTab(SCTAB nTab) const
Get marked ranges with sheet-tab set to nTab.
bool IsAllMarked(SCCOL nCol, SCROW nStartRow, SCROW nEndRow) const
std::set< SCTAB >::const_reverse_iterator const_reverse_iterator
bool HasAnyMultiMarks() const
ScRangeList GetMarkedRanges() const
ScRangeList aRightEnvelope
void GetMultiMarkArea(ScRange &rRange) const
ScMarkData(const ScSheetLimits &rSheetLimits)
void Set(ScRangeList const &)
optimised init-from-range-list.
bool GetTableSelect(SCTAB nTab) const
std::vector< sc::ColRowSpan > GetMarkedColSpans() const
constexpr OUStringLiteral first
std::set< SCTAB > MarkedTabsType
const_reverse_iterator rbegin() const
bool IsAllMarked(const ScRange &rRange) const
bool HasMultiMarks(SCCOL nCol) const
void SetSelectedTabs(const MarkedTabsType &rTabs)