summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/inc/global.hxx3
-rw-r--r--sc/inc/globstr.hrc4
-rw-r--r--sc/source/core/data/column2.cxx97
-rw-r--r--sc/source/core/data/documen4.cxx4
-rw-r--r--sc/source/filter/xml/XMLConverter.cxx3
-rw-r--r--sc/source/ui/src/globstr.src4
-rw-r--r--sc/source/ui/view/tabvwsha.cxx4
-rw-r--r--svx/inc/helpid.hrc1
-rw-r--r--svx/source/stbctrls/stbctrls.h19
-rw-r--r--svx/source/stbctrls/stbctrls.src6
10 files changed, 117 insertions, 28 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 );
diff --git a/svx/inc/helpid.hrc b/svx/inc/helpid.hrc
index 5455b3398ed1..b2088f61c155 100644
--- a/svx/inc/helpid.hrc
+++ b/svx/inc/helpid.hrc
@@ -134,6 +134,7 @@
#define HID_MNU_FUNC_MIN "SVX_HID_MNU_FUNC_MIN"
#define HID_MNU_FUNC_NONE "SVX_HID_MNU_FUNC_NONE"
#define HID_MNU_FUNC_SUM "SVX_HID_MNU_FUNC_SUM"
+#define HID_MNU_FUNC_SELECTION_COUNT "SVX_HID_MNU_FUNC_SELECTION_COUNT"
#define HID_MNU_ZOOM_100 "SVX_HID_MNU_ZOOM_100"
#define HID_MNU_ZOOM_150 "SVX_HID_MNU_ZOOM_150"
#define HID_MNU_ZOOM_200 "SVX_HID_MNU_ZOOM_200"
diff --git a/svx/source/stbctrls/stbctrls.h b/svx/source/stbctrls/stbctrls.h
index 7482c0b605d7..0b5e56d005d3 100644
--- a/svx/source/stbctrls/stbctrls.h
+++ b/svx/source/stbctrls/stbctrls.h
@@ -31,15 +31,16 @@
#define ZOOM_PAGE_WIDTH 7
#define ZOOM_WHOLE_PAGE 8
-// IDs wie SUBTOTAL_FUNC im Calc
-
-#define PSZ_FUNC_AVG 1
-#define PSZ_FUNC_COUNT2 3
-#define PSZ_FUNC_COUNT 2
-#define PSZ_FUNC_MAX 4
-#define PSZ_FUNC_MIN 5
-#define PSZ_FUNC_SUM 9
-#define PSZ_FUNC_NONE 16
+// IDs as in SUBTOTAL_FUNC of Calc
+
+#define PSZ_FUNC_AVG 1
+#define PSZ_FUNC_COUNT2 3
+#define PSZ_FUNC_COUNT 2
+#define PSZ_FUNC_MAX 4
+#define PSZ_FUNC_MIN 5
+#define PSZ_FUNC_SUM 9
+#define PSZ_FUNC_SELECTION_COUNT 12
+#define PSZ_FUNC_NONE 16
#define XMLSEC_CALL 1
diff --git a/svx/source/stbctrls/stbctrls.src b/svx/source/stbctrls/stbctrls.src
index a5b6799e9d5b..8d5beebcc6bc 100644
--- a/svx/source/stbctrls/stbctrls.src
+++ b/svx/source/stbctrls/stbctrls.src
@@ -218,6 +218,12 @@ Menu RID_SVXMNU_PSZ_FUNC
};
MenuItem
{
+ Identifier = PSZ_FUNC_SELECTION_COUNT ;
+ HelpId = HID_MNU_FUNC_SELECTION_COUNT ;
+ Text [ en-US ] = "Selection count" ;
+ };
+ MenuItem
+ {
Identifier = PSZ_FUNC_NONE ;
HelpId = HID_MNU_FUNC_NONE ;
Text [ en-US ] = "None" ;