diff options
author | Julien Nabet <serval2412@yahoo.fr> | 2017-02-18 20:35:17 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2017-02-24 15:23:32 +0000 |
commit | 41f95c4a35a6335e9edb2f51c11d136d88bd0749 (patch) | |
tree | caf167ab6f6777da38612b453703b08930fec5fd /sc | |
parent | 237685fdfad448ddb8493c6c8162f7db085ec45c (diff) |
Remove SC_DPOUT_MAXLEVELS limit in Pivot
by using vectors instead of fixed arrays
Change-Id: I4bd070e05ccc464c80722ffd05e70b7acac17d5f
Reviewed-on: https://gerrit.libreoffice.org/34408
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/dpoutput.hxx | 9 | ||||
-rw-r--r-- | sc/source/core/data/dpoutput.cxx | 290 |
2 files changed, 118 insertions, 181 deletions
diff --git a/sc/inc/dpoutput.hxx b/sc/inc/dpoutput.hxx index 9f9fdcf308a5..ecd933c22814 100644 --- a/sc/inc/dpoutput.hxx +++ b/sc/inc/dpoutput.hxx @@ -48,12 +48,9 @@ private: ScDocument* pDoc; css::uno::Reference< css::sheet::XDimensionsSupplier> xSource; ScAddress aStartPos; - ScDPOutLevelData* pColFields; - ScDPOutLevelData* pRowFields; - ScDPOutLevelData* pPageFields; - long nColFieldCount; - long nRowFieldCount; - long nPageFieldCount; + std::vector<ScDPOutLevelData> pColFields; + std::vector<ScDPOutLevelData> pRowFields; + std::vector<ScDPOutLevelData> pPageFields; css::uno::Sequence< css::uno::Sequence< css::sheet::DataResult> > aData; OUString aDataDescription; diff --git a/sc/source/core/data/dpoutput.cxx b/sc/source/core/data/dpoutput.cxx index 47aa7338c644..93701696d49d 100644 --- a/sc/source/core/data/dpoutput.cxx +++ b/sc/source/core/data/dpoutput.cxx @@ -71,16 +71,14 @@ using ::com::sun::star::uno::makeAny; #define SC_DP_FRAME_COLOR Color(0,0,0) //( 0x20, 0x40, 0x68 ) -#define SC_DPOUT_MAXLEVELS 256 - struct ScDPOutLevelData { - long nDim; - long nHier; - long nLevel; - long nDimPos; + long mnDim; + long mnHier; + long mnLevel; + long mnDimPos; sal_uInt32 mnSrcNumFmt; /// Prevailing number format used in the source data. - uno::Sequence<sheet::MemberResult> aResult; + uno::Sequence<sheet::MemberResult> maResult; OUString maName; /// Name is the internal field name. OUString maCaption; /// Caption is the name visible in the output table. double mfValue; /// Value is the underlying numeric value, if any, or NaN @@ -88,24 +86,30 @@ struct ScDPOutLevelData bool mbDataLayout:1; bool mbPageDim:1; - ScDPOutLevelData() : - nDim(-1), nHier(-1), nLevel(-1), nDimPos(-1), mnSrcNumFmt(0), mbHasHiddenMember(false), mbDataLayout(false), - mbPageDim(false) + ScDPOutLevelData(long nDim, long nHier, long nLevel, long nDimPos, sal_uInt32 nSrcNumFmt, uno::Sequence<sheet::MemberResult> &aResult, + const OUString &aName, const OUString &aCaption, double fValue, bool bHasHiddenMember, bool bDataLayout, bool bPageDim) : + mnDim(nDim), mnHier(nHier), mnLevel(nLevel), mnDimPos(nDimPos), mnSrcNumFmt(nSrcNumFmt), maResult(aResult), + maName(aName), maCaption(aCaption), mfValue(fValue), mbHasHiddenMember(bHasHiddenMember), mbDataLayout(bDataLayout), + mbPageDim(bPageDim) { rtl::math::setNan(&mfValue); } - bool operator<(const ScDPOutLevelData& r) const - { return nDimPos<r.nDimPos || ( nDimPos==r.nDimPos && nHier<r.nHier ) || - ( nDimPos==r.nDimPos && nHier==r.nHier && nLevel<r.nLevel ); } - - void Swap(ScDPOutLevelData& r) - { ScDPOutLevelData aTemp; aTemp = r; r = *this; *this = aTemp; } - // bug (73840) in uno::Sequence - copy and then assign doesn't work! }; + + namespace { + struct ScDPOutLevelDataComparator + { + bool operator()(const ScDPOutLevelData & rA, const ScDPOutLevelData & rB) + { + return rA.mnDimPos<rB.mnDimPos || ( rA.mnDimPos==rB.mnDimPos && rA.mnHier<rB.mnHier ) || + ( rA.mnDimPos==rB.mnDimPos && rA.mnHier==rB.mnHier && rA.mnLevel<rB.mnLevel ); + } + }; + class ScDPOutputImpl { @@ -151,8 +155,8 @@ void ScDPOutputImpl::OutputDataArea() bool bAllRows = ( ( mnTabEndRow - mnDataStartRow + 2 ) == (SCROW) mnRows.size() ); - std::sort( mnCols.begin(), mnCols.end() ); - std::sort( mnRows.begin(), mnRows.end() ); + std::sort( mnCols.begin(), mnCols.end()); + std::sort( mnRows.begin(), mnRows.end()); for( SCCOL nCol = 0; nCol < (SCCOL)mnCols.size()-1; nCol ++ ) { @@ -342,12 +346,11 @@ void lcl_FillNumberFormats( sal_uInt32*& rFormats, long& rCount, // get names/formats for all data dimensions //TODO: merge this with the loop to collect ScDPOutLevelData? - OUString aDataNames[SC_DPOUT_MAXLEVELS]; - sal_uInt32 nDataFormats[SC_DPOUT_MAXLEVELS]; - size_t nDataCount = 0; + std::vector <OUString> aDataNames; + std::vector <sal_uInt32> aDataFormats; sal_Int32 nDimCount = xDims->getCount(); sal_Int32 nDim = 0; - for ( ; nDim < nDimCount && nDataCount < SC_DPOUT_MAXLEVELS; nDim++) + for ( ; nDim < nDimCount ; nDim++) { uno::Reference<uno::XInterface> xDim = ScUnoHelpFunctions::AnyToInterface( xDims->getByIndex(nDim) ); @@ -361,29 +364,26 @@ void lcl_FillNumberFormats( sal_uInt32*& rFormats, long& rCount, sheet::DataPilotFieldOrientation_HIDDEN ); if ( eDimOrient == sheet::DataPilotFieldOrientation_DATA ) { - aDataNames[nDataCount] = xDimName->getName(); + aDataNames.push_back(xDimName->getName()); long nFormat = ScUnoHelpFunctions::GetLongProperty( xDimProp, SC_UNONAME_NUMFMT ); - nDataFormats[nDataCount] = nFormat; - ++nDataCount; + aDataFormats.push_back(nFormat); } } } - SAL_WARN_IF( nDim < nDimCount && nDataCount == SC_DPOUT_MAXLEVELS, "sc.core", - "lcl_FillNumberFormats - may have lost an output level due to SC_DPOUT_MAXLEVELS=" << SC_DPOUT_MAXLEVELS); - if (!nDataCount) + if (aDataFormats.empty()) return; const sheet::MemberResult* pArray = aResult.getConstArray(); OUString aName; sal_uInt32* pNumFmt = new sal_uInt32[nSize]; - if (nDataCount == 1) + if (aDataFormats.size() == 1) { // only one data dimension -> use its numberformat everywhere - long nFormat = nDataFormats[0]; + long nFormat = aDataFormats[0]; for (long nPos=0; nPos<nSize; nPos++) pNumFmt[nPos] = nFormat; } @@ -397,10 +397,10 @@ void lcl_FillNumberFormats( sal_uInt32*& rFormats, long& rCount, aName = pArray[nPos].Name; sal_uInt32 nFormat = 0; - for (size_t i=0; i<nDataCount; i++) + for (size_t i=0; i<aDataFormats.size(); i++) if (aName == aDataNames[i]) //TODO: search more efficiently? { - nFormat = nDataFormats[i]; + nFormat = aDataFormats[i]; break; } pNumFmt[nPos] = nFormat; @@ -439,16 +439,6 @@ sal_uInt32 lcl_GetFirstNumberFormat( const uno::Reference<container::XIndexAcces return 0; // none found } -void lcl_SortFields( ScDPOutLevelData* pFields, long nFieldCount ) -{ - for (long i=0; i+1<nFieldCount; i++) - { - for (long j=0; j+i+1<nFieldCount; j++) - if ( pFields[j+1] < pFields[j] ) - pFields[j].Swap( pFields[j+1] ); - } -} - bool lcl_MemberEmpty( const uno::Sequence<sheet::MemberResult>& rSeq ) { // used to skip levels that have no members @@ -537,13 +527,6 @@ ScDPOutput::ScDPOutput( ScDocument* pD, const uno::Reference<sheet::XDimensionsS nTabStartCol = nMemberStartCol = nDataStartCol = nTabEndCol = 0; nTabStartRow = nMemberStartRow = nDataStartRow = nTabEndRow = 0; - pColFields = new ScDPOutLevelData[SC_DPOUT_MAXLEVELS]; - pRowFields = new ScDPOutLevelData[SC_DPOUT_MAXLEVELS]; - pPageFields = new ScDPOutLevelData[SC_DPOUT_MAXLEVELS]; - nColFieldCount = 0; - nRowFieldCount = 0; - nPageFieldCount = 0; - uno::Reference<sheet::XDataPilotResults> xResult( xSource, uno::UNO_QUERY ); if ( xSource.is() && xResult.is() ) { @@ -618,73 +601,36 @@ ScDPOutput::ScDPOutput( ScDocument* pD, const uno::Reference<sheet::XDimensionsS switch ( eDimOrient ) { case sheet::DataPilotFieldOrientation_COLUMN: - if (nColFieldCount < SC_DPOUT_MAXLEVELS) - { - pColFields[nColFieldCount].nDim = nDim; - pColFields[nColFieldCount].nHier = nHierarchy; - pColFields[nColFieldCount].nLevel = nLev; - pColFields[nColFieldCount].nDimPos = nDimPos; - pColFields[nColFieldCount].aResult = xLevRes->getResults(); - pColFields[nColFieldCount].mnSrcNumFmt = nNumFmt; - pColFields[nColFieldCount].maName = aName; - pColFields[nColFieldCount].maCaption= aCaption; - pColFields[nColFieldCount].mfValue = fValue; - pColFields[nColFieldCount].mbHasHiddenMember = bHasHiddenMember; - pColFields[nColFieldCount].mbDataLayout = bIsDataLayout; - if (!lcl_MemberEmpty(pColFields[nColFieldCount].aResult)) - ++nColFieldCount; - } - else + { + uno::Sequence<sheet::MemberResult> aResult = xLevRes->getResults(); + if (!lcl_MemberEmpty(aResult)) { - SAL_WARN("sc.core","ScDPOutput - nColFieldCount already at SC_DPOUT_MAXLEVELS=" << SC_DPOUT_MAXLEVELS); + ScDPOutLevelData tmp(nDim, nHierarchy, nLev, nDimPos, nNumFmt, aResult, aName, + aCaption, fValue, bHasHiddenMember, bIsDataLayout, false); + pColFields.push_back(tmp); } + } break; case sheet::DataPilotFieldOrientation_ROW: - if (nRowFieldCount < SC_DPOUT_MAXLEVELS) - { - pRowFields[nRowFieldCount].nDim = nDim; - pRowFields[nRowFieldCount].nHier = nHierarchy; - pRowFields[nRowFieldCount].nLevel = nLev; - pRowFields[nRowFieldCount].nDimPos = nDimPos; - pRowFields[nRowFieldCount].aResult = xLevRes->getResults(); - pRowFields[nRowFieldCount].mnSrcNumFmt = nNumFmt; - pRowFields[nRowFieldCount].maName = aName; - pRowFields[nRowFieldCount].maCaption= aCaption; - pRowFields[nRowFieldCount].mfValue = fValue; - pRowFields[nRowFieldCount].mbHasHiddenMember = bHasHiddenMember; - pRowFields[nRowFieldCount].mbDataLayout = bIsDataLayout; - if (!lcl_MemberEmpty(pRowFields[nRowFieldCount].aResult)) - { - ++nRowFieldCount; - bRowFieldHasMember = true; - } - } - else + { + uno::Sequence<sheet::MemberResult> aResult = xLevRes->getResults(); + if (!lcl_MemberEmpty(aResult)) { - SAL_WARN("sc.core","ScDPOutput - nRowFieldCount already at SC_DPOUT_MAXLEVELS=" << SC_DPOUT_MAXLEVELS); + ScDPOutLevelData tmp(nDim, nHierarchy, nLev, nDimPos, nNumFmt, aResult, aName, + aCaption, fValue, bHasHiddenMember, bIsDataLayout, false); + pRowFields.push_back(tmp); + bRowFieldHasMember = true; } + } break; case sheet::DataPilotFieldOrientation_PAGE: - if (nPageFieldCount < SC_DPOUT_MAXLEVELS) - { - pPageFields[nPageFieldCount].nDim = nDim; - pPageFields[nPageFieldCount].nHier = nHierarchy; - pPageFields[nPageFieldCount].nLevel = nLev; - pPageFields[nPageFieldCount].nDimPos = nDimPos; - pPageFields[nPageFieldCount].aResult = getVisiblePageMembersAsResults(xLevel); - pPageFields[nPageFieldCount].mnSrcNumFmt = nNumFmt; - pPageFields[nPageFieldCount].maName = aName; - pPageFields[nPageFieldCount].maCaption= aCaption; - pPageFields[nPageFieldCount].mfValue = fValue; - pPageFields[nPageFieldCount].mbHasHiddenMember = bHasHiddenMember; - pPageFields[nPageFieldCount].mbPageDim = true; - // no check on results for page fields - ++nPageFieldCount; - } - else - { - SAL_WARN("sc.core","ScDPOutput - nPageFieldCount already at SC_DPOUT_MAXLEVELS=" << SC_DPOUT_MAXLEVELS); - } + { + uno::Sequence<sheet::MemberResult> aResult = getVisiblePageMembersAsResults(xLevel); + // no check on results for page fields + ScDPOutLevelData tmp(nDim, nHierarchy, nLev, nDimPos, nNumFmt, aResult, aName, + aCaption, fValue, bHasHiddenMember, false, true); + pPageFields.push_back(tmp); + } break; default: { @@ -717,9 +663,9 @@ ScDPOutput::ScDPOutput( ScDocument* pD, const uno::Reference<sheet::XDimensionsS } } } - lcl_SortFields( pColFields, nColFieldCount ); - lcl_SortFields( pRowFields, nRowFieldCount ); - lcl_SortFields( pPageFields, nPageFieldCount ); + std::sort(pColFields.begin(), pColFields.end(), ScDPOutLevelDataComparator()); + std::sort(pRowFields.begin(), pRowFields.end(), ScDPOutLevelDataComparator()); + std::sort(pPageFields.begin(), pPageFields.end(), ScDPOutLevelDataComparator()); // get data results: @@ -753,10 +699,6 @@ ScDPOutput::ScDPOutput( ScDocument* pD, const uno::Reference<sheet::XDimensionsS ScDPOutput::~ScDPOutput() { - delete[] pColFields; - delete[] pRowFields; - delete[] pPageFields; - delete[] pColNumFmt; delete[] pRowNumFmt; } @@ -922,22 +864,22 @@ void ScDPOutput::CalcSizes() nColCount = nRowCount ? ( pRowAry[0].getLength() ) : 0; nHeaderSize = 1; - if (GetHeaderLayout() && nColFieldCount == 0) + if (GetHeaderLayout() && pColFields.empty()) // Insert an extra header row only when there is no column field. nHeaderSize = 2; // calculate output positions and sizes long nPageSize = 0; // use page fields! - if ( bDoFilter || nPageFieldCount ) + if ( bDoFilter || pPageFields.size() ) { - nPageSize += nPageFieldCount + 1; // plus one empty row + nPageSize += pPageFields.size() + 1; // plus one empty row if ( bDoFilter ) ++nPageSize; // filter button above the page fields } - if ( aStartPos.Col() + nRowFieldCount + nColCount - 1 > MAXCOL || - aStartPos.Row() + nPageSize + nHeaderSize + nColFieldCount + nRowCount > MAXROW ) + if ( aStartPos.Col() + pRowFields.size() + nColCount - 1 > MAXCOL || + aStartPos.Row() + nPageSize + nHeaderSize + pColFields.size() + nRowCount > MAXROW ) { bSizeOverflow = true; } @@ -946,14 +888,14 @@ void ScDPOutput::CalcSizes() nTabStartRow = aStartPos.Row() + (SCROW)nPageSize; // below page fields nMemberStartCol = nTabStartCol; nMemberStartRow = nTabStartRow + (SCROW) nHeaderSize; - nDataStartCol = nMemberStartCol + (SCCOL)nRowFieldCount; - nDataStartRow = nMemberStartRow + (SCROW)nColFieldCount; + nDataStartCol = nMemberStartCol + (SCCOL)pRowFields.size(); + nDataStartRow = nMemberStartRow + (SCROW)pColFields.size(); if ( nColCount > 0 ) nTabEndCol = nDataStartCol + (SCCOL)nColCount - 1; else nTabEndCol = nDataStartCol; // single column will remain empty // if page fields are involved, include the page selection cells - if ( nPageFieldCount > 0 && nTabEndCol < nTabStartCol + 1 ) + if ( !pPageFields.empty() && nTabEndCol < nTabStartCol + 1 ) nTabEndCol = nTabStartCol + 1; if ( nRowCount > 0 ) nTabEndRow = nDataStartRow + (SCROW)nRowCount - 1; @@ -1008,7 +950,6 @@ sal_Int32 ScDPOutput::GetPositionType(const ScAddress& rPos) void ScDPOutput::Output() { - long nField; SCTAB nTab = aStartPos.Tab(); const uno::Sequence<sheet::DataResult>* pRowAry = aData.getConstArray(); @@ -1028,7 +969,7 @@ void ScDPOutput::Output() // output page fields: - for (nField=0; nField<nPageFieldCount; nField++) + for (size_t nField=0; nField<pPageFields.size(); ++nField) { SCCOL nHdrCol = aStartPos.Col(); SCROW nHdrRow = aStartPos.Row() + nField + ( bDoFilter ? 1 : 0 ); @@ -1037,7 +978,7 @@ void ScDPOutput::Output() SCCOL nFldCol = nHdrCol + 1; OUString aPageValue = ScResId(SCSTR_ALL).toString(); - const uno::Sequence<sheet::MemberResult>& rRes = pPageFields[nField].aResult; + const uno::Sequence<sheet::MemberResult>& rRes = pPageFields[nField].maResult; sal_Int32 n = rRes.getLength(); if (n == 1) aPageValue = rRes[0].Caption; @@ -1072,13 +1013,13 @@ void ScDPOutput::Output() ScDPOutputImpl outputimp( pDoc, nTab, nTabStartCol, nTabStartRow, nDataStartCol, nDataStartRow, nTabEndCol, nTabEndRow ); - for (nField=0; nField<nColFieldCount; nField++) + for (size_t nField=0; nField<pColFields.size(); nField++) { SCCOL nHdrCol = nDataStartCol + (SCCOL)nField; //TODO: check for overflow FieldCell(nHdrCol, nTabStartRow, nTab, pColFields[nField], true); SCROW nRowPos = nMemberStartRow + (SCROW)nField; //TODO: check for overflow - const uno::Sequence<sheet::MemberResult> rSequence = pColFields[nField].aResult; + const uno::Sequence<sheet::MemberResult> rSequence = pColFields[nField].maResult; const sheet::MemberResult* pArray = rSequence.getConstArray(); long nThisColCount = rSequence.getLength(); OSL_ENSURE( nThisColCount == nColCount, "count mismatch" ); //TODO: ??? @@ -1093,9 +1034,9 @@ void ScDPOutput::Output() while ( nEnd+1 < nThisColCount && ( pArray[nEnd+1].Flags & sheet::MemberResultFlags::CONTINUE ) ) ++nEnd; SCCOL nEndColPos = nDataStartCol + (SCCOL)nEnd; //TODO: check for overflow - if ( nField+1 < nColFieldCount ) + if ( nField+1 < pColFields.size()) { - if ( nField == nColFieldCount - 2 ) + if ( nField == pColFields.size() - 2 ) { outputimp.AddCol( nColPos ); if ( nColPos + 1 == nEndColPos ) @@ -1115,21 +1056,21 @@ void ScDPOutput::Output() // Apply the same number format as in data source. pDoc->ApplyAttr(nColPos, nRowPos, nTab, SfxUInt32Item(ATTR_VALUE_FORMAT, pColFields[nField].mnSrcNumFmt)); } - if ( nField== 0 && nColFieldCount == 1 ) + if ( nField== 0 && pColFields.size() == 1 ) outputimp.OutputBlockFrame( nDataStartCol,nTabStartRow, nTabEndCol,nRowPos-1 ); } // output row headers: std::vector<bool> vbSetBorder; vbSetBorder.resize( nTabEndRow - nDataStartRow + 1, false ); - for (nField=0; nField<nRowFieldCount; nField++) + for (size_t nField=0; nField<pRowFields.size(); nField++) { SCCOL nHdrCol = nTabStartCol + (SCCOL)nField; //TODO: check for overflow SCROW nHdrRow = nDataStartRow - 1; FieldCell(nHdrCol, nHdrRow, nTab, pRowFields[nField], true); SCCOL nColPos = nMemberStartCol + (SCCOL)nField; //TODO: check for overflow - const uno::Sequence<sheet::MemberResult> rSequence = pRowFields[nField].aResult; + const uno::Sequence<sheet::MemberResult> rSequence = pRowFields[nField].maResult; const sheet::MemberResult* pArray = rSequence.getConstArray(); long nThisRowCount = rSequence.getLength(); OSL_ENSURE( nThisRowCount == nRowCount, "count mismatch" ); //TODO: ??? @@ -1140,7 +1081,7 @@ void ScDPOutput::Output() if ( ( pArray[nRow].Flags & sheet::MemberResultFlags::HASMEMBER ) && !( pArray[nRow].Flags & sheet::MemberResultFlags::SUBTOTAL ) ) { - if ( nField+1 < nRowFieldCount ) + if ( nField+1 < pRowFields.size() ) { long nEnd = nRow; while ( nEnd+1 < nThisRowCount && ( pArray[nEnd+1].Flags & sheet::MemberResultFlags::CONTINUE ) ) @@ -1154,7 +1095,7 @@ void ScDPOutput::Output() } outputimp.OutputBlockFrame( nColPos, nRowPos, nColPos, nEndRowPos ); - if ( nField == nRowFieldCount - 2 ) + if ( nField == pRowFields.size() - 2 ) outputimp.OutputBlockFrame( nColPos+1, nRowPos, nColPos+1, nEndRowPos ); lcl_SetStyleById( pDoc, nTab, nColPos,nRowPos, nDataStartCol-1,nEndRowPos, STR_PIVOT_STYLE_CATEGORY ); @@ -1170,7 +1111,7 @@ void ScDPOutput::Output() } } - if (nColCount == 1 && nRowCount > 0 && nColFieldCount == 0) + if (nColCount == 1 && nRowCount > 0 && pColFields.empty()) { // the table contains exactly one data field and no column fields. // Display data description at top right corner. @@ -1226,7 +1167,7 @@ bool ScDPOutput::HasError() long ScDPOutput::GetHeaderRows() { - return nPageFieldCount + ( bDoFilter ? 1 : 0 ); + return pPageFields.size() + ( bDoFilter ? 1 : 0 ); } void ScDPOutput::GetMemberResultNames(ScDPUniqueStringSet& rNames, long nDimension) @@ -1237,23 +1178,22 @@ void ScDPOutput::GetMemberResultNames(ScDPUniqueStringSet& rNames, long nDimensi uno::Sequence<sheet::MemberResult> aMemberResults; bool bFound = false; - long nField; // look in column fields - for (nField=0; nField<nColFieldCount && !bFound; nField++) - if ( pColFields[nField].nDim == nDimension ) + for (size_t nField=0; nField<pColFields.size() && !bFound; nField++) + if ( pColFields[nField].mnDim == nDimension ) { - aMemberResults = pColFields[nField].aResult; + aMemberResults = pColFields[nField].maResult; bFound = true; } // look in row fields - for (nField=0; nField<nRowFieldCount && !bFound; nField++) - if ( pRowFields[nField].nDim == nDimension ) + for (size_t nField=0; nField<pRowFields.size() && !bFound; nField++) + if ( pRowFields[nField].mnDim == nDimension ) { - aMemberResults = pRowFields[nField].aResult; + aMemberResults = pRowFields[nField].maResult; bFound = true; } @@ -1415,7 +1355,7 @@ void ScDPOutput::GetPositionData(const ScAddress& rPos, DataPilotTablePositionDa if (nField < 0) break; - const uno::Sequence<sheet::MemberResult> rSequence = pColFields[nField].aResult; + const uno::Sequence<sheet::MemberResult> rSequence = pColFields[nField].maResult; if (rSequence.getLength() == 0) break; const sheet::MemberResult* pArray = rSequence.getConstArray(); @@ -1431,9 +1371,9 @@ void ScDPOutput::GetPositionData(const ScAddress& rPos, DataPilotTablePositionDa DataPilotTableHeaderData aHeaderData; aHeaderData.MemberName = pArray[nItem].Name; aHeaderData.Flags = pArray[nItem].Flags; - aHeaderData.Dimension = static_cast<sal_Int32>(pColFields[nField].nDim); - aHeaderData.Hierarchy = static_cast<sal_Int32>(pColFields[nField].nHier); - aHeaderData.Level = static_cast<sal_Int32>(pColFields[nField].nLevel); + aHeaderData.Dimension = static_cast<sal_Int32>(pColFields[nField].mnDim); + aHeaderData.Hierarchy = static_cast<sal_Int32>(pColFields[nField].mnHier); + aHeaderData.Level = static_cast<sal_Int32>(pColFields[nField].mnLevel); rPosData.PositionData = makeAny(aHeaderData); return; @@ -1444,7 +1384,7 @@ void ScDPOutput::GetPositionData(const ScAddress& rPos, DataPilotTablePositionDa if (nField < 0) break; - const uno::Sequence<sheet::MemberResult> rSequence = pRowFields[nField].aResult; + const uno::Sequence<sheet::MemberResult> rSequence = pRowFields[nField].maResult; if (rSequence.getLength() == 0) break; const sheet::MemberResult* pArray = rSequence.getConstArray(); @@ -1460,9 +1400,9 @@ void ScDPOutput::GetPositionData(const ScAddress& rPos, DataPilotTablePositionDa DataPilotTableHeaderData aHeaderData; aHeaderData.MemberName = pArray[nItem].Name; aHeaderData.Flags = pArray[nItem].Flags; - aHeaderData.Dimension = static_cast<sal_Int32>(pRowFields[nField].nDim); - aHeaderData.Hierarchy = static_cast<sal_Int32>(pRowFields[nField].nHier); - aHeaderData.Level = static_cast<sal_Int32>(pRowFields[nField].nLevel); + aHeaderData.Dimension = static_cast<sal_Int32>(pRowFields[nField].mnDim); + aHeaderData.Hierarchy = static_cast<sal_Int32>(pRowFields[nField].mnHier); + aHeaderData.Level = static_cast<sal_Int32>(pRowFields[nField].mnLevel); rPosData.PositionData = makeAny(aHeaderData); return; @@ -1511,16 +1451,16 @@ bool ScDPOutput::GetDataResultPositionData(vector<sheet::DataPilotFieldFilter>& bool bFilterByRow = (nRow <= static_cast<SCROW>(nTabEndRow - nGrandTotalRows)); // column fields - for (SCCOL nColField = 0; nColField < nColFieldCount && bFilterByCol; ++nColField) + for (size_t nColField = 0; nColField < pColFields.size() && bFilterByCol; ++nColField) { - if (pColFields[nColField].nDim == nDataLayoutIndex) + if (pColFields[nColField].mnDim == nDataLayoutIndex) // There is no sense including the data layout field for filtering. continue; sheet::DataPilotFieldFilter filter; filter.FieldName = pColFields[nColField].maName; - const uno::Sequence<sheet::MemberResult> rSequence = pColFields[nColField].aResult; + const uno::Sequence<sheet::MemberResult> rSequence = pColFields[nColField].maResult; const sheet::MemberResult* pArray = rSequence.getConstArray(); OSL_ENSURE(nDataStartCol + rSequence.getLength() - 1 == nTabEndCol, "ScDPOutput::GetDataFieldCellData: error in geometric assumption"); @@ -1535,16 +1475,16 @@ bool ScDPOutput::GetDataResultPositionData(vector<sheet::DataPilotFieldFilter>& } // row fields - for (SCROW nRowField = 0; nRowField < nRowFieldCount && bFilterByRow; ++nRowField) + for (size_t nRowField = 0; nRowField < pRowFields.size() && bFilterByRow; ++nRowField) { - if (pRowFields[nRowField].nDim == nDataLayoutIndex) + if (pRowFields[nRowField].mnDim == nDataLayoutIndex) // There is no sense including the data layout field for filtering. continue; sheet::DataPilotFieldFilter filter; filter.FieldName = pRowFields[nRowField].maName; - const uno::Sequence<sheet::MemberResult> rSequence = pRowFields[nRowField].aResult; + const uno::Sequence<sheet::MemberResult> rSequence = pRowFields[nRowField].maResult; const sheet::MemberResult* pArray = rSequence.getConstArray(); OSL_ENSURE(nDataStartRow + rSequence.getLength() - 1 == nTabEndRow, "ScDPOutput::GetDataFieldCellData: error in geometric assumption"); @@ -1645,30 +1585,30 @@ long ScDPOutput::GetHeaderDim( const ScAddress& rPos, sal_uInt16& rOrient ) // test for column header - if ( nRow == nTabStartRow && nCol >= nDataStartCol && nCol < nDataStartCol + nColFieldCount ) + if ( nRow == nTabStartRow && nCol >= nDataStartCol && static_cast<size_t>(nCol) < nDataStartCol + pColFields.size()) { rOrient = sheet::DataPilotFieldOrientation_COLUMN; long nField = nCol - nDataStartCol; - return pColFields[nField].nDim; + return pColFields[nField].mnDim; } // test for row header - if ( nRow+1 == nDataStartRow && nCol >= nTabStartCol && nCol < nTabStartCol + nRowFieldCount ) + if ( nRow+1 == nDataStartRow && nCol >= nTabStartCol && static_cast<size_t>(nCol) < nTabStartCol + pRowFields.size() ) { rOrient = sheet::DataPilotFieldOrientation_ROW; long nField = nCol - nTabStartCol; - return pRowFields[nField].nDim; + return pRowFields[nField].mnDim; } // test for page field SCROW nPageStartRow = aStartPos.Row() + ( bDoFilter ? 1 : 0 ); - if ( nCol == aStartPos.Col() && nRow >= nPageStartRow && nRow < nPageStartRow + nPageFieldCount ) + if ( nCol == aStartPos.Col() && nRow >= nPageStartRow && static_cast<size_t>(nRow) < nPageStartRow + pPageFields.size() ) { rOrient = sheet::DataPilotFieldOrientation_PAGE; long nField = nRow - nPageStartRow; - return pPageFields[nField].nDim; + return pPageFields[nField].mnDim; } //TODO: single data field (?) @@ -1696,7 +1636,7 @@ bool ScDPOutput::GetHeaderDrag( const ScAddress& rPos, bool bMouseLeft, bool bMo // test for column header if ( nCol >= nDataStartCol && nCol <= nTabEndCol && - nRow + 1 >= nMemberStartRow && nRow < nMemberStartRow + nColFieldCount ) + nRow + 1 >= nMemberStartRow && static_cast<size_t>(nRow) < nMemberStartRow + pColFields.size()) { long nField = nRow - nMemberStartRow; if (nField < 0) @@ -1712,9 +1652,9 @@ bool ScDPOutput::GetHeaderDrag( const ScAddress& rPos, bool bMouseLeft, bool bMo bool bFound = false; // is this within the same orientation? bool bBeforeDrag = false; bool bAfterDrag = false; - for (long nPos=0; nPos<nColFieldCount && !bFound; nPos++) + for (long nPos=0; static_cast<size_t>(nPos)<pColFields.size() && !bFound; nPos++) { - if (pColFields[nPos].nDim == nDragDim) + if (pColFields[nPos].mnDim == nDragDim) { bFound = true; if ( nField < nPos ) @@ -1752,10 +1692,10 @@ bool ScDPOutput::GetHeaderDrag( const ScAddress& rPos, bool bMouseLeft, bool bMo // special case if no row fields bool bSpecial = ( nRow+1 >= nDataStartRow && nRow <= nTabEndRow && - nRowFieldCount == 0 && nCol == nTabStartCol && bMouseLeft ); + pRowFields.empty() && nCol == nTabStartCol && bMouseLeft ); if ( bSpecial || ( nRow+1 >= nDataStartRow && nRow <= nTabEndRow && - nCol + 1 >= nTabStartCol && nCol < nTabStartCol + nRowFieldCount ) ) + nCol + 1 >= nTabStartCol && static_cast<size_t>(nCol) < nTabStartCol + pRowFields.size() ) ) { long nField = nCol - nTabStartCol; //TODO: find start of dimension @@ -1766,9 +1706,9 @@ bool ScDPOutput::GetHeaderDrag( const ScAddress& rPos, bool bMouseLeft, bool bMo bool bFound = false; // is this within the same orientation? bool bBeforeDrag = false; bool bAfterDrag = false; - for (long nPos=0; nPos<nRowFieldCount && !bFound; nPos++) + for (long nPos=0; static_cast<size_t>(nPos)<pRowFields.size() && !bFound; nPos++) { - if (pRowFields[nPos].nDim == nDragDim) + if (pRowFields[nPos].mnDim == nDragDim) { bFound = true; if ( nField < nPos ) @@ -1806,7 +1746,7 @@ bool ScDPOutput::GetHeaderDrag( const ScAddress& rPos, bool bMouseLeft, bool bMo SCROW nPageStartRow = aStartPos.Row() + ( bDoFilter ? 1 : 0 ); if ( nCol >= aStartPos.Col() && nCol <= nTabEndCol && - nRow + 1 >= nPageStartRow && nRow < nPageStartRow + nPageFieldCount ) + nRow + 1 >= nPageStartRow && static_cast<size_t>(nRow) < nPageStartRow + pPageFields.size() ) { long nField = nRow - nPageStartRow; if (nField < 0) @@ -1822,9 +1762,9 @@ bool ScDPOutput::GetHeaderDrag( const ScAddress& rPos, bool bMouseLeft, bool bMo bool bFound = false; // is this within the same orientation? bool bBeforeDrag = false; bool bAfterDrag = false; - for (long nPos=0; nPos<nPageFieldCount && !bFound; nPos++) + for (long nPos=0; static_cast<size_t>(nPos)<pPageFields.size() && !bFound; nPos++) { - if (pPageFields[nPos].nDim == nDragDim) + if (pPageFields[nPos].mnDim == nDragDim) { bFound = true; if ( nField < nPos ) |