blob: fc270c9c421a389d6f50ef26c4716b561ce869a8 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SC_XIPIVOT_HXX
#define SC_XIPIVOT_HXX
#include <list>
#include "xlpivot.hxx"
#include "xiroot.hxx"
class ScDPSaveData;
class ScDPSaveDimension;
// ============================================================================
// Pivot cache
// ============================================================================
/** Represents a data item in a pivot cache. */
class XclImpPCItem : public XclPCItem
{
public:
explicit XclImpPCItem( XclImpStream& rStrm );
/** Inserts the item data into the passed document. */
void WriteToSource( const XclImpRoot& rRoot, const ScAddress& rScPos ) const;
private:
/** Reads an SXDOUBLE record describing a floating-point item. */
void ReadSxdouble( XclImpStream& rStrm );
/** Reads an SXBOOLEAN record describing a boolean item. */
void ReadSxboolean( XclImpStream& rStrm );
/** Reads an SXERROR record describing an error code item. */
void ReadSxerror( XclImpStream& rStrm );
/** Reads an SXINTEGER record describing an integer item. */
void ReadSxinteger( XclImpStream& rStrm );
/** Reads an SXSTRING record describing a text item. */
void ReadSxstring( XclImpStream& rStrm );
/** Reads an SXDATETIME record describing a date/time item. */
void ReadSxdatetime( XclImpStream& rStrm );
/** Reads an SXEMPTY record describing an empty item. */
void ReadSxempty( XclImpStream& rStrm );
};
typedef ScfRef< XclImpPCItem > XclImpPCItemRef;
// ============================================================================
struct ScDPNumGroupInfo;
class XclImpPivotCache;
/** Represents a field in a pivot cache (a column of data items in the source area). */
class XclImpPCField : public XclPCField, protected XclImpRoot
{
public:
/** Creates a pivot cache field by reading an SXFIELD record. */
explicit XclImpPCField( const XclImpRoot& rRoot,
XclImpPivotCache& rPCache, sal_uInt16 nFieldIdx );
virtual ~XclImpPCField();
// general field/item access ----------------------------------------------
/** Returns the name of the field, uses the passed visible name if supported. */
const String& GetFieldName( const ScfStringVec& rVisNames ) const;
/** Returns the base field if this is a grouping field. */
const XclImpPCField* GetGroupBaseField() const;
/** Returns the number of items of this field. */
sal_uInt16 GetItemCount() const;
/** Returns the item at the specified position or 0 on error. */
const XclImpPCItem* GetItem( sal_uInt16 nItemIdx ) const;
/** Returns the item representing a limit value in numeric/date/time grouping fields.
@param nItemIdx One of EXC_SXFIELD_INDEX_MIN, EXC_SXFIELD_INDEX_MAX, or EXC_SXFIELD_INDEX_STEP. */
const XclImpPCItem* GetLimitItem( sal_uInt16 nItemIdx ) const;
/** Inserts the field name into the document. */
void WriteFieldNameToSource( SCCOL nScCol, SCTAB nScTab ) const;
/** Inserts the specified item data into the document. */
void WriteOrigItemToSource( SCROW nScRow, SCTAB nScTab, sal_uInt16 nItemIdx ) const;
/** Inserts the data of the last inserted item into the document. */
void WriteLastOrigItemToSource( SCROW nScRow, SCTAB nScTab ) const;
// records ----------------------------------------------------------------
/** Reads the SXFIELD record describing the field. */
void ReadSxfield( XclImpStream& rStrm );
/** Reads an item data record describing a new item. */
void ReadItem( XclImpStream& rStrm );
/** Reads the SXNUMGROUP record describing numeric grouping fields. */
void ReadSxnumgroup( XclImpStream& rStrm );
/** Reads the SXGROUPINFO record describing the item order in grouping fields. */
void ReadSxgroupinfo( XclImpStream& rStrm );
// grouping ---------------------------------------------------------------
/** Inserts grouping information of this field into the passed ScDPSaveData. */
void ConvertGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const;
// ------------------------------------------------------------------------
private:
/** Inserts standard grouping information of this field into the passed ScDPSaveData. */
void ConvertStdGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const;
/** Inserts numeric grouping information of this field into the passed ScDPSaveData. */
void ConvertNumGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const;
/** Inserts date grouping information of this field into the passed ScDPSaveData. */
void ConvertDateGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const;
/** Returns a Calc struct with numeric grouping data. */
ScDPNumGroupInfo GetScNumGroupInfo() const;
/** Returns a Calc struct with date grouping data. */
ScDPNumGroupInfo GetScDateGroupInfo() const;
/** Returns a limit value for numeric grouping fields. */
const double* GetNumGroupLimit( sal_uInt16 nLimitIdx ) const;
/** Returns a limit value for date grouping fields (minimum/maximum only). */
const DateTime* GetDateGroupLimit( sal_uInt16 nLimitIdx ) const;
/** Returns the step value for date grouping fields. */
const sal_Int16* GetDateGroupStep() const;
private:
typedef ::std::vector< XclImpPCItemRef > XclImpPCItemVec;
XclImpPivotCache& mrPCache; /// Parent pivot cache containing this field.
XclImpPCItemVec maItems; /// List of all displayed data items.
XclImpPCItemVec maOrigItems; /// List of all source data items.
XclImpPCItemVec maNumGroupItems; /// List of items containing numeric grouping limits.
mutable SCCOL mnSourceScCol; /// Column index of source data for this field.
bool mbNumGroupInfoRead; /// true = Numeric grouping info read (SXNUMGROUP record).
};
typedef ScfRef< XclImpPCField > XclImpPCFieldRef;
// ============================================================================
class XclImpPivotCache : protected XclImpRoot
{
public:
explicit XclImpPivotCache( const XclImpRoot& rRoot );
virtual ~XclImpPivotCache();
// data access ------------------------------------------------------------
/** Returns the data source range read from the DCONREF record. */
inline const ScRange& GetSourceRange() const { return maSrcRange; }
/** Returns the number of pivot cache fields. */
sal_uInt16 GetFieldCount() const;
/** Returns read-only access to a pivot cache field. */
const XclImpPCField* GetField( sal_uInt16 nFieldIdx ) const;
// records ----------------------------------------------------------------
/** Reads an SXIDSTM record containing a pivot cache stream identifier and the pivot cache. */
void ReadSxidstm( XclImpStream& rStrm );
/** Reads an SXVS record containing the source type of the pivot cache. */
void ReadSxvs( XclImpStream& rStrm );
/** Reads a DCONREF record containing the source range of the pivot cache. */
void ReadDconref( XclImpStream& rStrm );
/** Reads the entire pivot cache stream. Uses decrypter from passed stream. */
void ReadPivotCacheStream( XclImpStream& rStrm );
bool IsRefreshOnLoad() const;
private:
typedef ::std::vector< XclImpPCFieldRef > XclImpPCFieldVec;
XclPCInfo maPCInfo; /// Pivot cache settings (SXDB record).
XclImpPCFieldVec maFields; /// List of pivot cache fields.
ScRange maSrcRange; /// Source range in the spreadsheet.
String maUrl; /// URL of the source data.
String maTabName; /// Sheet name of the source data.
sal_uInt16 mnStrmId; /// Pivot cache stream identifier.
sal_uInt16 mnSrcType; /// Source data type.
bool mbSelfRef; /// true = Source data from own document.
};
typedef ScfRef< XclImpPivotCache > XclImpPivotCacheRef;
// ============================================================================
// Pivot table
// ============================================================================
class XclImpPivotTable;
class XclImpPTField;
// ============================================================================
class XclImpPTItem
{
public:
explicit XclImpPTItem( const XclImpPTField & );
/** Returns the internal name of the item or 0, if no name could be found. */
const String* GetItemName() const;
/** Returns the displayed name of the item or 0, if no name could be found. */
const String* GetVisItemName() const;
/** Reads an SXVI record containing data of this item. */
void ReadSxvi( XclImpStream& rStrm );
/** Inserts this item into the passed ScDPSaveDimension. */
void ConvertItem( ScDPSaveDimension& rSaveDim ) const;
private:
XclPTItemInfo maItemInfo; /// General data for this item.
//const XclImpPCField* mpCacheField; /// Corresponding pivot cache field.
const XclImpPTField & mrPTField;
};
typedef ScfRef< XclImpPTItem > XclImpPTItemRef;
// ============================================================================
class XclImpPTField
{
public:
explicit XclImpPTField( const XclImpPivotTable& rPTable, sal_uInt16 nCacheIdx );
// general field/item access ----------------------------------------------
/** Returns the corresponding pivot cache field of this field. */
const XclImpPCField* GetCacheField() const;
/** Returns the name of this field that is used to create the Calc dimensions. */
const String& GetFieldName() const;
/** Returns the internally set visible name of this field. */
const String& GetVisFieldName() const;
/** Returns the specified item. */
const XclImpPTItem* GetItem( sal_uInt16 nItemIdx ) const;
/** Returns the internal name of the specified item. */
const String* GetItemName( sal_uInt16 nItemIdx ) const;
/** Returns the displayed name of the specified item. */
const String* GetVisItemName( sal_uInt16 nItemIdx ) const;
/** Returns the flags of the axes this field is part of. */
inline sal_uInt16 GetAxes() const { return maFieldInfo.mnAxes; }
/** Sets the flags of the axes this field is part of. */
inline void SetAxes( sal_uInt16 nAxes ) { maFieldInfo.mnAxes = nAxes; }
// records ----------------------------------------------------------------
/** Reads an SXVD record describing the field. */
void ReadSxvd( XclImpStream& rStrm );
/** Reads an SXVDEX record describing extended options of the field. */
void ReadSxvdex( XclImpStream& rStrm );
/** Reads an SXVI record describing a new item of this field. */
void ReadSxvi( XclImpStream& rStrm );
// row/column fields ------------------------------------------------------
void ConvertRowColField( ScDPSaveData& rSaveData ) const;
// page fields ------------------------------------------------------------
void SetPageFieldInfo( const XclPTPageFieldInfo& rPageInfo );
void ConvertPageField( ScDPSaveData& rSaveData ) const;
// hidden fields ----------------------------------------------------------
void ConvertHiddenField( ScDPSaveData& rSaveData ) const;
// data fields ------------------------------------------------------------
bool HasDataFieldInfo() const;
void AddDataFieldInfo( const XclPTDataFieldInfo& rDataInfo );
void ConvertDataField( ScDPSaveData& rSaveData ) const;
// ------------------------------------------------------------------------
private:
ScDPSaveDimension* ConvertRCPField( ScDPSaveData& rSaveData ) const;
void ConvertFieldInfo( ScDPSaveDimension& rSaveDim ) const;
void ConvertDataField( ScDPSaveDimension& rSaveDim, const XclPTDataFieldInfo& rDataInfo ) const;
void ConvertDataFieldInfo( ScDPSaveDimension& rSaveDim, const XclPTDataFieldInfo& rDataInfo ) const;
void ConvertItems( ScDPSaveDimension& rSaveDim ) const;
private:
typedef ::std::list< XclPTDataFieldInfo > XclPTDataFieldInfoList;
typedef ::std::vector< XclImpPTItemRef > XclImpPTItemVec;
const XclImpPivotTable& mrPTable; /// Parent pivot table containing this field.
XclPTFieldInfo maFieldInfo; /// General field info (SXVD record).
XclPTFieldExtInfo maFieldExtInfo; /// Extended field info (SXVDEX record).
XclPTPageFieldInfo maPageInfo; /// Page field info (entry from SXPI record).
XclPTDataFieldInfoList maDataInfoList; /// List of extended data field info (SXDI records).
XclImpPTItemVec maItems; /// List of all items of this field.
};
typedef ScfRef< XclImpPTField > XclImpPTFieldRef;
// ============================================================================
class XclImpPivotTable : protected XclImpRoot
{
public:
explicit XclImpPivotTable( const XclImpRoot& rRoot );
virtual ~XclImpPivotTable();
// cache/field access, misc. ----------------------------------------------
inline XclImpPivotCacheRef GetPivotCache() const { return mxPCache; }
inline const ScfStringVec& GetVisFieldNames() const { return maVisFieldNames; }
sal_uInt16 GetFieldCount() const;
const XclImpPTField* GetField( sal_uInt16 nFieldIdx ) const;
XclImpPTField* GetFieldAcc( sal_uInt16 nFieldIdx );
const String& GetFieldName( sal_uInt16 nFieldIdx ) const;
const XclImpPTField* GetDataField( sal_uInt16 nDataFieldIdx ) const;
const String& GetDataFieldName( sal_uInt16 nDataFieldIdx ) const;
// records ----------------------------------------------------------------
/** Reads an SXVIEW record starting a new pivot table. */
void ReadSxview( XclImpStream& rStrm );
/** Reads an SXVD record describing a new field. */
void ReadSxvd( XclImpStream& rStrm );
/** Reads an SXVI record describing a new item of the current field. */
void ReadSxvi( XclImpStream& rStrm );
/** Reads an SXVDEX record describing extended options of the current field. */
void ReadSxvdex( XclImpStream& rStrm );
/** Reads an SXIVD record containing the row field or column field order. */
void ReadSxivd( XclImpStream& rStrm );
/** Reads an SXPI record containing page field data. */
void ReadSxpi( XclImpStream& rStrm );
/** Reads an SXDI record containing data field data. */
void ReadSxdi( XclImpStream& rStrm );
/** Reads an SXEX record containing additional settings for the pivot table. */
void ReadSxex( XclImpStream& rStrm );
/** Reads an SXVIEWEX9 record that specifies the pivot tables
* autoformat. */
void ReadSxViewEx9( XclImpStream& rStrm );
// ------------------------------------------------------------------------
/** Inserts the pivot table into the Calc document. */
void Convert();
void MaybeRefresh();
void ApplyMergeFlags(const ScRange& rOutRange, const ScDPSaveData& rSaveData);
sal_uInt16 GetCacheId() const { return maPTInfo.mnCacheIdx; };
// ------------------------------------------------------------------------
private:
typedef ::std::vector< XclImpPTFieldRef > XclImpPTFieldVec;
XclImpPivotCacheRef mxPCache; /// Pivot cache containing field/item names.
XclPTInfo maPTInfo; /// General info about the pivot table (SXVIEW record).
XclPTExtInfo maPTExtInfo; /// Extended info about the pivot table (SXEX record).
XclPTViewEx9Info maPTViewEx9Info; /// (SXVIEWEX9 record)
XclImpPTFieldVec maFields; /// Vector containing all fields.
XclImpPTFieldRef mxCurrField; /// Current field for importing additional info.
ScfStringVec maVisFieldNames; /// Vector containing all visible field names.
ScfUInt16Vec maRowFields; /// Row field indexes.
ScfUInt16Vec maColFields; /// Column field indexes.
ScfUInt16Vec maPageFields; /// Page field indexes.
ScfUInt16Vec maOrigDataFields; /// Original data field indexes.
ScfUInt16Vec maFiltDataFields; /// Filtered data field indexes.
XclImpPTField maDataOrientField; /// Special data field orientation field.
ScRange maOutScRange; /// Output range in the Calc document.
ScDPObject* mpDPObj;
};
typedef ScfRef< XclImpPivotTable > XclImpPivotTableRef;
// ============================================================================
// ============================================================================
/** The main class for pivot table import.
This class contains functions to read all records related to pivot tables
and pivot caches.
*/
class XclImpPivotTableManager : protected XclImpRoot
{
public:
explicit XclImpPivotTableManager( const XclImpRoot& rRoot );
virtual ~XclImpPivotTableManager();
// pivot cache records ----------------------------------------------------
/** Returns the pivot cache with the specified 0-based index. */
XclImpPivotCacheRef GetPivotCache( sal_uInt16 nCacheIdx );
/** Reads an SXIDSTM record containing a pivot cache stream identifier and the pivot cache. */
void ReadSxidstm( XclImpStream& rStrm );
/** Reads an SXVS record containing the source type of a pivot cache. */
void ReadSxvs( XclImpStream& rStrm );
/** Reads a DCONREF record containing the source range of a pivot cache. */
void ReadDconref( XclImpStream& rStrm );
// pivot table records ----------------------------------------------------
/** Reads an SXVIEW record describing a new pivot table. */
void ReadSxview( XclImpStream& rStrm );
/** Reads an SXVD record describing a new field. */
void ReadSxvd( XclImpStream& rStrm );
/** Reads an SXVDEX record describing extended options of a field. */
void ReadSxvdex( XclImpStream& rStrm );
/** Reads an SXIVD record containing the row field or column field order. */
void ReadSxivd( XclImpStream& rStrm );
/** Reads an SXPI record containing page field data. */
void ReadSxpi( XclImpStream& rStrm );
/** Reads an SXDI record containing data field data. */
void ReadSxdi( XclImpStream& rStrm );
/** Reads an SXVI record describing a new item of the current field. */
void ReadSxvi( XclImpStream& rStrm );
/** Reads an SXEX record containing additional settings for a pivot table. */
void ReadSxex( XclImpStream& rStrm );
/** Reads an SXVIEWEX9 record that specifies the pivot tables
* autoformat. */
void ReadSxViewEx9( XclImpStream& rStrm );
// ------------------------------------------------------------------------
/** Reads all used pivot caches and creates additional sheets for external data sources. */
// void ReadPivotCaches( XclImpStream& rStrm );
/** Inserts all pivot tables into the Calc document. */
// void ConvertPivotTables();
void ConvertPivotTables( XclImpStream & );
// void MaybeRefreshPivotTables();
private:
typedef ::std::vector< XclImpPivotCacheRef > XclImpPivotCacheVec;
typedef ::std::vector< XclImpPivotTableRef > XclImpPivotTableVec;
XclImpPivotCacheVec maPCaches; /// List of all pivot caches.
XclImpPivotTableVec maPTables; /// List of all pivot tables.
};
// ============================================================================
#endif