fix baseline build (old cairo) - 'cairo_rectangle_int_t' does not name a type
[LibreOffice.git] / sc / source / filter / inc / xipivot.hxx
blobdce979515f4195d637daee248c4090490117b1e7
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_SC_SOURCE_FILTER_INC_XIPIVOT_HXX
21 #define INCLUDED_SC_SOURCE_FILTER_INC_XIPIVOT_HXX
23 #include "xlpivot.hxx"
24 #include "xiroot.hxx"
25 #include <list>
26 #include <memory>
28 class ScDPSaveData;
29 class ScDPSaveDimension;
31 // Pivot cache
33 /** Represents a data item in a pivot cache. */
34 class XclImpPCItem : public XclPCItem
36 public:
37 explicit XclImpPCItem( XclImpStream& rStrm );
39 /** Inserts the item data into the passed document. */
40 void WriteToSource( XclImpRoot& rRoot, const ScAddress& rScPos ) const;
42 private:
43 /** Reads an SXDOUBLE record describing a floating-point item. */
44 void ReadSxdouble( XclImpStream& rStrm );
45 /** Reads an SXBOOLEAN record describing a boolean item. */
46 void ReadSxboolean( XclImpStream& rStrm );
47 /** Reads an SXERROR record describing an error code item. */
48 void ReadSxerror( XclImpStream& rStrm );
49 /** Reads an SXINTEGER record describing an integer item. */
50 void ReadSxinteger( XclImpStream& rStrm );
51 /** Reads an SXSTRING record describing a text item. */
52 void ReadSxstring( XclImpStream& rStrm );
53 /** Reads an SXDATETIME record describing a date/time item. */
54 void ReadSxdatetime( XclImpStream& rStrm );
55 /** Reads an SXEMPTY record describing an empty item. */
56 void ReadSxempty( XclImpStream& rStrm );
59 typedef std::shared_ptr< XclImpPCItem > XclImpPCItemRef;
61 struct ScDPNumGroupInfo;
62 class XclImpPivotCache;
64 /** Represents a field in a pivot cache (a column of data items in the source area). */
65 class XclImpPCField : public XclPCField, protected XclImpRoot
67 public:
68 /** Creates a pivot cache field by reading an SXFIELD record. */
69 explicit XclImpPCField( const XclImpRoot& rRoot,
70 XclImpPivotCache& rPCache, sal_uInt16 nFieldIdx );
71 virtual ~XclImpPCField();
73 // general field/item access ----------------------------------------------
75 /** Returns the name of the field, uses the passed visible name if supported. */
76 const OUString& GetFieldName( const ScfStringVec& rVisNames ) const;
78 /** Returns the base field if this is a grouping field. */
79 const XclImpPCField* GetGroupBaseField() const;
81 /** Returns the item at the specified position or 0 on error. */
82 const XclImpPCItem* GetItem( sal_uInt16 nItemIdx ) const;
83 /** Returns the item representing a limit value in numeric/date/time grouping fields.
84 @param nItemIdx One of EXC_SXFIELD_INDEX_MIN, EXC_SXFIELD_INDEX_MAX, or EXC_SXFIELD_INDEX_STEP. */
85 const XclImpPCItem* GetLimitItem( sal_uInt16 nItemIdx ) const;
87 /** Inserts the field name into the document. */
88 void WriteFieldNameToSource( SCCOL nScCol, SCTAB nScTab );
89 /** Inserts the specified item data into the document. */
90 void WriteOrigItemToSource( SCROW nScRow, SCTAB nScTab, sal_uInt16 nItemIdx );
91 /** Inserts the data of the last inserted item into the document. */
92 void WriteLastOrigItemToSource( SCROW nScRow, SCTAB nScTab );
94 // records ----------------------------------------------------------------
96 /** Reads the SXFIELD record describing the field. */
97 void ReadSxfield( XclImpStream& rStrm );
98 /** Reads an item data record describing a new item. */
99 void ReadItem( XclImpStream& rStrm );
100 /** Reads the SXNUMGROUP record describing numeric grouping fields. */
101 void ReadSxnumgroup( XclImpStream& rStrm );
102 /** Reads the SXGROUPINFO record describing the item order in grouping fields. */
103 void ReadSxgroupinfo( XclImpStream& rStrm );
105 // grouping ---------------------------------------------------------------
107 /** Inserts grouping information of this field into the passed ScDPSaveData. */
108 void ConvertGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const;
110 private:
111 /** Inserts standard grouping information of this field into the passed ScDPSaveData. */
112 void ConvertStdGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const;
113 /** Inserts numeric grouping information of this field into the passed ScDPSaveData. */
114 void ConvertNumGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const;
115 /** Inserts date grouping information of this field into the passed ScDPSaveData. */
116 void ConvertDateGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const;
118 /** Returns a Calc struct with numeric grouping data. */
119 ScDPNumGroupInfo GetScNumGroupInfo() const;
120 /** Returns a Calc struct with date grouping data. */
121 ScDPNumGroupInfo GetScDateGroupInfo() const;
123 /** Returns a limit value for numeric grouping fields. */
124 const double* GetNumGroupLimit( sal_uInt16 nLimitIdx ) const;
125 /** Returns a limit value for date grouping fields (minimum/maximum only). */
126 const DateTime* GetDateGroupLimit( sal_uInt16 nLimitIdx ) const;
127 /** Returns the step value for date grouping fields. */
128 const sal_Int16* GetDateGroupStep() const;
130 private:
131 typedef ::std::vector< XclImpPCItemRef > XclImpPCItemVec;
133 XclImpPivotCache& mrPCache; /// Parent pivot cache containing this field.
134 XclImpPCItemVec maItems; /// List of all displayed data items.
135 XclImpPCItemVec maOrigItems; /// List of all source data items.
136 XclImpPCItemVec maNumGroupItems; /// List of items containing numeric grouping limits.
137 mutable SCCOL mnSourceScCol; /// Column index of source data for this field.
138 bool mbNumGroupInfoRead; /// true = Numeric grouping info read (SXNUMGROUP record).
141 typedef std::shared_ptr< XclImpPCField > XclImpPCFieldRef;
143 class XclImpPivotCache : protected XclImpRoot
145 public:
146 explicit XclImpPivotCache( const XclImpRoot& rRoot );
147 virtual ~XclImpPivotCache();
149 // data access ------------------------------------------------------------
151 /** Returns the data source range read from the DCONREF record. */
152 inline const ScRange& GetSourceRange() const { return maSrcRange; }
154 const OUString& GetSourceRangeName() const { return maSrcRangeName; }
156 /** Returns the number of pivot cache fields. */
157 sal_uInt16 GetFieldCount() const;
158 /** Returns read-only access to a pivot cache field. */
159 const XclImpPCField* GetField( sal_uInt16 nFieldIdx ) const;
161 // records ----------------------------------------------------------------
163 /** Reads an SXIDSTM record containing a pivot cache stream identifier and the pivot cache. */
164 void ReadSxidstm( XclImpStream& rStrm );
165 /** Reads an SXVS record containing the source type of the pivot cache. */
166 void ReadSxvs( XclImpStream& rStrm );
167 /** Reads a DCONREF record containing the source range of the pivot cache. */
168 void ReadDconref( XclImpStream& rStrm );
170 * Read DECONNAME record which contains the defined name of the source
171 * range.
173 void ReadDConName( XclImpStream& rStrm );
174 /** Reads the entire pivot cache stream. Uses decrypter from passed stream. */
175 void ReadPivotCacheStream( XclImpStream& rStrm );
177 bool HasCacheRecords() const;
178 bool IsRefreshOnLoad() const;
179 bool IsValid() const;
181 private:
182 typedef ::std::vector< XclImpPCFieldRef > XclImpPCFieldVec;
184 XclPCInfo maPCInfo; /// Pivot cache settings (SXDB record).
185 XclImpPCFieldVec maFields; /// List of pivot cache fields.
186 ScRange maSrcRange; /// Source range in the spreadsheet.
187 OUString maUrl; /// URL of the source data.
188 OUString maTabName; /// Sheet name of the source data.
189 OUString maSrcRangeName; /// Name of the source data range.
190 sal_uInt16 mnStrmId; /// Pivot cache stream identifier.
191 sal_uInt16 mnSrcType; /// Source data type.
192 bool mbSelfRef; /// true = Source data from own document.
195 typedef std::shared_ptr< XclImpPivotCache > XclImpPivotCacheRef;
197 // Pivot table
199 class XclImpPivotTable;
201 class XclImpPTItem
203 public:
204 explicit XclImpPTItem( const XclImpPCField* pCacheField );
206 /** Returns the internal name of the item or 0, if no name could be found. */
207 const OUString* GetItemName() const;
209 /** Reads an SXVI record containing data of this item. */
210 void ReadSxvi( XclImpStream& rStrm );
212 /** Inserts this item into the passed ScDPSaveDimension. */
213 void ConvertItem( ScDPSaveDimension& rSaveDim ) const;
215 private:
216 XclPTItemInfo maItemInfo; /// General data for this item.
217 const XclImpPCField* mpCacheField; /// Corresponding pivot cache field.
220 typedef std::shared_ptr< XclImpPTItem > XclImpPTItemRef;
222 class XclImpPTField
224 public:
225 explicit XclImpPTField( const XclImpPivotTable& rPTable, sal_uInt16 nCacheIdx );
227 // general field/item access ----------------------------------------------
229 /** Returns the corresponding pivot cache field of this field. */
230 const XclImpPCField* GetCacheField() const;
231 /** Returns the name of this field that is used to create the Calc dimensions. */
232 OUString GetFieldName() const;
233 /** Returns the internally set visible name of this field. */
234 OUString GetVisFieldName() const;
236 /** Returns the specified item. */
237 const XclImpPTItem* GetItem( sal_uInt16 nItemIdx ) const;
238 /** Returns the internal name of the specified item. */
239 const OUString* GetItemName( sal_uInt16 nItemIdx ) const;
241 /** Returns the flags of the axes this field is part of. */
242 inline sal_uInt16 GetAxes() const { return maFieldInfo.mnAxes; }
243 /** Sets the flags of the axes this field is part of. */
244 inline void SetAxes( sal_uInt16 nAxes ) { maFieldInfo.mnAxes = nAxes; }
246 // records ----------------------------------------------------------------
248 /** Reads an SXVD record describing the field. */
249 void ReadSxvd( XclImpStream& rStrm );
250 /** Reads an SXVDEX record describing extended options of the field. */
251 void ReadSxvdex( XclImpStream& rStrm );
252 /** Reads an SXVI record describing a new item of this field. */
253 void ReadSxvi( XclImpStream& rStrm );
255 // row/column fields ------------------------------------------------------
257 void ConvertRowColField( ScDPSaveData& rSaveData ) const;
259 // page fields ------------------------------------------------------------
261 void SetPageFieldInfo( const XclPTPageFieldInfo& rPageInfo );
262 void ConvertPageField( ScDPSaveData& rSaveData ) const;
264 // hidden fields ----------------------------------------------------------
266 void ConvertHiddenField( ScDPSaveData& rSaveData ) const;
268 // data fields ------------------------------------------------------------
270 bool HasDataFieldInfo() const;
271 void AddDataFieldInfo( const XclPTDataFieldInfo& rDataInfo );
272 void ConvertDataField( ScDPSaveData& rSaveData ) const;
274 private:
275 ScDPSaveDimension* ConvertRCPField( ScDPSaveData& rSaveData ) const;
276 void ConvertFieldInfo( ScDPSaveDimension& rSaveDim ) const;
278 void ConvertDataField( ScDPSaveDimension& rSaveDim, const XclPTDataFieldInfo& rDataInfo ) const;
279 void ConvertDataFieldInfo( ScDPSaveDimension& rSaveDim, const XclPTDataFieldInfo& rDataInfo ) const;
280 void ConvertItems( ScDPSaveDimension& rSaveDim ) const;
282 private:
283 typedef ::std::list< XclPTDataFieldInfo > XclPTDataFieldInfoList;
284 typedef ::std::vector< XclImpPTItemRef > XclImpPTItemVec;
286 const XclImpPivotTable& mrPTable; /// Parent pivot table containing this field.
287 XclPTFieldInfo maFieldInfo; /// General field info (SXVD record).
288 XclPTFieldExtInfo maFieldExtInfo; /// Extended field info (SXVDEX record).
289 XclPTPageFieldInfo maPageInfo; /// Page field info (entry from SXPI record).
290 XclPTDataFieldInfoList maDataInfoList; /// List of extended data field info (SXDI records).
291 XclImpPTItemVec maItems; /// List of all items of this field.
294 typedef std::shared_ptr< XclImpPTField > XclImpPTFieldRef;
296 class XclImpPivotTable : protected XclImpRoot
298 public:
299 explicit XclImpPivotTable( const XclImpRoot& rRoot );
300 virtual ~XclImpPivotTable();
302 // cache/field access, misc. ----------------------------------------------
304 inline XclImpPivotCacheRef GetPivotCache() const { return mxPCache; }
305 inline const ScfStringVec& GetVisFieldNames() const { return maVisFieldNames; }
307 sal_uInt16 GetFieldCount() const;
308 const XclImpPTField* GetField( sal_uInt16 nFieldIdx ) const;
309 XclImpPTField* GetFieldAcc( sal_uInt16 nFieldIdx );
310 const OUString& GetFieldName( sal_uInt16 nFieldIdx ) const;
312 const XclImpPTField* GetDataField( sal_uInt16 nDataFieldIdx ) const;
313 OUString GetDataFieldName( sal_uInt16 nDataFieldIdx ) const;
315 // records ----------------------------------------------------------------
317 /** Reads an SXVIEW record starting a new pivot table. */
318 void ReadSxview( XclImpStream& rStrm );
319 /** Reads an SXVD record describing a new field. */
320 void ReadSxvd( XclImpStream& rStrm );
321 /** Reads an SXVI record describing a new item of the current field. */
322 void ReadSxvi( XclImpStream& rStrm );
323 /** Reads an SXVDEX record describing extended options of the current field. */
324 void ReadSxvdex( XclImpStream& rStrm );
325 /** Reads an SXIVD record containing the row field or column field order. */
326 void ReadSxivd( XclImpStream& rStrm );
327 /** Reads an SXPI record containing page field data. */
328 void ReadSxpi( XclImpStream& rStrm );
329 /** Reads an SXDI record containing data field data. */
330 void ReadSxdi( XclImpStream& rStrm );
331 /** Reads an SXEX record containing additional settings for the pivot table. */
332 void ReadSxex( XclImpStream& rStrm );
333 /** Reads an SXVIEWEX9 record that specifies the pivot tables
334 * autoformat. */
335 void ReadSxViewEx9( XclImpStream& rStrm );
337 /** Inserts the pivot table into the Calc document. */
338 void Convert();
340 void MaybeRefresh();
342 void ApplyMergeFlags(const ScRange& rOutRange, const ScDPSaveData& rSaveData);
344 private:
345 typedef ::std::vector< XclImpPTFieldRef > XclImpPTFieldVec;
347 XclImpPivotCacheRef mxPCache; /// Pivot cache containing field/item names.
349 XclPTInfo maPTInfo; /// General info about the pivot table (SXVIEW record).
350 XclPTExtInfo maPTExtInfo; /// Extended info about the pivot table (SXEX record).
351 XclPTViewEx9Info maPTViewEx9Info; /// (SXVIEWEX9 record)
352 XclImpPTFieldVec maFields; /// Vector containing all fields.
353 XclImpPTFieldRef mxCurrField; /// Current field for importing additional info.
354 ScfStringVec maVisFieldNames; /// Vector containing all visible field names.
355 ScfUInt16Vec maRowFields; /// Row field indexes.
356 ScfUInt16Vec maColFields; /// Column field indexes.
357 ScfUInt16Vec maPageFields; /// Page field indexes.
358 ScfUInt16Vec maOrigDataFields; /// Original data field indexes.
359 ScfUInt16Vec maFiltDataFields; /// Filtered data field indexes.
360 XclImpPTField maDataOrientField; /// Special data field orientation field.
361 ScRange maOutScRange; /// Output range in the Calc document.
362 ScDPObject* mpDPObj;
365 typedef std::shared_ptr< XclImpPivotTable > XclImpPivotTableRef;
367 /** The main class for pivot table import.
369 This class contains functions to read all records related to pivot tables
370 and pivot caches.
372 class XclImpPivotTableManager : protected XclImpRoot
374 public:
375 explicit XclImpPivotTableManager( const XclImpRoot& rRoot );
376 virtual ~XclImpPivotTableManager();
378 // pivot cache records ----------------------------------------------------
380 /** Returns the pivot cache with the specified 0-based index. */
381 XclImpPivotCacheRef GetPivotCache( sal_uInt16 nCacheIdx );
383 /** Reads an SXIDSTM record containing a pivot cache stream identifier and the pivot cache. */
384 void ReadSxidstm( XclImpStream& rStrm );
385 /** Reads an SXVS record containing the source type of a pivot cache. */
386 void ReadSxvs( XclImpStream& rStrm );
387 /** Reads a DCONREF record containing the source range of a pivot cache. */
388 void ReadDconref( XclImpStream& rStrm );
389 void ReadDConName( XclImpStream& rStrm );
391 // pivot table records ----------------------------------------------------
393 /** Reads an SXVIEW record describing a new pivot table. */
394 void ReadSxview( XclImpStream& rStrm );
395 /** Reads an SXVD record describing a new field. */
396 void ReadSxvd( XclImpStream& rStrm );
397 /** Reads an SXVDEX record describing extended options of a field. */
398 void ReadSxvdex( XclImpStream& rStrm );
399 /** Reads an SXIVD record containing the row field or column field order. */
400 void ReadSxivd( XclImpStream& rStrm );
401 /** Reads an SXPI record containing page field data. */
402 void ReadSxpi( XclImpStream& rStrm );
403 /** Reads an SXDI record containing data field data. */
404 void ReadSxdi( XclImpStream& rStrm );
405 /** Reads an SXVI record describing a new item of the current field. */
406 void ReadSxvi( XclImpStream& rStrm );
407 /** Reads an SXEX record containing additional settings for a pivot table. */
408 void ReadSxex( XclImpStream& rStrm );
409 /** Reads an SXVIEWEX9 record that specifies the pivot tables
410 * autoformat. */
411 void ReadSxViewEx9( XclImpStream& rStrm );
413 /** Reads all used pivot caches and creates additional sheets for external data sources. */
414 void ReadPivotCaches( XclImpStream& rStrm );
415 /** Inserts all pivot tables into the Calc document. */
416 void ConvertPivotTables();
418 void MaybeRefreshPivotTables();
420 private:
421 typedef ::std::vector< XclImpPivotCacheRef > XclImpPivotCacheVec;
422 typedef ::std::vector< XclImpPivotTableRef > XclImpPivotTableVec;
424 XclImpPivotCacheVec maPCaches; /// List of all pivot caches.
425 XclImpPivotTableVec maPTables; /// List of all pivot tables.
428 #endif
430 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */