xref: /AOO41X/main/oox/source/xls/pivottablebuffer.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #include "oox/xls/pivottablebuffer.hxx"
29*cdf0e10cSrcweir 
30*cdf0e10cSrcweir #include <set>
31*cdf0e10cSrcweir #include <com/sun/star/container/XIndexAccess.hpp>
32*cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
33*cdf0e10cSrcweir #include <com/sun/star/sheet/CellFlags.hpp>
34*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp>
35*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp>
36*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp>
37*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
38*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldReference.hpp>
39*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp>
40*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp>
41*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldShowItemsMode.hpp>
42*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldSortInfo.hpp>
43*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
44*cdf0e10cSrcweir #include <com/sun/star/sheet/GeneralFunction.hpp>
45*cdf0e10cSrcweir #include <com/sun/star/sheet/XDataPilotDataLayoutFieldSupplier.hpp>
46*cdf0e10cSrcweir #include <com/sun/star/sheet/XDataPilotField.hpp>
47*cdf0e10cSrcweir #include <com/sun/star/sheet/XDataPilotTablesSupplier.hpp>
48*cdf0e10cSrcweir #include <com/sun/star/sheet/XSheetOperation.hpp>
49*cdf0e10cSrcweir #include "oox/helper/attributelist.hxx"
50*cdf0e10cSrcweir #include "oox/helper/containerhelper.hxx"
51*cdf0e10cSrcweir #include "oox/helper/propertyset.hxx"
52*cdf0e10cSrcweir #include "oox/xls/addressconverter.hxx"
53*cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx"
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir namespace oox {
56*cdf0e10cSrcweir namespace xls {
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir // ============================================================================
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir using namespace ::com::sun::star::container;
61*cdf0e10cSrcweir using namespace ::com::sun::star::sheet;
62*cdf0e10cSrcweir using namespace ::com::sun::star::table;
63*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir using ::rtl::OUString;
66*cdf0e10cSrcweir 
67*cdf0e10cSrcweir // ============================================================================
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir namespace {
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir const sal_Int32 OOX_PT_DATALAYOUTFIELD              = -2;           /// Placeholder index of data layout field.
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir const sal_Int32 OOX_PT_PREVIOUS_ITEM                = 0x001000FC;   /// Calculation of data item result is based on previous item.
74*cdf0e10cSrcweir const sal_Int32 OOX_PT_NEXT_ITEM                    = 0x001000FD;   /// Calculation of data item result is based on next item.
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir // ----------------------------------------------------------------------------
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_DATAFIELD           = 0x00000008;
79*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_DEFAULT             = 0x00000100;
80*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_SUM                 = 0x00000200;
81*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_COUNTA              = 0x00000400;
82*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_AVERAGE             = 0x00000800;
83*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_MAX                 = 0x00001000;
84*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_MIN                 = 0x00002000;
85*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_PRODUCT             = 0x00004000;
86*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_COUNT               = 0x00008000;
87*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_STDDEV              = 0x00010000;
88*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_STDDEVP             = 0x00020000;
89*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_VAR                 = 0x00040000;
90*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_VARP                = 0x00080000;
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_SHOWALL             = 0x00000020;
93*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_OUTLINE             = 0x00000040;
94*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_INSERTBLANKROW      = 0x00000080;
95*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_SUBTOTALTOP         = 0x00000100;
96*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_INSERTPAGEBREAK     = 0x00000800;
97*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_AUTOSORT            = 0x00001000;
98*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_SORTASCENDING       = 0x00002000;
99*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_AUTOSHOW            = 0x00004000;
100*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_AUTOSHOWTOP         = 0x00008000;
101*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_MULTIPAGEITEMS      = 0x00080000;
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFITEM_HIDDEN              = 0x0001;
104*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFITEM_HIDEDETAILS         = 0x0002;
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir const sal_uInt8 BIFF12_PTPAGEFIELD_HASNAME          = 0x01;
107*cdf0e10cSrcweir const sal_uInt8 BIFF12_PTPAGEFIELD_HASOLAPCAPTION   = 0x02;
108*cdf0e10cSrcweir const sal_Int32 BIFF12_PTPAGEFIELD_MULTIITEMS       = 0x001000FE;
109*cdf0e10cSrcweir 
110*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFILTER_HASNAME            = 0x0001;
111*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFILTER_HASDESCRIPTION     = 0x0002;
112*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFILTER_HASSTRVALUE1       = 0x0004;
113*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFILTER_HASSTRVALUE2       = 0x0008;
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir const sal_uInt8 BIFF12_TOP10FILTER_TOP              = 0x01;
116*cdf0e10cSrcweir const sal_uInt8 BIFF12_TOP10FILTER_PERCENT          = 0x02;
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWITEMS             = 0x00000100;
119*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_DISABLEFIELDLIST      = 0x00000400;
120*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HIDECALCMEMBERS       = 0x00001000;
121*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_WITHHIDDENTOTALS      = 0x00002000;
122*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HIDEDRILL             = 0x00100000;
123*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_PRINTDRILL            = 0x00200000;
124*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HIDEHEADERS           = 0x80000000;
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWEMPTYROW          = 0x00000004;
127*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWEMPTYCOL          = 0x00000008;
128*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_ENABLEDRILL           = 0x00000020;
129*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_PRESERVEFORMATTING    = 0x00000080;
130*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_USEAUTOFORMAT         = 0x00000100;
131*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWERROR             = 0x00000200;
132*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWMISSING           = 0x00000400;
133*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_PAGEOVERTHENDOWN      = 0x00000800;
134*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SUBTOTALHIDDENITEMS   = 0x00001000;
135*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_ROWGRANDTOTALS        = 0x00002000;
136*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_COLGRANDTOTALS        = 0x00004000;
137*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_FIELDPRINTTITLES      = 0x00008000;
138*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_ITEMPRINTTITLES       = 0x00020000;
139*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_MERGEITEM             = 0x00040000;
140*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASDATACAPTION        = 0x00080000;
141*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASGRANDTOTALCAPTION  = 0x00100000;
142*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASPAGESTYLE          = 0x00200000;
143*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASPIVOTTABLESTYLE    = 0x00400000;
144*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASVACATEDSTYLE       = 0x00800000;
145*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYNUMFMT           = 0x01000000;
146*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYFONT             = 0x02000000;
147*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYALIGNMENT        = 0x04000000;
148*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYBORDER           = 0x08000000;
149*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYFILL             = 0x10000000;
150*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYPROTECTION       = 0x20000000;
151*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASTAG                = 0x40000000;
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_NOERRORCAPTION        = 0x00000040;
154*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_NOMISSINGCAPTION      = 0x00000080;
155*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASROWHEADERCAPTION   = 0x00000400;
156*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASCOLHEADERCAPTION   = 0x00000800;
157*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_FIELDLISTSORTASC      = 0x00001000;
158*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_NOCUSTOMLISTSORT      = 0x00004000;
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir const sal_uInt8 BIFF12_PTDEF_ROWAXIS                = 1;
161*cdf0e10cSrcweir const sal_uInt8 BIFF12_PTDEF_COLAXIS                = 2;
162*cdf0e10cSrcweir 
163*cdf0e10cSrcweir // ----------------------------------------------------------------------------
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir const sal_uInt16 BIFF_PT_NOSTRING                   = 0xFFFF;
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_DATAFIELD             = 0x0008;
168*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_DEFAULT               = 0x0001;
169*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_SUM                   = 0x0002;
170*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_COUNTA                = 0x0004;
171*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_AVERAGE               = 0x0008;
172*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_MAX                   = 0x0010;
173*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_MIN                   = 0x0020;
174*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_PRODUCT               = 0x0040;
175*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_COUNT                 = 0x0080;
176*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_STDDEV                = 0x0100;
177*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_STDDEVP               = 0x0200;
178*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_VAR                   = 0x0400;
179*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_VARP                  = 0x0800;
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_SHOWALL              = 0x00000001;
182*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_AUTOSORT             = 0x00000200;
183*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_SORTASCENDING        = 0x00000400;
184*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_AUTOSHOW             = 0x00000800;
185*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_AUTOSHOWTOP          = 0x00001000;
186*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_OUTLINE              = 0x00200000;
187*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_INSERTBLANKROW       = 0x00400000;
188*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_SUBTOTALTOP          = 0x00800000;
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFITEM_HIDDEN                = 0x0001;
191*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFITEM_HIDEDETAILS           = 0x0002;
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir const sal_uInt16 BIFF_PTDEF_ROWGRANDTOTALS          = 0x0001;
194*cdf0e10cSrcweir const sal_uInt16 BIFF_PTDEF_COLGRANDTOTALS          = 0x0002;
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir const sal_uInt8 BIFF_PTDEF_ROWAXIS                  = 1;
197*cdf0e10cSrcweir const sal_uInt8 BIFF_PTDEF_COLAXIS                  = 2;
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_PAGEOVERTHENDOWN       = 0x00000001;
200*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDE2F_ENABLEDRILL            = 0x00020000;
201*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_PRESERVEFORMATTING     = 0x00080000;
202*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_MERGEITEM              = 0x00100000;
203*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_SHOWERROR              = 0x00200000;
204*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_SHOWMISSING            = 0x00400000;
205*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_SUBTOTALHIDDENITEMS    = 0x00800000;
206*cdf0e10cSrcweir 
207*cdf0e10cSrcweir const sal_Int16 BIFF_PTPAGEFIELDS_ALLITEMS          = 0x7FFD;
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir const sal_Int16 BIFF_PTDATAFIELD_PREVIOUS           = 0x7FFB;
210*cdf0e10cSrcweir const sal_Int16 BIFF_PTDATAFIELD_NEXT               = 0x7FFC;
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir // ----------------------------------------------------------------------------
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir OUString lclReadPivotString( const WorkbookHelper& rHelper, BiffInputStream& rStrm, sal_uInt16 nLen )
215*cdf0e10cSrcweir {
216*cdf0e10cSrcweir     if( nLen == BIFF_PT_NOSTRING )
217*cdf0e10cSrcweir         return OUString();
218*cdf0e10cSrcweir     return (rHelper.getBiff() == BIFF8) ? rStrm.readUniStringBody( nLen ) : rStrm.readCharArrayUC( nLen, rHelper.getTextEncoding() );
219*cdf0e10cSrcweir }
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir } // namespace
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir // ============================================================================
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir PTFieldItemModel::PTFieldItemModel() :
226*cdf0e10cSrcweir     mnCacheItem( -1 ),
227*cdf0e10cSrcweir     mnType( XML_data ),
228*cdf0e10cSrcweir     mbShowDetails( true ),
229*cdf0e10cSrcweir     mbHidden( false )
230*cdf0e10cSrcweir {
231*cdf0e10cSrcweir }
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir void PTFieldItemModel::setBiffType( sal_uInt16 nType )
234*cdf0e10cSrcweir {
235*cdf0e10cSrcweir     static const sal_Int32 spnTypes[] = { XML_data, XML_default,
236*cdf0e10cSrcweir         XML_sum, XML_countA, XML_avg, XML_max, XML_min, XML_product, XML_count,
237*cdf0e10cSrcweir         XML_stdDev, XML_stdDevP, XML_var, XML_varP, XML_grand, XML_blank };
238*cdf0e10cSrcweir     mnType = STATIC_ARRAY_SELECT( spnTypes, nType, XML_data );
239*cdf0e10cSrcweir }
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir // ----------------------------------------------------------------------------
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir PTFieldModel::PTFieldModel() :
244*cdf0e10cSrcweir     mnAxis( XML_TOKEN_INVALID ),
245*cdf0e10cSrcweir     mnNumFmtId( 0 ),
246*cdf0e10cSrcweir     mnAutoShowItems( 10 ),
247*cdf0e10cSrcweir     mnAutoShowRankBy( -1 ),
248*cdf0e10cSrcweir     mnSortType( XML_manual ),
249*cdf0e10cSrcweir     mnSortRefField( -1 ),
250*cdf0e10cSrcweir     mnSortRefItem( -1 ),
251*cdf0e10cSrcweir     mbDataField( false ),
252*cdf0e10cSrcweir     mbDefaultSubtotal( true ),
253*cdf0e10cSrcweir     mbSumSubtotal( false ),
254*cdf0e10cSrcweir     mbCountASubtotal( false ),
255*cdf0e10cSrcweir     mbAverageSubtotal( false ),
256*cdf0e10cSrcweir     mbMaxSubtotal( false ),
257*cdf0e10cSrcweir     mbMinSubtotal( false ),
258*cdf0e10cSrcweir     mbProductSubtotal( false ),
259*cdf0e10cSrcweir     mbCountSubtotal( false ),
260*cdf0e10cSrcweir     mbStdDevSubtotal( false ),
261*cdf0e10cSrcweir     mbStdDevPSubtotal( false ),
262*cdf0e10cSrcweir     mbVarSubtotal( false ),
263*cdf0e10cSrcweir     mbVarPSubtotal( false ),
264*cdf0e10cSrcweir     mbShowAll( true ),
265*cdf0e10cSrcweir     mbOutline( true ),
266*cdf0e10cSrcweir     mbSubtotalTop( true ),
267*cdf0e10cSrcweir     mbInsertBlankRow( false ),
268*cdf0e10cSrcweir     mbInsertPageBreak( false ),
269*cdf0e10cSrcweir     mbAutoShow( false ),
270*cdf0e10cSrcweir     mbTopAutoShow( true ),
271*cdf0e10cSrcweir     mbMultiPageItems( false )
272*cdf0e10cSrcweir {
273*cdf0e10cSrcweir }
274*cdf0e10cSrcweir 
275*cdf0e10cSrcweir void PTFieldModel::setBiffAxis( sal_uInt8 nAxis )
276*cdf0e10cSrcweir {
277*cdf0e10cSrcweir     /*  Weird. The axis field is organized as bit field, but only one of the
278*cdf0e10cSrcweir         row/col/page flags are allowed at the same time and refer to the values
279*cdf0e10cSrcweir         'axisRow', 'axisCol', and 'axisPage' of the XML attribute
280*cdf0e10cSrcweir         'pivotField@axis'. Additionally, the fourth bit determines if the field
281*cdf0e10cSrcweir         is a data field, which may appear combined with the row/col/page flags.
282*cdf0e10cSrcweir         Therefore, this bit is unrelated to the 'axisValues' value of the
283*cdf0e10cSrcweir         'pivotField@axis' attribute, but refers to the 'pivotField@dataField'
284*cdf0e10cSrcweir         boolean attribute. */
285*cdf0e10cSrcweir     static const sal_Int32 spnAxisIds[] = { XML_TOKEN_INVALID, XML_axisRow, XML_axisCol, XML_TOKEN_INVALID, XML_axisPage };
286*cdf0e10cSrcweir     mnAxis = STATIC_ARRAY_SELECT( spnAxisIds, nAxis, XML_TOKEN_INVALID );
287*cdf0e10cSrcweir }
288*cdf0e10cSrcweir 
289*cdf0e10cSrcweir // ----------------------------------------------------------------------------
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir PTPageFieldModel::PTPageFieldModel() :
292*cdf0e10cSrcweir     mnField( -1 ),
293*cdf0e10cSrcweir     mnItem( BIFF12_PTPAGEFIELD_MULTIITEMS )
294*cdf0e10cSrcweir {
295*cdf0e10cSrcweir }
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir // ----------------------------------------------------------------------------
298*cdf0e10cSrcweir 
299*cdf0e10cSrcweir PTDataFieldModel::PTDataFieldModel() :
300*cdf0e10cSrcweir     mnField( -1 ),
301*cdf0e10cSrcweir     mnSubtotal( XML_sum ),
302*cdf0e10cSrcweir     mnShowDataAs( XML_normal ),
303*cdf0e10cSrcweir     mnBaseField( -1 ),
304*cdf0e10cSrcweir     mnBaseItem( -1 ),
305*cdf0e10cSrcweir     mnNumFmtId( 0 )
306*cdf0e10cSrcweir {
307*cdf0e10cSrcweir }
308*cdf0e10cSrcweir 
309*cdf0e10cSrcweir void PTDataFieldModel::setBiffSubtotal( sal_Int32 nSubtotal )
310*cdf0e10cSrcweir {
311*cdf0e10cSrcweir     static sal_Int32 spnSubtotals[] = { XML_sum, XML_count, XML_average, XML_max, XML_min, XML_product, XML_countNums, XML_stdDev, XML_stdDevp, XML_var, XML_varp };
312*cdf0e10cSrcweir     mnSubtotal = STATIC_ARRAY_SELECT( spnSubtotals, nSubtotal, XML_TOKEN_INVALID );
313*cdf0e10cSrcweir }
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir void PTDataFieldModel::setBiffShowDataAs( sal_Int32 nShowDataAs )
316*cdf0e10cSrcweir {
317*cdf0e10cSrcweir     static sal_Int32 spnShowDataAs[] = { XML_normal, XML_difference, XML_percent, XML_percentDiff, XML_runTotal, XML_percentOfRow, XML_percentOfCol, XML_percentOfTotal, XML_index };
318*cdf0e10cSrcweir     mnShowDataAs = STATIC_ARRAY_SELECT( spnShowDataAs, nShowDataAs, XML_TOKEN_INVALID );
319*cdf0e10cSrcweir }
320*cdf0e10cSrcweir 
321*cdf0e10cSrcweir // ----------------------------------------------------------------------------
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir PivotTableField::PivotTableField( PivotTable& rPivotTable, sal_Int32 nFieldIndex ) :
324*cdf0e10cSrcweir     WorkbookHelper( rPivotTable ),
325*cdf0e10cSrcweir     mrPivotTable( rPivotTable ),
326*cdf0e10cSrcweir     mnFieldIndex( nFieldIndex )
327*cdf0e10cSrcweir {
328*cdf0e10cSrcweir }
329*cdf0e10cSrcweir 
330*cdf0e10cSrcweir void PivotTableField::importPivotField( const AttributeList& rAttribs )
331*cdf0e10cSrcweir {
332*cdf0e10cSrcweir     /*  The documentation mentions a value 'axisValues' for the attribute
333*cdf0e10cSrcweir         'pivotField@axis'. But this value is not used to mark a data field, as
334*cdf0e10cSrcweir         data fields may be inserted in one of the row/column/page dimensions at
335*cdf0e10cSrcweir         the same time. Therefore, the boolean attribute 'pivotField@dataField'
336*cdf0e10cSrcweir         is really used to mark data fields. */
337*cdf0e10cSrcweir     maModel.mnAxis            = rAttribs.getToken( XML_axis, XML_TOKEN_INVALID );
338*cdf0e10cSrcweir     maModel.mnNumFmtId        = rAttribs.getInteger( XML_numFmtId, 0 );
339*cdf0e10cSrcweir     maModel.mnAutoShowItems   = rAttribs.getInteger( XML_itemPageCount, 10 );
340*cdf0e10cSrcweir     maModel.mnAutoShowRankBy  = rAttribs.getInteger( XML_rankBy, -1 );
341*cdf0e10cSrcweir     maModel.mnSortType        = rAttribs.getToken( XML_sortType, XML_manual );
342*cdf0e10cSrcweir     maModel.mbDataField       = rAttribs.getBool( XML_dataField, false );
343*cdf0e10cSrcweir     maModel.mbDefaultSubtotal = rAttribs.getBool( XML_defaultSubtotal, true );
344*cdf0e10cSrcweir     maModel.mbSumSubtotal     = rAttribs.getBool( XML_sumSubtotal, false );
345*cdf0e10cSrcweir     maModel.mbCountASubtotal  = rAttribs.getBool( XML_countASubtotal, false );
346*cdf0e10cSrcweir     maModel.mbAverageSubtotal = rAttribs.getBool( XML_avgSubtotal, false );
347*cdf0e10cSrcweir     maModel.mbMaxSubtotal     = rAttribs.getBool( XML_maxSubtotal, false );
348*cdf0e10cSrcweir     maModel.mbMinSubtotal     = rAttribs.getBool( XML_minSubtotal, false );
349*cdf0e10cSrcweir     maModel.mbProductSubtotal = rAttribs.getBool( XML_productSubtotal, false );
350*cdf0e10cSrcweir     maModel.mbCountSubtotal   = rAttribs.getBool( XML_countSubtotal, false );
351*cdf0e10cSrcweir     maModel.mbStdDevSubtotal  = rAttribs.getBool( XML_stdDevSubtotal, false );
352*cdf0e10cSrcweir     maModel.mbStdDevPSubtotal = rAttribs.getBool( XML_stdDevPSubtotal, false );
353*cdf0e10cSrcweir     maModel.mbVarSubtotal     = rAttribs.getBool( XML_varSubtotal, false );
354*cdf0e10cSrcweir     maModel.mbVarPSubtotal    = rAttribs.getBool( XML_varPSubtotal, false );
355*cdf0e10cSrcweir     maModel.mbShowAll         = rAttribs.getBool( XML_showAll, true );
356*cdf0e10cSrcweir     maModel.mbOutline         = rAttribs.getBool( XML_outline, true );
357*cdf0e10cSrcweir     maModel.mbSubtotalTop     = rAttribs.getBool( XML_subtotalTop, true );
358*cdf0e10cSrcweir     maModel.mbInsertBlankRow  = rAttribs.getBool( XML_insertBlankRow, false );
359*cdf0e10cSrcweir     maModel.mbInsertPageBreak = rAttribs.getBool( XML_insertPageBreak, false );
360*cdf0e10cSrcweir     maModel.mbAutoShow        = rAttribs.getBool( XML_autoShow, false );
361*cdf0e10cSrcweir     maModel.mbTopAutoShow     = rAttribs.getBool( XML_topAutoShow, true );
362*cdf0e10cSrcweir     maModel.mbMultiPageItems  = rAttribs.getBool( XML_multipleItemSelectionAllowed, false );
363*cdf0e10cSrcweir }
364*cdf0e10cSrcweir 
365*cdf0e10cSrcweir void PivotTableField::importItem( const AttributeList& rAttribs )
366*cdf0e10cSrcweir {
367*cdf0e10cSrcweir     PTFieldItemModel aModel;
368*cdf0e10cSrcweir     aModel.mnCacheItem   = rAttribs.getInteger( XML_x, -1 );
369*cdf0e10cSrcweir     aModel.mnType        = rAttribs.getToken( XML_t, XML_data );
370*cdf0e10cSrcweir     aModel.mbShowDetails = rAttribs.getBool( XML_sd, true );
371*cdf0e10cSrcweir     aModel.mbHidden      = rAttribs.getBool( XML_h, false );
372*cdf0e10cSrcweir     maItems.push_back( aModel );
373*cdf0e10cSrcweir }
374*cdf0e10cSrcweir 
375*cdf0e10cSrcweir void PivotTableField::importReference( const AttributeList& rAttribs )
376*cdf0e10cSrcweir {
377*cdf0e10cSrcweir     // field index is stored as unsigned integer
378*cdf0e10cSrcweir     maModel.mnSortRefField = static_cast< sal_Int32 >( rAttribs.getUnsigned( XML_field, SAL_MAX_UINT32 ) );
379*cdf0e10cSrcweir }
380*cdf0e10cSrcweir 
381*cdf0e10cSrcweir void PivotTableField::importReferenceItem( const AttributeList& rAttribs )
382*cdf0e10cSrcweir {
383*cdf0e10cSrcweir     maModel.mnSortRefItem = rAttribs.getInteger( XML_v, -1 );
384*cdf0e10cSrcweir }
385*cdf0e10cSrcweir 
386*cdf0e10cSrcweir void PivotTableField::importPTField( SequenceInputStream& rStrm )
387*cdf0e10cSrcweir {
388*cdf0e10cSrcweir     sal_uInt32 nFlags1, nFlags2;
389*cdf0e10cSrcweir     rStrm >> nFlags1 >> maModel.mnNumFmtId >> nFlags2 >> maModel.mnAutoShowItems >> maModel.mnAutoShowRankBy;
390*cdf0e10cSrcweir 
391*cdf0e10cSrcweir     maModel.setBiffAxis( extractValue< sal_uInt8 >( nFlags1, 0, 3 ) );
392*cdf0e10cSrcweir     maModel.mbDataField       = getFlag( nFlags1, BIFF12_PTFIELD_DATAFIELD );
393*cdf0e10cSrcweir     maModel.mbDefaultSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_DEFAULT );
394*cdf0e10cSrcweir     maModel.mbSumSubtotal     = getFlag( nFlags1, BIFF12_PTFIELD_SUM );
395*cdf0e10cSrcweir     maModel.mbCountASubtotal  = getFlag( nFlags1, BIFF12_PTFIELD_COUNTA );
396*cdf0e10cSrcweir     maModel.mbAverageSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_AVERAGE );
397*cdf0e10cSrcweir     maModel.mbMaxSubtotal     = getFlag( nFlags1, BIFF12_PTFIELD_MAX );
398*cdf0e10cSrcweir     maModel.mbMinSubtotal     = getFlag( nFlags1, BIFF12_PTFIELD_MIN );
399*cdf0e10cSrcweir     maModel.mbProductSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_PRODUCT );
400*cdf0e10cSrcweir     maModel.mbCountSubtotal   = getFlag( nFlags1, BIFF12_PTFIELD_COUNT );
401*cdf0e10cSrcweir     maModel.mbStdDevSubtotal  = getFlag( nFlags1, BIFF12_PTFIELD_STDDEV );
402*cdf0e10cSrcweir     maModel.mbStdDevPSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_STDDEVP );
403*cdf0e10cSrcweir     maModel.mbVarSubtotal     = getFlag( nFlags1, BIFF12_PTFIELD_VAR );
404*cdf0e10cSrcweir     maModel.mbVarPSubtotal    = getFlag( nFlags1, BIFF12_PTFIELD_VARP );
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir     maModel.mbShowAll         = getFlag( nFlags2, BIFF12_PTFIELD_SHOWALL );
407*cdf0e10cSrcweir     maModel.mbOutline         = getFlag( nFlags2, BIFF12_PTFIELD_OUTLINE );
408*cdf0e10cSrcweir     maModel.mbSubtotalTop     = getFlag( nFlags2, BIFF12_PTFIELD_SUBTOTALTOP );
409*cdf0e10cSrcweir     maModel.mbInsertBlankRow  = getFlag( nFlags2, BIFF12_PTFIELD_INSERTBLANKROW );
410*cdf0e10cSrcweir     maModel.mbInsertPageBreak = getFlag( nFlags2, BIFF12_PTFIELD_INSERTPAGEBREAK );
411*cdf0e10cSrcweir     maModel.mbAutoShow        = getFlag( nFlags2, BIFF12_PTFIELD_AUTOSHOW );
412*cdf0e10cSrcweir     maModel.mbTopAutoShow     = getFlag( nFlags2, BIFF12_PTFIELD_AUTOSHOWTOP );
413*cdf0e10cSrcweir     maModel.mbMultiPageItems  = getFlag( nFlags2, BIFF12_PTFIELD_MULTIPAGEITEMS );
414*cdf0e10cSrcweir 
415*cdf0e10cSrcweir     bool bAutoSort = getFlag( nFlags2, BIFF12_PTFIELD_AUTOSORT );
416*cdf0e10cSrcweir     bool bAscending = getFlag( nFlags2, BIFF12_PTFIELD_SORTASCENDING );
417*cdf0e10cSrcweir     maModel.mnSortType = bAutoSort ? (bAscending ? XML_ascending : XML_descending) : XML_manual;
418*cdf0e10cSrcweir }
419*cdf0e10cSrcweir 
420*cdf0e10cSrcweir void PivotTableField::importPTFItem( SequenceInputStream& rStrm )
421*cdf0e10cSrcweir {
422*cdf0e10cSrcweir     PTFieldItemModel aModel;
423*cdf0e10cSrcweir     sal_uInt8 nType;
424*cdf0e10cSrcweir     sal_uInt16 nFlags;
425*cdf0e10cSrcweir     rStrm >> nType >> nFlags >> aModel.mnCacheItem;
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir     aModel.setBiffType( nType );
428*cdf0e10cSrcweir     aModel.mbShowDetails = !getFlag( nFlags, BIFF12_PTFITEM_HIDEDETAILS );
429*cdf0e10cSrcweir     aModel.mbHidden      = getFlag( nFlags, BIFF12_PTFITEM_HIDDEN );
430*cdf0e10cSrcweir 
431*cdf0e10cSrcweir     maItems.push_back( aModel );
432*cdf0e10cSrcweir }
433*cdf0e10cSrcweir 
434*cdf0e10cSrcweir void PivotTableField::importPTReference( SequenceInputStream& rStrm )
435*cdf0e10cSrcweir {
436*cdf0e10cSrcweir     rStrm >> maModel.mnSortRefField;
437*cdf0e10cSrcweir }
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir void PivotTableField::importPTReferenceItem( SequenceInputStream& rStrm )
440*cdf0e10cSrcweir {
441*cdf0e10cSrcweir     rStrm >> maModel.mnSortRefItem;
442*cdf0e10cSrcweir }
443*cdf0e10cSrcweir 
444*cdf0e10cSrcweir void PivotTableField::importPTField( BiffInputStream& rStrm )
445*cdf0e10cSrcweir {
446*cdf0e10cSrcweir     sal_uInt16 nAxis, nSubtCount, nSubtotals;
447*cdf0e10cSrcweir     rStrm >> nAxis >> nSubtCount >> nSubtotals;
448*cdf0e10cSrcweir     rStrm.skip( 2 );    // item count
449*cdf0e10cSrcweir 
450*cdf0e10cSrcweir     maModel.setBiffAxis( extractValue< sal_uInt8 >( nAxis, 0, 3 ) );
451*cdf0e10cSrcweir     maModel.mbDataField       = getFlag( nAxis, BIFF_PTFIELD_DATAFIELD );
452*cdf0e10cSrcweir 
453*cdf0e10cSrcweir     maModel.mbDefaultSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_DEFAULT );
454*cdf0e10cSrcweir     maModel.mbSumSubtotal     = getFlag( nSubtotals, BIFF_PTFIELD_SUM );
455*cdf0e10cSrcweir     maModel.mbCountASubtotal  = getFlag( nSubtotals, BIFF_PTFIELD_COUNTA );
456*cdf0e10cSrcweir     maModel.mbAverageSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_AVERAGE );
457*cdf0e10cSrcweir     maModel.mbMaxSubtotal     = getFlag( nSubtotals, BIFF_PTFIELD_MAX );
458*cdf0e10cSrcweir     maModel.mbMinSubtotal     = getFlag( nSubtotals, BIFF_PTFIELD_MIN );
459*cdf0e10cSrcweir     maModel.mbProductSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_PRODUCT );
460*cdf0e10cSrcweir     maModel.mbCountSubtotal   = getFlag( nSubtotals, BIFF_PTFIELD_COUNT );
461*cdf0e10cSrcweir     maModel.mbStdDevSubtotal  = getFlag( nSubtotals, BIFF_PTFIELD_STDDEV );
462*cdf0e10cSrcweir     maModel.mbStdDevPSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_STDDEVP );
463*cdf0e10cSrcweir     maModel.mbVarSubtotal     = getFlag( nSubtotals, BIFF_PTFIELD_VAR );
464*cdf0e10cSrcweir     maModel.mbVarPSubtotal    = getFlag( nSubtotals, BIFF_PTFIELD_VARP );
465*cdf0e10cSrcweir 
466*cdf0e10cSrcweir     // set different defaults for BIFF
467*cdf0e10cSrcweir     maModel.mbShowAll = maModel.mbOutline = maModel.mbSubtotalTop = false;
468*cdf0e10cSrcweir 
469*cdf0e10cSrcweir     // read following items
470*cdf0e10cSrcweir     while( (rStrm.getNextRecId() == BIFF_ID_PTFITEM) && rStrm.startNextRecord() )
471*cdf0e10cSrcweir         importPTFItem( rStrm );
472*cdf0e10cSrcweir 
473*cdf0e10cSrcweir     // read following PTFIELD2 record with additional field settings
474*cdf0e10cSrcweir     if( (getBiff() == BIFF8) && (rStrm.getNextRecId() == BIFF_ID_PTFIELD2) && rStrm.startNextRecord() )
475*cdf0e10cSrcweir         importPTField2( rStrm );
476*cdf0e10cSrcweir }
477*cdf0e10cSrcweir 
478*cdf0e10cSrcweir void PivotTableField::importPTField2( BiffInputStream& rStrm )
479*cdf0e10cSrcweir {
480*cdf0e10cSrcweir     sal_uInt32 nFlags;
481*cdf0e10cSrcweir     rStrm >> nFlags;
482*cdf0e10cSrcweir     maModel.mnSortRefItem    = rStrm.readInt16();
483*cdf0e10cSrcweir     maModel.mnAutoShowRankBy = rStrm.readInt16();
484*cdf0e10cSrcweir     maModel.mnNumFmtId       = rStrm.readuInt16();
485*cdf0e10cSrcweir 
486*cdf0e10cSrcweir     maModel.mnAutoShowItems   = extractValue< sal_Int32 >( nFlags, 24, 8 );
487*cdf0e10cSrcweir     maModel.mbShowAll         = getFlag( nFlags, BIFF_PTFIELD2_SHOWALL );
488*cdf0e10cSrcweir     maModel.mbOutline         = getFlag( nFlags, BIFF_PTFIELD2_OUTLINE );
489*cdf0e10cSrcweir     maModel.mbSubtotalTop     = getFlag( nFlags, BIFF_PTFIELD2_SUBTOTALTOP );
490*cdf0e10cSrcweir     maModel.mbInsertBlankRow  = getFlag( nFlags, BIFF_PTFIELD2_INSERTBLANKROW );
491*cdf0e10cSrcweir     maModel.mbAutoShow        = getFlag( nFlags, BIFF_PTFIELD2_AUTOSHOW );
492*cdf0e10cSrcweir     maModel.mbTopAutoShow     = getFlag( nFlags, BIFF_PTFIELD2_AUTOSHOWTOP );
493*cdf0e10cSrcweir 
494*cdf0e10cSrcweir     bool bAutoSort = getFlag( nFlags, BIFF_PTFIELD2_AUTOSORT );
495*cdf0e10cSrcweir     bool bAscending = getFlag( nFlags, BIFF_PTFIELD2_SORTASCENDING );
496*cdf0e10cSrcweir     maModel.mnSortType = bAutoSort ? (bAscending ? XML_ascending : XML_descending) : XML_manual;
497*cdf0e10cSrcweir     // mnSortRefField == OOX_PT_DATALAYOUTFIELD will indicate sorting by data field
498*cdf0e10cSrcweir     if( maModel.mnSortRefItem >= 0 )
499*cdf0e10cSrcweir         maModel.mnSortRefField = OOX_PT_DATALAYOUTFIELD;
500*cdf0e10cSrcweir }
501*cdf0e10cSrcweir 
502*cdf0e10cSrcweir void PivotTableField::importPTFItem( BiffInputStream& rStrm )
503*cdf0e10cSrcweir {
504*cdf0e10cSrcweir     PTFieldItemModel aModel;
505*cdf0e10cSrcweir     sal_uInt16 nType, nFlags;
506*cdf0e10cSrcweir     sal_Int16 nCacheItem;
507*cdf0e10cSrcweir     rStrm >> nType >> nFlags >> nCacheItem;
508*cdf0e10cSrcweir 
509*cdf0e10cSrcweir     aModel.setBiffType( nType );
510*cdf0e10cSrcweir     aModel.mnCacheItem = nCacheItem;
511*cdf0e10cSrcweir     aModel.mbShowDetails = !getFlag( nFlags, BIFF_PTFITEM_HIDEDETAILS );
512*cdf0e10cSrcweir     aModel.mbHidden      = getFlag( nFlags, BIFF_PTFITEM_HIDDEN );
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir     maItems.push_back( aModel );
515*cdf0e10cSrcweir }
516*cdf0e10cSrcweir 
517*cdf0e10cSrcweir void PivotTableField::finalizeImport( const Reference< XDataPilotDescriptor >& rxDPDesc )
518*cdf0e10cSrcweir {
519*cdf0e10cSrcweir     /*  Process all fields based on source data, other fields (e.g. group
520*cdf0e10cSrcweir         fields) are processed from here. PivotCacahe::getDatabaseIndex()
521*cdf0e10cSrcweir         returns -1 for all fields not based on source data. */
522*cdf0e10cSrcweir     Reference< XDataPilotField > xDPField;
523*cdf0e10cSrcweir     sal_Int32 nDatabaseIdx = mrPivotTable.getCacheDatabaseIndex( mnFieldIndex );
524*cdf0e10cSrcweir     if( (nDatabaseIdx >= 0) && rxDPDesc.is() ) try
525*cdf0e10cSrcweir     {
526*cdf0e10cSrcweir         // try to get the source field and its name from passed DataPilot descriptor
527*cdf0e10cSrcweir         Reference< XIndexAccess > xDPFieldsIA( rxDPDesc->getDataPilotFields(), UNO_SET_THROW );
528*cdf0e10cSrcweir         xDPField.set( xDPFieldsIA->getByIndex( nDatabaseIdx ), UNO_QUERY_THROW );
529*cdf0e10cSrcweir         Reference< XNamed > xDPFieldName( xDPField, UNO_QUERY_THROW );
530*cdf0e10cSrcweir         maDPFieldName = xDPFieldName->getName();
531*cdf0e10cSrcweir         OSL_ENSURE( maDPFieldName.getLength() > 0, "PivotTableField::finalizeImport - no field name in source data found" );
532*cdf0e10cSrcweir 
533*cdf0e10cSrcweir         // try to convert grouping settings
534*cdf0e10cSrcweir         if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) )
535*cdf0e10cSrcweir         {
536*cdf0e10cSrcweir             // numeric grouping is done inplace, no nested group fields will appear
537*cdf0e10cSrcweir             if( pCacheField->hasNumericGrouping() )
538*cdf0e10cSrcweir             {
539*cdf0e10cSrcweir                 pCacheField->convertNumericGrouping( xDPField );
540*cdf0e10cSrcweir             }
541*cdf0e10cSrcweir             else if( pCacheField->hasDateGrouping() )
542*cdf0e10cSrcweir             {
543*cdf0e10cSrcweir                 // first date group settings are inplace
544*cdf0e10cSrcweir                 pCacheField->createDateGroupField( xDPField );
545*cdf0e10cSrcweir                 // create all nested group fields (if any)
546*cdf0e10cSrcweir                 mrPivotTable.finalizeDateGroupingImport( xDPField, mnFieldIndex );
547*cdf0e10cSrcweir             }
548*cdf0e10cSrcweir             else if( pCacheField->hasParentGrouping() )
549*cdf0e10cSrcweir             {
550*cdf0e10cSrcweir                 // create a list of all item names, needed to map between original and group items
551*cdf0e10cSrcweir                 ::std::vector< OUString > aItems;
552*cdf0e10cSrcweir                 pCacheField->getCacheItemNames( aItems );
553*cdf0e10cSrcweir                 PivotCacheGroupItemVector aItemNames;
554*cdf0e10cSrcweir                 for( ::std::vector< OUString >::iterator aIt = aItems.begin(), aEnd = aItems.end(); aIt != aEnd; ++aIt )
555*cdf0e10cSrcweir                     aItemNames.push_back( PivotCacheGroupItem( *aIt ) );
556*cdf0e10cSrcweir                 // create all nested group fields (if any)
557*cdf0e10cSrcweir                 mrPivotTable.finalizeParentGroupingImport( xDPField, *pCacheField, aItemNames );
558*cdf0e10cSrcweir             }
559*cdf0e10cSrcweir         }
560*cdf0e10cSrcweir     }
561*cdf0e10cSrcweir     catch( Exception& )
562*cdf0e10cSrcweir     {
563*cdf0e10cSrcweir     }
564*cdf0e10cSrcweir }
565*cdf0e10cSrcweir 
566*cdf0e10cSrcweir void PivotTableField::finalizeDateGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, sal_Int32 nBaseFieldIdx )
567*cdf0e10cSrcweir {
568*cdf0e10cSrcweir     if( maDPFieldName.getLength() == 0 )    // prevent endless loops if file format is broken
569*cdf0e10cSrcweir     {
570*cdf0e10cSrcweir         if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) )
571*cdf0e10cSrcweir         {
572*cdf0e10cSrcweir             if( !pCacheField->isDatabaseField() && pCacheField->hasDateGrouping() && (pCacheField->getGroupBaseField() == nBaseFieldIdx) )
573*cdf0e10cSrcweir             {
574*cdf0e10cSrcweir                 maDPFieldName = pCacheField->createDateGroupField( rxBaseDPField );
575*cdf0e10cSrcweir                 OSL_ENSURE( maDPFieldName.getLength() > 0, "PivotTableField::finalizeDateGroupingImport - cannot create date group field" );
576*cdf0e10cSrcweir             }
577*cdf0e10cSrcweir         }
578*cdf0e10cSrcweir     }
579*cdf0e10cSrcweir }
580*cdf0e10cSrcweir 
581*cdf0e10cSrcweir void PivotTableField::finalizeParentGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, PivotCacheGroupItemVector& orItemNames )
582*cdf0e10cSrcweir {
583*cdf0e10cSrcweir     if( maDPFieldName.getLength() == 0 )    // prevent endless loops if file format is broken
584*cdf0e10cSrcweir     {
585*cdf0e10cSrcweir         if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) )
586*cdf0e10cSrcweir         {
587*cdf0e10cSrcweir             maDPFieldName = pCacheField->createParentGroupField( rxBaseDPField, orItemNames );
588*cdf0e10cSrcweir             // on success, try to create nested group fields
589*cdf0e10cSrcweir             Reference< XDataPilotField > xDPField = mrPivotTable.getDataPilotField( maDPFieldName );
590*cdf0e10cSrcweir             if( xDPField.is() )
591*cdf0e10cSrcweir                 mrPivotTable.finalizeParentGroupingImport( xDPField, *pCacheField, orItemNames );
592*cdf0e10cSrcweir         }
593*cdf0e10cSrcweir     }
594*cdf0e10cSrcweir }
595*cdf0e10cSrcweir 
596*cdf0e10cSrcweir void PivotTableField::convertRowField()
597*cdf0e10cSrcweir {
598*cdf0e10cSrcweir     convertRowColPageField( XML_axisRow );
599*cdf0e10cSrcweir }
600*cdf0e10cSrcweir 
601*cdf0e10cSrcweir void PivotTableField::convertColField()
602*cdf0e10cSrcweir {
603*cdf0e10cSrcweir     convertRowColPageField( XML_axisCol );
604*cdf0e10cSrcweir }
605*cdf0e10cSrcweir 
606*cdf0e10cSrcweir void PivotTableField::convertHiddenField()
607*cdf0e10cSrcweir {
608*cdf0e10cSrcweir     convertRowColPageField( XML_TOKEN_INVALID );
609*cdf0e10cSrcweir }
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir void PivotTableField::convertPageField( const PTPageFieldModel& rPageField )
612*cdf0e10cSrcweir {
613*cdf0e10cSrcweir     OSL_ENSURE( rPageField.mnField == mnFieldIndex, "PivotTableField::convertPageField - wrong field index" );
614*cdf0e10cSrcweir     // convert all settings common for row/column/page fields
615*cdf0e10cSrcweir     Reference< XDataPilotField > xDPField = convertRowColPageField( XML_axisPage );
616*cdf0e10cSrcweir 
617*cdf0e10cSrcweir     if( xDPField.is() )
618*cdf0e10cSrcweir     {
619*cdf0e10cSrcweir         PropertySet aPropSet( xDPField );
620*cdf0e10cSrcweir         using namespace ::com::sun::star::sheet;
621*cdf0e10cSrcweir 
622*cdf0e10cSrcweir         // find cache item used as 'selected page'
623*cdf0e10cSrcweir         sal_Int32 nCacheItem = -1;
624*cdf0e10cSrcweir         if( maModel.mbMultiPageItems )
625*cdf0e10cSrcweir         {
626*cdf0e10cSrcweir             // multiple items may be selected
627*cdf0e10cSrcweir             OSL_ENSURE( rPageField.mnItem == BIFF12_PTPAGEFIELD_MULTIITEMS, "PivotTableField::convertPageField - unexpected cache item index" );
628*cdf0e10cSrcweir             // try to find a single visible item
629*cdf0e10cSrcweir             bool bHasMultiItems = false;
630*cdf0e10cSrcweir             for( ItemModelVector::iterator aIt = maItems.begin(), aEnd = maItems.end(); (aIt != aEnd) && !bHasMultiItems; ++aIt )
631*cdf0e10cSrcweir             {
632*cdf0e10cSrcweir                 if( (aIt->mnType == XML_data) && !aIt->mbHidden )
633*cdf0e10cSrcweir                 {
634*cdf0e10cSrcweir                     bHasMultiItems = nCacheItem >= 0;
635*cdf0e10cSrcweir                     nCacheItem = bHasMultiItems ? -1 : aIt->mnCacheItem;
636*cdf0e10cSrcweir                 }
637*cdf0e10cSrcweir             }
638*cdf0e10cSrcweir         }
639*cdf0e10cSrcweir         else
640*cdf0e10cSrcweir         {
641*cdf0e10cSrcweir             // single item may be selected
642*cdf0e10cSrcweir             if( (0 <= rPageField.mnItem) && (rPageField.mnItem < static_cast< sal_Int32 >( maItems.size() )) )
643*cdf0e10cSrcweir                 nCacheItem = maItems[ rPageField.mnItem ].mnCacheItem;
644*cdf0e10cSrcweir         }
645*cdf0e10cSrcweir 
646*cdf0e10cSrcweir         if( nCacheItem >= 0 )
647*cdf0e10cSrcweir         {
648*cdf0e10cSrcweir             if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) )
649*cdf0e10cSrcweir             {
650*cdf0e10cSrcweir                 if( const PivotCacheItem* pSharedItem = pCacheField->getCacheItem( nCacheItem ) )
651*cdf0e10cSrcweir                 {
652*cdf0e10cSrcweir                     OUString aSelectedPage = pSharedItem->getName();
653*cdf0e10cSrcweir                     if( aSelectedPage.getLength() > 0 )
654*cdf0e10cSrcweir                         aPropSet.setProperty( PROP_SelectedPage, aSelectedPage );
655*cdf0e10cSrcweir                 }
656*cdf0e10cSrcweir             }
657*cdf0e10cSrcweir         }
658*cdf0e10cSrcweir     }
659*cdf0e10cSrcweir }
660*cdf0e10cSrcweir 
661*cdf0e10cSrcweir void PivotTableField::convertDataField( const PTDataFieldModel& rDataField )
662*cdf0e10cSrcweir {
663*cdf0e10cSrcweir     OSL_ENSURE( rDataField.mnField == mnFieldIndex, "PivotTableField::convertDataField - wrong field index" );
664*cdf0e10cSrcweir     OSL_ENSURE( maModel.mbDataField, "PivotTableField::convertDataField - not a data field" );
665*cdf0e10cSrcweir     Reference< XDataPilotField > xDPField = mrPivotTable.getDataPilotField( maDPFieldName );
666*cdf0e10cSrcweir     if( xDPField.is() )
667*cdf0e10cSrcweir     {
668*cdf0e10cSrcweir         PropertySet aPropSet( xDPField );
669*cdf0e10cSrcweir         using namespace ::com::sun::star::sheet;
670*cdf0e10cSrcweir 
671*cdf0e10cSrcweir         // field orientation
672*cdf0e10cSrcweir         aPropSet.setProperty( PROP_Orientation, DataPilotFieldOrientation_DATA );
673*cdf0e10cSrcweir 
674*cdf0e10cSrcweir         /*  Field aggregation function. Documentation is a little bit confused
675*cdf0e10cSrcweir             about which names to use for the count functions. The name 'count'
676*cdf0e10cSrcweir             means 'count all', and 'countNum' means 'count numbers'. On the
677*cdf0e10cSrcweir             other hand, for subtotals, 'countA' means 'count all', and 'count'
678*cdf0e10cSrcweir             means 'count numbers' (see above). */
679*cdf0e10cSrcweir         GeneralFunction eAggFunc = GeneralFunction_SUM;
680*cdf0e10cSrcweir         switch( rDataField.mnSubtotal )
681*cdf0e10cSrcweir         {
682*cdf0e10cSrcweir             case XML_sum:       eAggFunc = GeneralFunction_SUM;         break;
683*cdf0e10cSrcweir             case XML_count:     eAggFunc = GeneralFunction_COUNT;       break;
684*cdf0e10cSrcweir             case XML_average:   eAggFunc = GeneralFunction_AVERAGE;     break;
685*cdf0e10cSrcweir             case XML_max:       eAggFunc = GeneralFunction_MAX;         break;
686*cdf0e10cSrcweir             case XML_min:       eAggFunc = GeneralFunction_MIN;         break;
687*cdf0e10cSrcweir             case XML_product:   eAggFunc = GeneralFunction_PRODUCT;     break;
688*cdf0e10cSrcweir             case XML_countNums: eAggFunc = GeneralFunction_COUNTNUMS;   break;
689*cdf0e10cSrcweir             case XML_stdDev:    eAggFunc = GeneralFunction_STDEV;       break;
690*cdf0e10cSrcweir             case XML_stdDevp:   eAggFunc = GeneralFunction_STDEVP;      break;
691*cdf0e10cSrcweir             case XML_var:       eAggFunc = GeneralFunction_VAR;         break;
692*cdf0e10cSrcweir             case XML_varp:      eAggFunc = GeneralFunction_VARP;        break;
693*cdf0e10cSrcweir             default:            OSL_ENSURE( false, "PivotTableField::convertDataField - unknown aggregation function" );
694*cdf0e10cSrcweir         }
695*cdf0e10cSrcweir         aPropSet.setProperty( PROP_Function, eAggFunc );
696*cdf0e10cSrcweir 
697*cdf0e10cSrcweir         // field reference ('show data as')
698*cdf0e10cSrcweir         DataPilotFieldReference aReference;
699*cdf0e10cSrcweir         aReference.ReferenceType = DataPilotFieldReferenceType::NONE;
700*cdf0e10cSrcweir         switch( rDataField.mnShowDataAs )
701*cdf0e10cSrcweir         {
702*cdf0e10cSrcweir             case XML_difference:        aReference.ReferenceType = DataPilotFieldReferenceType::ITEM_DIFFERENCE;            break;
703*cdf0e10cSrcweir             case XML_percent:           aReference.ReferenceType = DataPilotFieldReferenceType::ITEM_PERCENTAGE;            break;
704*cdf0e10cSrcweir             case XML_percentDiff:       aReference.ReferenceType = DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE; break;
705*cdf0e10cSrcweir             case XML_runTotal:          aReference.ReferenceType = DataPilotFieldReferenceType::RUNNING_TOTAL;              break;
706*cdf0e10cSrcweir             case XML_percentOfRow:      aReference.ReferenceType = DataPilotFieldReferenceType::ROW_PERCENTAGE;             break;
707*cdf0e10cSrcweir             case XML_percentOfCol:      aReference.ReferenceType = DataPilotFieldReferenceType::COLUMN_PERCENTAGE;          break;
708*cdf0e10cSrcweir             case XML_percentOfTotal:    aReference.ReferenceType = DataPilotFieldReferenceType::TOTAL_PERCENTAGE;           break;
709*cdf0e10cSrcweir             case XML_index:             aReference.ReferenceType = DataPilotFieldReferenceType::INDEX;                      break;
710*cdf0e10cSrcweir         }
711*cdf0e10cSrcweir         if( aReference.ReferenceType != DataPilotFieldReferenceType::NONE )
712*cdf0e10cSrcweir         {
713*cdf0e10cSrcweir             if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( rDataField.mnBaseField ) )
714*cdf0e10cSrcweir             {
715*cdf0e10cSrcweir                 aReference.ReferenceField = pCacheField->getName();
716*cdf0e10cSrcweir                 switch( rDataField.mnBaseItem )
717*cdf0e10cSrcweir                 {
718*cdf0e10cSrcweir                     case OOX_PT_PREVIOUS_ITEM:
719*cdf0e10cSrcweir                         aReference.ReferenceItemType = DataPilotFieldReferenceItemType::PREVIOUS;
720*cdf0e10cSrcweir                     break;
721*cdf0e10cSrcweir                     case OOX_PT_NEXT_ITEM:
722*cdf0e10cSrcweir                         aReference.ReferenceItemType = DataPilotFieldReferenceItemType::NEXT;
723*cdf0e10cSrcweir                     break;
724*cdf0e10cSrcweir                     default:
725*cdf0e10cSrcweir                         aReference.ReferenceItemType = DataPilotFieldReferenceItemType::NAMED;
726*cdf0e10cSrcweir                         if( const PivotCacheItem* pCacheItem = pCacheField->getCacheItem( rDataField.mnBaseItem ) )
727*cdf0e10cSrcweir                             aReference.ReferenceItemName = pCacheItem->getName();
728*cdf0e10cSrcweir                 }
729*cdf0e10cSrcweir                 aPropSet.setProperty( PROP_Reference, aReference );
730*cdf0e10cSrcweir             }
731*cdf0e10cSrcweir         }
732*cdf0e10cSrcweir     }
733*cdf0e10cSrcweir }
734*cdf0e10cSrcweir 
735*cdf0e10cSrcweir // private --------------------------------------------------------------------
736*cdf0e10cSrcweir 
737*cdf0e10cSrcweir Reference< XDataPilotField > PivotTableField::convertRowColPageField( sal_Int32 nAxis )
738*cdf0e10cSrcweir {
739*cdf0e10cSrcweir     bool bDataLayout = mnFieldIndex == OOX_PT_DATALAYOUTFIELD;
740*cdf0e10cSrcweir     Reference< XDataPilotField > xDPField = bDataLayout ? mrPivotTable.getDataLayoutField() : mrPivotTable.getDataPilotField( maDPFieldName );
741*cdf0e10cSrcweir     OSL_ENSURE( bDataLayout || (nAxis == maModel.mnAxis), "PivotTableField::convertRowColPageField - field axis mismatch" );
742*cdf0e10cSrcweir 
743*cdf0e10cSrcweir     if( xDPField.is() )
744*cdf0e10cSrcweir     {
745*cdf0e10cSrcweir         PropertySet aPropSet( xDPField );
746*cdf0e10cSrcweir         using namespace ::com::sun::star::sheet;
747*cdf0e10cSrcweir 
748*cdf0e10cSrcweir         // field orientation
749*cdf0e10cSrcweir         DataPilotFieldOrientation eFieldOrient = DataPilotFieldOrientation_HIDDEN;
750*cdf0e10cSrcweir         switch( nAxis )
751*cdf0e10cSrcweir         {
752*cdf0e10cSrcweir             case XML_axisRow:   eFieldOrient = DataPilotFieldOrientation_ROW;       break;
753*cdf0e10cSrcweir             case XML_axisCol:   eFieldOrient = DataPilotFieldOrientation_COLUMN;    break;
754*cdf0e10cSrcweir             case XML_axisPage:  eFieldOrient = DataPilotFieldOrientation_PAGE;      break;
755*cdf0e10cSrcweir         }
756*cdf0e10cSrcweir         if( eFieldOrient != DataPilotFieldOrientation_HIDDEN )
757*cdf0e10cSrcweir             aPropSet.setProperty( PROP_Orientation, eFieldOrient );
758*cdf0e10cSrcweir 
759*cdf0e10cSrcweir         // all other settings not for the data layout field
760*cdf0e10cSrcweir         if( !bDataLayout )
761*cdf0e10cSrcweir         {
762*cdf0e10cSrcweir             /*  Field subtotal functions. Ignore the 'defaultSubtotal' flag, if
763*cdf0e10cSrcweir                 explicit functions are set. This is different behaviour between
764*cdf0e10cSrcweir                 XML (where 'defaultSubtotal' is set regardless of other
765*cdf0e10cSrcweir                 functions) and binary formats (where 'defaultSubtotal' is not
766*cdf0e10cSrcweir                 set if other functions are set). */
767*cdf0e10cSrcweir             ::std::vector< GeneralFunction > aSubtotals;
768*cdf0e10cSrcweir             /*  Order of subtotals is fixed in Excel. Documentation is a little
769*cdf0e10cSrcweir                 bit confused about which names to use for the count functions.
770*cdf0e10cSrcweir                 For subtotals, 'countA' means 'count all', and 'count' means
771*cdf0e10cSrcweir                 'count numbers'. On the other hand, for the data field
772*cdf0e10cSrcweir                 aggregation function, 'count' means 'count all', and 'countNum'
773*cdf0e10cSrcweir                 means 'count numbers' (see below). */
774*cdf0e10cSrcweir             if( maModel.mbSumSubtotal )     aSubtotals.push_back( GeneralFunction_SUM );
775*cdf0e10cSrcweir             if( maModel.mbCountASubtotal )  aSubtotals.push_back( GeneralFunction_COUNT );
776*cdf0e10cSrcweir             if( maModel.mbAverageSubtotal ) aSubtotals.push_back( GeneralFunction_AVERAGE );
777*cdf0e10cSrcweir             if( maModel.mbMaxSubtotal )     aSubtotals.push_back( GeneralFunction_MAX );
778*cdf0e10cSrcweir             if( maModel.mbMinSubtotal )     aSubtotals.push_back( GeneralFunction_MIN );
779*cdf0e10cSrcweir             if( maModel.mbProductSubtotal ) aSubtotals.push_back( GeneralFunction_PRODUCT );
780*cdf0e10cSrcweir             if( maModel.mbCountSubtotal )   aSubtotals.push_back( GeneralFunction_COUNTNUMS );
781*cdf0e10cSrcweir             if( maModel.mbStdDevSubtotal )  aSubtotals.push_back( GeneralFunction_STDEV );
782*cdf0e10cSrcweir             if( maModel.mbStdDevPSubtotal ) aSubtotals.push_back( GeneralFunction_STDEVP );
783*cdf0e10cSrcweir             if( maModel.mbVarSubtotal )     aSubtotals.push_back( GeneralFunction_VAR );
784*cdf0e10cSrcweir             if( maModel.mbVarPSubtotal )    aSubtotals.push_back( GeneralFunction_VARP );
785*cdf0e10cSrcweir             // if no function is set manually, check the 'defaultSubtotal' flag
786*cdf0e10cSrcweir             if( aSubtotals.empty() && maModel.mbDefaultSubtotal )
787*cdf0e10cSrcweir                 aSubtotals.push_back( GeneralFunction_AUTO );
788*cdf0e10cSrcweir             aPropSet.setProperty( PROP_Subtotals, ContainerHelper::vectorToSequence( aSubtotals ) );
789*cdf0e10cSrcweir 
790*cdf0e10cSrcweir             // layout settings
791*cdf0e10cSrcweir             DataPilotFieldLayoutInfo aLayoutInfo;
792*cdf0e10cSrcweir             aLayoutInfo.LayoutMode = maModel.mbOutline ?
793*cdf0e10cSrcweir                 (maModel.mbSubtotalTop ? DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP : DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM) :
794*cdf0e10cSrcweir                 DataPilotFieldLayoutMode::TABULAR_LAYOUT;
795*cdf0e10cSrcweir             aLayoutInfo.AddEmptyLines = maModel.mbInsertBlankRow;
796*cdf0e10cSrcweir             aPropSet.setProperty( PROP_LayoutInfo, aLayoutInfo );
797*cdf0e10cSrcweir             aPropSet.setProperty( PROP_ShowEmpty, maModel.mbShowAll );
798*cdf0e10cSrcweir 
799*cdf0e10cSrcweir             // auto show (OOXML/BIFF12 only)
800*cdf0e10cSrcweir             if( maModel.mbAutoShow )
801*cdf0e10cSrcweir             {
802*cdf0e10cSrcweir                 DataPilotFieldAutoShowInfo aAutoShowInfo;
803*cdf0e10cSrcweir                 aAutoShowInfo.IsEnabled = sal_True;
804*cdf0e10cSrcweir                 aAutoShowInfo.ShowItemsMode = maModel.mbTopAutoShow ? DataPilotFieldShowItemsMode::FROM_TOP : DataPilotFieldShowItemsMode::FROM_BOTTOM;
805*cdf0e10cSrcweir                 aAutoShowInfo.ItemCount = maModel.mnAutoShowItems;
806*cdf0e10cSrcweir                 if( const PivotCacheField* pCacheField = mrPivotTable.getCacheFieldOfDataField( maModel.mnAutoShowRankBy ) )
807*cdf0e10cSrcweir                     aAutoShowInfo.DataField = pCacheField->getName();
808*cdf0e10cSrcweir                 aPropSet.setProperty( PROP_AutoShowInfo, aAutoShowInfo );
809*cdf0e10cSrcweir             }
810*cdf0e10cSrcweir 
811*cdf0e10cSrcweir             // auto sort
812*cdf0e10cSrcweir             DataPilotFieldSortInfo aSortInfo;
813*cdf0e10cSrcweir             aSortInfo.IsAscending = maModel.mnSortType == XML_ascending;
814*cdf0e10cSrcweir             if( (maModel.mnSortType != XML_ascending) && (maModel.mnSortType != XML_descending) )
815*cdf0e10cSrcweir             {
816*cdf0e10cSrcweir                 aSortInfo.Mode = DataPilotFieldSortMode::MANUAL;
817*cdf0e10cSrcweir             }
818*cdf0e10cSrcweir             else
819*cdf0e10cSrcweir             {
820*cdf0e10cSrcweir                 const PivotCacheField* pCacheField = (maModel.mnSortRefField == OOX_PT_DATALAYOUTFIELD) ?
821*cdf0e10cSrcweir                     mrPivotTable.getCacheFieldOfDataField( maModel.mnSortRefItem ) : 0;
822*cdf0e10cSrcweir                 if( pCacheField )
823*cdf0e10cSrcweir                 {
824*cdf0e10cSrcweir                     aSortInfo.Mode = DataPilotFieldSortMode::DATA;
825*cdf0e10cSrcweir                     aSortInfo.Field = pCacheField->getName();
826*cdf0e10cSrcweir                 }
827*cdf0e10cSrcweir                 else
828*cdf0e10cSrcweir                 {
829*cdf0e10cSrcweir                     aSortInfo.Mode = DataPilotFieldSortMode::NAME;
830*cdf0e10cSrcweir                 }
831*cdf0e10cSrcweir             }
832*cdf0e10cSrcweir             aPropSet.setProperty( PROP_SortInfo, aSortInfo );
833*cdf0e10cSrcweir 
834*cdf0e10cSrcweir             // item settings
835*cdf0e10cSrcweir             if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) try
836*cdf0e10cSrcweir             {
837*cdf0e10cSrcweir                 Reference< XNameAccess > xDPItemsNA( xDPField->getItems(), UNO_QUERY_THROW );
838*cdf0e10cSrcweir                 for( ItemModelVector::iterator aIt = maItems.begin(), aEnd = maItems.end(); aIt != aEnd; ++aIt )
839*cdf0e10cSrcweir                 {
840*cdf0e10cSrcweir                     if( aIt->mnType == XML_data )
841*cdf0e10cSrcweir                     {
842*cdf0e10cSrcweir                         if( const PivotCacheItem* pSharedItem = pCacheField->getCacheItem( aIt->mnCacheItem ) ) try
843*cdf0e10cSrcweir                         {
844*cdf0e10cSrcweir                             PropertySet aItemProp( xDPItemsNA->getByName( pSharedItem->getName() ) );
845*cdf0e10cSrcweir                             aItemProp.setProperty( PROP_ShowDetail, aIt->mbShowDetails );
846*cdf0e10cSrcweir                             aItemProp.setProperty( PROP_IsHidden, aIt->mbHidden );
847*cdf0e10cSrcweir                         }
848*cdf0e10cSrcweir                         catch( Exception& )
849*cdf0e10cSrcweir                         {
850*cdf0e10cSrcweir                             // catch every failed container access to be able to process following items
851*cdf0e10cSrcweir                         }
852*cdf0e10cSrcweir                     }
853*cdf0e10cSrcweir                 }
854*cdf0e10cSrcweir             }
855*cdf0e10cSrcweir             catch( Exception& )
856*cdf0e10cSrcweir             {
857*cdf0e10cSrcweir             }
858*cdf0e10cSrcweir         }
859*cdf0e10cSrcweir     }
860*cdf0e10cSrcweir     return xDPField;
861*cdf0e10cSrcweir }
862*cdf0e10cSrcweir 
863*cdf0e10cSrcweir // ============================================================================
864*cdf0e10cSrcweir 
865*cdf0e10cSrcweir PTFilterModel::PTFilterModel() :
866*cdf0e10cSrcweir     mfValue( 0.0 ),
867*cdf0e10cSrcweir     mnField( -1 ),
868*cdf0e10cSrcweir     mnMemPropField( -1 ),
869*cdf0e10cSrcweir     mnType( XML_TOKEN_INVALID ),
870*cdf0e10cSrcweir     mnEvalOrder( 0 ),
871*cdf0e10cSrcweir     mnId( -1 ),
872*cdf0e10cSrcweir     mnMeasureField( -1 ),
873*cdf0e10cSrcweir     mnMeasureHier( -1 ),
874*cdf0e10cSrcweir     mbTopFilter( true )
875*cdf0e10cSrcweir {
876*cdf0e10cSrcweir }
877*cdf0e10cSrcweir 
878*cdf0e10cSrcweir // ----------------------------------------------------------------------------
879*cdf0e10cSrcweir 
880*cdf0e10cSrcweir PivotTableFilter::PivotTableFilter( const PivotTable& rPivotTable ) :
881*cdf0e10cSrcweir     WorkbookHelper( rPivotTable ),
882*cdf0e10cSrcweir     mrPivotTable( rPivotTable )
883*cdf0e10cSrcweir {
884*cdf0e10cSrcweir }
885*cdf0e10cSrcweir 
886*cdf0e10cSrcweir void PivotTableFilter::importFilter( const AttributeList& rAttribs )
887*cdf0e10cSrcweir {
888*cdf0e10cSrcweir     maModel.maName         = rAttribs.getXString( XML_name, OUString() );
889*cdf0e10cSrcweir     maModel.maDescription  = rAttribs.getXString( XML_description, OUString() );
890*cdf0e10cSrcweir     maModel.maStrValue1    = rAttribs.getXString( XML_stringValue1, OUString() );
891*cdf0e10cSrcweir     maModel.maStrValue2    = rAttribs.getXString( XML_stringValue2, OUString() );
892*cdf0e10cSrcweir     maModel.mnField        = rAttribs.getInteger( XML_fld, -1 );
893*cdf0e10cSrcweir     maModel.mnMemPropField = rAttribs.getInteger( XML_mpFld, -1 );
894*cdf0e10cSrcweir     maModel.mnType         = rAttribs.getToken( XML_type, XML_TOKEN_INVALID );
895*cdf0e10cSrcweir     maModel.mnEvalOrder    = rAttribs.getInteger( XML_evalOrder, 0 );
896*cdf0e10cSrcweir     maModel.mnId           = rAttribs.getInteger( XML_id, -1 );
897*cdf0e10cSrcweir     maModel.mnMeasureField = rAttribs.getInteger( XML_iMeasureFld, -1 );
898*cdf0e10cSrcweir     maModel.mnMeasureHier  = rAttribs.getInteger( XML_iMeasureHier, -1 );
899*cdf0e10cSrcweir }
900*cdf0e10cSrcweir 
901*cdf0e10cSrcweir void PivotTableFilter::importTop10( const AttributeList& rAttribs )
902*cdf0e10cSrcweir {
903*cdf0e10cSrcweir     OSL_ENSURE( rAttribs.getBool( XML_percent, false ) == (maModel.mnType == XML_percent),
904*cdf0e10cSrcweir         "PivotTableFilter::importTop10 - unexpected value of percent attribute" );
905*cdf0e10cSrcweir     maModel.mfValue     = rAttribs.getDouble( XML_val, 0.0 );
906*cdf0e10cSrcweir     maModel.mbTopFilter = rAttribs.getBool( XML_top, true );
907*cdf0e10cSrcweir }
908*cdf0e10cSrcweir 
909*cdf0e10cSrcweir void PivotTableFilter::importPTFilter( SequenceInputStream& rStrm )
910*cdf0e10cSrcweir {
911*cdf0e10cSrcweir     sal_Int32 nType;
912*cdf0e10cSrcweir     sal_uInt16 nFlags;
913*cdf0e10cSrcweir     rStrm >> maModel.mnField >> maModel.mnMemPropField >> nType;
914*cdf0e10cSrcweir     rStrm.skip( 4 );    // unused
915*cdf0e10cSrcweir     rStrm >> maModel.mnId >> maModel.mnMeasureField >> maModel.mnMeasureHier >> nFlags;
916*cdf0e10cSrcweir     if( getFlag( nFlags, BIFF12_PTFILTER_HASNAME ) )
917*cdf0e10cSrcweir         rStrm >> maModel.maName;
918*cdf0e10cSrcweir     if( getFlag( nFlags, BIFF12_PTFILTER_HASDESCRIPTION ) )
919*cdf0e10cSrcweir         rStrm >> maModel.maDescription;
920*cdf0e10cSrcweir     if( getFlag( nFlags, BIFF12_PTFILTER_HASSTRVALUE1 ) )
921*cdf0e10cSrcweir         rStrm >> maModel.maStrValue1;
922*cdf0e10cSrcweir     if( getFlag( nFlags, BIFF12_PTFILTER_HASSTRVALUE2 ) )
923*cdf0e10cSrcweir         rStrm >> maModel.maStrValue2;
924*cdf0e10cSrcweir 
925*cdf0e10cSrcweir     static sal_Int32 spnTypes[] =
926*cdf0e10cSrcweir     {
927*cdf0e10cSrcweir         XML_unknown,
928*cdf0e10cSrcweir         // data field top10 filter (1-3)
929*cdf0e10cSrcweir         XML_count, XML_percent, XML_sum,
930*cdf0e10cSrcweir         // caption filter (4-17)
931*cdf0e10cSrcweir         XML_captionEqual, XML_captionNotEqual,
932*cdf0e10cSrcweir         XML_captionBeginsWith, XML_captionNotBeginsWith, XML_captionEndsWith, XML_captionNotEndsWith,
933*cdf0e10cSrcweir         XML_captionContains, XML_captionNotContains, XML_captionGreaterThan, XML_captionGreaterThanOrEqual,
934*cdf0e10cSrcweir         XML_captionLessThan, XML_captionLessThanOrEqual, XML_captionBetween, XML_captionNotBetween,
935*cdf0e10cSrcweir         // value filter (18-25)
936*cdf0e10cSrcweir         XML_valueEqual, XML_valueNotEqual, XML_valueGreaterThan, XML_valueGreaterThanOrEqual,
937*cdf0e10cSrcweir         XML_valueLessThan, XML_valueLessThanOrEqual, XML_valueBetween, XML_valueNotBetween,
938*cdf0e10cSrcweir         // date filter (26-65)
939*cdf0e10cSrcweir         XML_dateEqual, XML_dateOlderThan, XML_dateNewerThan, XML_dateBetween,
940*cdf0e10cSrcweir         XML_tomorrow, XML_today, XML_yesterday, XML_nextWeek, XML_thisWeek, XML_lastWeek,
941*cdf0e10cSrcweir         XML_nextMonth, XML_thisMonth, XML_lastMonth, XML_nextQuarter, XML_thisQuarter, XML_lastQuarter,
942*cdf0e10cSrcweir         XML_nextYear, XML_thisYear, XML_lastYear, XML_yearToDate, XML_Q1, XML_Q2, XML_Q3, XML_Q4,
943*cdf0e10cSrcweir         XML_M1, XML_M2, XML_M3, XML_M4, XML_M5, XML_M6, XML_M7, XML_M8, XML_M9, XML_M10, XML_M11, XML_M12,
944*cdf0e10cSrcweir         XML_dateNotEqual, XML_dateOlderThanOrEqual, XML_dateNewerThanOrEqual, XML_dateNotBetween
945*cdf0e10cSrcweir     };
946*cdf0e10cSrcweir     maModel.mnType = STATIC_ARRAY_SELECT( spnTypes, nType, XML_TOKEN_INVALID );
947*cdf0e10cSrcweir }
948*cdf0e10cSrcweir 
949*cdf0e10cSrcweir void PivotTableFilter::importTop10Filter( SequenceInputStream& rStrm )
950*cdf0e10cSrcweir {
951*cdf0e10cSrcweir     sal_uInt8 nFlags;
952*cdf0e10cSrcweir     rStrm >> nFlags >> maModel.mfValue;
953*cdf0e10cSrcweir 
954*cdf0e10cSrcweir     OSL_ENSURE( getFlag( nFlags, BIFF12_TOP10FILTER_PERCENT ) == (maModel.mnType == XML_percent),
955*cdf0e10cSrcweir         "PivotTableFilter::importTop10 - unexpected value of percent attribute" );
956*cdf0e10cSrcweir     maModel.mbTopFilter = getFlag( nFlags, BIFF12_TOP10FILTER_TOP );
957*cdf0e10cSrcweir }
958*cdf0e10cSrcweir 
959*cdf0e10cSrcweir void PivotTableFilter::finalizeImport()
960*cdf0e10cSrcweir {
961*cdf0e10cSrcweir     // only simple top10 filter supported
962*cdf0e10cSrcweir     if( maModel.mnType == XML_count )
963*cdf0e10cSrcweir     {
964*cdf0e10cSrcweir         PropertySet aPropSet( mrPivotTable.getDataPilotField( maModel.mnField ) );
965*cdf0e10cSrcweir         if( aPropSet.is() )
966*cdf0e10cSrcweir         {
967*cdf0e10cSrcweir             using namespace ::com::sun::star::sheet;
968*cdf0e10cSrcweir             DataPilotFieldAutoShowInfo aAutoShowInfo;
969*cdf0e10cSrcweir             aAutoShowInfo.IsEnabled = sal_True;
970*cdf0e10cSrcweir             aAutoShowInfo.ShowItemsMode = maModel.mbTopFilter ? DataPilotFieldShowItemsMode::FROM_TOP : DataPilotFieldShowItemsMode::FROM_BOTTOM;
971*cdf0e10cSrcweir             aAutoShowInfo.ItemCount = getLimitedValue< sal_Int32, double >( maModel.mfValue, 0, SAL_MAX_INT32 );
972*cdf0e10cSrcweir             if( const PivotCacheField* pCacheField = mrPivotTable.getCacheFieldOfDataField( maModel.mnMeasureField ) )
973*cdf0e10cSrcweir                 aAutoShowInfo.DataField = pCacheField->getName();
974*cdf0e10cSrcweir             aPropSet.setProperty( PROP_AutoShowInfo, aAutoShowInfo );
975*cdf0e10cSrcweir         }
976*cdf0e10cSrcweir     }
977*cdf0e10cSrcweir }
978*cdf0e10cSrcweir 
979*cdf0e10cSrcweir // ============================================================================
980*cdf0e10cSrcweir 
981*cdf0e10cSrcweir PTDefinitionModel::PTDefinitionModel() :
982*cdf0e10cSrcweir     mnCacheId( -1 ),
983*cdf0e10cSrcweir     mnDataPosition( 0 ),
984*cdf0e10cSrcweir     mnPageWrap( 0 ),
985*cdf0e10cSrcweir     mnIndent( 1 ),
986*cdf0e10cSrcweir     mnChartFormat( 0 ),
987*cdf0e10cSrcweir     mnRowFields( 0 ),
988*cdf0e10cSrcweir     mnColFields( 0 ),
989*cdf0e10cSrcweir     mbDataOnRows( false ),
990*cdf0e10cSrcweir     mbShowError( false ),
991*cdf0e10cSrcweir     mbShowMissing( true ),
992*cdf0e10cSrcweir     mbShowItems( true ),
993*cdf0e10cSrcweir     mbDisableFieldList( false ),
994*cdf0e10cSrcweir     mbShowCalcMembers( true ),
995*cdf0e10cSrcweir     mbVisualTotals( true ),
996*cdf0e10cSrcweir     mbShowDrill( true ),
997*cdf0e10cSrcweir     mbPrintDrill( false ),
998*cdf0e10cSrcweir     mbEnableDrill( true ),
999*cdf0e10cSrcweir     mbPreserveFormatting( true ),
1000*cdf0e10cSrcweir     mbUseAutoFormat( false ),
1001*cdf0e10cSrcweir     mbPageOverThenDown( false ),
1002*cdf0e10cSrcweir     mbSubtotalHiddenItems( false ),
1003*cdf0e10cSrcweir     mbRowGrandTotals( true ),
1004*cdf0e10cSrcweir     mbColGrandTotals( true ),
1005*cdf0e10cSrcweir     mbFieldPrintTitles( false ),
1006*cdf0e10cSrcweir     mbItemPrintTitles( false ),
1007*cdf0e10cSrcweir     mbMergeItem( false ),
1008*cdf0e10cSrcweir     mbShowEmptyRow( false ),
1009*cdf0e10cSrcweir     mbShowEmptyCol( false ),
1010*cdf0e10cSrcweir     mbShowHeaders( true ),
1011*cdf0e10cSrcweir     mbFieldListSortAsc( false ),
1012*cdf0e10cSrcweir     mbCustomListSort( true )
1013*cdf0e10cSrcweir {
1014*cdf0e10cSrcweir }
1015*cdf0e10cSrcweir 
1016*cdf0e10cSrcweir // ----------------------------------------------------------------------------
1017*cdf0e10cSrcweir 
1018*cdf0e10cSrcweir PTLocationModel::PTLocationModel() :
1019*cdf0e10cSrcweir     mnFirstHeaderRow( 0 ),
1020*cdf0e10cSrcweir     mnFirstDataRow( 0 ),
1021*cdf0e10cSrcweir     mnFirstDataCol( 0 ),
1022*cdf0e10cSrcweir     mnRowPageCount( 0 ),
1023*cdf0e10cSrcweir     mnColPageCount( 0 )
1024*cdf0e10cSrcweir {
1025*cdf0e10cSrcweir }
1026*cdf0e10cSrcweir 
1027*cdf0e10cSrcweir // ----------------------------------------------------------------------------
1028*cdf0e10cSrcweir 
1029*cdf0e10cSrcweir PivotTable::PivotTable( const WorkbookHelper& rHelper ) :
1030*cdf0e10cSrcweir     WorkbookHelper( rHelper ),
1031*cdf0e10cSrcweir     maDataField( *this, OOX_PT_DATALAYOUTFIELD ),
1032*cdf0e10cSrcweir     mpPivotCache( 0 )
1033*cdf0e10cSrcweir {
1034*cdf0e10cSrcweir }
1035*cdf0e10cSrcweir 
1036*cdf0e10cSrcweir void PivotTable::importPivotTableDefinition( const AttributeList& rAttribs )
1037*cdf0e10cSrcweir {
1038*cdf0e10cSrcweir     maDefModel.maName                = rAttribs.getXString( XML_name, OUString() );
1039*cdf0e10cSrcweir     maDefModel.maDataCaption         = rAttribs.getXString( XML_dataCaption , OUString() );
1040*cdf0e10cSrcweir     maDefModel.maGrandTotalCaption   = rAttribs.getXString( XML_grandTotalCaption, OUString() );
1041*cdf0e10cSrcweir     maDefModel.maRowHeaderCaption    = rAttribs.getXString( XML_rowHeaderCaption, OUString() );
1042*cdf0e10cSrcweir     maDefModel.maColHeaderCaption    = rAttribs.getXString( XML_colHeaderCaption, OUString() );
1043*cdf0e10cSrcweir     maDefModel.maErrorCaption        = rAttribs.getXString( XML_errorCaption, OUString() );
1044*cdf0e10cSrcweir     maDefModel.maMissingCaption      = rAttribs.getXString( XML_missingCaption, OUString() );
1045*cdf0e10cSrcweir     maDefModel.maPageStyle           = rAttribs.getXString( XML_pageStyle, OUString() );
1046*cdf0e10cSrcweir     maDefModel.maPivotTableStyle     = rAttribs.getXString( XML_pivotTableStyle, OUString() );
1047*cdf0e10cSrcweir     maDefModel.maVacatedStyle        = rAttribs.getXString( XML_vacatedStyle, OUString() );
1048*cdf0e10cSrcweir     maDefModel.maTag                 = rAttribs.getXString( XML_tag, OUString() );
1049*cdf0e10cSrcweir     maDefModel.mnCacheId             = rAttribs.getInteger( XML_cacheId, -1 );
1050*cdf0e10cSrcweir     maDefModel.mnDataPosition        = rAttribs.getInteger( XML_dataPosition, 0 );
1051*cdf0e10cSrcweir     maDefModel.mnPageWrap            = rAttribs.getInteger( XML_pageWrap, 0 );
1052*cdf0e10cSrcweir     maDefModel.mnIndent              = rAttribs.getInteger( XML_indent, 1 );
1053*cdf0e10cSrcweir     maDefModel.mnChartFormat         = rAttribs.getInteger( XML_chartFormat, 0 );
1054*cdf0e10cSrcweir     maDefModel.mnAutoFormatId        = rAttribs.getInteger( XML_autoFormatId, 0 );
1055*cdf0e10cSrcweir     maDefModel.mbDataOnRows          = rAttribs.getBool( XML_dataOnRows, false );
1056*cdf0e10cSrcweir     maDefModel.mbShowError           = rAttribs.getBool( XML_showError, false );
1057*cdf0e10cSrcweir     maDefModel.mbShowMissing         = rAttribs.getBool( XML_showMissing, true );
1058*cdf0e10cSrcweir     maDefModel.mbShowItems           = rAttribs.getBool( XML_showItems, true );
1059*cdf0e10cSrcweir     maDefModel.mbDisableFieldList    = rAttribs.getBool( XML_disableFieldList, false );
1060*cdf0e10cSrcweir     maDefModel.mbShowCalcMembers     = rAttribs.getBool( XML_showCalcMbrs, true );
1061*cdf0e10cSrcweir     maDefModel.mbVisualTotals        = rAttribs.getBool( XML_visualTotals, true );
1062*cdf0e10cSrcweir     maDefModel.mbShowDrill           = rAttribs.getBool( XML_showDrill, true );
1063*cdf0e10cSrcweir     maDefModel.mbPrintDrill          = rAttribs.getBool( XML_printDrill, false );
1064*cdf0e10cSrcweir     maDefModel.mbEnableDrill         = rAttribs.getBool( XML_enableDrill, true );
1065*cdf0e10cSrcweir     maDefModel.mbPreserveFormatting  = rAttribs.getBool( XML_preserveFormatting, true );
1066*cdf0e10cSrcweir     maDefModel.mbUseAutoFormat       = rAttribs.getBool( XML_useAutoFormatting, false );
1067*cdf0e10cSrcweir     maDefModel.mbPageOverThenDown    = rAttribs.getBool( XML_pageOverThenDown, false );
1068*cdf0e10cSrcweir     maDefModel.mbSubtotalHiddenItems = rAttribs.getBool( XML_subtotalHiddenItems, false );
1069*cdf0e10cSrcweir     maDefModel.mbRowGrandTotals      = rAttribs.getBool( XML_rowGrandTotals, true );
1070*cdf0e10cSrcweir     maDefModel.mbColGrandTotals      = rAttribs.getBool( XML_colGrandTotals, true );
1071*cdf0e10cSrcweir     maDefModel.mbFieldPrintTitles    = rAttribs.getBool( XML_fieldPrintTitles, false );
1072*cdf0e10cSrcweir     maDefModel.mbItemPrintTitles     = rAttribs.getBool( XML_itemPrintTitles, false );
1073*cdf0e10cSrcweir     maDefModel.mbMergeItem           = rAttribs.getBool( XML_mergeItem, false );
1074*cdf0e10cSrcweir     maDefModel.mbShowEmptyRow        = rAttribs.getBool( XML_showEmptyRow, false );
1075*cdf0e10cSrcweir     maDefModel.mbShowEmptyCol        = rAttribs.getBool( XML_showEmptyCol, false );
1076*cdf0e10cSrcweir     maDefModel.mbShowHeaders         = rAttribs.getBool( XML_showHeaders, true );
1077*cdf0e10cSrcweir     maDefModel.mbFieldListSortAsc    = rAttribs.getBool( XML_fieldListSortAscending, false );
1078*cdf0e10cSrcweir     maDefModel.mbCustomListSort      = rAttribs.getBool( XML_customListSort, true );
1079*cdf0e10cSrcweir     maDefModel.mbApplyNumFmt         = rAttribs.getBool( XML_applyNumberFormats, false );
1080*cdf0e10cSrcweir     maDefModel.mbApplyFont           = rAttribs.getBool( XML_applyFontFormats, false );
1081*cdf0e10cSrcweir     maDefModel.mbApplyAlignment      = rAttribs.getBool( XML_applyAlignmentFormats, false );
1082*cdf0e10cSrcweir     maDefModel.mbApplyBorder         = rAttribs.getBool( XML_applyBorderFormats, false );
1083*cdf0e10cSrcweir     maDefModel.mbApplyFill           = rAttribs.getBool( XML_applyPatternFormats, false );
1084*cdf0e10cSrcweir     // OOXML and BIFF12 documentation differ: OOXML mentions width/height, BIFF12 mentions protection
1085*cdf0e10cSrcweir     maDefModel.mbApplyProtection     = rAttribs.getBool( XML_applyWidthHeightFormats, false );
1086*cdf0e10cSrcweir }
1087*cdf0e10cSrcweir 
1088*cdf0e10cSrcweir void PivotTable::importLocation( const AttributeList& rAttribs, sal_Int16 nSheet )
1089*cdf0e10cSrcweir {
1090*cdf0e10cSrcweir     getAddressConverter().convertToCellRangeUnchecked( maLocationModel.maRange, rAttribs.getString( XML_ref, OUString() ), nSheet );
1091*cdf0e10cSrcweir     maLocationModel.mnFirstHeaderRow = rAttribs.getInteger( XML_firstHeaderRow, 0 );
1092*cdf0e10cSrcweir     maLocationModel.mnFirstDataRow   = rAttribs.getInteger( XML_firstDataRow, 0 );
1093*cdf0e10cSrcweir     maLocationModel.mnFirstDataCol   = rAttribs.getInteger( XML_firstDataCol, 0 );
1094*cdf0e10cSrcweir     maLocationModel.mnRowPageCount   = rAttribs.getInteger( XML_rowPageCount, 0 );
1095*cdf0e10cSrcweir     maLocationModel.mnColPageCount   = rAttribs.getInteger( XML_colPageCount, 0 );
1096*cdf0e10cSrcweir }
1097*cdf0e10cSrcweir 
1098*cdf0e10cSrcweir void PivotTable::importRowField( const AttributeList& rAttribs )
1099*cdf0e10cSrcweir {
1100*cdf0e10cSrcweir     importField( maRowFields, rAttribs );
1101*cdf0e10cSrcweir }
1102*cdf0e10cSrcweir 
1103*cdf0e10cSrcweir void PivotTable::importColField( const AttributeList& rAttribs )
1104*cdf0e10cSrcweir {
1105*cdf0e10cSrcweir     importField( maColFields, rAttribs );
1106*cdf0e10cSrcweir }
1107*cdf0e10cSrcweir 
1108*cdf0e10cSrcweir void PivotTable::importPageField( const AttributeList& rAttribs )
1109*cdf0e10cSrcweir {
1110*cdf0e10cSrcweir     PTPageFieldModel aModel;
1111*cdf0e10cSrcweir     aModel.maName      = rAttribs.getXString( XML_name, OUString() );
1112*cdf0e10cSrcweir     aModel.mnField     = rAttribs.getInteger( XML_fld, -1 );
1113*cdf0e10cSrcweir     // specification is wrong, XML_item is not the cache item, but the field item
1114*cdf0e10cSrcweir     aModel.mnItem      = rAttribs.getInteger( XML_item, BIFF12_PTPAGEFIELD_MULTIITEMS );
1115*cdf0e10cSrcweir     maPageFields.push_back( aModel );
1116*cdf0e10cSrcweir }
1117*cdf0e10cSrcweir 
1118*cdf0e10cSrcweir void PivotTable::importDataField( const AttributeList& rAttribs )
1119*cdf0e10cSrcweir {
1120*cdf0e10cSrcweir     PTDataFieldModel aModel;
1121*cdf0e10cSrcweir     aModel.maName       = rAttribs.getXString( XML_name, OUString() );
1122*cdf0e10cSrcweir     aModel.mnField      = rAttribs.getInteger( XML_fld, -1 );
1123*cdf0e10cSrcweir     aModel.mnSubtotal   = rAttribs.getToken( XML_subtotal, XML_sum );
1124*cdf0e10cSrcweir     aModel.mnShowDataAs = rAttribs.getToken( XML_showDataAs, XML_normal );
1125*cdf0e10cSrcweir     aModel.mnBaseField  = rAttribs.getInteger( XML_baseField, -1 );
1126*cdf0e10cSrcweir     aModel.mnBaseItem   = rAttribs.getInteger( XML_baseItem, -1 );
1127*cdf0e10cSrcweir     aModel.mnNumFmtId   = rAttribs.getInteger( XML_numFmtId, 0 );
1128*cdf0e10cSrcweir     maDataFields.push_back( aModel );
1129*cdf0e10cSrcweir }
1130*cdf0e10cSrcweir 
1131*cdf0e10cSrcweir void PivotTable::importPTDefinition( SequenceInputStream& rStrm )
1132*cdf0e10cSrcweir {
1133*cdf0e10cSrcweir     sal_uInt32 nFlags1, nFlags2, nFlags3;
1134*cdf0e10cSrcweir     sal_uInt8 nDataAxis;
1135*cdf0e10cSrcweir     rStrm >> nFlags1 >> nFlags2 >> nFlags3 >> nDataAxis;
1136*cdf0e10cSrcweir     maDefModel.mnPageWrap = rStrm.readuInt8();
1137*cdf0e10cSrcweir     rStrm.skip( 2 );    // refresh versions
1138*cdf0e10cSrcweir     rStrm >> maDefModel.mnDataPosition;
1139*cdf0e10cSrcweir     maDefModel.mnAutoFormatId = rStrm.readuInt16();
1140*cdf0e10cSrcweir     rStrm.skip( 2 );    // unused
1141*cdf0e10cSrcweir     rStrm >> maDefModel.mnChartFormat >> maDefModel.mnCacheId >> maDefModel.maName;
1142*cdf0e10cSrcweir     if( getFlag( nFlags2, BIFF12_PTDEF_HASDATACAPTION ) )
1143*cdf0e10cSrcweir         rStrm >> maDefModel.maDataCaption;
1144*cdf0e10cSrcweir     if( getFlag( nFlags2, BIFF12_PTDEF_HASGRANDTOTALCAPTION ) )
1145*cdf0e10cSrcweir         rStrm >> maDefModel.maGrandTotalCaption;
1146*cdf0e10cSrcweir     if( !getFlag( nFlags3, BIFF12_PTDEF_NOERRORCAPTION ) )   // missing flag indicates existing string
1147*cdf0e10cSrcweir         rStrm >> maDefModel.maErrorCaption;
1148*cdf0e10cSrcweir     if( !getFlag( nFlags3, BIFF12_PTDEF_NOMISSINGCAPTION ) ) // missing flag indicates existing string
1149*cdf0e10cSrcweir         rStrm >> maDefModel.maMissingCaption;
1150*cdf0e10cSrcweir     if( getFlag( nFlags2, BIFF12_PTDEF_HASPAGESTYLE ) )
1151*cdf0e10cSrcweir         rStrm >> maDefModel.maPageStyle;
1152*cdf0e10cSrcweir     if( getFlag( nFlags2, BIFF12_PTDEF_HASPIVOTTABLESTYLE ) )
1153*cdf0e10cSrcweir         rStrm >> maDefModel.maPivotTableStyle;
1154*cdf0e10cSrcweir     if( getFlag( nFlags2, BIFF12_PTDEF_HASVACATEDSTYLE ) )
1155*cdf0e10cSrcweir         rStrm >> maDefModel.maVacatedStyle;
1156*cdf0e10cSrcweir     if( getFlag( nFlags2, BIFF12_PTDEF_HASTAG ) )
1157*cdf0e10cSrcweir         rStrm >> maDefModel.maTag;
1158*cdf0e10cSrcweir     if( getFlag( nFlags3, BIFF12_PTDEF_HASCOLHEADERCAPTION ) )   // TODO: right order (col/row)? spec is unclear
1159*cdf0e10cSrcweir         rStrm >> maDefModel.maColHeaderCaption;
1160*cdf0e10cSrcweir     if( getFlag( nFlags3, BIFF12_PTDEF_HASROWHEADERCAPTION ) )
1161*cdf0e10cSrcweir         rStrm >> maDefModel.maRowHeaderCaption;
1162*cdf0e10cSrcweir 
1163*cdf0e10cSrcweir     OSL_ENSURE( (nDataAxis == BIFF12_PTDEF_ROWAXIS) || (nDataAxis == BIFF12_PTDEF_COLAXIS),
1164*cdf0e10cSrcweir         "PivotTable::importPTDefinition - unexpected axis position for data field" );
1165*cdf0e10cSrcweir 
1166*cdf0e10cSrcweir     maDefModel.mnIndent              = extractValue< sal_uInt8 >( nFlags1, 24, 7 );
1167*cdf0e10cSrcweir     maDefModel.mbDataOnRows          = nDataAxis == BIFF12_PTDEF_ROWAXIS;
1168*cdf0e10cSrcweir     maDefModel.mbShowError           = getFlag( nFlags2, BIFF12_PTDEF_SHOWERROR );
1169*cdf0e10cSrcweir     maDefModel.mbShowMissing         = getFlag( nFlags2, BIFF12_PTDEF_SHOWMISSING );
1170*cdf0e10cSrcweir     maDefModel.mbShowItems           = getFlag( nFlags1, BIFF12_PTDEF_SHOWITEMS );
1171*cdf0e10cSrcweir     maDefModel.mbDisableFieldList    = getFlag( nFlags1, BIFF12_PTDEF_DISABLEFIELDLIST );
1172*cdf0e10cSrcweir     maDefModel.mbShowCalcMembers     = !getFlag( nFlags1, BIFF12_PTDEF_HIDECALCMEMBERS );
1173*cdf0e10cSrcweir     maDefModel.mbVisualTotals        = !getFlag( nFlags1, BIFF12_PTDEF_WITHHIDDENTOTALS );
1174*cdf0e10cSrcweir     maDefModel.mbShowDrill           = !getFlag( nFlags1, BIFF12_PTDEF_HIDEDRILL );
1175*cdf0e10cSrcweir     maDefModel.mbPrintDrill          = getFlag( nFlags1, BIFF12_PTDEF_PRINTDRILL );
1176*cdf0e10cSrcweir     maDefModel.mbEnableDrill         = getFlag( nFlags2, BIFF12_PTDEF_ENABLEDRILL );
1177*cdf0e10cSrcweir     maDefModel.mbPreserveFormatting  = getFlag( nFlags2, BIFF12_PTDEF_PRESERVEFORMATTING );
1178*cdf0e10cSrcweir     maDefModel.mbUseAutoFormat       = getFlag( nFlags2, BIFF12_PTDEF_USEAUTOFORMAT );
1179*cdf0e10cSrcweir     maDefModel.mbPageOverThenDown    = getFlag( nFlags2, BIFF12_PTDEF_PAGEOVERTHENDOWN );
1180*cdf0e10cSrcweir     maDefModel.mbSubtotalHiddenItems = getFlag( nFlags2, BIFF12_PTDEF_SUBTOTALHIDDENITEMS );
1181*cdf0e10cSrcweir     maDefModel.mbRowGrandTotals      = getFlag( nFlags2, BIFF12_PTDEF_ROWGRANDTOTALS );
1182*cdf0e10cSrcweir     maDefModel.mbColGrandTotals      = getFlag( nFlags2, BIFF12_PTDEF_COLGRANDTOTALS );
1183*cdf0e10cSrcweir     maDefModel.mbFieldPrintTitles    = getFlag( nFlags2, BIFF12_PTDEF_FIELDPRINTTITLES );
1184*cdf0e10cSrcweir     maDefModel.mbItemPrintTitles     = getFlag( nFlags2, BIFF12_PTDEF_ITEMPRINTTITLES );
1185*cdf0e10cSrcweir     maDefModel.mbMergeItem           = getFlag( nFlags2, BIFF12_PTDEF_MERGEITEM );
1186*cdf0e10cSrcweir     maDefModel.mbApplyNumFmt         = getFlag( nFlags2, BIFF12_PTDEF_APPLYNUMFMT );
1187*cdf0e10cSrcweir     maDefModel.mbApplyFont           = getFlag( nFlags2, BIFF12_PTDEF_APPLYFONT );
1188*cdf0e10cSrcweir     maDefModel.mbApplyAlignment      = getFlag( nFlags2, BIFF12_PTDEF_APPLYALIGNMENT );
1189*cdf0e10cSrcweir     maDefModel.mbApplyBorder         = getFlag( nFlags2, BIFF12_PTDEF_APPLYBORDER );
1190*cdf0e10cSrcweir     maDefModel.mbApplyFill           = getFlag( nFlags2, BIFF12_PTDEF_APPLYFILL );
1191*cdf0e10cSrcweir     maDefModel.mbApplyProtection     = getFlag( nFlags2, BIFF12_PTDEF_APPLYPROTECTION );
1192*cdf0e10cSrcweir     maDefModel.mbShowEmptyRow        = getFlag( nFlags2, BIFF12_PTDEF_SHOWEMPTYROW );
1193*cdf0e10cSrcweir     maDefModel.mbShowEmptyCol        = getFlag( nFlags2, BIFF12_PTDEF_SHOWEMPTYCOL );
1194*cdf0e10cSrcweir     maDefModel.mbShowHeaders         = !getFlag( nFlags1, BIFF12_PTDEF_HIDEHEADERS );
1195*cdf0e10cSrcweir     maDefModel.mbFieldListSortAsc    = getFlag( nFlags3, BIFF12_PTDEF_FIELDLISTSORTASC );
1196*cdf0e10cSrcweir     maDefModel.mbCustomListSort      = !getFlag( nFlags3, BIFF12_PTDEF_NOCUSTOMLISTSORT );
1197*cdf0e10cSrcweir }
1198*cdf0e10cSrcweir 
1199*cdf0e10cSrcweir void PivotTable::importPTLocation( SequenceInputStream& rStrm, sal_Int16 nSheet )
1200*cdf0e10cSrcweir {
1201*cdf0e10cSrcweir     BinRange aBinRange;
1202*cdf0e10cSrcweir     rStrm   >> aBinRange >> maLocationModel.mnFirstHeaderRow
1203*cdf0e10cSrcweir             >> maLocationModel.mnFirstDataRow >> maLocationModel.mnFirstDataCol
1204*cdf0e10cSrcweir             >> maLocationModel.mnRowPageCount >> maLocationModel.mnColPageCount;
1205*cdf0e10cSrcweir     getAddressConverter().convertToCellRangeUnchecked( maLocationModel.maRange, aBinRange, nSheet );
1206*cdf0e10cSrcweir }
1207*cdf0e10cSrcweir 
1208*cdf0e10cSrcweir void PivotTable::importPTRowFields( SequenceInputStream& rStrm )
1209*cdf0e10cSrcweir {
1210*cdf0e10cSrcweir     importFields( maRowFields, rStrm );
1211*cdf0e10cSrcweir }
1212*cdf0e10cSrcweir 
1213*cdf0e10cSrcweir void PivotTable::importPTColFields( SequenceInputStream& rStrm )
1214*cdf0e10cSrcweir {
1215*cdf0e10cSrcweir     importFields( maColFields, rStrm );
1216*cdf0e10cSrcweir }
1217*cdf0e10cSrcweir 
1218*cdf0e10cSrcweir void PivotTable::importPTPageField( SequenceInputStream& rStrm )
1219*cdf0e10cSrcweir {
1220*cdf0e10cSrcweir     PTPageFieldModel aModel;
1221*cdf0e10cSrcweir     sal_uInt8 nFlags;
1222*cdf0e10cSrcweir     rStrm >> aModel.mnField >> aModel.mnItem;
1223*cdf0e10cSrcweir     rStrm.skip( 4 );    // hierarchy
1224*cdf0e10cSrcweir     rStrm >> nFlags;
1225*cdf0e10cSrcweir     if( getFlag( nFlags, BIFF12_PTPAGEFIELD_HASNAME ) )
1226*cdf0e10cSrcweir         rStrm >> aModel.maName;
1227*cdf0e10cSrcweir     maPageFields.push_back( aModel );
1228*cdf0e10cSrcweir }
1229*cdf0e10cSrcweir 
1230*cdf0e10cSrcweir void PivotTable::importPTDataField( SequenceInputStream& rStrm )
1231*cdf0e10cSrcweir {
1232*cdf0e10cSrcweir     PTDataFieldModel aModel;
1233*cdf0e10cSrcweir     sal_Int32 nSubtotal, nShowDataAs;
1234*cdf0e10cSrcweir     sal_uInt8 nHasName;
1235*cdf0e10cSrcweir     rStrm >> aModel.mnField >> nSubtotal >> nShowDataAs >> aModel.mnBaseField >> aModel.mnBaseItem >> aModel.mnNumFmtId >> nHasName;
1236*cdf0e10cSrcweir     if( nHasName == 1 )
1237*cdf0e10cSrcweir         rStrm >> aModel.maName;
1238*cdf0e10cSrcweir     aModel.setBiffSubtotal( nSubtotal );
1239*cdf0e10cSrcweir     aModel.setBiffShowDataAs( nShowDataAs );
1240*cdf0e10cSrcweir     maDataFields.push_back( aModel );
1241*cdf0e10cSrcweir }
1242*cdf0e10cSrcweir 
1243*cdf0e10cSrcweir void PivotTable::importPTDefinition( BiffInputStream& rStrm, sal_Int16 nSheet )
1244*cdf0e10cSrcweir {
1245*cdf0e10cSrcweir     BinRange aBinRange;
1246*cdf0e10cSrcweir     sal_uInt16 nFlags, nTabNameLen, nDataNameLen;
1247*cdf0e10cSrcweir     rStrm >> aBinRange;
1248*cdf0e10cSrcweir     maLocationModel.mnFirstHeaderRow = rStrm.readuInt16();
1249*cdf0e10cSrcweir     maLocationModel.mnFirstDataRow   = rStrm.readuInt16();
1250*cdf0e10cSrcweir     maLocationModel.mnFirstDataCol   = rStrm.readuInt16();
1251*cdf0e10cSrcweir     maDefModel.mnCacheId             = rStrm.readuInt16();
1252*cdf0e10cSrcweir     rStrm.skip( 2 );                 // unused
1253*cdf0e10cSrcweir     maDefModel.mbDataOnRows          = rStrm.readuInt16() == BIFF_PTDEF_ROWAXIS;
1254*cdf0e10cSrcweir     maDefModel.mnDataPosition        = rStrm.readInt16();
1255*cdf0e10cSrcweir     rStrm.skip( 2 );                 // number of fields
1256*cdf0e10cSrcweir     rStrm >> maDefModel.mnRowFields >> maDefModel.mnColFields;
1257*cdf0e10cSrcweir     rStrm.skip( 8 );                 // number of page fields, data fields, data rows, data columns
1258*cdf0e10cSrcweir     rStrm >> nFlags;
1259*cdf0e10cSrcweir     maDefModel.mnChartFormat         = rStrm.readuInt16();
1260*cdf0e10cSrcweir     rStrm >> nTabNameLen >> nDataNameLen;
1261*cdf0e10cSrcweir     maDefModel.maName                = lclReadPivotString( *this, rStrm, nTabNameLen );
1262*cdf0e10cSrcweir     maDefModel.maDataCaption         = lclReadPivotString( *this, rStrm, nDataNameLen );
1263*cdf0e10cSrcweir 
1264*cdf0e10cSrcweir     maDefModel.mbRowGrandTotals  = getFlag( nFlags, BIFF_PTDEF_ROWGRANDTOTALS );
1265*cdf0e10cSrcweir     maDefModel.mbColGrandTotals  = getFlag( nFlags, BIFF_PTDEF_COLGRANDTOTALS );
1266*cdf0e10cSrcweir 
1267*cdf0e10cSrcweir     getAddressConverter().convertToCellRangeUnchecked( maLocationModel.maRange, aBinRange, nSheet );
1268*cdf0e10cSrcweir }
1269*cdf0e10cSrcweir 
1270*cdf0e10cSrcweir void PivotTable::importPTDefinition2( BiffInputStream& rStrm )
1271*cdf0e10cSrcweir {
1272*cdf0e10cSrcweir     if( getBiff() == BIFF8 )
1273*cdf0e10cSrcweir     {
1274*cdf0e10cSrcweir         sal_uInt16 nErrCaptLen, nMissCaptLen, nTagLen, nPageStyleLen, nTabStyleLen, nVacStyleLen;
1275*cdf0e10cSrcweir         sal_uInt32 nFlags;
1276*cdf0e10cSrcweir         rStrm.skip( 2 );    // number of formatting records
1277*cdf0e10cSrcweir         rStrm >> nErrCaptLen >> nMissCaptLen >> nTagLen;
1278*cdf0e10cSrcweir         rStrm.skip( 6 );    // number of selection records, page rows, page columns
1279*cdf0e10cSrcweir         rStrm >> nFlags >> nPageStyleLen >> nTabStyleLen >> nVacStyleLen;
1280*cdf0e10cSrcweir         maDefModel.maErrorCaption    = lclReadPivotString( *this, rStrm, nErrCaptLen );
1281*cdf0e10cSrcweir         maDefModel.maMissingCaption  = lclReadPivotString( *this, rStrm, nMissCaptLen );
1282*cdf0e10cSrcweir         maDefModel.maTag             = lclReadPivotString( *this, rStrm, nTagLen );
1283*cdf0e10cSrcweir         maDefModel.maPageStyle       = lclReadPivotString( *this, rStrm, nPageStyleLen );
1284*cdf0e10cSrcweir         maDefModel.maPivotTableStyle = lclReadPivotString( *this, rStrm, nTabStyleLen );
1285*cdf0e10cSrcweir         maDefModel.maVacatedStyle    = lclReadPivotString( *this, rStrm, nVacStyleLen );
1286*cdf0e10cSrcweir 
1287*cdf0e10cSrcweir         maDefModel.mbShowError           = getFlag( nFlags, BIFF_PTDEF2_SHOWERROR );
1288*cdf0e10cSrcweir         maDefModel.mbShowMissing         = getFlag( nFlags, BIFF_PTDEF2_SHOWMISSING );
1289*cdf0e10cSrcweir         maDefModel.mbEnableDrill         = getFlag( nFlags, BIFF_PTDE2F_ENABLEDRILL );
1290*cdf0e10cSrcweir         maDefModel.mbPreserveFormatting  = getFlag( nFlags, BIFF_PTDEF2_PRESERVEFORMATTING );
1291*cdf0e10cSrcweir         maDefModel.mbPageOverThenDown    = getFlag( nFlags, BIFF_PTDEF2_PAGEOVERTHENDOWN );
1292*cdf0e10cSrcweir         maDefModel.mbSubtotalHiddenItems = getFlag( nFlags, BIFF_PTDEF2_SUBTOTALHIDDENITEMS );
1293*cdf0e10cSrcweir         maDefModel.mbMergeItem           = getFlag( nFlags, BIFF_PTDEF2_MERGEITEM );
1294*cdf0e10cSrcweir     }
1295*cdf0e10cSrcweir }
1296*cdf0e10cSrcweir 
1297*cdf0e10cSrcweir void PivotTable::importPTRowColFields( BiffInputStream& rStrm )
1298*cdf0e10cSrcweir {
1299*cdf0e10cSrcweir     // first PTROWCOLFIELDS record contains row fields unless there are no row fields
1300*cdf0e10cSrcweir     if( (maDefModel.mnRowFields > 0) && maRowFields.empty() )
1301*cdf0e10cSrcweir         importFields( maRowFields, rStrm, maDefModel.mnRowFields );
1302*cdf0e10cSrcweir     else if( (maDefModel.mnColFields > 0) && maColFields.empty() )
1303*cdf0e10cSrcweir         importFields( maColFields, rStrm, maDefModel.mnColFields );
1304*cdf0e10cSrcweir }
1305*cdf0e10cSrcweir 
1306*cdf0e10cSrcweir void PivotTable::importPTPageFields( BiffInputStream& rStrm )
1307*cdf0e10cSrcweir {
1308*cdf0e10cSrcweir     while( rStrm.getRemaining() >= 6 )
1309*cdf0e10cSrcweir     {
1310*cdf0e10cSrcweir         PTPageFieldModel aModel;
1311*cdf0e10cSrcweir         sal_Int16 nField, nItem;
1312*cdf0e10cSrcweir         rStrm >> nField >> nItem;
1313*cdf0e10cSrcweir         rStrm.skip( 2 );    // dropdown object ID
1314*cdf0e10cSrcweir         aModel.mnField = nField;
1315*cdf0e10cSrcweir         aModel.mnItem = (nItem == BIFF_PTPAGEFIELDS_ALLITEMS) ? BIFF12_PTPAGEFIELD_MULTIITEMS : nItem;
1316*cdf0e10cSrcweir         maPageFields.push_back( aModel );
1317*cdf0e10cSrcweir     }
1318*cdf0e10cSrcweir }
1319*cdf0e10cSrcweir 
1320*cdf0e10cSrcweir void PivotTable::importPTDataField( BiffInputStream& rStrm )
1321*cdf0e10cSrcweir {
1322*cdf0e10cSrcweir     PTDataFieldModel aModel;
1323*cdf0e10cSrcweir     sal_Int16 nField, nBaseField, nBaseItem;
1324*cdf0e10cSrcweir     sal_uInt16 nSubtotal, nShowDataAs, nNumFmt, nNameLen;
1325*cdf0e10cSrcweir     rStrm >> nField >> nSubtotal >> nShowDataAs >> nBaseField >> nBaseItem >> nNumFmt >> nNameLen;
1326*cdf0e10cSrcweir     aModel.maName = lclReadPivotString( *this, rStrm, nNameLen );
1327*cdf0e10cSrcweir 
1328*cdf0e10cSrcweir     aModel.mnField = nField;
1329*cdf0e10cSrcweir     aModel.setBiffSubtotal( nSubtotal );
1330*cdf0e10cSrcweir     aModel.setBiffShowDataAs( nShowDataAs );
1331*cdf0e10cSrcweir     aModel.mnBaseField = nBaseField;
1332*cdf0e10cSrcweir     switch( nBaseItem )
1333*cdf0e10cSrcweir     {
1334*cdf0e10cSrcweir         case BIFF_PTDATAFIELD_PREVIOUS: aModel.mnBaseItem = OOX_PT_PREVIOUS_ITEM;   break;
1335*cdf0e10cSrcweir         case BIFF_PTDATAFIELD_NEXT:     aModel.mnBaseItem = OOX_PT_NEXT_ITEM;       break;
1336*cdf0e10cSrcweir         default:                        aModel.mnBaseItem = nBaseItem;
1337*cdf0e10cSrcweir     }
1338*cdf0e10cSrcweir     aModel.mnNumFmtId = nNumFmt;
1339*cdf0e10cSrcweir 
1340*cdf0e10cSrcweir     maDataFields.push_back( aModel );
1341*cdf0e10cSrcweir }
1342*cdf0e10cSrcweir 
1343*cdf0e10cSrcweir PivotTableField& PivotTable::createTableField()
1344*cdf0e10cSrcweir {
1345*cdf0e10cSrcweir     sal_Int32 nFieldIndex = static_cast< sal_Int32 >( maFields.size() );
1346*cdf0e10cSrcweir     PivotTableFieldVector::value_type xTableField( new PivotTableField( *this, nFieldIndex ) );
1347*cdf0e10cSrcweir     maFields.push_back( xTableField );
1348*cdf0e10cSrcweir     return *xTableField;
1349*cdf0e10cSrcweir }
1350*cdf0e10cSrcweir 
1351*cdf0e10cSrcweir PivotTableFilter& PivotTable::createTableFilter()
1352*cdf0e10cSrcweir {
1353*cdf0e10cSrcweir     PivotTableFilterVector::value_type xTableFilter( new PivotTableFilter( *this ) );
1354*cdf0e10cSrcweir     maFilters.push_back( xTableFilter );
1355*cdf0e10cSrcweir     return *xTableFilter;
1356*cdf0e10cSrcweir }
1357*cdf0e10cSrcweir 
1358*cdf0e10cSrcweir void PivotTable::finalizeImport()
1359*cdf0e10cSrcweir {
1360*cdf0e10cSrcweir     if( getAddressConverter().validateCellRange( maLocationModel.maRange, true, true ) )
1361*cdf0e10cSrcweir     {
1362*cdf0e10cSrcweir         mpPivotCache = getPivotCaches().importPivotCacheFragment( maDefModel.mnCacheId );
1363*cdf0e10cSrcweir         if( mpPivotCache && mpPivotCache->isValidDataSource() && (maDefModel.maName.getLength() > 0) )
1364*cdf0e10cSrcweir         {
1365*cdf0e10cSrcweir             // clear destination area of the original pivot table
1366*cdf0e10cSrcweir             try
1367*cdf0e10cSrcweir             {
1368*cdf0e10cSrcweir                 Reference< XSheetOperation > xSheetOp( getCellRangeFromDoc( maLocationModel.maRange ), UNO_QUERY_THROW );
1369*cdf0e10cSrcweir                 using namespace ::com::sun::star::sheet::CellFlags;
1370*cdf0e10cSrcweir                 xSheetOp->clearContents( VALUE | DATETIME | STRING | FORMULA | HARDATTR | STYLES | EDITATTR | FORMATTED );
1371*cdf0e10cSrcweir             }
1372*cdf0e10cSrcweir             catch( Exception& )
1373*cdf0e10cSrcweir             {
1374*cdf0e10cSrcweir             }
1375*cdf0e10cSrcweir 
1376*cdf0e10cSrcweir             try
1377*cdf0e10cSrcweir             {
1378*cdf0e10cSrcweir                 // create a new data pilot descriptor based on the source data
1379*cdf0e10cSrcweir                 Reference< XDataPilotTablesSupplier > xDPTablesSupp( getSheetFromDoc( maLocationModel.maRange.Sheet ), UNO_QUERY_THROW );
1380*cdf0e10cSrcweir                 Reference< XDataPilotTables > xDPTables( xDPTablesSupp->getDataPilotTables(), UNO_SET_THROW );
1381*cdf0e10cSrcweir                 mxDPDescriptor.set( xDPTables->createDataPilotDescriptor(), UNO_SET_THROW );
1382*cdf0e10cSrcweir                 mxDPDescriptor->setSourceRange( mpPivotCache->getSourceRange() );
1383*cdf0e10cSrcweir                 mxDPDescriptor->setTag( maDefModel.maTag );
1384*cdf0e10cSrcweir 
1385*cdf0e10cSrcweir                 // global data pilot properties
1386*cdf0e10cSrcweir                 PropertySet aDescProp( mxDPDescriptor );
1387*cdf0e10cSrcweir                 aDescProp.setProperty( PROP_ColumnGrand, maDefModel.mbColGrandTotals );
1388*cdf0e10cSrcweir                 aDescProp.setProperty( PROP_RowGrand, maDefModel.mbRowGrandTotals );
1389*cdf0e10cSrcweir                 aDescProp.setProperty( PROP_ShowFilterButton, false );
1390*cdf0e10cSrcweir                 aDescProp.setProperty( PROP_DrillDownOnDoubleClick, maDefModel.mbEnableDrill );
1391*cdf0e10cSrcweir 
1392*cdf0e10cSrcweir                 // finalize all fields, this finds field names and creates grouping fields
1393*cdf0e10cSrcweir                 maFields.forEachMem( &PivotTableField::finalizeImport, ::boost::cref( mxDPDescriptor ) );
1394*cdf0e10cSrcweir 
1395*cdf0e10cSrcweir                 // all row fields
1396*cdf0e10cSrcweir                 for( IndexVector::iterator aIt = maRowFields.begin(), aEnd = maRowFields.end(); aIt != aEnd; ++aIt )
1397*cdf0e10cSrcweir                     if( PivotTableField* pField = getTableField( *aIt ) )
1398*cdf0e10cSrcweir                         pField->convertRowField();
1399*cdf0e10cSrcweir 
1400*cdf0e10cSrcweir                 // all column fields
1401*cdf0e10cSrcweir                 for( IndexVector::iterator aIt = maColFields.begin(), aEnd = maColFields.end(); aIt != aEnd; ++aIt )
1402*cdf0e10cSrcweir                     if( PivotTableField* pField = getTableField( *aIt ) )
1403*cdf0e10cSrcweir                         pField->convertColField();
1404*cdf0e10cSrcweir 
1405*cdf0e10cSrcweir                 // all page fields
1406*cdf0e10cSrcweir                 for( PageFieldVector::iterator aIt = maPageFields.begin(), aEnd = maPageFields.end(); aIt != aEnd; ++aIt )
1407*cdf0e10cSrcweir                     if( PivotTableField* pField = getTableField( aIt->mnField ) )
1408*cdf0e10cSrcweir                         pField->convertPageField( *aIt );
1409*cdf0e10cSrcweir 
1410*cdf0e10cSrcweir                 // all hidden fields
1411*cdf0e10cSrcweir                 ::std::set< sal_Int32 > aVisFields;
1412*cdf0e10cSrcweir                 aVisFields.insert( maRowFields.begin(), maRowFields.end() );
1413*cdf0e10cSrcweir                 aVisFields.insert( maColFields.begin(), maColFields.end() );
1414*cdf0e10cSrcweir                 for( PageFieldVector::iterator aIt = maPageFields.begin(), aEnd = maPageFields.end(); aIt != aEnd; ++aIt )
1415*cdf0e10cSrcweir                     aVisFields.insert( aIt->mnField );
1416*cdf0e10cSrcweir                 for( PivotTableFieldVector::iterator aBeg = maFields.begin(), aIt = aBeg, aEnd = maFields.end(); aIt != aEnd; ++aIt )
1417*cdf0e10cSrcweir                     if( aVisFields.count( static_cast< sal_Int32 >( aIt - aBeg ) ) == 0 )
1418*cdf0e10cSrcweir                         (*aIt)->convertHiddenField();
1419*cdf0e10cSrcweir 
1420*cdf0e10cSrcweir                 // all data fields
1421*cdf0e10cSrcweir                 for( DataFieldVector::iterator aIt = maDataFields.begin(), aEnd = maDataFields.end(); aIt != aEnd; ++aIt )
1422*cdf0e10cSrcweir                     if( PivotTableField* pField = getTableField( aIt->mnField ) )
1423*cdf0e10cSrcweir                         pField->convertDataField( *aIt );
1424*cdf0e10cSrcweir 
1425*cdf0e10cSrcweir                 // filters
1426*cdf0e10cSrcweir                 maFilters.forEachMem( &PivotTableFilter::finalizeImport );
1427*cdf0e10cSrcweir 
1428*cdf0e10cSrcweir                 // calculate base position of table
1429*cdf0e10cSrcweir                 CellAddress aPos( maLocationModel.maRange.Sheet, maLocationModel.maRange.StartColumn, maLocationModel.maRange.StartRow );
1430*cdf0e10cSrcweir                 /*  If page fields exist, include them into the destination
1431*cdf0e10cSrcweir                     area (they are excluded in Excel). Add an extra blank row. */
1432*cdf0e10cSrcweir                 if( !maPageFields.empty() )
1433*cdf0e10cSrcweir                     aPos.Row = ::std::max< sal_Int32 >( static_cast< sal_Int32 >( aPos.Row - maPageFields.size() - 1 ), 0 );
1434*cdf0e10cSrcweir 
1435*cdf0e10cSrcweir                 // insert the DataPilot table into the sheet
1436*cdf0e10cSrcweir                 xDPTables->insertNewByName( maDefModel.maName, aPos, mxDPDescriptor );
1437*cdf0e10cSrcweir             }
1438*cdf0e10cSrcweir             catch( Exception& )
1439*cdf0e10cSrcweir             {
1440*cdf0e10cSrcweir                 OSL_ENSURE( false, "PivotTable::finalizeImport - exception while creating the DataPilot table" );
1441*cdf0e10cSrcweir             }
1442*cdf0e10cSrcweir         }
1443*cdf0e10cSrcweir     }
1444*cdf0e10cSrcweir }
1445*cdf0e10cSrcweir 
1446*cdf0e10cSrcweir void PivotTable::finalizeDateGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, sal_Int32 nBaseFieldIdx )
1447*cdf0e10cSrcweir {
1448*cdf0e10cSrcweir     // process all fields, there is no chaining information in the cache fields
1449*cdf0e10cSrcweir     maFields.forEachMem( &PivotTableField::finalizeDateGroupingImport, ::boost::cref( rxBaseDPField ), nBaseFieldIdx );
1450*cdf0e10cSrcweir }
1451*cdf0e10cSrcweir 
1452*cdf0e10cSrcweir void PivotTable::finalizeParentGroupingImport( const Reference< XDataPilotField >& rxBaseDPField,
1453*cdf0e10cSrcweir         const PivotCacheField& rBaseCacheField, PivotCacheGroupItemVector& orItemNames )
1454*cdf0e10cSrcweir {
1455*cdf0e10cSrcweir     // try to create parent group fields that group the items of the passed base field
1456*cdf0e10cSrcweir     if( PivotTableField* pParentTableField = maFields.get( rBaseCacheField.getParentGroupField() ).get() )
1457*cdf0e10cSrcweir         pParentTableField->finalizeParentGroupingImport( rxBaseDPField, orItemNames );
1458*cdf0e10cSrcweir }
1459*cdf0e10cSrcweir 
1460*cdf0e10cSrcweir Reference< XDataPilotField > PivotTable::getDataPilotField( const OUString& rFieldName ) const
1461*cdf0e10cSrcweir {
1462*cdf0e10cSrcweir     Reference< XDataPilotField > xDPField;
1463*cdf0e10cSrcweir     if( (rFieldName.getLength() > 0) && mxDPDescriptor.is() ) try
1464*cdf0e10cSrcweir     {
1465*cdf0e10cSrcweir         Reference< XNameAccess > xDPFieldsNA( mxDPDescriptor->getDataPilotFields(), UNO_QUERY_THROW );
1466*cdf0e10cSrcweir         xDPField.set( xDPFieldsNA->getByName( rFieldName ), UNO_QUERY );
1467*cdf0e10cSrcweir     }
1468*cdf0e10cSrcweir     catch( Exception& )
1469*cdf0e10cSrcweir     {
1470*cdf0e10cSrcweir     }
1471*cdf0e10cSrcweir     return xDPField;
1472*cdf0e10cSrcweir }
1473*cdf0e10cSrcweir 
1474*cdf0e10cSrcweir Reference< XDataPilotField > PivotTable::getDataPilotField( sal_Int32 nFieldIdx ) const
1475*cdf0e10cSrcweir {
1476*cdf0e10cSrcweir     Reference< XDataPilotField > xDPField;
1477*cdf0e10cSrcweir     if( const PivotTableField* pTableField = maFields.get( nFieldIdx ).get() )
1478*cdf0e10cSrcweir         xDPField = getDataPilotField( pTableField->getDPFieldName() );
1479*cdf0e10cSrcweir     return xDPField;
1480*cdf0e10cSrcweir }
1481*cdf0e10cSrcweir 
1482*cdf0e10cSrcweir Reference< XDataPilotField > PivotTable::getDataLayoutField() const
1483*cdf0e10cSrcweir {
1484*cdf0e10cSrcweir     Reference< XDataPilotField > xDPField;
1485*cdf0e10cSrcweir     try
1486*cdf0e10cSrcweir     {
1487*cdf0e10cSrcweir         Reference< XDataPilotDataLayoutFieldSupplier > xDPDataFieldSupp( mxDPDescriptor, UNO_QUERY_THROW );
1488*cdf0e10cSrcweir         xDPField = xDPDataFieldSupp->getDataLayoutField();
1489*cdf0e10cSrcweir     }
1490*cdf0e10cSrcweir     catch( Exception& )
1491*cdf0e10cSrcweir     {
1492*cdf0e10cSrcweir     }
1493*cdf0e10cSrcweir     return xDPField;
1494*cdf0e10cSrcweir }
1495*cdf0e10cSrcweir 
1496*cdf0e10cSrcweir const PivotCacheField* PivotTable::getCacheField( sal_Int32 nFieldIdx ) const
1497*cdf0e10cSrcweir {
1498*cdf0e10cSrcweir     return mpPivotCache ? mpPivotCache->getCacheField( nFieldIdx ) : 0;
1499*cdf0e10cSrcweir }
1500*cdf0e10cSrcweir 
1501*cdf0e10cSrcweir const PivotCacheField* PivotTable::getCacheFieldOfDataField( sal_Int32 nDataItemIdx ) const
1502*cdf0e10cSrcweir {
1503*cdf0e10cSrcweir     const PTDataFieldModel* pDataField = ContainerHelper::getVectorElement( maDataFields, nDataItemIdx );
1504*cdf0e10cSrcweir     return pDataField ? getCacheField( pDataField->mnField ) : 0;
1505*cdf0e10cSrcweir }
1506*cdf0e10cSrcweir 
1507*cdf0e10cSrcweir sal_Int32 PivotTable::getCacheDatabaseIndex( sal_Int32 nFieldIdx ) const
1508*cdf0e10cSrcweir {
1509*cdf0e10cSrcweir     return mpPivotCache ? mpPivotCache->getCacheDatabaseIndex( nFieldIdx ) : -1;
1510*cdf0e10cSrcweir }
1511*cdf0e10cSrcweir 
1512*cdf0e10cSrcweir // private --------------------------------------------------------------------
1513*cdf0e10cSrcweir 
1514*cdf0e10cSrcweir PivotTableField* PivotTable::getTableField( sal_Int32 nFieldIdx )
1515*cdf0e10cSrcweir {
1516*cdf0e10cSrcweir     return (nFieldIdx == OOX_PT_DATALAYOUTFIELD) ? &maDataField : maFields.get( nFieldIdx ).get();
1517*cdf0e10cSrcweir }
1518*cdf0e10cSrcweir 
1519*cdf0e10cSrcweir void PivotTable::importField( IndexVector& orFields, const AttributeList& rAttribs )
1520*cdf0e10cSrcweir {
1521*cdf0e10cSrcweir     orFields.push_back( rAttribs.getInteger( XML_x, -1 ) );
1522*cdf0e10cSrcweir }
1523*cdf0e10cSrcweir 
1524*cdf0e10cSrcweir void PivotTable::importFields( IndexVector& orFields, SequenceInputStream& rStrm )
1525*cdf0e10cSrcweir {
1526*cdf0e10cSrcweir     OSL_ENSURE( orFields.empty(), "PivotTable::importFields - multiple record instances" );
1527*cdf0e10cSrcweir     orFields.clear();
1528*cdf0e10cSrcweir     sal_Int32 nCount = rStrm.readInt32();
1529*cdf0e10cSrcweir     OSL_ENSURE( 4 * nCount == rStrm.getRemaining(), "PivotTable::importFields - invalid field count" );
1530*cdf0e10cSrcweir     nCount = static_cast< sal_Int32 >( rStrm.getRemaining() / 4 );
1531*cdf0e10cSrcweir     for( sal_Int32 nIdx = 0; nIdx < nCount; ++nIdx )
1532*cdf0e10cSrcweir         orFields.push_back( rStrm.readInt32() );
1533*cdf0e10cSrcweir }
1534*cdf0e10cSrcweir 
1535*cdf0e10cSrcweir void PivotTable::importFields( IndexVector& orFields, BiffInputStream& rStrm, sal_Int32 nCount )
1536*cdf0e10cSrcweir {
1537*cdf0e10cSrcweir     OSL_ENSURE( orFields.empty(), "PivotTable::importFields - multiple record instances" );
1538*cdf0e10cSrcweir     orFields.clear();
1539*cdf0e10cSrcweir     OSL_ENSURE( 2 * nCount == rStrm.getRemaining(), "PivotTable::importFields - invalid field count" );
1540*cdf0e10cSrcweir     nCount = static_cast< sal_Int32 >( rStrm.getRemaining() / 2 );
1541*cdf0e10cSrcweir     for( sal_Int32 nIdx = 0; nIdx < nCount; ++nIdx )
1542*cdf0e10cSrcweir         orFields.push_back( rStrm.readInt16() );
1543*cdf0e10cSrcweir }
1544*cdf0e10cSrcweir 
1545*cdf0e10cSrcweir // ============================================================================
1546*cdf0e10cSrcweir 
1547*cdf0e10cSrcweir PivotTableBuffer::PivotTableBuffer( const WorkbookHelper& rHelper ) :
1548*cdf0e10cSrcweir     WorkbookHelper( rHelper )
1549*cdf0e10cSrcweir {
1550*cdf0e10cSrcweir }
1551*cdf0e10cSrcweir 
1552*cdf0e10cSrcweir PivotTable& PivotTableBuffer::createPivotTable()
1553*cdf0e10cSrcweir {
1554*cdf0e10cSrcweir     PivotTableVector::value_type xTable( new PivotTable( *this ) );
1555*cdf0e10cSrcweir     maTables.push_back( xTable );
1556*cdf0e10cSrcweir     return *xTable;
1557*cdf0e10cSrcweir }
1558*cdf0e10cSrcweir 
1559*cdf0e10cSrcweir void PivotTableBuffer::finalizeImport()
1560*cdf0e10cSrcweir {
1561*cdf0e10cSrcweir     maTables.forEachMem( &PivotTable::finalizeImport );
1562*cdf0e10cSrcweir }
1563*cdf0e10cSrcweir 
1564*cdf0e10cSrcweir // ============================================================================
1565*cdf0e10cSrcweir 
1566*cdf0e10cSrcweir } // namespace xls
1567*cdf0e10cSrcweir } // namespace oox
1568