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 10cdf0e10cSrcweir * 11*ca5ec200SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 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. 19cdf0e10cSrcweir * 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 40cdf0e10cSrcweir PivotTableFieldContext::PivotTableFieldContext( WorksheetFragmentBase& rFragment, PivotTableField& rTableField ) : 41cdf0e10cSrcweir WorksheetContextBase( rFragment ), 42cdf0e10cSrcweir mrTableField( rTableField ) 43cdf0e10cSrcweir { 44cdf0e10cSrcweir } 45cdf0e10cSrcweir 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 76cdf0e10cSrcweir void PivotTableFieldContext::onStartElement( const AttributeList& rAttribs ) 77cdf0e10cSrcweir { 78cdf0e10cSrcweir if( isRootElement() ) 79cdf0e10cSrcweir mrTableField.importPivotField( rAttribs ); 80cdf0e10cSrcweir } 81cdf0e10cSrcweir 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 112cdf0e10cSrcweir void PivotTableFieldContext::onStartRecord( SequenceInputStream& rStrm ) 113cdf0e10cSrcweir { 114cdf0e10cSrcweir if( isRootElement() ) 115cdf0e10cSrcweir mrTableField.importPTField( rStrm ); 116cdf0e10cSrcweir } 117cdf0e10cSrcweir 118cdf0e10cSrcweir // ============================================================================ 119cdf0e10cSrcweir 120cdf0e10cSrcweir PivotTableFilterContext::PivotTableFilterContext( WorksheetFragmentBase& rFragment, PivotTableFilter& rTableFilter ) : 121cdf0e10cSrcweir WorksheetContextBase( rFragment ), 122cdf0e10cSrcweir mrTableFilter( rTableFilter ) 123cdf0e10cSrcweir { 124cdf0e10cSrcweir } 125cdf0e10cSrcweir 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 143cdf0e10cSrcweir void PivotTableFilterContext::onStartElement( const AttributeList& rAttribs ) 144cdf0e10cSrcweir { 145cdf0e10cSrcweir if( isRootElement() ) 146cdf0e10cSrcweir mrTableFilter.importFilter( rAttribs ); 147cdf0e10cSrcweir } 148cdf0e10cSrcweir 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 166cdf0e10cSrcweir void PivotTableFilterContext::onStartRecord( SequenceInputStream& rStrm ) 167cdf0e10cSrcweir { 168cdf0e10cSrcweir if( isRootElement() ) 169cdf0e10cSrcweir mrTableFilter.importPTFilter( rStrm ); 170cdf0e10cSrcweir } 171cdf0e10cSrcweir 172cdf0e10cSrcweir // ============================================================================ 173cdf0e10cSrcweir 174cdf0e10cSrcweir PivotTableFragment::PivotTableFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : 175cdf0e10cSrcweir WorksheetFragmentBase( rHelper, rFragmentPath ), 176cdf0e10cSrcweir mrPivotTable( getPivotTables().createPivotTable() ) 177cdf0e10cSrcweir { 178cdf0e10cSrcweir } 179cdf0e10cSrcweir 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 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 260cdf0e10cSrcweir 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 293cdf0e10cSrcweir BiffPivotTableContext::BiffPivotTableContext( const WorksheetHelper& rHelper ) : 294cdf0e10cSrcweir BiffWorksheetContextBase( rHelper ), 295cdf0e10cSrcweir mrPivotTable( getPivotTables().createPivotTable() ) 296cdf0e10cSrcweir { 297cdf0e10cSrcweir } 298cdf0e10cSrcweir 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