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>
53 using ::std::unique_ptr;
55 #define SC_DPSAVEMODE_DONTKNOW 2
58 const OUString& rName,
bool bValue )
62 xProp->setPropertyValue( rName,
uno::Any( bValue ) );
74 mpLayoutName( r.mpLayoutName ),
75 nVisibleMode( r.nVisibleMode ),
76 nShowDetailsMode( r.nShowDetailsMode )
136 uno::Reference<beans::XPropertySet> xMembProp( xMember, uno::UNO_QUERY );
137 OSL_ENSURE( xMembProp.is(),
"no properties at member" );
138 if ( !xMembProp.is() )
154 if ( nPosition >= 0 )
162 std::string aIndent(nIndent*4,
' ');
163 cout << aIndent <<
"* member name: '" <<
aName <<
"'" <<
endl;
165 cout << aIndent <<
" + layout name: ";
172 cout << aIndent <<
" + visibility: ";
184 bIsDataLayout( bDataLayout ),
186 nOrientation(
sheet::DataPilotFieldOrientation_HIDDEN ),
188 nUsedHierarchy( -1 ),
190 bRepeatItemLabels(
false ),
191 bSubTotalDefault( true )
197 mpLayoutName( r.mpLayoutName ),
198 mpSubtotalName( r.mpSubtotalName ),
199 bIsDataLayout( r.bIsDataLayout ),
200 bDupFlag( r.bDupFlag ),
201 nOrientation( r.nOrientation ),
202 nFunction( r.nFunction ),
203 nUsedHierarchy( r.nUsedHierarchy ),
204 nShowEmptyMode( r.nShowEmptyMode ),
205 bRepeatItemLabels( r.bRepeatItemLabels ),
206 bSubTotalDefault( r.bSubTotalDefault ),
207 maSubTotalFuncs( r.maSubTotalFuncs )
211 const OUString& rName = pMem->
GetName();
212 std::unique_ptr<ScDPSaveMember> pNew(
new ScDPSaveMember( *pMem ));
295 const OUString & rName = pMember->GetName();
297 auto tmp = pMember.get();
305 aExisting->second = std::move(pMember);
372 if (rName.equalsIgnoreAsciiCase(pMem->GetName()))
375 const std::optional<OUString> & pLayoutName = pMem->GetLayoutName();
376 return pLayoutName && rName.equalsIgnoreAsciiCase(*pLayoutName);
382 mpLayoutName = rName;
392 mpLayoutName.reset();
406 pSortInfo.reset(
new sheet::DataPilotFieldSortInfo(*pNew) );
414 pAutoShowInfo.reset(
new sheet::DataPilotFieldAutoShowInfo(*pNew) );
422 pLayoutInfo.reset(
new sheet::DataPilotFieldLayoutInfo(*pNew) );
434 bool bVisible = !pPage || pMem->GetName() == *pPage;
435 pMem->SetIsVisible(bVisible);
444 return (*it)->GetName();
453 return res->second.get();
461 return res->second.get();
464 maMemberHash[rName] = std::unique_ptr<ScDPSaveMember>(pNew);
480 uno::Reference<beans::XPropertySet> xDimProp( xDim, uno::UNO_QUERY );
481 OSL_ENSURE( xDimProp.is(),
"no properties at dimension" );
486 sheet::DataPilotFieldOrientation eOrient =
nOrientation;
489 sal_Int16 eFunc =
static_cast<sal_Int16
>(
nFunction);
518 uno::Reference<container::XIndexAccess> xHiers;
519 uno::Reference<sheet::XHierarchiesSupplier> xHierSupp( xDim, uno::UNO_QUERY );
520 if ( xHierSupp.is() )
522 uno::Reference<container::XNameAccess> xHiersName = xHierSupp->getHierarchies();
524 nHierCount = xHiers->getCount();
527 bool bHasHiddenMember =
false;
529 for (
tools::Long nHier=0; nHier<nHierCount; nHier++)
532 uno::Reference<container::XIndexAccess> xLevels;
533 uno::Reference<sheet::XLevelsSupplier> xLevSupp(xHiers->getByIndex(nHier), uno::UNO_QUERY);
536 uno::Reference<container::XNameAccess> xLevelsName = xLevSupp->getLevels();
538 nLevCount = xLevels->getCount();
543 uno::Reference<uno::XInterface> xLevel(xLevels->getByIndex(nLev), uno::UNO_QUERY);
544 uno::Reference<beans::XPropertySet> xLevProp( xLevel, uno::UNO_QUERY );
545 OSL_ENSURE( xLevProp.is(),
"no properties at level" );
576 uno::Reference<sheet::XMembersSupplier> xMembSupp( xLevel, uno::UNO_QUERY );
577 if ( xMembSupp.is() )
579 uno::Reference<sheet::XMembersAccess> xMembers = xMembSupp->getMembers();
582 sal_Int32 nPosition = -1;
588 if (!pMember->GetIsVisible())
589 bHasHiddenMember =
true;
590 OUString aMemberName = pMember->GetName();
591 if ( xMembers->hasByName( aMemberName ) )
593 uno::Reference<uno::XInterface> xMemberInt(
594 xMembers->getByName(aMemberName), uno::UNO_QUERY);
595 pMember->WriteToSource( xMemberInt, nPosition );
597 if ( nPosition >= 0 )
616 const OUString& rMemName = pMem->GetName();
617 auto itr = rData.find(rMemName);
618 if (itr != rData.end())
619 pMem->SetIsVisible(itr->second);
626 [](
const ScDPSaveMember* pMem) {
return !pMem->GetIsVisible(); });
634 if (rMembers.count(pMem->GetName()))
637 aNew.push_back(pMem);
645 maMemberList.swap(aNew);
652 static const char* pOrientNames[] = {
"hidden",
"column",
"row",
"page",
"data" };
653 std::string aIndent(nIndent*4,
' ');
655 cout << aIndent <<
"* dimension name: '" <<
aName <<
"'" << endl;
657 cout << aIndent <<
" + orientation: ";
664 cout << aIndent <<
" + layout name: ";
666 cout <<
"'" << *mpLayoutName <<
"'";
671 cout << aIndent <<
" + subtotal name: ";
678 cout << aIndent <<
" + is data layout: " << (
bIsDataLayout ?
"yes" :
"no") << endl;
679 cout << aIndent <<
" + is duplicate: " << (
bDupFlag ?
"yes" :
"no") << endl;
683 pMem->Dump(nIndent+1);
696 bFilterButton( true ),
698 mbDimensionMembersBuilt(
false)
703 nColumnGrandMode( r.nColumnGrandMode ),
704 nRowGrandMode( r.nRowGrandMode ),
705 nIgnoreEmptyMode( r.nIgnoreEmptyMode ),
706 nRepeatEmptyMode( r.nRepeatEmptyMode ),
707 bFilterButton( r.bFilterButton ),
708 bDrillDown( r.bDrillDown ),
709 mbDimensionMembersBuilt(r.mbDimensionMembersBuilt),
710 mpGrandTotalName(r.mpGrandTotalName)
717 m_DimList.push_back(std::make_unique<ScDPSaveDimension>(*it));
778 class DimOrderInserter
786 size_t nRank = mrNames.size();
798 std::vector<const ScDPSaveDimension*> aRowDims, aColDims;
802 std::for_each(aRowDims.begin(), aRowDims.end(), DimOrderInserter(*
mpDimOrder));
803 std::for_each(aColDims.begin(), aColDims.end(), DimOrderInserter(*
mpDimOrder));
809 sheet::DataPilotFieldOrientation eOrientation, std::vector<const ScDPSaveDimension*>& rDims)
const
811 std::vector<const ScDPSaveDimension*> aDims;
818 aDims.push_back(&rDim);
830 m_DimList.push_back(std::unique_ptr<ScDPSaveDimension>(pDim));
839 if (iter->GetName() == rName && !iter->IsDataLayout() )
850 if (iter->GetName() == rName && !iter->IsDataLayout() )
860 if (iter->GetName() == rName && !iter->IsDataLayout() )
880 if ( iter->IsDataLayout() )
902 [&rName](
const std::unique_ptr<ScDPSaveDimension>& rxDim) {
903 return rxDim->GetName() == rName && !rxDim->IsDataLayout(); });
925 [&nOrientation](
const std::unique_ptr<ScDPSaveDimension>& rxDim) {
926 return rxDim->GetOrientation() == nOrientation && !rxDim->IsDataLayout(); });
937 if (iter->GetOrientation() == eOrientation && !iter->IsDataLayout())
949 if (iter->GetOrientation() == sheet::DataPilotFieldOrientation_DATA)
963 [&pDim](
const std::unique_ptr<ScDPSaveDimension>& rxDim) {
return pDim == rxDim.get(); });
974 [&nOrient, &nNew](
const std::unique_ptr<ScDPSaveDimension>& rxDim) {
975 if (rxDim->GetOrientation() == nOrient )
980 m_DimList.insert(iterInsert, std::unique_ptr<ScDPSaveDimension>(pDim));
1016 uno::Reference<container::XNameAccess> xDimsName = xSource->getDimensions();
1019 for (
tools::Long nIntDim=0; nIntDim<nIntCount; nIntDim++)
1021 uno::Reference<beans::XPropertySet> xDimProp(xIntDims->getByIndex(nIntDim), uno::UNO_QUERY);
1036 uno::Reference<beans::XPropertySet> xSourceProp( xSource, uno::UNO_QUERY );
1037 SAL_WARN_IF( !xSourceProp.is(),
"sc.core",
"no properties at source" );
1038 if ( xSourceProp.is() )
1052 catch(uno::Exception&)
1058 if (pGrandTotalName)
1068 SAL_INFO(
"sc.core",
"ScDPSaveData::WriteToSource");
1072 uno::Reference<container::XNameAccess> xDimsName = xSource->getDimensions();
1078 OUString
aName = rxDim->GetName();
1083 bool bData = rxDim->IsDataLayout();
1087 bool bFound =
false;
1088 for (
tools::Long nIntDim=0; nIntDim<nIntCount && !bFound; nIntDim++)
1090 uno::Reference<uno::XInterface> xIntDim(xIntDims->getByIndex(nIntDim),
1094 uno::Reference<beans::XPropertySet> xDimProp( xIntDim, uno::UNO_QUERY );
1095 if ( xDimProp.is() )
1104 uno::Reference<container::XNamed> xDimName( xIntDim, uno::UNO_QUERY );
1105 if (xDimName.is() && xDimName->getName() == aCoreName)
1111 if (rxDim->GetDupFlag())
1113 uno::Reference<util::XCloneable> xCloneable(xIntDim, uno::UNO_QUERY);
1114 SAL_WARN_IF(!xCloneable.is(),
"sc.core",
"cannot clone dimension");
1115 if (xCloneable.is())
1117 uno::Reference<util::XCloneable> xNew = xCloneable->createClone();
1118 uno::Reference<container::XNamed> xNewName(xNew, uno::UNO_QUERY);
1121 xNewName->setName(aName);
1122 rxDim->WriteToSource(xNew);
1127 rxDim->WriteToSource( xIntDim );
1130 SAL_WARN_IF(!bFound,
"sc.core",
"WriteToSource: Dimension not found: " + aName +
".");
1133 if ( xSourceProp.is() )
1143 catch(uno::Exception
const &)
1153 if (iter->GetOrientation() != sheet::DataPilotFieldOrientation_HIDDEN && !iter->IsDataLayout())
1173 while ( pExistingGroup )
1182 pDeletedNames->push_back(aGroupDimName);
1185 pExistingGroup =
pDimensionData->GetGroupDimForBase(rSrcDimName);
1187 if ( pExistingGroup && pExistingGroup->
GetGroupDimName() == aGroupDimName )
1190 OSL_FAIL(
"couldn't remove group dimension");
1191 pExistingGroup =
nullptr;
1217 typedef std::unordered_map<OUString, tools::Long> NameIndexMap;
1223 NameIndexMap::const_iterator itrEnd = aMap.end();
1227 const OUString& rDimName = iter->GetName();
1228 if (rDimName.isEmpty())
1232 NameIndexMap::const_iterator itr = aMap.find(rDimName);
1239 size_t nMemberCount = rMembers.size();
1240 for (
size_t j = 0; j < nMemberCount; ++j)
1244 if (iter->GetExistingMemberByName(aMemName))
1248 unique_ptr<ScDPSaveMember> pNewMember(
new ScDPSaveMember(aMemName));
1249 pNewMember->SetIsVisible(
true);
1250 iter->AddMember(std::move(pNewMember));
1259 typedef std::unordered_map<OUString, tools::Long> NameIndexMap;
1267 NameIndexMap::const_iterator itMapEnd = aMap.end();
1271 const OUString& rDimName = it->GetName();
1272 if (rDimName.isEmpty())
1276 NameIndexMap::const_iterator itMap = aMap.find(rDimName);
1277 if (itMap == itMapEnd)
1284 size_t nMemberCount = rMembers.size();
1285 for (
size_t j = 0; j < nMemberCount; ++j)
1289 aMemNames.insert(aMemName);
1292 it->RemoveObsoleteMembers(aMemNames);
1305 #if DUMP_PIVOT_TABLE
1334 OUString aCoreName = rName;
1358 m_DimList.push_back(std::unique_ptr<ScDPSaveDimension>(pNew));
SC_DLLPUBLIC bool HasInvisibleMember(std::u16string_view rDimName) const
Check whether a dimension has one or more invisible members.
SC_DLLPUBLIC void SetRepeatIfEmpty(bool bSet)
const OUString & GetGroupDimName() const
static SC_DLLPUBLIC OUString createDuplicateDimensionName(const OUString &rOriginal, size_t nDupCount)
#define SC_UNO_DP_FIELD_SUBTOTALNAME
void WriteToSource(const css::uno::Reference< css::uno::XInterface > &xMember, sal_Int32 nPosition)
const std::optional< OUString > & GetLayoutName() const
#define SC_UNO_DP_IGNOREEMPTY
void BuildAllDimensionMembers(ScDPTableData *pData)
css::sheet::DataPilotFieldOrientation nOrientation
This class has to do with handling exclusively grouped dimensions? TODO: Find out what this class doe...
ScDPSaveMember * GetMemberByName(const OUString &rName)
Get a member object by its name.
void SetOrientation(css::sheet::DataPilotFieldOrientation nNew)
#define SC_UNO_DP_REFVALUE
bool operator==(const ScDPSaveMember &r) const
SC_DLLPUBLIC const std::optional< OUString > & GetGrandTotalName() const
std::unique_ptr< DimOrderType > mpDimOrder
void RemoveObsoleteMembers(const MemberSetType &rMembers)
bool IsMemberNameInUse(const OUString &rName) const
std::optional< OUString > mpLayoutName
css::sheet::DataPilotFieldOrientation GetOrientation() const
void CheckDuplicateName(ScDPSaveDimension &rDim)
std::unique_ptr< css::sheet::DataPilotFieldSortInfo > pSortInfo
sal_uInt16 nShowDetailsMode
std::unordered_map< OUString, std::unique_ptr< ScDPSaveMember > > maMemberHash
SC_DLLPUBLIC ScDPDimensionSaveData * GetDimensionData()
#define SC_UNO_DP_COLGRAND
#define SC_UNO_DP_SORTING
static void lcl_SetBoolProperty(const uno::Reference< beans::XPropertySet > &xProp, const OUString &rName, bool bValue)
void SetSubTotals(std::vector< ScGeneralFunction > &&rFuncs)
#define SC_UNO_DP_REPEATEMPTY
ScDPSaveMember * GetExistingMemberByName(const OUString &rName)
#define SC_UNO_DP_POSITION
virtual const std::vector< SCROW > & GetColumnEntries(sal_Int32 nColumn)
void SetName(const OUString &rNew)
void AddDimension(ScDPSaveDimension *pDim)
bool HasInvisibleMember() const
SC_DLLPUBLIC void SetIsVisible(bool bSet)
#define SC_UNO_DP_GRANDTOTAL_NAME
std::unordered_set< OUString > MemberSetType
ScDPSaveData & operator=(const ScDPSaveData &r)
static bool isDuplicateDimension(std::u16string_view rName)
exports com.sun.star. sheet
std::optional< OUString > mpGrandTotalName
SC_DLLPUBLIC void GetAllDimensionsByOrientation(css::sheet::DataPilotFieldOrientation eOrientation, std::vector< const ScDPSaveDimension * > &rDims) const
Get all dimensions in a given orientation.
virtual const ScDPItemData * GetMemberById(sal_Int32 nDim, sal_Int32 nId)
#define SC_UNO_DP_LAYOUTNAME
HashMap_OWString_Interface aMap
ScGeneralFunction nFunction
void RemoveDimensionByName(const OUString &rName)
bool operator==(const ScDPSaveDimension &r) const
bool operator==(const ScDPSaveData &r) const
const DimOrderType & GetDimensionSortOrder() const
Get sort order map to sort row and column dimensions in order of appearance.
const OUString & GetName() const
void SetMemberPosition(const OUString &rName, sal_Int32 nNewPos)
bool HasShowEmpty() const
std::unordered_map< OUString, size_t > DimOrderType
void SetFunction(ScGeneralFunction nNew)
std::vector< ScDPSaveMember * > MemberList
static SC_DLLPUBLIC OUString getSourceDimensionName(std::u16string_view rName)
#define SC_UNO_DP_REPEATITEMLABELS
ScDPSaveDimension * GetInnermostDimension(css::sheet::DataPilotFieldOrientation nOrientation)
void SetLayoutName(const OUString &rName)
std::unique_ptr< ScDPDimensionSaveData > pDimensionData
keep track of number of duplicates in each name.
void SyncAllDimensionMembers(ScDPTableData *pData)
ScDPSaveDimension * GetFirstDimension(css::sheet::DataPilotFieldOrientation eOrientation)
SC_DLLPUBLIC tools::Long GetDataDimensionCount() const
#define TOOLS_WARN_EXCEPTION(area, stream)
void RemoveDuplicateNameCount(const OUString &rName)
SC_DLLPUBLIC ScDPSaveDimension * GetNewDimensionByName(const OUString &rName)
When assigning a string value, you can also assign an interned string whose life-cycle is managed by ...
#define SC_UNO_DP_FUNCTION2
void SetCurrentPage(const OUString *pPage)
DupNameCountType maDupNameCounts
SC_DLLPUBLIC void SetDimensionData(const ScDPDimensionSaveData *pNew)
ScDPSaveDimension * AppendNewDimension(const OUString &rName, bool bDataLayout)
Append a new original dimension.
SC_DLLPUBLIC ScDPSaveDimension * GetExistingDataLayoutDimension() const
virtual OUString getDimensionName(sal_Int32 nColumn)=0
SC_DLLPUBLIC void SetLayoutName(const OUString &rName)
static SC_DLLPUBLIC const CharClass & getCharClass()
void SetUsedHierarchy(tools::Long nNew)
void SetName(const OUString &rNew)
static bool GetBoolProperty(const css::uno::Reference< css::beans::XPropertySet > &xProp, const OUString &rName, bool bDefault=false)
SC_DLLPUBLIC ~ScDPSaveData()
SC_DLLPUBLIC void SetIgnoreEmptyRows(bool bSet)
sal_uInt16 nIgnoreEmptyMode
#define SC_UNO_DP_AUTOSHOW
SC_DLLPUBLIC ScDPSaveDimension * GetExistingDimensionByName(std::u16string_view rName) const
void SetDupFlag(bool bSet)
void Dump(int nIndent=0) const
OUString GetCurrentPage() const
SC_DLLPUBLIC void SetFilterButton(bool bSet)
#define SC_UNO_DP_HAS_HIDDEN_MEMBER
ScDPSaveDimension * DuplicateDimension(std::u16string_view rName)
static void SetOptionalPropertyValue(const css::uno::Reference< css::beans::XPropertySet > &rPropSet, const char *pPropName, const css::uno::Any &rVal)
sal_uInt16 nColumnGrandMode
void SetReferenceValue(const css::sheet::DataPilotFieldReference *pNew)
const std::optional< OUString > & GetSubtotalName() const
bool ContainerUniquePtrEquals(C< std::unique_ptr< T >, Etc... > const &lhs, C< std::unique_ptr< T >, Etc... > const &rhs)
void SetPosition(ScDPSaveDimension *pDim, tools::Long nNew)
bool mbDimensionMembersBuilt
if true, all dimensions already have all of their member instances created.
SC_DLLPUBLIC void SetShowDetails(bool bSet)
#define SC_UNO_DP_ROWGRAND
std::optional< OUString > mpSubtotalName
#define SC_UNO_DP_ORIENTATION
void SetAutoShowInfo(const css::sheet::DataPilotFieldAutoShowInfo *pNew)
SC_DLLPUBLIC void SetGrandTotalName(const OUString &rName)
SC_DLLPUBLIC void SetDrillDown(bool bSet)
#define SC_UNO_DP_SHOWEMPTY
Base class that abstracts different data source types of a datapilot table.
#define SC_DPSAVEMODE_DONTKNOW
SC_DLLPUBLIC bool HasIsVisible() const
tools::Long nUsedHierarchy
sal_uInt16 nShowEmptyMode
sal_uInt16 nRepeatEmptyMode
std::unique_ptr< css::sheet::DataPilotFieldReference > pReferenceValue
void SetRepeatItemLabels(bool bSet)
#define SC_UNO_DP_USEDHIERARCHY
#define SAL_WARN_IF(condition, area, stream)
void UpdateMemberVisibility(const std::unordered_map< OUString, bool > &rData)
void SetSubtotalName(const OUString &rName)
std::unique_ptr< css::sheet::DataPilotFieldLayoutInfo > pLayoutInfo
SvStream & endl(SvStream &rStr)
ScGeneralFunction
the css::sheet::GeneralFunction enum is extended by constants in GeneralFunction2, which causes some type-safety issues.
#define SAL_INFO(area, stream)
const OUString & GetName() const
#define SC_UNO_DP_ISVISIBLE
void WriteToSource(const css::uno::Reference< css::uno::XInterface > &xDim)
std::unique_ptr< css::sheet::DataPilotFieldAutoShowInfo > pAutoShowInfo
Represents a new group dimension whose dimension ID is higher than the highest source dimension ID...
void RemoveSubtotalName()
bool bSubTotalDefault
at level
Sequence< sal_Int8 > aSeq
void SetShowEmpty(bool bSet)
SC_DLLPUBLIC void SetColumnGrand(bool bSet)
OUString GetFormattedString(sal_Int32 nDim, const ScDPItemData &rItem, bool bLocaleIndependent) const
SC_DLLPUBLIC void SetRowGrand(bool bSet)
void WriteToSource(const css::uno::Reference< css::sheet::XDimensionsSupplier > &xSource)
void Dump(int nIndent=0) const
#define SC_UNO_DP_SHOWDETAILS
bool bRepeatItemLabels
at level
ScDPSaveDimension(const OUString &rName, bool bDataLayout)
#define SC_UNO_DP_ISDATALAYOUT
SC_DLLPUBLIC const std::optional< OUString > & GetLayoutName() const
void RemoveAllGroupDimensions(const OUString &rSrcDimName, std::vector< OUString > *pDeletedNames=nullptr)
std::optional< OUString > mpLayoutName
#define SC_UNO_DP_SUBTOTAL2
SC_DLLPUBLIC ScDPSaveDimension * GetDimensionByName(const OUString &rName)
Get a dimension object by its name.
static void lcl_ResetOrient(const uno::Reference< sheet::XDimensionsSupplier > &xSource)
void SetLayoutInfo(const css::sheet::DataPilotFieldLayoutInfo *pNew)
SC_DLLPUBLIC ScDPSaveDimension * GetDataLayoutDimension()
ScDPSaveMember(const OUString &rName)
std::vector< ScGeneralFunction > maSubTotalFuncs
at level
void AddMember(std::unique_ptr< ScDPSaveMember > pMember)
void SetSortInfo(const css::sheet::DataPilotFieldSortInfo *pNew)
SC_DLLPUBLIC ScDPSaveData()
bool m_bDetectedRangeSegmentation false
virtual sal_Int32 GetColumnCount()=0
use (new) typed collection instead of ScStrCollection or separate Str and ValueCollection ...
SC_DLLPUBLIC bool HasShowDetails() const