fdo#73606: Avoid excessive and unnecessary heap allocation of array objects.

This is a leftover from the 1 million row conversion we did years ago.

Change-Id: Ib50819ed51c7017bcc559bfc8b6062ff46615d09
diff --git a/sc/inc/columnspanset.hxx b/sc/inc/columnspanset.hxx
index 98533e2..62e96a8 100644
--- a/sc/inc/columnspanset.hxx
+++ b/sc/inc/columnspanset.hxx
@@ -25,6 +25,14 @@ namespace sc {

struct ColumnBlockConstPosition;

struct RowSpan
{
    SCROW mnRow1;
    SCROW mnRow2;

    RowSpan(SCROW nRow1, SCROW nRow2);
};

/**
 * Structure that stores segments of boolean flags per column, and perform
 * custom action on those segments.
@@ -85,15 +93,7 @@ class SingleColumnSpanSet
public:
    typedef mdds::flat_segment_tree<SCROW, bool> ColumnSpansType;

    struct Span
    {
        SCROW mnRow1;
        SCROW mnRow2;

        Span(SCROW nRow1, SCROW nRow2) : mnRow1(nRow1), mnRow2(nRow2) {}
    };

    typedef std::vector<Span> SpansType;
    typedef std::vector<RowSpan> SpansType;

    SingleColumnSpanSet();

diff --git a/sc/inc/markdata.hxx b/sc/inc/markdata.hxx
index 75937ed..943419d 100644
--- a/sc/inc/markdata.hxx
+++ b/sc/inc/markdata.hxx
@@ -26,6 +26,12 @@

#include <set>

namespace sc {

struct RowSpan;

}

class ScMarkArray;
class ScRangeList;

@@ -103,6 +109,8 @@ public:
    SCCOLROW    GetMarkColumnRanges( SCCOLROW* pRanges );
    SCCOLROW    GetMarkRowRanges( SCCOLROW* pRanges );

    void GetMarkedRowSpans( SCTAB nTab, std::vector<sc::RowSpan>& rSpans );

    bool        IsColumnMarked( SCCOL nCol ) const;
    bool        IsRowMarked( SCROW nRow ) const;
    bool        IsAllMarked( const ScRange& rRange ) const;     // Multi
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 4d7b4bf..bea9179 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -618,7 +618,7 @@ sal_uInt16 ScColumn::GetOptimalColWidth(
    }
    else
        // "Select" the entire column if no selection exists.
        aMarkedSpans.push_back(sc::SingleColumnSpanSet::Span(0, MAXROW));
        aMarkedSpans.push_back(sc::RowSpan(0, MAXROW));

    sal_uInt16 nWidth = static_cast<sal_uInt16>(nOldWidth*nPPTX);
    bool bFound = false;
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 850a904..7675271 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -198,7 +198,7 @@ public:
        mrDoc(rDoc),
        maHint(SC_HINT_DATACHANGED, ScAddress(nCol, 0, nTab)) {}

    void operator() (const sc::SingleColumnSpanSet::Span& rSpan)
    void operator() (const sc::RowSpan& rSpan)
    {
        SCROW nRow1 = rSpan.mnRow1, nRow2 = rSpan.mnRow2;
        maHint.GetAddress().SetRow(nRow1);
@@ -556,7 +556,7 @@ public:
    EmptyCells(sc::ColumnBlockPosition& rPos, ScColumn& rColumn) :
        mrColumn(rColumn), mrPos(rPos) {}

    void operator() (const sc::SingleColumnSpanSet::Span& rSpan)
    void operator() (const sc::RowSpan& rSpan)
    {
        sc::CellStoreType& rCells = mrColumn.GetCellStore();

@@ -651,7 +651,7 @@ bool ScColumn::InitBlockPosition( sc::ColumnBlockConstPosition& rBlockPos ) cons

namespace {

class CopyAttrArrayByRange : std::unary_function<sc::SingleColumnSpanSet::Span, void>
class CopyAttrArrayByRange : std::unary_function<sc::RowSpan, void>
{
    ScAttrArray& mrDestAttrArray;
    ScAttrArray& mrSrcAttrArray;
@@ -660,7 +660,7 @@ public:
    CopyAttrArrayByRange(ScAttrArray& rDestAttrArray, ScAttrArray& rSrcAttrArray, long nRowOffset) :
        mrDestAttrArray(rDestAttrArray), mrSrcAttrArray(rSrcAttrArray), mnRowOffset(nRowOffset) {}

    void operator() (const sc::SingleColumnSpanSet::Span& rSpan)
    void operator() (const sc::RowSpan& rSpan)
    {
        mrDestAttrArray.CopyAreaSafe(
            rSpan.mnRow1+mnRowOffset, rSpan.mnRow2+mnRowOffset, mnRowOffset, mrSrcAttrArray);
diff --git a/sc/source/core/data/columnspanset.cxx b/sc/source/core/data/columnspanset.cxx
index f8c7813..efa51b5 100644
--- a/sc/source/core/data/columnspanset.cxx
+++ b/sc/source/core/data/columnspanset.cxx
@@ -20,6 +20,8 @@

namespace sc {

RowSpan::RowSpan(SCROW nRow1, SCROW nRow2) : mnRow1(nRow1), mnRow2(nRow2) {}

ColumnSpanSet::ColumnType::ColumnType(SCROW nStart, SCROW nEnd, bool bInit) :
    maSpans(nStart, nEnd+1, bInit), miPos(maSpans.begin()) {}

@@ -270,7 +272,7 @@ void SingleColumnSpanSet::getSpans(SpansType& rSpans) const
        bool bThisVal = it->second;

        if (bLastVal)
            aSpans.push_back(Span(nLastRow, nThisRow-1));
            aSpans.push_back(RowSpan(nLastRow, nThisRow-1));

        nLastRow = nThisRow;
        bLastVal = bThisVal;
diff --git a/sc/source/core/data/markdata.cxx b/sc/source/core/data/markdata.cxx
index a4232f8..556df50 100644
--- a/sc/source/core/data/markdata.cxx
+++ b/sc/source/core/data/markdata.cxx
@@ -20,6 +20,7 @@
#include "markdata.hxx"
#include "markarr.hxx"
#include "rangelst.hxx"
#include <columnspanset.hxx>

// STATIC DATA -----------------------------------------------------------

@@ -547,6 +548,26 @@ SCCOLROW ScMarkData::GetMarkRowRanges( SCCOLROW* pRanges )
    return nRangeCnt;
}

void ScMarkData::GetMarkedRowSpans( SCTAB nTab, std::vector<sc::RowSpan>& rSpans )
{
    std::vector<sc::RowSpan> aSpans;

    if (bMarked)
        MarkToMulti();

    if (!bMultiMarked)
    {
        rSpans.swap(aSpans);
        return;
    }

    sc::SingleColumnSpanSet aMarkedRows;
    for (SCCOL nCol = aMultiRange.aStart.Col(); nCol <= aMultiRange.aEnd.Col(); ++nCol)
        aMarkedRows.scan(*this, nTab, nCol);

    aMarkedRows.getSpans(rSpans);
}

bool ScMarkData::IsAllMarked( const ScRange& rRange ) const
{
    if ( !bMultiMarked )
diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx
index 69658f2..fb07797 100644
--- a/sc/source/ui/view/viewfun2.cxx
+++ b/sc/source/ui/view/viewfun2.cxx
@@ -81,6 +81,7 @@
#include "prnsave.hxx"
#include "searchresults.hxx"
#include "tokenarray.hxx"
#include <columnspanset.hxx>

#include <boost/scoped_ptr.hpp>
#include <vector>
@@ -107,12 +108,12 @@ sal_Bool ScViewFunc::AdjustBlockHeight( sal_Bool bPaint, ScMarkData* pMarkData )
        pMarkData = &GetViewData()->GetMarkData();

    ScDocument* pDoc = pDocSh->GetDocument();
    SCCOLROW* pRanges = new SCCOLROW[MAXCOLROWCOUNT];
    SCCOLROW nRangeCnt = pMarkData->GetMarkRowRanges( pRanges );
    if (nRangeCnt == 0)
    std::vector<sc::RowSpan> aMarkedRows;
    pMarkData->GetMarkedRowSpans(GetViewData()->GetTabNo(), aMarkedRows);
    if (aMarkedRows.empty())
    {
        pRanges[0] = pRanges[1] = GetViewData()->GetCurY();
        nRangeCnt = 1;
        SCROW nCurRow = GetViewData()->GetCurY();
        aMarkedRows.push_back(sc::RowSpan(nCurRow, nCurRow));
    }

    double nPPTX = GetViewData()->GetPPTX();
@@ -133,26 +134,25 @@ sal_Bool ScViewFunc::AdjustBlockHeight( sal_Bool bPaint, ScMarkData* pMarkData )
    for (; itr != itrEnd; ++itr)
    {
        SCTAB nTab = *itr;
        SCCOLROW* pOneRange = pRanges;
        sal_Bool bChanged = false;
        bool bChanged = false;
        SCROW nPaintY = 0;
        for (SCROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
        std::vector<sc::RowSpan>::const_iterator itRows = aMarkedRows.begin(), itRowsEnd = aMarkedRows.end();
        for (; itRows != itRowsEnd; ++itRows)
        {
            SCROW nStartNo = *(pOneRange++);
            SCROW nEndNo = *(pOneRange++);
            SCROW nStartNo = itRows->mnRow1;
            SCROW nEndNo = itRows->mnRow2;
            if (pDoc->SetOptimalHeight( nStartNo, nEndNo, nTab, 0, aProv.GetDevice(),
                                        nPPTX, nPPTY, aZoomX, aZoomY, false ))
            {
                if (!bChanged)
                    nPaintY = nStartNo;
                bAnyChanged = bChanged = sal_True;
                bAnyChanged = bChanged = true;
            }
        }
        if ( bPaint && bChanged )
            pDocSh->PostPaint( 0, nPaintY, nTab, MAXCOL, MAXROW, nTab,
                                                PAINT_GRID | PAINT_LEFT );
    }
    delete[] pRanges;

    if ( bPaint && bAnyChanged )
        pDocSh->UpdateOle(GetViewData());
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 089024a..b967526 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -2905,7 +2905,7 @@ void ScViewFunc::UpdateSelectionArea( const ScMarkData& rSel, ScPatternAttr* pAt
        PAINT_GRID, nExtFlags | SC_PF_TESTMERGE );
    ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
    pTabViewShell->CellContentChanged();
    pTabViewShell->AdjustBlockHeight(true, const_cast<ScMarkData*>(&rSel));
    pTabViewShell->AdjustBlockHeight(false, const_cast<ScMarkData*>(&rSel));
}