sc/inc/document.hxx | 7 +++++++ sc/inc/table.hxx | 2 ++ sc/source/core/data/document.cxx | 9 +++++++++ sc/source/core/data/formulacell.cxx | 18 ++++++++++++++++++ sc/source/core/data/table1.cxx | 15 +++++++++++++++ 5 files changed, 51 insertions(+)
New commits: commit c12719b1b1114c04f67f5819fc53a4148bf778e5 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Sep 9 23:14:19 2013 -0400 Trim data array length to remove trailing empty rows. Change-Id: I61a6a289ad1c2c757fcea490ada5d40fee08e840 diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 6949b6d..4cbf06a 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -1027,6 +1027,13 @@ public: SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly ) const; + /** + * Return the last non-empty row position in given columns, or 0 if the + * columns are empty. A negative value is returned if the given sheet or + * column positions are invalid. + */ + SCROW GetLastDataRow( SCTAB nTab, SCCOL nCol1, SCCOL nCol2 ) const; + SC_DLLPUBLIC void GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, bool bIncludeOld, bool bOnlyDown ) const; SC_DLLPUBLIC bool GetCellArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const; diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 8816642..9bf3f90 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -469,6 +469,8 @@ public: bool ShrinkToUsedDataArea( bool& o_bShrunk, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly ) const; + SCROW GetLastDataRow( SCCOL nCol1, SCCOL nCol2 ) const; + SCSIZE GetEmptyLinesInBlock( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScDirection eDir ) const; diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index c6d3c79..d161910 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -1018,6 +1018,15 @@ bool ScDocument::ShrinkToUsedDataArea( bool& o_bShrunk, SCTAB nTab, SCCOL& rStar return maTabs[nTab]->ShrinkToUsedDataArea( o_bShrunk, rStartCol, rStartRow, rEndCol, rEndRow, bColumnsOnly); } +SCROW ScDocument::GetLastDataRow( SCTAB nTab, SCCOL nCol1, SCCOL nCol2 ) const +{ + const ScTable* pTab = FetchTable(nTab); + if (!pTab) + return -1; + + pTab->GetLastDataRow(nCol1, nCol2); +} + // connected area void ScDocument::GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index f8f344d..7e8a975 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -3359,6 +3359,18 @@ class GroupTokenConverter return true; } + + SCROW trimLength(SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCROW nRow, SCROW nRowLen) + { + SCROW nLastRow = mrDoc.GetLastDataRow(nTab, nCol1, nCol2); + if (nLastRow < (nRow + nRowLen - 1)) + nRowLen = nLastRow - nRow + 1; + else if (nLastRow == 0) + // Column is empty. + nRowLen = 1; + + return nRowLen; + } public: GroupTokenConverter(sc::FormulaGroupContext& rCxt, ScTokenArray& rGroupTokens, ScDocument& rDoc, ScFormulaCell& rCell, const ScAddress& rPos) : mrCxt(rCxt), mrGroupTokens(rGroupTokens), mrDoc(rDoc), mrCell(rCell), mrPos(rPos) {} @@ -3394,6 +3406,9 @@ public: if (isSelfReferenceRelative(aRefPos, aRef.Row())) return false; + // Trim data array length to actual data range. + nLen = trimLength(aRefPos.Tab(), aRefPos.Col(), aRefPos.Col(), aRefPos.Row(), nLen); + // Fetch double array guarantees that the length of the // returned array equals or greater than the requested // length. @@ -3456,6 +3471,9 @@ public: nArrayLength += nRefRowSize - 1; } + // Trim trailing empty rows. + nArrayLength = trimLength(aRefPos.Tab(), aAbs.aStart.Col(), aAbs.aEnd.Col(), aRefPos.Row(), nArrayLength); + for (SCCOL i = aAbs.aStart.Col(); i <= aAbs.aEnd.Col(); ++i) { aRefPos.SetCol(i); diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx index 6391eee..9af12d6 100644 --- a/sc/source/core/data/table1.cxx +++ b/sc/source/core/data/table1.cxx @@ -987,6 +987,21 @@ bool ScTable::ShrinkToUsedDataArea( bool& o_bShrunk, SCCOL& rStartCol, SCROW& rS (rStartRow != rEndRow || aCol[rStartCol].HasDataAt( rStartRow))); } +SCROW ScTable::GetLastDataRow( SCCOL nCol1, SCCOL nCol2 ) const +{ + if (!ValidCol(nCol1) || !ValidCol(nCol2)) + return -1; + + SCROW nLastRow = 0; + for (SCCOL i = nCol1; i <= nCol2; ++i) + { + SCROW nThis = aCol[i].GetLastDataPos(); + if (nLastRow < nThis) + nLastRow = nThis; + } + + return nLastRow; +} SCSIZE ScTable::GetEmptyLinesInBlock( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScDirection eDir ) const _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits