summaryrefslogtreecommitdiff
path: root/sc/source/core
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/core')
-rw-r--r--sc/source/core/data/docpool.cxx8
-rw-r--r--sc/source/core/data/dpgroup.cxx41
-rwxr-xr-xsc/source/core/data/dpobject.cxx5
-rwxr-xr-xsc/source/core/data/dpoutput.cxx160
-rwxr-xr-xsc/source/core/data/dptabdat.cxx10
-rwxr-xr-xsc/source/core/data/dptabres.cxx15
-rw-r--r--sc/source/core/data/table4.cxx2
-rw-r--r--sc/source/core/data/table5.cxx21
8 files changed, 129 insertions, 133 deletions
diff --git a/sc/source/core/data/docpool.cxx b/sc/source/core/data/docpool.cxx
index d6aa91efcca6..cd763cfc0787 100644
--- a/sc/source/core/data/docpool.cxx
+++ b/sc/source/core/data/docpool.cxx
@@ -705,7 +705,7 @@ SfxItemPresentation lcl_HFPresentation
nTmp = rLRItem.GetRight();
nRightMargin = nTmp < 0 ? 0 : USHORT(nTmp);
- aText = SVX_RESSTR(RID_SVXITEMS_LRSPACE_LEFT);
+ aText = EE_RESSTR(RID_SVXITEMS_LRSPACE_LEFT);
if ( 100 != nPropLeftMargin )
{
aText += String::CreateFromInt32( nPropLeftMargin );
@@ -715,13 +715,13 @@ SfxItemPresentation lcl_HFPresentation
{
aText += GetMetricText( (long)nLeftMargin,
eCoreMetric, ePresentationMetric, pIntl );
- aText += SVX_RESSTR(GetMetricId(ePresentationMetric));
+ aText += EE_RESSTR(GetMetricId(ePresentationMetric));
}
aText += cpDelim;
// nPropFirstLineOfst haben wir nicht
- aText += SVX_RESSTR(RID_SVXITEMS_LRSPACE_RIGHT);
+ aText += EE_RESSTR(RID_SVXITEMS_LRSPACE_RIGHT);
if ( 100 != nPropRightMargin )
{
aText += String::CreateFromInt32( nPropRightMargin );
@@ -731,7 +731,7 @@ SfxItemPresentation lcl_HFPresentation
{
aText += GetMetricText( (long)nRightMargin,
eCoreMetric, ePresentationMetric, pIntl );
- aText += SVX_RESSTR(GetMetricId(ePresentationMetric));
+ aText += EE_RESSTR(GetMetricId(ePresentationMetric));
}
}
break;
diff --git a/sc/source/core/data/dpgroup.cxx b/sc/source/core/data/dpgroup.cxx
index e71ec5c8b82c..edb3b787b9b2 100644
--- a/sc/source/core/data/dpgroup.cxx
+++ b/sc/source/core/data/dpgroup.cxx
@@ -1324,13 +1324,9 @@ void ScDPGroupTableData::GetDrillDownData(const vector<ScDPCacheTable::Criterion
void ScDPGroupTableData::CalcResults(CalcInfo& rInfo, bool bAutoShow)
{
- // This CalcInfo instance is used only to retrive data from the original
- // data source.
- CalcInfo aInfoSrc = rInfo;
- CopyFields(rInfo.aColLevelDims, aInfoSrc.aColLevelDims);
- CopyFields(rInfo.aRowLevelDims, aInfoSrc.aRowLevelDims);
- CopyFields(rInfo.aPageDims, aInfoSrc.aPageDims);
- CopyFields(rInfo.aDataSrcCols, aInfoSrc.aDataSrcCols);
+ // #i111435# Inside FillRowDataFromCacheTable/GetItemData, virtual methods
+ // getIsDataLayoutDimension and GetSourceDim are used, so it has to be called
+ // with original rInfo, containing dimension indexes of the grouped data.
const ScDPCacheTable& rCacheTable = pSourceData->GetCacheTable();
sal_Int32 nRowSize = rCacheTable.getRowSize();
@@ -1340,7 +1336,7 @@ void ScDPGroupTableData::CalcResults(CalcInfo& rInfo, bool bAutoShow)
continue;
CalcRowData aData;
- FillRowDataFromCacheTable(nRow, rCacheTable, aInfoSrc, aData);
+ FillRowDataFromCacheTable(nRow, rCacheTable, rInfo, aData);
if ( !rInfo.aColLevelDims.empty() )
FillGroupValues(&aData.aColData[0], rInfo.aColLevelDims.size(), &rInfo.aColLevelDims[0]);
@@ -1358,35 +1354,6 @@ const ScDPCacheTable& ScDPGroupTableData::GetCacheTable() const
return pSourceData->GetCacheTable();
}
-void ScDPGroupTableData::CopyFields(const vector<long>& rFieldDims, vector<long>& rNewFieldDims)
-{
- size_t nCount = rFieldDims.size();
- if (!nCount)
- return;
-
- long nGroupedColumns = aGroups.size();
-
- rNewFieldDims.clear();
- rNewFieldDims.reserve(nCount);
- for (size_t i = 0; i < nCount; ++i)
- {
- if ( rFieldDims[i] >= nSourceCount )
- {
- if ( rFieldDims[i] == nSourceCount + nGroupedColumns )
- // data layout in source
- rNewFieldDims.push_back(nSourceCount);
- else
- {
- // original dimension
- long n = rFieldDims[i] - nSourceCount;
- rNewFieldDims.push_back(aGroups[n].GetSourceDim());
- }
- }
- else
- rNewFieldDims.push_back(rFieldDims[i]);
- }
-}
-
void ScDPGroupTableData::FillGroupValues( /*ScDPItemData* pItemData*/ SCROW* pItemDataIndex, long nCount, const long* pDims )
{
long nGroupedColumns = aGroups.size();
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx
index 44c998fb4ede..5394605969d0 100755
--- a/sc/source/core/data/dpobject.cxx
+++ b/sc/source/core/data/dpobject.cxx
@@ -623,6 +623,11 @@ void ScDPObject::BuildAllDimensionMembers()
if (!pSaveData)
return;
+ // #i111857# don't always create empty mpTableData for external service.
+ // Ideally, xSource should be used instead of mpTableData.
+ if (pServDesc)
+ return;
+
pSaveData->BuildAllDimensionMembers(GetTableData());
}
diff --git a/sc/source/core/data/dpoutput.cxx b/sc/source/core/data/dpoutput.cxx
index ec384874aa69..91688c6c0e2a 100755
--- a/sc/source/core/data/dpoutput.cxx
+++ b/sc/source/core/data/dpoutput.cxx
@@ -1087,6 +1087,72 @@ bool ScDPOutput::GetHeaderLayout() const
return mbHeaderLayout;
}
+void lcl_GetTableVars( sal_Int32& rGrandTotalCols, sal_Int32& rGrandTotalRows, sal_Int32& rDataLayoutIndex,
+ std::vector<String>& rDataNames, std::vector<String>& rGivenNames,
+ sheet::DataPilotFieldOrientation& rDataOrient,
+ const uno::Reference<sheet::XDimensionsSupplier>& xSource )
+{
+ rDataLayoutIndex = -1; // invalid
+ rGrandTotalCols = 0;
+ rGrandTotalRows = 0;
+ rDataOrient = sheet::DataPilotFieldOrientation_HIDDEN;
+
+ uno::Reference<beans::XPropertySet> xSrcProp( xSource, uno::UNO_QUERY );
+ BOOL bColGrand = ScUnoHelpFunctions::GetBoolProperty( xSrcProp,
+ rtl::OUString::createFromAscii(DP_PROP_COLUMNGRAND) );
+ if ( bColGrand )
+ rGrandTotalCols = 1; // default if data layout not in columns
+
+ BOOL bRowGrand = ScUnoHelpFunctions::GetBoolProperty( xSrcProp,
+ rtl::OUString::createFromAscii(DP_PROP_ROWGRAND) );
+ if ( bRowGrand )
+ rGrandTotalRows = 1; // default if data layout not in rows
+
+ if ( xSource.is() )
+ {
+ // find index and orientation of "data layout" dimension, count data dimensions
+
+ sal_Int32 nDataCount = 0;
+
+ uno::Reference<container::XIndexAccess> xDims = new ScNameToIndexAccess( xSource->getDimensions() );
+ 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 );
+ if ( xDimProp.is() )
+ {
+ sheet::DataPilotFieldOrientation eDimOrient =
+ (sheet::DataPilotFieldOrientation) ScUnoHelpFunctions::GetEnumProperty(
+ xDimProp, rtl::OUString::createFromAscii(DP_PROP_ORIENTATION),
+ sheet::DataPilotFieldOrientation_HIDDEN );
+ if ( ScUnoHelpFunctions::GetBoolProperty( xDimProp,
+ rtl::OUString::createFromAscii(DP_PROP_ISDATALAYOUT) ) )
+ {
+ rDataLayoutIndex = nDim;
+ rDataOrient = eDimOrient;
+ }
+ if ( eDimOrient == sheet::DataPilotFieldOrientation_DATA )
+ {
+ String aSourceName;
+ String aGivenName;
+ ScDPOutput::GetDataDimensionNames( aSourceName, aGivenName, xDim );
+ rDataNames.push_back( aSourceName );
+ rGivenNames.push_back( aGivenName );
+
+ ++nDataCount;
+ }
+ }
+ }
+
+ if ( ( rDataOrient == sheet::DataPilotFieldOrientation_COLUMN ) && bColGrand )
+ rGrandTotalCols = nDataCount;
+ else if ( ( rDataOrient == sheet::DataPilotFieldOrientation_ROW ) && bRowGrand )
+ rGrandTotalRows = nDataCount;
+ }
+}
+
void ScDPOutput::GetPositionData(const ScAddress& rPos, DataPilotTablePositionData& rPosData)
{
using namespace ::com::sun::star::sheet;
@@ -1207,15 +1273,14 @@ bool ScDPOutput::GetDataResultPositionData(vector<sheet::DataPilotFieldFilter>&
// No data field is present in this datapilot table.
return false;
- bool bColGrand = bool();
- any = xPropSet->getPropertyValue(rtl::OUString::createFromAscii(SC_UNO_COLGRAND));
- if (!(any >>= bColGrand))
- return false;
-
- bool bRowGrand = bool();
- any = xPropSet->getPropertyValue(rtl::OUString::createFromAscii(SC_UNO_ROWGRAND));
- if (!(any >>= bRowGrand))
- return false;
+ // #i111421# use lcl_GetTableVars for correct size of totals and data layout position
+ sal_Int32 nGrandTotalCols;
+ sal_Int32 nGrandTotalRows;
+ sal_Int32 nDataLayoutIndex;
+ std::vector<String> aDataNames;
+ std::vector<String> aGivenNames;
+ sheet::DataPilotFieldOrientation eDataOrient;
+ lcl_GetTableVars( nGrandTotalCols, nGrandTotalRows, nDataLayoutIndex, aDataNames, aGivenNames, eDataOrient, xSource );
SCCOL nCol = rPos.Col();
SCROW nRow = rPos.Row();
@@ -1232,12 +1297,16 @@ bool ScDPOutput::GetDataResultPositionData(vector<sheet::DataPilotFieldFilter>&
return false;
}
- bool bFilterByCol = !(bColGrand && (nCol == nTabEndCol));
- bool bFilterByRow = !(bRowGrand && (nRow == nTabEndRow));
+ bool bFilterByCol = (nCol <= static_cast<SCCOL>(nTabEndCol - nGrandTotalCols));
+ bool bFilterByRow = (nRow <= static_cast<SCROW>(nTabEndRow - nGrandTotalRows));
// column fields
for (SCCOL nColField = 0; nColField < nColFieldCount && bFilterByCol; ++nColField)
{
+ if (pColFields[nColField].nDim == nDataLayoutIndex)
+ // There is no sense including the data layout field for filtering.
+ continue;
+
sheet::DataPilotFieldFilter filter;
filter.FieldName = pColFields[nColField].maName;
@@ -1256,10 +1325,9 @@ bool ScDPOutput::GetDataResultPositionData(vector<sheet::DataPilotFieldFilter>&
}
// row fields
- bool bDataLayoutExists = (nDataFieldCount > 1);
for (SCROW nRowField = 0; nRowField < nRowFieldCount && bFilterByRow; ++nRowField)
{
- if (bDataLayoutExists && nRowField == nRowFieldCount - 1)
+ if (pRowFields[nRowField].nDim == nDataLayoutIndex)
// There is no sense including the data layout field for filtering.
continue;
@@ -1643,72 +1711,6 @@ void ScDPOutput::GetDataDimensionNames( String& rSourceName, String& rGivenName,
}
}
-void lcl_GetTableVars( sal_Int32& rGrandTotalCols, sal_Int32& rGrandTotalRows, sal_Int32& rDataLayoutIndex,
- std::vector<String>& rDataNames, std::vector<String>& rGivenNames,
- sheet::DataPilotFieldOrientation& rDataOrient,
- const uno::Reference<sheet::XDimensionsSupplier>& xSource )
-{
- rDataLayoutIndex = -1; // invalid
- rGrandTotalCols = 0;
- rGrandTotalRows = 0;
- rDataOrient = sheet::DataPilotFieldOrientation_HIDDEN;
-
- uno::Reference<beans::XPropertySet> xSrcProp( xSource, uno::UNO_QUERY );
- BOOL bColGrand = ScUnoHelpFunctions::GetBoolProperty( xSrcProp,
- rtl::OUString::createFromAscii(DP_PROP_COLUMNGRAND) );
- if ( bColGrand )
- rGrandTotalCols = 1; // default if data layout not in columns
-
- BOOL bRowGrand = ScUnoHelpFunctions::GetBoolProperty( xSrcProp,
- rtl::OUString::createFromAscii(DP_PROP_ROWGRAND) );
- if ( bRowGrand )
- rGrandTotalRows = 1; // default if data layout not in rows
-
- if ( xSource.is() )
- {
- // find index and orientation of "data layout" dimension, count data dimensions
-
- sal_Int32 nDataCount = 0;
-
- uno::Reference<container::XIndexAccess> xDims = new ScNameToIndexAccess( xSource->getDimensions() );
- 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 );
- if ( xDimProp.is() )
- {
- sheet::DataPilotFieldOrientation eDimOrient =
- (sheet::DataPilotFieldOrientation) ScUnoHelpFunctions::GetEnumProperty(
- xDimProp, rtl::OUString::createFromAscii(DP_PROP_ORIENTATION),
- sheet::DataPilotFieldOrientation_HIDDEN );
- if ( ScUnoHelpFunctions::GetBoolProperty( xDimProp,
- rtl::OUString::createFromAscii(DP_PROP_ISDATALAYOUT) ) )
- {
- rDataLayoutIndex = nDim;
- rDataOrient = eDimOrient;
- }
- if ( eDimOrient == sheet::DataPilotFieldOrientation_DATA )
- {
- String aSourceName;
- String aGivenName;
- ScDPOutput::GetDataDimensionNames( aSourceName, aGivenName, xDim );
- rDataNames.push_back( aSourceName );
- rGivenNames.push_back( aGivenName );
-
- ++nDataCount;
- }
- }
- }
-
- if ( ( rDataOrient == sheet::DataPilotFieldOrientation_COLUMN ) && bColGrand )
- rGrandTotalCols = nDataCount;
- else if ( ( rDataOrient == sheet::DataPilotFieldOrientation_ROW ) && bRowGrand )
- rGrandTotalRows = nDataCount;
- }
-}
-
// Returns TRUE on success and stores the result in rTarget
// Returns FALSE if rFilters or rTarget describes something that is not visible
BOOL ScDPOutput::GetPivotData( ScDPGetPivotDataField& rTarget,
diff --git a/sc/source/core/data/dptabdat.cxx b/sc/source/core/data/dptabdat.cxx
index cff18ef925d9..cb68732a237f 100755
--- a/sc/source/core/data/dptabdat.cxx
+++ b/sc/source/core/data/dptabdat.cxx
@@ -169,13 +169,19 @@ void ScDPTableData::FillRowDataFromCacheTable(sal_Int32 nRow, const ScDPCacheTab
// page dimensions
GetItemData(rCacheTable, nRow, rInfo.aPageDims, rData.aPageData);
+ long nCacheColumnCount = rCacheTable.GetCache()->GetColumnCount();
sal_Int32 n = rInfo.aDataSrcCols.size();
for (sal_Int32 i = 0; i < n; ++i)
{
long nDim = rInfo.aDataSrcCols[i];
rData.aValues.push_back( ScDPValueData() );
- ScDPValueData& rVal = rData.aValues.back();
- rCacheTable.getValue( rVal, static_cast<SCCOL>(nDim), static_cast<SCROW>(nRow), false);
+ // #i111435# GetItemData needs dimension indexes including groups,
+ // so the index must be checked here (groups aren't useful as data fields).
+ if ( nDim < nCacheColumnCount )
+ {
+ ScDPValueData& rVal = rData.aValues.back();
+ rCacheTable.getValue( rVal, static_cast<SCCOL>(nDim), static_cast<SCROW>(nRow), false);
+ }
}
}
diff --git a/sc/source/core/data/dptabres.cxx b/sc/source/core/data/dptabres.cxx
index af8b74d546a8..c79f7c1b17a6 100755
--- a/sc/source/core/data/dptabres.cxx
+++ b/sc/source/core/data/dptabres.cxx
@@ -1153,11 +1153,16 @@ void ScDPResultMember::LateInitFrom( LateInitParams& rParams/*const vector<ScDPD
{
if ( rParams.GetDim( nPos ) ->getIsDataLayoutDimension() )
{
- if ( !pChildDimension )
- pChildDimension = new ScDPResultDimension( pResultData );
- rParams.SetInitChild( FALSE );
- pChildDimension->LateInitFrom( rParams, pItemData, nPos, rInitState );
- return;
+ if ( !pChildDimension )
+ pChildDimension = new ScDPResultDimension( pResultData );
+
+ // #i111462# reset InitChild flag only for this child dimension's LateInitFrom call,
+ // not for following members of parent dimensions
+ BOOL bWasInitChild = rParams.GetInitChild();
+ rParams.SetInitChild( FALSE );
+ pChildDimension->LateInitFrom( rParams, pItemData, nPos, rInitState );
+ rParams.SetInitChild( bWasInitChild );
+ return;
}
else
{ //find next dim
diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx
index 4a736e8c11b7..434144d06e00 100644
--- a/sc/source/core/data/table4.cxx
+++ b/sc/source/core/data/table4.cxx
@@ -586,13 +586,13 @@ void ScTable::FillAuto( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
// Attributierung uebertragen
const ScPatternAttr* pSrcPattern = NULL;
+ const ScStyleSheet* pStyleSheet = NULL;
ULONG nAtSrc = nISrcStart;
ScPatternAttr* pNewPattern = NULL;
BOOL bGetPattern = TRUE;
rInner = nIStart;
while (true) // #i53728# with "for (;;)" old solaris/x86 compiler mis-optimizes
{
- const ScStyleSheet* pStyleSheet = NULL;
if ( bGetPattern )
{
if ( pNewPattern )
diff --git a/sc/source/core/data/table5.cxx b/sc/source/core/data/table5.cxx
index 3a7117dfcd10..a3a0153a4b97 100644
--- a/sc/source/core/data/table5.cxx
+++ b/sc/source/core/data/table5.cxx
@@ -114,14 +114,25 @@ void ScTable::UpdatePageBreaks( const ScRange* pUserArea )
} // sonst alles
}
- // bSkipBreaks holen:
+ // get bSkipColBreaks/bSkipRowBreaks flags:
- BOOL bSkipBreaks = FALSE;
+ bool bSkipColBreaks = false;
+ bool bSkipRowBreaks = false;
if ( pStyleSet->GetItemState( ATTR_PAGE_SCALETOPAGES, FALSE, &pItem ) == SFX_ITEM_SET )
{
DBG_ASSERT( pItem->ISA(SfxUInt16Item), "falsches Item" );
- bSkipBreaks = ( ((const SfxUInt16Item*)pItem)->GetValue() > 0 );
+ bSkipColBreaks = bSkipRowBreaks = ( ((const SfxUInt16Item*)pItem)->GetValue() > 0 );
+ }
+
+ if ( !bSkipColBreaks && pStyleSet->GetItemState(ATTR_PAGE_SCALETO, FALSE, &pItem) == SFX_ITEM_SET )
+ {
+ // #i54993# when fitting to width or height, ignore only manual breaks in that direction
+ const ScPageScaleToItem* pScaleToItem = static_cast<const ScPageScaleToItem*>(pItem);
+ if ( pScaleToItem->GetWidth() > 0 )
+ bSkipColBreaks = true;
+ if ( pScaleToItem->GetHeight() > 0 )
+ bSkipRowBreaks = true;
}
//--------------------------------------------------------------------------
@@ -149,7 +160,7 @@ void ScTable::UpdatePageBreaks( const ScRange* pUserArea )
{
BOOL bStartOfPage = FALSE;
long nThisX = ( pColFlags[nX] & CR_HIDDEN ) ? 0 : pColWidth[nX];
- if ( (nSizeX+nThisX > nPageSizeX) || ((pColFlags[nX] & CR_MANUALBREAK) && !bSkipBreaks) )
+ if ( (nSizeX+nThisX > nPageSizeX) || ((pColFlags[nX] & CR_MANUALBREAK) && !bSkipColBreaks) )
{
pColFlags[nX] |= CR_PAGEBREAK;
nSizeX = 0;
@@ -187,7 +198,7 @@ void ScTable::UpdatePageBreaks( const ScRange* pUserArea )
BOOL bStartOfPage = FALSE;
BYTE nFlags = *aFlagsIter;
long nThisY = (nFlags & CR_HIDDEN) ? 0 : *aHeightIter;
- if ( (nSizeY+nThisY > nPageSizeY) || ((nFlags & CR_MANUALBREAK) && !bSkipBreaks) )
+ if ( (nSizeY+nThisY > nPageSizeY) || ((nFlags & CR_MANUALBREAK) && !bSkipRowBreaks) )
{
pRowFlags->SetValue( nY, nFlags | CR_PAGEBREAK);
aFlagsIter.Resync( nY);