1*ca5ec200SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*ca5ec200SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*ca5ec200SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*ca5ec200SAndrew Rist * distributed with this work for additional information
6*ca5ec200SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*ca5ec200SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*ca5ec200SAndrew Rist * "License"); you may not use this file except in compliance
9*ca5ec200SAndrew Rist * with the License. You may obtain a copy of the License at
10*ca5ec200SAndrew Rist *
11*ca5ec200SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*ca5ec200SAndrew Rist *
13*ca5ec200SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*ca5ec200SAndrew Rist * software distributed under the License is distributed on an
15*ca5ec200SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*ca5ec200SAndrew Rist * KIND, either express or implied. See the License for the
17*ca5ec200SAndrew Rist * specific language governing permissions and limitations
18*ca5ec200SAndrew Rist * under the License.
19*ca5ec200SAndrew Rist *
20*ca5ec200SAndrew Rist *************************************************************/
21*ca5ec200SAndrew Rist
22*ca5ec200SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir #include "oox/xls/pivottablefragment.hxx"
25cdf0e10cSrcweir
26cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx"
27cdf0e10cSrcweir #include "oox/xls/pivottablebuffer.hxx"
28cdf0e10cSrcweir
29cdf0e10cSrcweir namespace oox {
30cdf0e10cSrcweir namespace xls {
31cdf0e10cSrcweir
32cdf0e10cSrcweir // ============================================================================
33cdf0e10cSrcweir
34cdf0e10cSrcweir using namespace ::oox::core;
35cdf0e10cSrcweir
36cdf0e10cSrcweir using ::rtl::OUString;
37cdf0e10cSrcweir
38cdf0e10cSrcweir // ============================================================================
39cdf0e10cSrcweir
PivotTableFieldContext(WorksheetFragmentBase & rFragment,PivotTableField & rTableField)40cdf0e10cSrcweir PivotTableFieldContext::PivotTableFieldContext( WorksheetFragmentBase& rFragment, PivotTableField& rTableField ) :
41cdf0e10cSrcweir WorksheetContextBase( rFragment ),
42cdf0e10cSrcweir mrTableField( rTableField )
43cdf0e10cSrcweir {
44cdf0e10cSrcweir }
45cdf0e10cSrcweir
onCreateContext(sal_Int32 nElement,const AttributeList & rAttribs)46cdf0e10cSrcweir ContextHandlerRef PivotTableFieldContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
47cdf0e10cSrcweir {
48cdf0e10cSrcweir switch( getCurrentElement() )
49cdf0e10cSrcweir {
50cdf0e10cSrcweir case XLS_TOKEN( pivotField ):
51cdf0e10cSrcweir switch( nElement )
52cdf0e10cSrcweir {
53cdf0e10cSrcweir case XLS_TOKEN( items ): return this;
54cdf0e10cSrcweir case XLS_TOKEN( autoSortScope ): return this;
55cdf0e10cSrcweir }
56cdf0e10cSrcweir break;
57cdf0e10cSrcweir case XLS_TOKEN( items ):
58cdf0e10cSrcweir if( nElement == XLS_TOKEN( item ) ) mrTableField.importItem( rAttribs );
59cdf0e10cSrcweir break;
60cdf0e10cSrcweir case XLS_TOKEN( autoSortScope ):
61cdf0e10cSrcweir if( nElement == XLS_TOKEN( pivotArea ) ) return this;
62cdf0e10cSrcweir break;
63cdf0e10cSrcweir case XLS_TOKEN( pivotArea ):
64cdf0e10cSrcweir if( nElement == XLS_TOKEN( references ) ) return this;
65cdf0e10cSrcweir break;
66cdf0e10cSrcweir case XLS_TOKEN( references ):
67cdf0e10cSrcweir if( nElement == XLS_TOKEN( reference ) ) { mrTableField.importReference( rAttribs ); return this; }
68cdf0e10cSrcweir break;
69cdf0e10cSrcweir case XLS_TOKEN( reference ):
70cdf0e10cSrcweir if( nElement == XLS_TOKEN( x ) ) mrTableField.importReferenceItem( rAttribs );
71cdf0e10cSrcweir break;
72cdf0e10cSrcweir }
73cdf0e10cSrcweir return 0;
74cdf0e10cSrcweir }
75cdf0e10cSrcweir
onStartElement(const AttributeList & rAttribs)76cdf0e10cSrcweir void PivotTableFieldContext::onStartElement( const AttributeList& rAttribs )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir if( isRootElement() )
79cdf0e10cSrcweir mrTableField.importPivotField( rAttribs );
80cdf0e10cSrcweir }
81cdf0e10cSrcweir
onCreateRecordContext(sal_Int32 nRecId,SequenceInputStream & rStrm)82cdf0e10cSrcweir ContextHandlerRef PivotTableFieldContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir switch( getCurrentElement() )
85cdf0e10cSrcweir {
86cdf0e10cSrcweir case BIFF12_ID_PTFIELD:
87cdf0e10cSrcweir switch( nRecId )
88cdf0e10cSrcweir {
89cdf0e10cSrcweir case BIFF12_ID_PTFITEMS: return this;
90cdf0e10cSrcweir case BIFF12_ID_AUTOSORTSCOPE: return this;
91cdf0e10cSrcweir }
92cdf0e10cSrcweir break;
93cdf0e10cSrcweir case BIFF12_ID_PTFITEMS:
94cdf0e10cSrcweir if( nRecId == BIFF12_ID_PTFITEM ) mrTableField.importPTFItem( rStrm );
95cdf0e10cSrcweir break;
96cdf0e10cSrcweir case BIFF12_ID_AUTOSORTSCOPE:
97cdf0e10cSrcweir if( nRecId == BIFF12_ID_PIVOTAREA ) return this;
98cdf0e10cSrcweir break;
99cdf0e10cSrcweir case BIFF12_ID_PIVOTAREA:
100cdf0e10cSrcweir if( nRecId == BIFF12_ID_PTREFERENCES ) return this;
101cdf0e10cSrcweir break;
102cdf0e10cSrcweir case BIFF12_ID_PTREFERENCES:
103cdf0e10cSrcweir if( nRecId == BIFF12_ID_PTREFERENCE ) { mrTableField.importPTReference( rStrm ); return this; }
104cdf0e10cSrcweir break;
105cdf0e10cSrcweir case BIFF12_ID_PTREFERENCE:
106cdf0e10cSrcweir if( nRecId == BIFF12_ID_PTREFERENCEITEM ) mrTableField.importPTReferenceItem( rStrm );
107cdf0e10cSrcweir break;
108cdf0e10cSrcweir }
109cdf0e10cSrcweir return 0;
110cdf0e10cSrcweir }
111cdf0e10cSrcweir
onStartRecord(SequenceInputStream & rStrm)112cdf0e10cSrcweir void PivotTableFieldContext::onStartRecord( SequenceInputStream& rStrm )
113cdf0e10cSrcweir {
114cdf0e10cSrcweir if( isRootElement() )
115cdf0e10cSrcweir mrTableField.importPTField( rStrm );
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
118cdf0e10cSrcweir // ============================================================================
119cdf0e10cSrcweir
PivotTableFilterContext(WorksheetFragmentBase & rFragment,PivotTableFilter & rTableFilter)120cdf0e10cSrcweir PivotTableFilterContext::PivotTableFilterContext( WorksheetFragmentBase& rFragment, PivotTableFilter& rTableFilter ) :
121cdf0e10cSrcweir WorksheetContextBase( rFragment ),
122cdf0e10cSrcweir mrTableFilter( rTableFilter )
123cdf0e10cSrcweir {
124cdf0e10cSrcweir }
125cdf0e10cSrcweir
onCreateContext(sal_Int32 nElement,const AttributeList & rAttribs)126cdf0e10cSrcweir ContextHandlerRef PivotTableFilterContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir switch( getCurrentElement() )
129cdf0e10cSrcweir {
130cdf0e10cSrcweir case XLS_TOKEN( filter ):
131cdf0e10cSrcweir if( nElement == XLS_TOKEN( autoFilter ) ) return this;
132cdf0e10cSrcweir break;
133cdf0e10cSrcweir case XLS_TOKEN( autoFilter ):
134cdf0e10cSrcweir if( nElement == XLS_TOKEN( filterColumn ) ) return this;
135cdf0e10cSrcweir break;
136cdf0e10cSrcweir case XLS_TOKEN( filterColumn ):
137cdf0e10cSrcweir if( nElement == XLS_TOKEN( top10 ) ) mrTableFilter.importTop10( rAttribs );
138cdf0e10cSrcweir break;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir return 0;
141cdf0e10cSrcweir }
142cdf0e10cSrcweir
onStartElement(const AttributeList & rAttribs)143cdf0e10cSrcweir void PivotTableFilterContext::onStartElement( const AttributeList& rAttribs )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir if( isRootElement() )
146cdf0e10cSrcweir mrTableFilter.importFilter( rAttribs );
147cdf0e10cSrcweir }
148cdf0e10cSrcweir
onCreateRecordContext(sal_Int32 nRecId,SequenceInputStream & rStrm)149cdf0e10cSrcweir ContextHandlerRef PivotTableFilterContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir switch( getCurrentElement() )
152cdf0e10cSrcweir {
153cdf0e10cSrcweir case BIFF12_ID_PTFILTER:
154cdf0e10cSrcweir if( nRecId == BIFF12_ID_AUTOFILTER ) return this;
155cdf0e10cSrcweir break;
156cdf0e10cSrcweir case BIFF12_ID_AUTOFILTER:
157cdf0e10cSrcweir if( nRecId == BIFF12_ID_FILTERCOLUMN ) return this;
158cdf0e10cSrcweir break;
159cdf0e10cSrcweir case BIFF12_ID_FILTERCOLUMN:
160cdf0e10cSrcweir if( nRecId == BIFF12_ID_TOP10FILTER ) mrTableFilter.importTop10Filter( rStrm );
161cdf0e10cSrcweir break;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir return 0;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir
onStartRecord(SequenceInputStream & rStrm)166cdf0e10cSrcweir void PivotTableFilterContext::onStartRecord( SequenceInputStream& rStrm )
167cdf0e10cSrcweir {
168cdf0e10cSrcweir if( isRootElement() )
169cdf0e10cSrcweir mrTableFilter.importPTFilter( rStrm );
170cdf0e10cSrcweir }
171cdf0e10cSrcweir
172cdf0e10cSrcweir // ============================================================================
173cdf0e10cSrcweir
PivotTableFragment(const WorksheetHelper & rHelper,const OUString & rFragmentPath)174cdf0e10cSrcweir PivotTableFragment::PivotTableFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) :
175cdf0e10cSrcweir WorksheetFragmentBase( rHelper, rFragmentPath ),
176cdf0e10cSrcweir mrPivotTable( getPivotTables().createPivotTable() )
177cdf0e10cSrcweir {
178cdf0e10cSrcweir }
179cdf0e10cSrcweir
onCreateContext(sal_Int32 nElement,const AttributeList & rAttribs)180cdf0e10cSrcweir ContextHandlerRef PivotTableFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir switch( getCurrentElement() )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir case XML_ROOT_CONTEXT:
185cdf0e10cSrcweir if( nElement == XLS_TOKEN( pivotTableDefinition ) ) { mrPivotTable.importPivotTableDefinition( rAttribs ); return this; }
186cdf0e10cSrcweir break;
187cdf0e10cSrcweir
188cdf0e10cSrcweir case XLS_TOKEN( pivotTableDefinition ):
189cdf0e10cSrcweir switch( nElement )
190cdf0e10cSrcweir {
191cdf0e10cSrcweir case XLS_TOKEN( location ): mrPivotTable.importLocation( rAttribs, getSheetIndex() ); break;
192cdf0e10cSrcweir case XLS_TOKEN( pivotFields ): return this;
193cdf0e10cSrcweir case XLS_TOKEN( rowFields ): return this;
194cdf0e10cSrcweir case XLS_TOKEN( colFields ): return this;
195cdf0e10cSrcweir case XLS_TOKEN( pageFields ): return this;
196cdf0e10cSrcweir case XLS_TOKEN( dataFields ): return this;
197cdf0e10cSrcweir case XLS_TOKEN( filters ): return this;
198cdf0e10cSrcweir }
199cdf0e10cSrcweir break;
200cdf0e10cSrcweir
201cdf0e10cSrcweir case XLS_TOKEN( pivotFields ):
202cdf0e10cSrcweir if( nElement == XLS_TOKEN( pivotField ) ) return new PivotTableFieldContext( *this, mrPivotTable.createTableField() );
203cdf0e10cSrcweir break;
204cdf0e10cSrcweir case XLS_TOKEN( rowFields ):
205cdf0e10cSrcweir if( nElement == XLS_TOKEN( field ) ) mrPivotTable.importRowField( rAttribs );
206cdf0e10cSrcweir break;
207cdf0e10cSrcweir case XLS_TOKEN( colFields ):
208cdf0e10cSrcweir if( nElement == XLS_TOKEN( field ) ) mrPivotTable.importColField( rAttribs );
209cdf0e10cSrcweir break;
210cdf0e10cSrcweir case XLS_TOKEN( pageFields ):
211cdf0e10cSrcweir if( nElement == XLS_TOKEN( pageField ) ) mrPivotTable.importPageField( rAttribs );
212cdf0e10cSrcweir break;
213cdf0e10cSrcweir case XLS_TOKEN( dataFields ):
214cdf0e10cSrcweir if( nElement == XLS_TOKEN( dataField ) ) mrPivotTable.importDataField( rAttribs );
215cdf0e10cSrcweir break;
216cdf0e10cSrcweir case XLS_TOKEN( filters ):
217cdf0e10cSrcweir if( nElement == XLS_TOKEN( filter ) ) return new PivotTableFilterContext( *this, mrPivotTable.createTableFilter() );
218cdf0e10cSrcweir break;
219cdf0e10cSrcweir }
220cdf0e10cSrcweir return 0;
221cdf0e10cSrcweir }
222cdf0e10cSrcweir
onCreateRecordContext(sal_Int32 nRecId,SequenceInputStream & rStrm)223cdf0e10cSrcweir ContextHandlerRef PivotTableFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
224cdf0e10cSrcweir {
225cdf0e10cSrcweir switch( getCurrentElement() )
226cdf0e10cSrcweir {
227cdf0e10cSrcweir case XML_ROOT_CONTEXT:
228cdf0e10cSrcweir if( nRecId == BIFF12_ID_PTDEFINITION ) { mrPivotTable.importPTDefinition( rStrm ); return this; }
229cdf0e10cSrcweir break;
230cdf0e10cSrcweir
231cdf0e10cSrcweir case BIFF12_ID_PTDEFINITION:
232cdf0e10cSrcweir switch( nRecId )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir case BIFF12_ID_PTLOCATION: mrPivotTable.importPTLocation( rStrm, getSheetIndex() ); break;
235cdf0e10cSrcweir case BIFF12_ID_PTFIELDS: return this;
236cdf0e10cSrcweir case BIFF12_ID_PTROWFIELDS: mrPivotTable.importPTRowFields( rStrm ); break;
237cdf0e10cSrcweir case BIFF12_ID_PTCOLFIELDS: mrPivotTable.importPTColFields( rStrm ); break;
238cdf0e10cSrcweir case BIFF12_ID_PTPAGEFIELDS: return this;
239cdf0e10cSrcweir case BIFF12_ID_PTDATAFIELDS: return this;
240cdf0e10cSrcweir case BIFF12_ID_PTFILTERS: return this;
241cdf0e10cSrcweir }
242cdf0e10cSrcweir break;
243cdf0e10cSrcweir
244cdf0e10cSrcweir case BIFF12_ID_PTFIELDS:
245cdf0e10cSrcweir if( nRecId == BIFF12_ID_PTFIELD ) return new PivotTableFieldContext( *this, mrPivotTable.createTableField() );
246cdf0e10cSrcweir break;
247cdf0e10cSrcweir case BIFF12_ID_PTPAGEFIELDS:
248cdf0e10cSrcweir if( nRecId == BIFF12_ID_PTPAGEFIELD ) mrPivotTable.importPTPageField( rStrm );
249cdf0e10cSrcweir break;
250cdf0e10cSrcweir case BIFF12_ID_PTDATAFIELDS:
251cdf0e10cSrcweir if( nRecId == BIFF12_ID_PTDATAFIELD ) mrPivotTable.importPTDataField( rStrm );
252cdf0e10cSrcweir break;
253cdf0e10cSrcweir case BIFF12_ID_PTFILTERS:
254cdf0e10cSrcweir if( nRecId == BIFF12_ID_PTFILTER ) return new PivotTableFilterContext( *this, mrPivotTable.createTableFilter() );
255cdf0e10cSrcweir break;
256cdf0e10cSrcweir }
257cdf0e10cSrcweir return 0;
258cdf0e10cSrcweir }
259cdf0e10cSrcweir
getRecordInfos() const260cdf0e10cSrcweir const RecordInfo* PivotTableFragment::getRecordInfos() const
261cdf0e10cSrcweir {
262cdf0e10cSrcweir static const RecordInfo spRecInfos[] =
263cdf0e10cSrcweir {
264cdf0e10cSrcweir { BIFF12_ID_AUTOFILTER, BIFF12_ID_AUTOFILTER + 1 },
265cdf0e10cSrcweir { BIFF12_ID_AUTOSORTSCOPE, BIFF12_ID_AUTOSORTSCOPE + 1 },
266cdf0e10cSrcweir { BIFF12_ID_FILTERCOLUMN, BIFF12_ID_FILTERCOLUMN + 1 },
267cdf0e10cSrcweir { BIFF12_ID_PIVOTAREA, BIFF12_ID_PIVOTAREA + 1 },
268cdf0e10cSrcweir { BIFF12_ID_PTCOLFIELDS, BIFF12_ID_PTCOLFIELDS + 1 },
269cdf0e10cSrcweir { BIFF12_ID_PTDATAFIELD, BIFF12_ID_PTDATAFIELD + 1 },
270cdf0e10cSrcweir { BIFF12_ID_PTDATAFIELDS, BIFF12_ID_PTDATAFIELDS + 1 },
271cdf0e10cSrcweir { BIFF12_ID_PTDEFINITION, BIFF12_ID_PTDEFINITION + 35 },
272cdf0e10cSrcweir { BIFF12_ID_PTFIELD, BIFF12_ID_PTFIELD + 1 },
273cdf0e10cSrcweir { BIFF12_ID_PTFIELDS, BIFF12_ID_PTFIELDS + 1 },
274cdf0e10cSrcweir { BIFF12_ID_PTFILTER, BIFF12_ID_PTFILTER + 1 },
275cdf0e10cSrcweir { BIFF12_ID_PTFILTERS, BIFF12_ID_PTFILTERS + 1 },
276cdf0e10cSrcweir { BIFF12_ID_PTFITEM, BIFF12_ID_PTFITEM - 1 },
277cdf0e10cSrcweir { BIFF12_ID_PTFITEMS, BIFF12_ID_PTFITEMS + 1 },
278cdf0e10cSrcweir { BIFF12_ID_PTLOCATION, BIFF12_ID_PTLOCATION - 1 },
279cdf0e10cSrcweir { BIFF12_ID_PTPAGEFIELD, BIFF12_ID_PTPAGEFIELD + 1 },
280cdf0e10cSrcweir { BIFF12_ID_PTPAGEFIELDS, BIFF12_ID_PTPAGEFIELDS + 1 },
281cdf0e10cSrcweir { BIFF12_ID_PTREFERENCE, BIFF12_ID_PTREFERENCE + 1 },
282cdf0e10cSrcweir { BIFF12_ID_PTREFERENCEITEM, BIFF12_ID_PTREFERENCEITEM + 1 },
283cdf0e10cSrcweir { BIFF12_ID_PTREFERENCES, BIFF12_ID_PTREFERENCES + 1 },
284cdf0e10cSrcweir { BIFF12_ID_PTROWFIELDS, BIFF12_ID_PTROWFIELDS + 1 },
285cdf0e10cSrcweir { -1, -1 }
286cdf0e10cSrcweir };
287cdf0e10cSrcweir return spRecInfos;
288cdf0e10cSrcweir }
289cdf0e10cSrcweir
290cdf0e10cSrcweir // ============================================================================
291cdf0e10cSrcweir // ============================================================================
292cdf0e10cSrcweir
BiffPivotTableContext(const WorksheetHelper & rHelper)293cdf0e10cSrcweir BiffPivotTableContext::BiffPivotTableContext( const WorksheetHelper& rHelper ) :
294cdf0e10cSrcweir BiffWorksheetContextBase( rHelper ),
295cdf0e10cSrcweir mrPivotTable( getPivotTables().createPivotTable() )
296cdf0e10cSrcweir {
297cdf0e10cSrcweir }
298cdf0e10cSrcweir
importRecord(BiffInputStream & rStrm)299cdf0e10cSrcweir void BiffPivotTableContext::importRecord( BiffInputStream& rStrm )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir switch( rStrm.getRecId() )
302cdf0e10cSrcweir {
303cdf0e10cSrcweir case BIFF_ID_PTDEFINITION: mrPivotTable.importPTDefinition( rStrm, getSheetIndex() ); break;
304cdf0e10cSrcweir case BIFF_ID_PTDEFINITION2: mrPivotTable.importPTDefinition2( rStrm ); break;
305cdf0e10cSrcweir case BIFF_ID_PTFIELD: mrPivotTable.createTableField().importPTField( rStrm ); break;
306cdf0e10cSrcweir case BIFF_ID_PTROWCOLFIELDS: mrPivotTable.importPTRowColFields( rStrm ); break;
307cdf0e10cSrcweir case BIFF_ID_PTPAGEFIELDS: mrPivotTable.importPTPageFields( rStrm ); break;
308cdf0e10cSrcweir case BIFF_ID_PTDATAFIELD: mrPivotTable.importPTDataField( rStrm ); break;
309cdf0e10cSrcweir }
310cdf0e10cSrcweir }
311cdf0e10cSrcweir
312cdf0e10cSrcweir // ============================================================================
313cdf0e10cSrcweir
314cdf0e10cSrcweir } // namespace xls
315cdf0e10cSrcweir } // namespace oox
316