diff options
author | Prashant Pandey <prashant3.yishu@gmail.com> | 2013-04-19 05:30:36 +0530 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2013-04-19 16:33:49 +0000 |
commit | e7a5f5ef80c3e66101cfb063cbed0527c0559319 (patch) | |
tree | a4ea0b3bb128d10e79c5a51803a7be835b6cda83 /sc | |
parent | 42960dcc78175f44dacc8bd64cf6c6dcb8bbaf38 (diff) |
fdo#61541 : Count Number of selected Cells in calc
Change-Id: Ic9c911552f2b03bb496f47251917a3736494dce1
Reviewed-on: https://gerrit.libreoffice.org/3213
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/global.hxx | 3 | ||||
-rw-r--r-- | sc/inc/globstr.hrc | 4 | ||||
-rw-r--r-- | sc/source/core/data/column2.cxx | 97 | ||||
-rw-r--r-- | sc/source/core/data/documen4.cxx | 4 | ||||
-rw-r--r-- | sc/source/filter/xml/XMLConverter.cxx | 3 | ||||
-rw-r--r-- | sc/source/ui/src/globstr.src | 4 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwsha.cxx | 4 |
7 files changed, 100 insertions, 19 deletions
diff --git a/sc/inc/global.hxx b/sc/inc/global.hxx index 44bd67a3007c..0ef1bd8fdc3c 100644 --- a/sc/inc/global.hxx +++ b/sc/inc/global.hxx @@ -741,7 +741,8 @@ enum ScSubTotalFunc SUBTOTAL_FUNC_STDP = 8, SUBTOTAL_FUNC_SUM = 9, SUBTOTAL_FUNC_VAR = 10, - SUBTOTAL_FUNC_VARP = 11 + SUBTOTAL_FUNC_VARP = 11, + SUBTOTAL_FUNC_SELECTION_COUNT = 12 }; class ScArea; diff --git a/sc/inc/globstr.hrc b/sc/inc/globstr.hrc index fa41d1da2346..24727b798472 100644 --- a/sc/inc/globstr.hrc +++ b/sc/inc/globstr.hrc @@ -679,7 +679,9 @@ #define STR_UNDO_L2R 544 #define STR_UNDO_R2L 545 -#define STR_COUNT 546 +#define STR_FUN_TEXT_SELECTION_COUNT 546 + +#define STR_COUNT 547 #endif diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index c818c49da7ca..82f03cc73930 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -1972,15 +1972,58 @@ void ScColumn::UpdateSelectionFunction( const ScMarkData& rMark, ScFunctionData& rData, ScFlatBoolRowSegments& rHiddenRows, bool bDoExclude, SCROW nExStartRow, SCROW nExEndRow) const { - SCSIZE nIndex; - ScMarkedDataIter aDataIter(this, &rMark, false); - while (aDataIter.Next( nIndex )) + if ( rData.eFunc != SUBTOTAL_FUNC_SELECTION_COUNT ) { - SCROW nRow = maItems[nIndex].nRow; - bool bRowHidden = rHiddenRows.getValue(nRow); - if ( !bRowHidden ) - if ( !bDoExclude || nRow < nExStartRow || nRow > nExEndRow ) - lcl_UpdateSubTotal( rData, maItems[nIndex].pCell ); + SCSIZE nIndex; + ScMarkedDataIter aDataIter(this, &rMark, false); + while (aDataIter.Next( nIndex )) + { + SCROW nRow = maItems[nIndex].nRow; + bool bRowHidden = rHiddenRows.getValue(nRow); + if ( !bRowHidden ) + if ( !bDoExclude || nRow < nExStartRow || nRow > nExEndRow ) + lcl_UpdateSubTotal( rData, maItems[nIndex].pCell ); + } + } + else + { + SCROW nTop, nBottom; + + // ScMarkData::GetArray() returns a valid array only if + // 'rMark.IsMultiMarked()' returns true. + // Since ScTable::UpdateSelectionFunction() already checked that first + // before calling this method it does not need to be repeated here. + + ScMarkArrayIter aIter(rMark.GetArray() + nCol); + ScFlatBoolRowSegments::RangeData aData; + + while (aIter.Next( nTop, nBottom )) + { + sal_Int32 nCellCount = 0; // to get the count of selected visible cells + SCROW nRow = nTop; + + while ( nRow <= nBottom ) + { + if (!rHiddenRows.getRangeData(nRow, aData)) // failed to get range data + break; + + if (aData.mnRow2 > nBottom) + aData.mnRow2 = nBottom; + + if (!aData.mbValue) + { + nCellCount += aData.mnRow2 - nRow + 1; + + // Till this point, nCellCount also includes count of those cells which are excluded + // So, they should be decremented now. + + if ( bDoExclude && nExStartRow >= nRow && nExEndRow <= aData.mnRow2 ) + nCellCount -= nExEndRow - nExStartRow + 1; + } + nRow = aData.mnRow2 + 1; + } + rData.nCount += nCellCount; + } } } @@ -1988,15 +2031,37 @@ void ScColumn::UpdateSelectionFunction( void ScColumn::UpdateAreaFunction( ScFunctionData& rData, ScFlatBoolRowSegments& rHiddenRows, SCROW nStartRow, SCROW nEndRow) const { - SCSIZE nIndex; - Search( nStartRow, nIndex ); - while ( nIndex<maItems.size() && maItems[nIndex].nRow<=nEndRow ) + if ( rData.eFunc != SUBTOTAL_FUNC_SELECTION_COUNT ) { - SCROW nRow = maItems[nIndex].nRow; - bool bRowHidden = rHiddenRows.getValue(nRow); - if ( !bRowHidden ) - lcl_UpdateSubTotal( rData, maItems[nIndex].pCell ); - ++nIndex; + SCSIZE nIndex; + Search( nStartRow, nIndex ); + while ( nIndex<maItems.size() && maItems[nIndex].nRow<=nEndRow ) + { + SCROW nRow = maItems[nIndex].nRow; + bool bRowHidden = rHiddenRows.getValue(nRow); + if ( !bRowHidden ) + if ( rData.eFunc != SUBTOTAL_FUNC_SELECTION_COUNT ) + lcl_UpdateSubTotal( rData, maItems[nIndex].pCell ); + ++nIndex; + } + } + else + { + sal_Int32 nCellCount = 0; // to get the count of selected visible cells + SCROW nRow = nStartRow; + ScFlatBoolRowSegments::RangeData aData; + + while (nRow <= nEndRow) + { + if (!rHiddenRows.getRangeData(nRow, aData)) + break; + + if (!aData.mbValue) + nCellCount += (aData.mnRow2 <= nEndRow ? aData.mnRow2 : nEndRow) - nRow + 1; + + nRow = aData.mnRow2 + 1; + } + rData.nCount += nCellCount; } } diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index 5ce49e205ab0..f19cd8cc5272 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -486,6 +486,7 @@ bool ScDocument::GetSelectionFunction( ScSubTotalFunc eFunc, SCTAB nMax = static_cast<SCTAB>(maTabs.size()); ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end(); + for (; itr != itrEnd && *itr < nMax && !aData.bError; ++itr) if (maTabs[*itr]) maTabs[*itr]->UpdateSelectionFunction( aData, @@ -499,6 +500,9 @@ bool ScDocument::GetSelectionFunction( ScSubTotalFunc eFunc, case SUBTOTAL_FUNC_SUM: rResult = aData.nVal; break; + case SUBTOTAL_FUNC_SELECTION_COUNT: + rResult = aData.nCount; + break; case SUBTOTAL_FUNC_CNT: case SUBTOTAL_FUNC_CNT2: rResult = aData.nCount; diff --git a/sc/source/filter/xml/XMLConverter.cxx b/sc/source/filter/xml/XMLConverter.cxx index ae58ceff0e31..da1259218492 100644 --- a/sc/source/filter/xml/XMLConverter.cxx +++ b/sc/source/filter/xml/XMLConverter.cxx @@ -154,6 +154,9 @@ void ScXMLConverter::GetStringFromFunction( case SUBTOTAL_FUNC_STD: sFuncStr = GetXMLToken( XML_STDEV ); break; case SUBTOTAL_FUNC_STDP: sFuncStr = GetXMLToken( XML_STDEVP ); break; case SUBTOTAL_FUNC_SUM: sFuncStr = GetXMLToken( XML_SUM ); break; + case SUBTOTAL_FUNC_SELECTION_COUNT: break; + // it is not needed as it is only a UI value and not document content + case SUBTOTAL_FUNC_VAR: sFuncStr = GetXMLToken( XML_VAR ); break; case SUBTOTAL_FUNC_VARP: sFuncStr = GetXMLToken( XML_VARP ); break; } diff --git a/sc/source/ui/src/globstr.src b/sc/source/ui/src/globstr.src index e5fe2dc80990..375db7bbb282 100644 --- a/sc/source/ui/src/globstr.src +++ b/sc/source/ui/src/globstr.src @@ -686,6 +686,10 @@ Resource RID_GLOBSTR { Text [ en-US ] = "Sum" ; }; + String STR_FUN_TEXT_SELECTION_COUNT + { + Text [ en-US ] = "Selection count" ; + }; String STR_FUN_TEXT_COUNT { Text [ en-US ] = "Count" ; diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx index e9a5e6bf52e0..1cc39fd33ced 100644 --- a/sc/source/ui/view/tabvwsha.cxx +++ b/sc/source/ui/view/tabvwsha.cxx @@ -80,6 +80,8 @@ sal_Bool ScTabViewShell::GetFunction( String& rFuncStr, sal_uInt16 nErrCode ) case SUBTOTAL_FUNC_MAX: nGlobStrId = STR_FUN_TEXT_MAX; break; case SUBTOTAL_FUNC_MIN: nGlobStrId = STR_FUN_TEXT_MIN; break; case SUBTOTAL_FUNC_SUM: nGlobStrId = STR_FUN_TEXT_SUM; break; + case SUBTOTAL_FUNC_SELECTION_COUNT: nGlobStrId = STR_FUN_TEXT_SELECTION_COUNT; break; + default: { // added to avoid warnings @@ -106,7 +108,7 @@ sal_Bool ScTabViewShell::GetFunction( String& rFuncStr, sal_uInt16 nErrCode ) // Number in the standard format, the other on the cursor position SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); sal_uInt32 nNumFmt = 0; - if ( eFunc != SUBTOTAL_FUNC_CNT && eFunc != SUBTOTAL_FUNC_CNT2 ) + if ( eFunc != SUBTOTAL_FUNC_CNT && eFunc != SUBTOTAL_FUNC_CNT2 && eFunc != SUBTOTAL_FUNC_SELECTION_COUNT) { // Zahlformat aus Attributen oder Formel pDoc->GetNumberFormat( nPosX, nPosY, nTab, nNumFmt ); |