LibreOffice Module sc (master)  1
dpsave.hxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_SC_INC_DPSAVE_HXX
21 #define INCLUDED_SC_INC_DPSAVE_HXX
22 
23 #include <memory>
24 #include <vector>
25 
26 #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
27 #include <rtl/ustring.hxx>
28 #include <sal/types.h>
29 
30 #include "scdllapi.h"
31 #include "calcmacros.hxx"
32 
33 #include <unordered_map>
34 #include <unordered_set>
35 #include <optional>
36 
37 namespace com::sun::star::sheet {
38  class XDimensionsSupplier;
39  struct DataPilotFieldReference;
40  struct DataPilotFieldSortInfo;
41  struct DataPilotFieldAutoShowInfo;
42  struct DataPilotFieldLayoutInfo;
43 }
44 
46 class ScDPTableData;
47 enum class ScGeneralFunction;
48 
49 // classes to save Data Pilot settings
50 
52 {
53 private:
54  OUString aName;
55  std::optional<OUString> mpLayoutName; // custom name to be displayed in the table.
56  sal_uInt16 nVisibleMode;
57  sal_uInt16 nShowDetailsMode;
58 
59 public:
60  ScDPSaveMember(const OUString& rName);
63 
64  bool operator== ( const ScDPSaveMember& r ) const;
65 
66  const OUString& GetName() const
67  { return aName; }
68 
69  SC_DLLPUBLIC bool HasIsVisible() const;
70  SC_DLLPUBLIC void SetIsVisible(bool bSet);
71  bool GetIsVisible() const
72  { return bool(nVisibleMode); }
73 
74  SC_DLLPUBLIC bool HasShowDetails() const;
75  SC_DLLPUBLIC void SetShowDetails(bool bSet);
76  bool GetShowDetails() const
77  { return bool(nShowDetailsMode); }
78 
79  void SetName( const OUString& rNew ); // used if the source member was renamed (groups)
80 
81  SC_DLLPUBLIC void SetLayoutName( const OUString& rName );
82  SC_DLLPUBLIC const std::optional<OUString> & GetLayoutName() const;
83  void RemoveLayoutName();
84 
85  void WriteToSource( const css::uno::Reference<css::uno::XInterface>& xMember,
86  sal_Int32 nPosition );
87 
88 #if DUMP_PIVOT_TABLE
89  void Dump(int nIndent = 0) const;
90 #endif
91 };
92 
94 {
95 private:
96  OUString aName;
97  std::optional<OUString> mpLayoutName;
98  std::optional<OUString> mpSubtotalName;
100  bool bDupFlag;
101  css::sheet::DataPilotFieldOrientation nOrientation;
102  ScGeneralFunction nFunction; // for data dimensions
104  sal_uInt16 nShowEmptyMode;
107  std::vector<ScGeneralFunction> maSubTotalFuncs;
108  std::unique_ptr<css::sheet::DataPilotFieldReference> pReferenceValue;
109  std::unique_ptr<css::sheet::DataPilotFieldSortInfo> pSortInfo; // (level)
110  std::unique_ptr<css::sheet::DataPilotFieldAutoShowInfo> pAutoShowInfo; // (level)
111  std::unique_ptr<css::sheet::DataPilotFieldLayoutInfo> pLayoutInfo; // (level)
112 
113 public:
114  typedef std::unordered_set<OUString> MemberSetType;
115  typedef std::vector<ScDPSaveMember*> MemberList;
116 
117 private:
118  std::unordered_map<OUString, std::unique_ptr<ScDPSaveMember>> maMemberHash;
119  MemberList maMemberList;
120 
121 public:
122  ScDPSaveDimension(const OUString& rName, bool bDataLayout);
125 
126  bool operator== ( const ScDPSaveDimension& r ) const;
127 
128  const MemberList& GetMembers() const
129  { return maMemberList; }
130 
131  void AddMember(std::unique_ptr<ScDPSaveMember> pMember);
132 
133  void SetDupFlag(bool bSet)
134  { bDupFlag = bSet; }
135 
136  bool GetDupFlag() const
137  { return bDupFlag; }
138 
139  const OUString& GetName() const
140  { return aName; }
141 
142  bool IsDataLayout() const
143  { return bIsDataLayout; }
144 
145  void SetName( const OUString& rNew ); // used if the source dim was renamed (groups)
146 
147  void SetOrientation(css::sheet::DataPilotFieldOrientation nNew);
148  void SetSubTotals(std::vector<ScGeneralFunction> const & rFuncs);
149  long GetSubTotalsCount() const
150  { return maSubTotalFuncs.size(); }
151 
153  { return maSubTotalFuncs[nIndex]; }
154 
155  bool HasShowEmpty() const;
156  void SetShowEmpty(bool bSet);
157  bool GetShowEmpty() const
158  { return bool(nShowEmptyMode); }
159 
160  void SetRepeatItemLabels(bool bSet);
161  bool GetRepeatItemLabels() const
162  { return bRepeatItemLabels; }
163 
164  void SetFunction(ScGeneralFunction nNew);
166  { return nFunction; }
167 
168  void SetUsedHierarchy(long nNew);
169  long GetUsedHierarchy() const
170  { return nUsedHierarchy; }
171 
172  void SetLayoutName(const OUString& rName);
173  const std::optional<OUString> & GetLayoutName() const;
174  void RemoveLayoutName();
175  void SetSubtotalName(const OUString& rName);
176  const std::optional<OUString> & GetSubtotalName() const;
177  void RemoveSubtotalName();
178 
179  bool IsMemberNameInUse(const OUString& rName) const;
180 
181  const css::sheet::DataPilotFieldReference* GetReferenceValue() const
182  { return pReferenceValue.get(); }
183 
184  void SetReferenceValue(const css::sheet::DataPilotFieldReference* pNew);
185 
186  const css::sheet::DataPilotFieldSortInfo* GetSortInfo() const
187  { return pSortInfo.get(); }
188 
189  void SetSortInfo(const css::sheet::DataPilotFieldSortInfo* pNew);
190  const css::sheet::DataPilotFieldAutoShowInfo* GetAutoShowInfo() const
191  { return pAutoShowInfo.get(); }
192 
193  void SetAutoShowInfo(const css::sheet::DataPilotFieldAutoShowInfo* pNew);
194  const css::sheet::DataPilotFieldLayoutInfo* GetLayoutInfo() const
195  { return pLayoutInfo.get(); }
196 
197  void SetLayoutInfo(const css::sheet::DataPilotFieldLayoutInfo* pNew);
198 
199  void SetCurrentPage( const OUString* pPage ); // NULL = no selection (all)
200  OUString GetCurrentPage() const; // only for ODF compatibility
201 
202  css::sheet::DataPilotFieldOrientation GetOrientation() const
203  { return nOrientation; }
204 
205  ScDPSaveMember* GetExistingMemberByName(const OUString& rName);
206 
216  ScDPSaveMember* GetMemberByName(const OUString& rName);
217 
218  void SetMemberPosition( const OUString& rName, sal_Int32 nNewPos );
219 
220  void WriteToSource( const css::uno::Reference<css::uno::XInterface>& xDim );
221 
222  void UpdateMemberVisibility(const std::unordered_map< OUString, bool>& rData);
223 
224  bool HasInvisibleMember() const;
225 
226  void RemoveObsoleteMembers(const MemberSetType& rMembers);
227 
228 #if DUMP_PIVOT_TABLE
229  void Dump(int nIndent = 0) const;
230 #endif
231 };
232 
234 {
235  typedef std::unordered_map<OUString, size_t> DupNameCountType;
236 public:
237  typedef std::unordered_map<OUString, size_t> DimOrderType;
238  typedef std::vector<std::unique_ptr<ScDPSaveDimension>> DimsType;
239 
240 private:
241  DimsType m_DimList;
242  DupNameCountType maDupNameCounts;
243  std::unique_ptr<ScDPDimensionSaveData> pDimensionData; // settings that create new dimensions
244  sal_uInt16 nColumnGrandMode;
245  sal_uInt16 nRowGrandMode;
246  sal_uInt16 nIgnoreEmptyMode;
247  sal_uInt16 nRepeatEmptyMode;
248  bool bFilterButton; // not passed to DataPilotSource
249  bool bDrillDown; // not passed to DataPilotSource
250 
254 
255  std::optional<OUString> mpGrandTotalName;
256  mutable std::unique_ptr<DimOrderType> mpDimOrder; // dimension order for row and column dimensions, to traverse result tree.
257 
258 public:
260  ScDPSaveData(const ScDPSaveData& r);
262 
263  ScDPSaveData& operator= ( const ScDPSaveData& r );
264 
265  bool operator== ( const ScDPSaveData& r ) const;
266 
267  SC_DLLPUBLIC void SetGrandTotalName(const OUString& rName);
268  SC_DLLPUBLIC const std::optional<OUString> & GetGrandTotalName() const;
269 
270  const DimsType& GetDimensions() const { return m_DimList; }
271 
278  const DimOrderType& GetDimensionSortOrder() const;
279 
289  css::sheet::DataPilotFieldOrientation eOrientation,
290  std::vector<const ScDPSaveDimension*>& rDims) const;
291 
292  void AddDimension(ScDPSaveDimension* pDim);
293 
304  SC_DLLPUBLIC ScDPSaveDimension* GetDimensionByName(const OUString& rName);
307 
308  ScDPSaveDimension* DuplicateDimension(const OUString& rName);
310 
311  SC_DLLPUBLIC ScDPSaveDimension* GetExistingDimensionByName(const OUString& rName) const;
312  SC_DLLPUBLIC ScDPSaveDimension* GetNewDimensionByName(const OUString& rName);
313 
314  void RemoveDimensionByName(const OUString& rName);
315 
316  ScDPSaveDimension* GetInnermostDimension(css::sheet::DataPilotFieldOrientation nOrientation);
317  ScDPSaveDimension* GetFirstDimension(css::sheet::DataPilotFieldOrientation eOrientation);
318  SC_DLLPUBLIC long GetDataDimensionCount() const;
319 
320  void SetPosition( ScDPSaveDimension* pDim, long nNew );
321  SC_DLLPUBLIC void SetColumnGrand( bool bSet );
322  bool GetColumnGrand() const
323  { return bool(nColumnGrandMode); }
324 
325  SC_DLLPUBLIC void SetRowGrand( bool bSet );
326  bool GetRowGrand() const
327  { return bool(nRowGrandMode); }
328 
329  SC_DLLPUBLIC void SetIgnoreEmptyRows( bool bSet );
330  bool GetIgnoreEmptyRows() const
331  { return bool(nIgnoreEmptyMode); }
332 
333  SC_DLLPUBLIC void SetRepeatIfEmpty( bool bSet );
334  bool GetRepeatIfEmpty() const
335  { return bool(nRepeatEmptyMode); }
336 
337  SC_DLLPUBLIC void SetFilterButton( bool bSet );
338  bool GetFilterButton() const
339  { return bFilterButton; }
340 
341  SC_DLLPUBLIC void SetDrillDown( bool bSet );
342  bool GetDrillDown() const
343  { return bDrillDown; }
344 
345  void WriteToSource( const css::uno::Reference<css::sheet::XDimensionsSupplier>& xSource );
346  bool IsEmpty() const;
347 
349  { return pDimensionData.get(); }
350 
351  void RemoveAllGroupDimensions( const OUString& rSrcDimName, std::vector<OUString>* pDeletedNames = nullptr );
352 
353  SC_DLLPUBLIC ScDPDimensionSaveData* GetDimensionData(); // create if not there
354  SC_DLLPUBLIC void SetDimensionData( const ScDPDimensionSaveData* pNew ); // copied
357 
363  SC_DLLPUBLIC bool HasInvisibleMember(const OUString& rDimName) const;
364 
365 #if DUMP_PIVOT_TABLE
366  void Dump() const;
367 #endif
368 
369 private:
371  void RemoveDuplicateNameCount(const OUString& rName);
372 
384  ScDPSaveDimension* AppendNewDimension(const OUString& rName, bool bDataLayout);
385 
386  void DimensionsChanged();
387 };
388 
389 #endif
390 
391 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bool operator==(const XclFontData &rLeft, const XclFontData &rRight)
Definition: xlstyle.cxx:517
SC_DLLPUBLIC void SetRepeatIfEmpty(bool bSet)
Definition: dpsave.cxx:999
const ScDPDimensionSaveData * GetExistingDimensionData() const
Definition: dpsave.hxx:348
SC_DLLPUBLIC long GetDataDimensionCount() const
Definition: dpsave.cxx:943
void WriteToSource(const css::uno::Reference< css::uno::XInterface > &xMember, sal_Int32 nPosition)
Definition: dpsave.cxx:133
bool GetRowGrand() const
Definition: dpsave.hxx:326
void BuildAllDimensionMembers(ScDPTableData *pData)
Definition: dpsave.cxx:1211
SC_DLLPUBLIC bool HasInvisibleMember(const OUString &rDimName) const
Check whether a dimension has one or more invisible members.
Definition: dpsave.cxx:1296
css::sheet::DataPilotFieldOrientation nOrientation
Definition: dpsave.hxx:101
This class has to do with handling exclusively grouped dimensions? TODO: Find out what this class doe...
Definition: dpdimsave.hxx:160
bool operator==(const ScDPSaveMember &r) const
Definition: dpsave.cxx:83
SC_DLLPUBLIC const std::optional< OUString > & GetGrandTotalName() const
Definition: dpsave.cxx:771
std::unique_ptr< DimOrderType > mpDimOrder
Definition: dpsave.hxx:256
const MemberList & GetMembers() const
Definition: dpsave.hxx:128
std::optional< OUString > mpLayoutName
Definition: dpsave.hxx:55
css::sheet::DataPilotFieldOrientation GetOrientation() const
Definition: dpsave.hxx:202
void CheckDuplicateName(ScDPSaveDimension &rDim)
Definition: dpsave.cxx:1318
std::unique_ptr< css::sheet::DataPilotFieldSortInfo > pSortInfo
Definition: dpsave.hxx:109
sal_uInt16 nShowDetailsMode
Definition: dpsave.hxx:57
bool bIsDataLayout
Definition: dpsave.hxx:99
MemberList maMemberList
Definition: dpsave.hxx:119
bool GetIsVisible() const
Definition: dpsave.hxx:71
const css::sheet::DataPilotFieldLayoutInfo * GetLayoutInfo() const
Definition: dpsave.hxx:194
std::unordered_map< OUString, std::unique_ptr< ScDPSaveMember > > maMemberHash
Definition: dpsave.hxx:118
SC_DLLPUBLIC ScDPDimensionSaveData * GetDimensionData()
Definition: dpsave.cxx:1196
long GetUsedHierarchy() const
Definition: dpsave.hxx:169
void SetPosition(ScDPSaveDimension *pDim, long nNew)
Definition: dpsave.cxx:956
long GetSubTotalsCount() const
Definition: dpsave.hxx:149
bool IsDataLayout() const
Definition: dpsave.hxx:142
void AddDimension(ScDPSaveDimension *pDim)
Definition: dpsave.cxx:824
SC_DLLPUBLIC void SetIsVisible(bool bSet)
Definition: dpsave.cxx:95
std::unordered_set< OUString > MemberSetType
Definition: dpsave.hxx:114
ScDPSaveData & operator=(const ScDPSaveData &r)
Definition: dpsave.cxx:721
std::optional< OUString > mpGrandTotalName
Definition: dpsave.hxx:255
SC_DLLPUBLIC void GetAllDimensionsByOrientation(css::sheet::DataPilotFieldOrientation eOrientation, std::vector< const ScDPSaveDimension * > &rDims) const
Get all dimensions in a given orientation.
Definition: dpsave.cxx:808
ScGeneralFunction nFunction
Definition: dpsave.hxx:102
void RemoveDimensionByName(const OUString &rName)
Definition: dpsave.cxx:899
bool operator==(const ScDPSaveData &r) const
Definition: dpsave.cxx:731
const DimOrderType & GetDimensionSortOrder() const
Get sort order map to sort row and column dimensions in order of appearance.
Definition: dpsave.cxx:793
const OUString & GetName() const
Definition: dpsave.hxx:66
ScGeneralFunction GetFunction() const
Definition: dpsave.hxx:165
bool GetIgnoreEmptyRows() const
Definition: dpsave.hxx:330
bool IsEmpty() const
Definition: dpsave.cxx:1149
std::unordered_map< OUString, size_t > DimOrderType
Definition: dpsave.hxx:237
std::vector< ScDPSaveMember * > MemberList
Definition: dpsave.hxx:115
sal_uInt16 nVisibleMode
Definition: dpsave.hxx:56
bool GetRepeatItemLabels() const
Definition: dpsave.hxx:161
ScDPSaveDimension * GetInnermostDimension(css::sheet::DataPilotFieldOrientation nOrientation)
Definition: dpsave.cxx:919
std::unique_ptr< ScDPDimensionSaveData > pDimensionData
keep track of number of duplicates in each name.
Definition: dpsave.hxx:243
bool GetDrillDown() const
Definition: dpsave.hxx:342
void SyncAllDimensionMembers(ScDPTableData *pData)
Definition: dpsave.cxx:1257
ScDPSaveDimension * GetFirstDimension(css::sheet::DataPilotFieldOrientation eOrientation)
Definition: dpsave.cxx:933
void RemoveDuplicateNameCount(const OUString &rName)
Definition: dpsave.cxx:1332
SC_DLLPUBLIC ScDPSaveDimension * GetNewDimensionByName(const OUString &rName)
Definition: dpsave.cxx:856
const css::sheet::DataPilotFieldSortInfo * GetSortInfo() const
Definition: dpsave.hxx:186
DupNameCountType maDupNameCounts
Definition: dpsave.hxx:242
SC_DLLPUBLIC void SetDimensionData(const ScDPDimensionSaveData *pNew)
Definition: dpsave.cxx:1203
ScDPSaveDimension * AppendNewDimension(const OUString &rName, bool bDataLayout)
Append a new original dimension.
Definition: dpsave.cxx:1351
SC_DLLPUBLIC ScDPSaveDimension * GetExistingDataLayoutDimension() const
Definition: dpsave.cxx:876
SC_DLLPUBLIC void SetLayoutName(const OUString &rName)
Definition: dpsave.cxx:118
void SetName(const OUString &rNew)
Definition: dpsave.cxx:110
void Dump() const
sal_uInt16 nRowGrandMode
Definition: dpsave.hxx:245
bool GetRepeatIfEmpty() const
Definition: dpsave.hxx:334
SC_DLLPUBLIC ScDPSaveDimension * GetExistingDimensionByName(const OUString &rName) const
Definition: dpsave.cxx:846
SC_DLLPUBLIC ~ScDPSaveData()
Definition: dpsave.cxx:762
SC_DLLPUBLIC void SetIgnoreEmptyRows(bool bSet)
Definition: dpsave.cxx:994
sal_uInt16 nIgnoreEmptyMode
Definition: dpsave.hxx:246
void SetDupFlag(bool bSet)
Definition: dpsave.hxx:133
SC_DLLPUBLIC void SetFilterButton(bool bSet)
Definition: dpsave.cxx:1004
OUString aName
Definition: dpsave.hxx:96
sal_uInt16 nColumnGrandMode
Definition: dpsave.hxx:244
bool GetFilterButton() const
Definition: dpsave.hxx:338
bool mbDimensionMembersBuilt
if true, all dimensions already have all of their member instances created.
Definition: dpsave.hxx:253
SC_DLLPUBLIC void SetShowDetails(bool bSet)
Definition: dpsave.cxx:105
std::optional< OUString > mpSubtotalName
Definition: dpsave.hxx:98
bool GetColumnGrand() const
Definition: dpsave.hxx:322
SC_DLLPUBLIC void SetGrandTotalName(const OUString &rName)
Definition: dpsave.cxx:766
SC_DLLPUBLIC void SetDrillDown(bool bSet)
Definition: dpsave.cxx:1009
Base class that abstracts different data source types of a datapilot table.
Definition: dptabdat.hxx:56
void DimensionsChanged()
Definition: dpsave.cxx:1366
SC_DLLPUBLIC bool HasIsVisible() const
Definition: dpsave.cxx:90
bool GetShowDetails() const
Definition: dpsave.hxx:76
const DimsType & GetDimensions() const
Definition: dpsave.hxx:270
std::unordered_map< OUString, size_t > DupNameCountType
Definition: dpsave.hxx:235
sal_uInt16 nShowEmptyMode
Definition: dpsave.hxx:104
sal_uInt16 nRepeatEmptyMode
Definition: dpsave.hxx:247
ScDPSaveDimension * DuplicateDimension(const OUString &rName)
Definition: dpsave.cxx:886
std::unique_ptr< css::sheet::DataPilotFieldReference > pReferenceValue
Definition: dpsave.hxx:108
bool GetShowEmpty() const
Definition: dpsave.hxx:157
std::unique_ptr< css::sheet::DataPilotFieldLayoutInfo > pLayoutInfo
Definition: dpsave.hxx:111
ScGeneralFunction
the css::sheet::GeneralFunction enum is extended by constants in GeneralFunction2, which causes some type-safety issues.
const OUString & GetName() const
Definition: dpsave.hxx:139
std::vector< std::unique_ptr< ScDPSaveDimension > > DimsType
Definition: dpsave.hxx:238
std::unique_ptr< css::sheet::DataPilotFieldAutoShowInfo > pAutoShowInfo
Definition: dpsave.hxx:110
bool bSubTotalDefault
at level
Definition: dpsave.hxx:106
const css::sheet::DataPilotFieldAutoShowInfo * GetAutoShowInfo() const
Definition: dpsave.hxx:190
bool bDrillDown
Definition: dpsave.hxx:249
SC_DLLPUBLIC void SetColumnGrand(bool bSet)
Definition: dpsave.cxx:984
DimsType m_DimList
Definition: dpsave.hxx:241
bool GetDupFlag() const
Definition: dpsave.hxx:136
SC_DLLPUBLIC void SetRowGrand(bool bSet)
Definition: dpsave.cxx:989
void WriteToSource(const css::uno::Reference< css::sheet::XDimensionsSupplier > &xSource)
Definition: dpsave.cxx:1029
void Dump(int nIndent=0) const
bool bRepeatItemLabels
at level
Definition: dpsave.hxx:105
SC_DLLPUBLIC const std::optional< OUString > & GetLayoutName() const
Definition: dpsave.cxx:123
OUString aName
Definition: dpsave.hxx:54
void RemoveAllGroupDimensions(const OUString &rSrcDimName, std::vector< OUString > *pDeletedNames=nullptr)
Definition: dpsave.cxx:1159
std::optional< OUString > mpLayoutName
Definition: dpsave.hxx:97
void RemoveLayoutName()
Definition: dpsave.cxx:128
#define SC_DLLPUBLIC
Definition: scdllapi.h:28
SC_DLLPUBLIC ScDPSaveDimension * GetDimensionByName(const OUString &rName)
Get a dimension object by its name.
Definition: dpsave.cxx:835
const css::sheet::DataPilotFieldReference * GetReferenceValue() const
Definition: dpsave.hxx:181
SC_DLLPUBLIC ScDPSaveDimension * GetDataLayoutDimension()
Definition: dpsave.cxx:867
ScDPSaveMember(const OUString &rName)
Definition: dpsave.cxx:64
std::vector< ScGeneralFunction > maSubTotalFuncs
at level
Definition: dpsave.hxx:107
ScGeneralFunction GetSubTotalFunc(long nIndex) const
Definition: dpsave.hxx:152
bool bFilterButton
Definition: dpsave.hxx:248
SC_DLLPUBLIC ScDPSaveData()
Definition: dpsave.cxx:691
SC_DLLPUBLIC bool HasShowDetails() const
Definition: dpsave.cxx:100