diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-01-03 14:50:18 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-01-03 14:57:04 -0500 |
commit | c9db8c02a38bfff08a9bae3b2901c316a4f3eabe (patch) | |
tree | 16503038293f847bf9f5686b3c7cc29b9f805035 /sc/source/core/data/dpoutput.cxx | |
parent | 55e61ec26d44847ffa55537a6bbe49bdf2fe1d03 (diff) |
fdo#58004: Apply source number format over one specified by the style.
Pivot table output applies several pre-defined styles, which also include
number formats. But, the source number format, or one set by the pivot
table should take precedence over the one specified by the style, or else
it would lead to a very peculiar behavior.
This is especially the case when the documnet has its 'Default' style
specify a number format that's not 'General'.
Also, we should take all number formats into account, including the ones
that are 0.
Change-Id: Ifa794314a2881c5146e24eb7be892585a823048d
Diffstat (limited to 'sc/source/core/data/dpoutput.cxx')
-rw-r--r-- | sc/source/core/data/dpoutput.cxx | 178 |
1 files changed, 99 insertions, 79 deletions
diff --git a/sc/source/core/data/dpoutput.cxx b/sc/source/core/data/dpoutput.cxx index 1a3022d6d82e..be2518c0fae1 100644 --- a/sc/source/core/data/dpoutput.cxx +++ b/sc/source/core/data/dpoutput.cxx @@ -81,6 +81,7 @@ struct ScDPOutLevelData long nHier; long nLevel; long nDimPos; + sal_uInt32 mnSrcNumFmt; /// Prevailing number format used in the source data. uno::Sequence<sheet::MemberResult> aResult; rtl::OUString maName; /// Name is the internal field name. rtl::OUString maCaption; /// Caption is the name visible in the output table. @@ -89,7 +90,7 @@ struct ScDPOutLevelData bool mbPageDim:1; ScDPOutLevelData() : - nDim(-1), nHier(-1), nLevel(-1), nDimPos(-1), mbHasHiddenMember(false), mbDataLayout(false), mbPageDim(false) + nDim(-1), nHier(-1), nLevel(-1), nDimPos(-1), mnSrcNumFmt(0), mbHasHiddenMember(false), mbDataLayout(false), mbPageDim(false) {} bool operator<(const ScDPOutLevelData& r) const @@ -339,80 +340,76 @@ void lcl_FillNumberFormats( sal_uInt32*& rFormats, long& rCount, uno::Sequence<sheet::MemberResult> aResult = xLevRes->getResults(); long nSize = aResult.getLength(); - if (nSize) - { - // get names/formats for all data dimensions - //! merge this with the loop to collect ScDPOutLevelData? + if (!nSize) + return; - rtl::OUString aDataNames[SC_DPOUT_MAXLEVELS]; - sal_uInt32 nDataFormats[SC_DPOUT_MAXLEVELS]; - long nDataCount = 0; - bool bAnySet = false; + // get names/formats for all data dimensions + //! merge this with the loop to collect ScDPOutLevelData? - long nDimCount = xDims->getCount(); - for (long nDim=0; nDim<nDimCount; nDim++) + rtl::OUString aDataNames[SC_DPOUT_MAXLEVELS]; + sal_uInt32 nDataFormats[SC_DPOUT_MAXLEVELS]; + long nDataCount = 0; + long nDimCount = xDims->getCount(); + for (long nDim=0; nDim<nDimCount; nDim++) + { + uno::Reference<uno::XInterface> xDim = + ScUnoHelpFunctions::AnyToInterface( xDims->getByIndex(nDim) ); + uno::Reference<beans::XPropertySet> xDimProp( xDim, uno::UNO_QUERY ); + uno::Reference<container::XNamed> xDimName( xDim, uno::UNO_QUERY ); + if ( xDimProp.is() && xDimName.is() ) { - uno::Reference<uno::XInterface> xDim = - ScUnoHelpFunctions::AnyToInterface( xDims->getByIndex(nDim) ); - uno::Reference<beans::XPropertySet> xDimProp( xDim, uno::UNO_QUERY ); - uno::Reference<container::XNamed> xDimName( xDim, uno::UNO_QUERY ); - if ( xDimProp.is() && xDimName.is() ) + sheet::DataPilotFieldOrientation eDimOrient = + (sheet::DataPilotFieldOrientation) ScUnoHelpFunctions::GetEnumProperty( + xDimProp, rtl::OUString(SC_UNO_DP_ORIENTATION), + sheet::DataPilotFieldOrientation_HIDDEN ); + if ( eDimOrient == sheet::DataPilotFieldOrientation_DATA ) { - sheet::DataPilotFieldOrientation eDimOrient = - (sheet::DataPilotFieldOrientation) ScUnoHelpFunctions::GetEnumProperty( - xDimProp, rtl::OUString(SC_UNO_DP_ORIENTATION), - sheet::DataPilotFieldOrientation_HIDDEN ); - if ( eDimOrient == sheet::DataPilotFieldOrientation_DATA ) - { - aDataNames[nDataCount] = xDimName->getName(); - long nFormat = ScUnoHelpFunctions::GetLongProperty( - xDimProp, - rtl::OUString(SC_UNONAME_NUMFMT) ); - nDataFormats[nDataCount] = nFormat; - if ( nFormat != 0 ) - bAnySet = true; - ++nDataCount; - } + aDataNames[nDataCount] = xDimName->getName(); + long nFormat = ScUnoHelpFunctions::GetLongProperty( + xDimProp, + rtl::OUString(SC_UNONAME_NUMFMT) ); + nDataFormats[nDataCount] = nFormat; + ++nDataCount; } } + } - if ( bAnySet ) // forget everything if all formats are 0 (or no data dimensions) - { - const sheet::MemberResult* pArray = aResult.getConstArray(); + if (!nDataCount) + return; - rtl::OUString aName; - sal_uInt32* pNumFmt = new sal_uInt32[nSize]; - if (nDataCount == 1) - { - // only one data dimension -> use its numberformat everywhere - long nFormat = nDataFormats[0]; - for (long nPos=0; nPos<nSize; nPos++) - pNumFmt[nPos] = nFormat; - } - else - { - for (long nPos=0; nPos<nSize; nPos++) + const sheet::MemberResult* pArray = aResult.getConstArray(); + + rtl::OUString aName; + sal_uInt32* pNumFmt = new sal_uInt32[nSize]; + if (nDataCount == 1) + { + // only one data dimension -> use its numberformat everywhere + long nFormat = nDataFormats[0]; + for (long nPos=0; nPos<nSize; nPos++) + pNumFmt[nPos] = nFormat; + } + else + { + for (long nPos=0; nPos<nSize; nPos++) + { + // if CONTINUE bit is set, keep previous name + //! keep number format instead! + if ( !(pArray[nPos].Flags & sheet::MemberResultFlags::CONTINUE) ) + aName = pArray[nPos].Name; + + sal_uInt32 nFormat = 0; + for (long i=0; i<nDataCount; i++) + if (aName == aDataNames[i]) //! search more efficiently? { - // if CONTINUE bit is set, keep previous name - //! keep number format instead! - if ( !(pArray[nPos].Flags & sheet::MemberResultFlags::CONTINUE) ) - aName = pArray[nPos].Name; - - sal_uInt32 nFormat = 0; - for (long i=0; i<nDataCount; i++) - if (aName == aDataNames[i]) //! search more efficiently? - { - nFormat = nDataFormats[i]; - break; - } - pNumFmt[nPos] = nFormat; + nFormat = nDataFormats[i]; + break; } - } - - rFormats = pNumFmt; - rCount = nSize; + pNumFmt[nPos] = nFormat; } } + + rFormats = pNumFmt; + rCount = nSize; } sal_uInt32 lcl_GetFirstNumberFormat( const uno::Reference<container::XIndexAccess>& xDims ) @@ -566,6 +563,8 @@ ScDPOutput::ScDPOutput( ScDocument* pD, const uno::Reference<sheet::XDimensionsS xDimProp, rtl::OUString(SC_UNO_DP_ISDATALAYOUT)); bool bHasHiddenMember = ScUnoHelpFunctions::GetBoolProperty( xDimProp, OUString(SC_UNO_DP_HAS_HIDDEN_MEMBER)); + sal_Int32 nNumFmt = ScUnoHelpFunctions::GetLongProperty( + xDimProp, SC_UNO_DP_NUMBERFO, 0); if ( eDimOrient != sheet::DataPilotFieldOrientation_HIDDEN ) { @@ -613,6 +612,7 @@ ScDPOutput::ScDPOutput( ScDocument* pD, const uno::Reference<sheet::XDimensionsS 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].mbHasHiddenMember = bHasHiddenMember; @@ -626,6 +626,7 @@ ScDPOutput::ScDPOutput( ScDocument* pD, const uno::Reference<sheet::XDimensionsS 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].mbHasHiddenMember = bHasHiddenMember; @@ -642,6 +643,7 @@ ScDPOutput::ScDPOutput( ScDocument* pD, const uno::Reference<sheet::XDimensionsS 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].mbHasHiddenMember = bHasHiddenMember; @@ -746,13 +748,17 @@ void ScDPOutput::DataCell( SCCOL nCol, SCROW nRow, SCTAB nTab, const sheet::Data OSL_ENSURE( bSizesValid, "DataCell: !bSizesValid" ); sal_uInt32 nFormat = 0; + bool bApplyFormat = false; if ( pColNumFmt ) { if ( nCol >= nDataStartCol ) { long nIndex = nCol - nDataStartCol; if ( nIndex < nColFmtCount ) + { nFormat = pColNumFmt[nIndex]; + bApplyFormat = true; + } } } else if ( pRowNumFmt ) @@ -761,13 +767,20 @@ void ScDPOutput::DataCell( SCCOL nCol, SCROW nRow, SCTAB nTab, const sheet::Data { long nIndex = nRow - nDataStartRow; if ( nIndex < nRowFmtCount ) + { nFormat = pRowNumFmt[nIndex]; + bApplyFormat = true; + } } } else if ( nSingleNumFmt != 0 ) + { nFormat = nSingleNumFmt; // single format is used everywhere - if ( nFormat != 0 ) - pDoc->ApplyAttr( nCol, nRow, nTab, SfxUInt32Item( ATTR_VALUE_FORMAT, nFormat ) ); + bApplyFormat = true; + } + + if (bApplyFormat) + pDoc->ApplyAttr(nCol, nRow, nTab, SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat)); } // SubTotal formatting is controlled by headers } @@ -980,20 +993,6 @@ void ScDPOutput::Output() if ( bDoFilter ) lcl_DoFilterButton( pDoc, aStartPos.Col(), aStartPos.Row(), nTab ); - // output data results: - - for (long nRow=0; nRow<nRowCount; nRow++) - { - SCROW nRowPos = nDataStartRow + (SCROW)nRow; //! check for overflow - const sheet::DataResult* pColAry = pRowAry[nRow].getConstArray(); - long nThisColCount = pRowAry[nRow].getLength(); - OSL_ENSURE( nThisColCount == nColCount, "count mismatch" ); //! ??? - for (long nCol=0; nCol<nThisColCount; nCol++) - { - SCCOL nColPos = nDataStartCol + (SCCOL)nCol; //! check for overflow - DataCell( nColPos, nRowPos, nTab, pColAry[nCol] ); - } - } // output page fields: for (nField=0; nField<nPageFieldCount; nField++) @@ -1077,6 +1076,9 @@ void ScDPOutput::Output() } else if ( pArray[nCol].Flags & sheet::MemberResultFlags::SUBTOTAL ) outputimp.AddCol( nColPos ); + + // 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 ) outputimp.OutputBlockFrame( nDataStartCol,nTabStartRow, nTabEndCol,nRowPos-1 ); @@ -1127,6 +1129,24 @@ void ScDPOutput::Output() } else if ( pArray[nRow].Flags & sheet::MemberResultFlags::SUBTOTAL ) outputimp.AddRow( nRowPos ); + + // Apply the same number format as in data source. + pDoc->ApplyAttr(nColPos, nRowPos, nTab, SfxUInt32Item(ATTR_VALUE_FORMAT, pRowFields[nField].mnSrcNumFmt)); + } + } + + // output data results: + + for (long nRow=0; nRow<nRowCount; nRow++) + { + SCROW nRowPos = nDataStartRow + (SCROW)nRow; //! check for overflow + const sheet::DataResult* pColAry = pRowAry[nRow].getConstArray(); + long nThisColCount = pRowAry[nRow].getLength(); + OSL_ENSURE( nThisColCount == nColCount, "count mismatch" ); //! ??? + for (long nCol=0; nCol<nThisColCount; nCol++) + { + SCCOL nColPos = nDataStartCol + (SCCOL)nCol; //! check for overflow + DataCell( nColPos, nRowPos, nTab, pColAry[nCol] ); } } |