24#include <unonames.hxx>
31#include <osl/diagnose.h>
35#include <com/sun/star/sheet/XDimensionsSupplier.hpp>
36#include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp>
37#include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp>
38#include <com/sun/star/sheet/DataPilotFieldReference.hpp>
39#include <com/sun/star/sheet/DataPilotFieldSortInfo.hpp>
40#include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
41#include <com/sun/star/sheet/XHierarchiesSupplier.hpp>
42#include <com/sun/star/sheet/XLevelsSupplier.hpp>
43#include <com/sun/star/sheet/XMembersSupplier.hpp>
44#include <com/sun/star/container/XNamed.hpp>
45#include <com/sun/star/util/XCloneable.hpp>
48#include <unordered_map>
54using ::std::unique_ptr;
56#define SC_DPSAVEMODE_DONTKNOW 2
59 const OUString& rName,
bool bValue )
63 xProp->setPropertyValue( rName,
uno::Any( bValue ) );
75 mpLayoutName( r.mpLayoutName ),
76 nVisibleMode( r.nVisibleMode ),
77 nShowDetailsMode( r.nShowDetailsMode )
137 uno::Reference<beans::XPropertySet> xMembProp( xMember, uno::UNO_QUERY );
138 OSL_ENSURE( xMembProp.is(),
"no properties at member" );
139 if ( !xMembProp.is() )
155 if ( nPosition >= 0 )
163 std::string aIndent(nIndent*4,
' ');
164 cout << aIndent <<
"* member name: '" <<
aName <<
"'" <<
endl;
166 cout << aIndent <<
" + layout name: ";
173 cout << aIndent <<
" + visibility: ";
185 bIsDataLayout( bDataLayout ),
187 nOrientation( sheet::DataPilotFieldOrientation_HIDDEN ),
189 nUsedHierarchy( -1 ),
191 bRepeatItemLabels( false ),
192 bSubTotalDefault( true )
198 mpLayoutName( r.mpLayoutName ),
199 mpSubtotalName( r.mpSubtotalName ),
200 bIsDataLayout( r.bIsDataLayout ),
201 bDupFlag( r.bDupFlag ),
202 nOrientation( r.nOrientation ),
203 nFunction( r.nFunction ),
204 nUsedHierarchy( r.nUsedHierarchy ),
205 nShowEmptyMode( r.nShowEmptyMode ),
206 bRepeatItemLabels( r.bRepeatItemLabels ),
207 bSubTotalDefault( r.bSubTotalDefault ),
208 maSubTotalFuncs( r.maSubTotalFuncs )
212 const OUString& rName = pMem->
GetName();
213 std::unique_ptr<ScDPSaveMember> pNew(
new ScDPSaveMember( *pMem ));
296 const OUString & rName = pMember->GetName();
298 auto tmp = pMember.get();
306 aExisting->second = std::move(pMember);
373 if (rName.equalsIgnoreAsciiCase(pMem->GetName()))
376 const std::optional<OUString> & pLayoutName = pMem->GetLayoutName();
377 return pLayoutName && rName.equalsIgnoreAsciiCase(*pLayoutName);
407 pSortInfo.reset(
new sheet::DataPilotFieldSortInfo(*pNew) );
415 pAutoShowInfo.reset(
new sheet::DataPilotFieldAutoShowInfo(*pNew) );
423 pLayoutInfo.reset(
new sheet::DataPilotFieldLayoutInfo(*pNew) );
435 bool bVisible = !pPage || pMem->GetName() == *pPage;
445 return (*it)->GetName();
454 return res->second.get();
462 return res->second.get();
465 maMemberHash[rName] = std::unique_ptr<ScDPSaveMember>(pNew);
481 uno::Reference<beans::XPropertySet> xDimProp( xDim, uno::UNO_QUERY );
482 OSL_ENSURE( xDimProp.is(),
"no properties at dimension" );
487 sheet::DataPilotFieldOrientation eOrient =
nOrientation;
490 sal_Int16 eFunc =
static_cast<sal_Int16
>(
nFunction);
519 uno::Reference<container::XIndexAccess> xHiers;
520 uno::Reference<sheet::XHierarchiesSupplier> xHierSupp( xDim, uno::UNO_QUERY );
521 if ( xHierSupp.is() )
523 uno::Reference<container::XNameAccess> xHiersName = xHierSupp->getHierarchies();
525 nHierCount = xHiers->getCount();
528 bool bHasHiddenMember =
false;
530 for (
tools::Long nHier=0; nHier<nHierCount; nHier++)
533 uno::Reference<container::XIndexAccess> xLevels;
534 uno::Reference<sheet::XLevelsSupplier> xLevSupp(xHiers->getByIndex(nHier), uno::UNO_QUERY);
537 uno::Reference<container::XNameAccess> xLevelsName = xLevSupp->getLevels();
539 nLevCount = xLevels->getCount();
544 uno::Reference<uno::XInterface> xLevel(xLevels->getByIndex(nLev), uno::UNO_QUERY);
545 uno::Reference<beans::XPropertySet> xLevProp( xLevel, uno::UNO_QUERY );
546 OSL_ENSURE( xLevProp.is(),
"no properties at level" );
577 uno::Reference<sheet::XMembersSupplier> xMembSupp( xLevel, uno::UNO_QUERY );
578 if ( xMembSupp.is() )
580 uno::Reference<sheet::XMembersAccess> xMembers = xMembSupp->getMembers();
583 sal_Int32 nPosition = -1;
589 if (!pMember->GetIsVisible())
590 bHasHiddenMember =
true;
591 OUString aMemberName = pMember->GetName();
592 if ( xMembers->hasByName( aMemberName ) )
594 uno::Reference<uno::XInterface> xMemberInt(
595 xMembers->getByName(aMemberName), uno::UNO_QUERY);
596 pMember->WriteToSource( xMemberInt, nPosition );
598 if ( nPosition >= 0 )
617 const OUString& rMemName = pMem->GetName();
618 auto itr = rData.find(rMemName);
619 if (itr != rData.end())
620 pMem->SetIsVisible(itr->second);
627 [](
const ScDPSaveMember* pMem) { return !pMem->GetIsVisible(); });
635 if (rMembers.count(pMem->GetName()))
638 aNew.push_back(pMem);
653 static const char* pOrientNames[] = {
"hidden",
"column",
"row",
"page",
"data" };
654 std::string aIndent(nIndent*4,
' ');
656 cout << aIndent <<
"* dimension name: '" <<
aName <<
"'" <<
endl;
658 cout << aIndent <<
" + orientation: ";
665 cout << aIndent <<
" + layout name: ";
672 cout << aIndent <<
" + subtotal name: ";
679 cout << aIndent <<
" + is data layout: " << (
bIsDataLayout ?
"yes" :
"no") << endl;
680 cout << aIndent <<
" + is duplicate: " << (
bDupFlag ?
"yes" :
"no") << endl;
684 pMem->Dump(nIndent+1);
697 bFilterButton( true ),
699 bExpandCollapse( false ),
700 mbDimensionMembersBuilt(false)
705 nColumnGrandMode( r.nColumnGrandMode ),
706 nRowGrandMode( r.nRowGrandMode ),
707 nIgnoreEmptyMode( r.nIgnoreEmptyMode ),
708 nRepeatEmptyMode( r.nRepeatEmptyMode ),
709 bFilterButton( r.bFilterButton ),
710 bDrillDown( r.bDrillDown ),
711 bExpandCollapse( r.bExpandCollapse ),
712 mbDimensionMembersBuilt(r.mbDimensionMembersBuilt),
713 mpGrandTotalName(r.mpGrandTotalName)
720 m_DimList.push_back(std::make_unique<ScDPSaveDimension>(*it));
781class DimOrderInserter
789 size_t nRank = mrNames.size();
801 std::vector<const ScDPSaveDimension*> aRowDims, aColDims;
805 std::for_each(aRowDims.begin(), aRowDims.end(), DimOrderInserter(*
mpDimOrder));
806 std::for_each(aColDims.begin(), aColDims.end(), DimOrderInserter(*
mpDimOrder));
812 sheet::DataPilotFieldOrientation eOrientation, std::vector<const ScDPSaveDimension*>& rDims)
const
814 std::vector<const ScDPSaveDimension*> aDims;
821 aDims.push_back(&rDim);
833 m_DimList.push_back(std::unique_ptr<ScDPSaveDimension>(pDim));
842 if (iter->GetName() == rName && !iter->IsDataLayout() )
853 if (iter->GetName() == rName && !iter->IsDataLayout() )
863 if (iter->GetName() == rName && !iter->IsDataLayout() )
883 if ( iter->IsDataLayout() )
905 [&rName](
const std::unique_ptr<ScDPSaveDimension>& rxDim) {
906 return rxDim->GetName() == rName && !rxDim->IsDataLayout(); });
928 [&nOrientation](
const std::unique_ptr<ScDPSaveDimension>& rxDim) {
929 return rxDim->GetOrientation() == nOrientation && !rxDim->IsDataLayout(); });
940 if (iter->GetOrientation() == eOrientation && !iter->IsDataLayout())
952 if (iter->GetOrientation() == sheet::DataPilotFieldOrientation_DATA)
966 [&pDim](
const std::unique_ptr<ScDPSaveDimension>& rxDim) { return pDim == rxDim.get(); });
977 [&nOrient, &nNew](
const std::unique_ptr<ScDPSaveDimension>& rxDim) {
978 if (rxDim->GetOrientation() == nOrient )
983 m_DimList.insert(iterInsert, std::unique_ptr<ScDPSaveDimension>(pDim));
1024 uno::Reference<container::XNameAccess> xDimsName = xSource->getDimensions();
1027 for (
tools::Long nIntDim=0; nIntDim<nIntCount; nIntDim++)
1029 uno::Reference<beans::XPropertySet> xDimProp(xIntDims->getByIndex(nIntDim), uno::UNO_QUERY);
1044 uno::Reference<beans::XPropertySet> xSourceProp( xSource, uno::UNO_QUERY );
1045 SAL_WARN_IF( !xSourceProp.is(),
"sc.core",
"no properties at source" );
1046 if ( xSourceProp.is() )
1060 catch(uno::Exception&)
1066 if (pGrandTotalName)
1076 SAL_INFO(
"sc.core",
"ScDPSaveData::WriteToSource");
1080 uno::Reference<container::XNameAccess> xDimsName = xSource->getDimensions();
1086 OUString
aName = rxDim->GetName();
1091 bool bData = rxDim->IsDataLayout();
1095 bool bFound =
false;
1096 for (
tools::Long nIntDim=0; nIntDim<nIntCount && !bFound; nIntDim++)
1098 uno::Reference<uno::XInterface> xIntDim(xIntDims->getByIndex(nIntDim),
1102 uno::Reference<beans::XPropertySet> xDimProp( xIntDim, uno::UNO_QUERY );
1103 if ( xDimProp.is() )
1112 uno::Reference<container::XNamed> xDimName( xIntDim, uno::UNO_QUERY );
1113 if (xDimName.is() && xDimName->getName() == aCoreName)
1119 if (rxDim->GetDupFlag())
1121 uno::Reference<util::XCloneable> xCloneable(xIntDim, uno::UNO_QUERY);
1122 SAL_WARN_IF(!xCloneable.is(),
"sc.core",
"cannot clone dimension");
1123 if (xCloneable.is())
1125 uno::Reference<util::XCloneable> xNew = xCloneable->createClone();
1126 uno::Reference<container::XNamed> xNewName(xNew, uno::UNO_QUERY);
1129 xNewName->setName(
aName);
1130 rxDim->WriteToSource(xNew);
1135 rxDim->WriteToSource( xIntDim );
1138 SAL_WARN_IF(!bFound,
"sc.core",
"WriteToSource: Dimension not found: " +
aName +
".");
1141 if ( xSourceProp.is() )
1151 catch(uno::Exception
const &)
1161 if (iter->GetOrientation() != sheet::DataPilotFieldOrientation_HIDDEN && !iter->IsDataLayout())
1181 while ( pExistingGroup )
1190 pDeletedNames->push_back(aGroupDimName);
1193 pExistingGroup =
pDimensionData->GetGroupDimForBase(rSrcDimName);
1195 if ( pExistingGroup && pExistingGroup->
GetGroupDimName() == aGroupDimName )
1198 OSL_FAIL(
"couldn't remove group dimension");
1199 pExistingGroup =
nullptr;
1225 typedef std::unordered_map<OUString, tools::Long> NameIndexMap;
1231 NameIndexMap::const_iterator itrEnd =
aMap.end();
1235 const OUString& rDimName = iter->GetName();
1236 if (rDimName.isEmpty())
1240 NameIndexMap::const_iterator itr =
aMap.find(rDimName);
1246 const std::vector<SCROW>& rMembers =
pData->GetColumnEntries(nDimIndex);
1247 size_t nMemberCount = rMembers.size();
1248 for (
size_t j = 0; j < nMemberCount; ++j)
1250 const ScDPItemData* pMemberData =
pData->GetMemberById( nDimIndex, rMembers[j] );
1251 OUString aMemName =
pData->GetFormattedString(nDimIndex, *pMemberData,
false);
1252 if (iter->GetExistingMemberByName(aMemName))
1256 unique_ptr<ScDPSaveMember> pNewMember(
new ScDPSaveMember(aMemName));
1257 pNewMember->SetIsVisible(
true);
1258 iter->AddMember(std::move(pNewMember));
1267 typedef std::unordered_map<OUString, tools::Long> NameIndexMap;
1275 NameIndexMap::const_iterator itMapEnd =
aMap.end();
1279 const OUString& rDimName = it->GetName();
1280 if (rDimName.isEmpty())
1284 NameIndexMap::const_iterator itMap =
aMap.find(rDimName);
1285 if (itMap == itMapEnd)
1291 const std::vector<SCROW>& rMembers =
pData->GetColumnEntries(nDimIndex);
1292 size_t nMemberCount = rMembers.size();
1293 for (
size_t j = 0; j < nMemberCount; ++j)
1302 OUString aMemName =
pData->GetFormattedString(nDimIndex, *pMemberData,
false);
1303 aMemNames.insert(aMemName);
1307 SAL_WARN(
"sc.core",
"No pMemberData for nDimIndex " << nDimIndex <<
", rMembers[j] " << rMembers[j]
1312 it->RemoveObsoleteMembers(aMemNames);
1354 OUString aCoreName = rName;
1378 m_DimList.push_back(std::unique_ptr<ScDPSaveDimension>(pNew));
This class has to do with handling exclusively grouped dimensions? TODO: Find out what this class doe...
When assigning a string value, you can also assign an interned string whose life-cycle is managed by ...
std::unordered_map< OUString, size_t > DimOrderType
void RemoveAllGroupDimensions(const OUString &rSrcDimName, std::vector< OUString > *pDeletedNames=nullptr)
void WriteToSource(const css::uno::Reference< css::sheet::XDimensionsSupplier > &xSource)
SC_DLLPUBLIC void SetIgnoreEmptyRows(bool bSet)
ScDPSaveDimension * GetInnermostDimension(css::sheet::DataPilotFieldOrientation nOrientation)
void RemoveDuplicateNameCount(const OUString &rName)
bool operator==(const ScDPSaveData &r) const
SC_DLLPUBLIC ScDPSaveDimension * GetExistingDimensionByName(std::u16string_view rName) const
const DimOrderType & GetDimensionSortOrder() const
Get sort order map to sort row and column dimensions in order of appearance.
SC_DLLPUBLIC void GetAllDimensionsByOrientation(css::sheet::DataPilotFieldOrientation eOrientation, std::vector< const ScDPSaveDimension * > &rDims) const
Get all dimensions in a given orientation.
SC_DLLPUBLIC void SetExpandCollapse(bool bSet)
ScDPSaveData & operator=(const ScDPSaveData &r)
SC_DLLPUBLIC ScDPSaveDimension * GetNewDimensionByName(const OUString &rName)
ScDPSaveDimension * GetFirstDimension(css::sheet::DataPilotFieldOrientation eOrientation)
void SetPosition(ScDPSaveDimension *pDim, tools::Long nNew)
SC_DLLPUBLIC bool HasInvisibleMember(std::u16string_view rDimName) const
Check whether a dimension has one or more invisible members.
ScDPSaveDimension * DuplicateDimension(std::u16string_view rName)
std::unique_ptr< DimOrderType > mpDimOrder
sal_uInt16 nIgnoreEmptyMode
SC_DLLPUBLIC const std::optional< OUString > & GetGrandTotalName() const
void CheckDuplicateName(ScDPSaveDimension &rDim)
SC_DLLPUBLIC void SetRepeatIfEmpty(bool bSet)
DupNameCountType maDupNameCounts
SC_DLLPUBLIC void SetFilterButton(bool bSet)
void RemoveDimensionByName(const OUString &rName)
SC_DLLPUBLIC void SetGrandTotalName(const OUString &rName)
SC_DLLPUBLIC ScDPSaveDimension * GetDataLayoutDimension()
std::optional< OUString > mpGrandTotalName
ScDPSaveDimension * AppendNewDimension(const OUString &rName, bool bDataLayout)
Append a new original dimension.
void AddDimension(ScDPSaveDimension *pDim)
SC_DLLPUBLIC void SetRowGrand(bool bSet)
SC_DLLPUBLIC void SetColumnGrand(bool bSet)
SC_DLLPUBLIC ScDPSaveDimension * GetExistingDataLayoutDimension() const
void SyncAllDimensionMembers(ScDPTableData *pData)
SC_DLLPUBLIC ScDPDimensionSaveData * GetDimensionData()
SC_DLLPUBLIC void SetDimensionData(const ScDPDimensionSaveData *pNew)
SC_DLLPUBLIC tools::Long GetDataDimensionCount() const
void BuildAllDimensionMembers(ScDPTableData *pData)
SC_DLLPUBLIC ScDPSaveDimension * GetDimensionByName(const OUString &rName)
Get a dimension object by its name.
sal_uInt16 nColumnGrandMode
SC_DLLPUBLIC void SetDrillDown(bool bSet)
bool mbDimensionMembersBuilt
if true, all dimensions already have all of their member instances created.
std::unique_ptr< ScDPDimensionSaveData > pDimensionData
keep track of number of duplicates in each name.
sal_uInt16 nRepeatEmptyMode
SC_DLLPUBLIC ~ScDPSaveData()
SC_DLLPUBLIC ScDPSaveData()
void RemoveObsoleteMembers(const MemberSetType &rMembers)
tools::Long nUsedHierarchy
std::optional< OUString > mpSubtotalName
void SetAutoShowInfo(const css::sheet::DataPilotFieldAutoShowInfo *pNew)
bool bSubTotalDefault
at level
sal_uInt16 nShowEmptyMode
std::unique_ptr< css::sheet::DataPilotFieldLayoutInfo > pLayoutInfo
void SetRepeatItemLabels(bool bSet)
bool operator==(const ScDPSaveDimension &r) const
void RemoveSubtotalName()
void SetLayoutInfo(const css::sheet::DataPilotFieldLayoutInfo *pNew)
void UpdateMemberVisibility(const std::unordered_map< OUString, bool > &rData)
std::vector< ScGeneralFunction > maSubTotalFuncs
at level
std::unordered_set< OUString > MemberSetType
bool HasShowEmpty() const
void SetLayoutName(const OUString &rName)
void SetReferenceValue(const css::sheet::DataPilotFieldReference *pNew)
bool bRepeatItemLabels
at level
OUString GetCurrentPage() const
bool HasInvisibleMember() const
std::unique_ptr< css::sheet::DataPilotFieldAutoShowInfo > pAutoShowInfo
void SetOrientation(css::sheet::DataPilotFieldOrientation nNew)
ScGeneralFunction nFunction
void AddMember(std::unique_ptr< ScDPSaveMember > pMember)
void SetDupFlag(bool bSet)
ScDPSaveMember * GetExistingMemberByName(const OUString &rName)
css::sheet::DataPilotFieldOrientation GetOrientation() const
std::unique_ptr< css::sheet::DataPilotFieldSortInfo > pSortInfo
std::unordered_map< OUString, std::unique_ptr< ScDPSaveMember > > maMemberHash
void SetSubtotalName(const OUString &rName)
void SetUsedHierarchy(tools::Long nNew)
std::unique_ptr< css::sheet::DataPilotFieldReference > pReferenceValue
css::sheet::DataPilotFieldOrientation nOrientation
std::optional< OUString > mpLayoutName
void SetSortInfo(const css::sheet::DataPilotFieldSortInfo *pNew)
const std::optional< OUString > & GetSubtotalName() const
bool IsMemberNameInUse(const OUString &rName) const
ScDPSaveMember * GetMemberByName(const OUString &rName)
Get a member object by its name.
const std::optional< OUString > & GetLayoutName() const
ScDPSaveDimension(OUString aName, bool bDataLayout)
void SetCurrentPage(const OUString *pPage)
void WriteToSource(const css::uno::Reference< css::uno::XInterface > &xDim)
void Dump(int nIndent=0) const
std::vector< ScDPSaveMember * > MemberList
const OUString & GetName() const
void SetSubTotals(std::vector< ScGeneralFunction > &&rFuncs)
void SetName(const OUString &rNew)
void SetShowEmpty(bool bSet)
void SetMemberPosition(const OUString &rName, sal_Int32 nNewPos)
void SetFunction(ScGeneralFunction nNew)
Represents a new group dimension whose dimension ID is higher than the highest source dimension ID.
const OUString & GetGroupDimName() const
void SetName(const OUString &rNew)
SC_DLLPUBLIC void SetIsVisible(bool bSet)
const OUString & GetName() const
std::optional< OUString > mpLayoutName
void WriteToSource(const css::uno::Reference< css::uno::XInterface > &xMember, sal_Int32 nPosition)
SC_DLLPUBLIC bool HasShowDetails() const
SC_DLLPUBLIC bool HasIsVisible() const
void Dump(int nIndent=0) const
SC_DLLPUBLIC void SetLayoutName(const OUString &rName)
ScDPSaveMember(OUString aName)
bool operator==(const ScDPSaveMember &r) const
sal_uInt16 nShowDetailsMode
SC_DLLPUBLIC const std::optional< OUString > & GetLayoutName() const
SC_DLLPUBLIC void SetShowDetails(bool bSet)
Base class that abstracts different data source types of a datapilot table.
static SC_DLLPUBLIC OUString getSourceDimensionName(std::u16string_view rName)
static bool isDuplicateDimension(std::u16string_view rName)
static SC_DLLPUBLIC OUString createDuplicateDimensionName(const OUString &rOriginal, size_t nDupCount)
static SC_DLLPUBLIC const CharClass & getCharClass()
static bool GetBoolProperty(const css::uno::Reference< css::beans::XPropertySet > &xProp, const OUString &rName, bool bDefault=false)
static void SetOptionalPropertyValue(const css::uno::Reference< css::beans::XPropertySet > &rPropSet, const char *pPropName, const css::uno::Any &rVal)
#define TOOLS_WARN_EXCEPTION(area, stream)
static void lcl_ResetOrient(const uno::Reference< sheet::XDimensionsSupplier > &xSource)
static void lcl_SetBoolProperty(const uno::Reference< beans::XPropertySet > &xProp, const OUString &rName, bool bValue)
#define SC_DPSAVEMODE_DONTKNOW
ScGeneralFunction
the css::sheet::GeneralFunction enum is extended by constants in GeneralFunction2,...
Sequence< sal_Int8 > aSeq
#define SAL_WARN_IF(condition, area, stream)
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
std::unique_ptr< sal_Int32[]> pData
HashMap_OWString_Interface aMap
TOOLS_DLLPUBLIC SvStream & endl(SvStream &rStr)
constexpr OUStringLiteral SC_UNO_DP_SORTING
constexpr OUStringLiteral SC_UNO_DP_HAS_HIDDEN_MEMBER
constexpr OUStringLiteral SC_UNO_DP_COLGRAND
constexpr OUStringLiteral SC_UNO_DP_POSITION
constexpr OUStringLiteral SC_UNO_DP_REPEATEMPTY
constexpr OUStringLiteral SC_UNO_DP_ISDATALAYOUT
constexpr OUStringLiteral SC_UNO_DP_IGNOREEMPTY
constexpr OUStringLiteral SC_UNO_DP_SUBTOTAL2
constexpr OUStringLiteral SC_UNO_DP_GRANDTOTAL_NAME
constexpr OUStringLiteral SC_UNO_DP_LAYOUTNAME
constexpr OUStringLiteral SC_UNO_DP_REPEATITEMLABELS
constexpr OUStringLiteral SC_UNO_DP_FUNCTION2
constexpr OUStringLiteral SC_UNO_DP_ROWGRAND
constexpr OUStringLiteral SC_UNO_DP_USEDHIERARCHY
constexpr OUStringLiteral SC_UNO_DP_ORIENTATION
constexpr OUStringLiteral SC_UNO_DP_FIELD_SUBTOTALNAME
constexpr OUStringLiteral SC_UNO_DP_ISVISIBLE
constexpr OUStringLiteral SC_UNO_DP_SHOWDETAILS
constexpr OUStringLiteral SC_UNO_DP_SHOWEMPTY
constexpr OUStringLiteral SC_UNO_DP_LAYOUT
constexpr OUStringLiteral SC_UNO_DP_REFVALUE
constexpr OUStringLiteral SC_UNO_DP_AUTOSHOW