xref: /AOO41X/main/oox/source/xls/worksheetfragment.cxx (revision ca5ec2004b000a7d9aaa8381be8ac2853e3b1dc7)
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/worksheetfragment.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "oox/core/filterbase.hxx"
27cdf0e10cSrcweir #include "oox/core/relations.hxx"
28cdf0e10cSrcweir #include "oox/helper/attributelist.hxx"
29cdf0e10cSrcweir #include "oox/xls/addressconverter.hxx"
30cdf0e10cSrcweir #include "oox/xls/autofilterbuffer.hxx"
31cdf0e10cSrcweir #include "oox/xls/autofiltercontext.hxx"
32cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx"
33cdf0e10cSrcweir #include "oox/xls/commentsfragment.hxx"
34cdf0e10cSrcweir #include "oox/xls/condformatcontext.hxx"
35cdf0e10cSrcweir #include "oox/xls/drawingfragment.hxx"
36cdf0e10cSrcweir #include "oox/xls/drawingmanager.hxx"
37cdf0e10cSrcweir #include "oox/xls/externallinkbuffer.hxx"
38cdf0e10cSrcweir #include "oox/xls/pagesettings.hxx"
39cdf0e10cSrcweir #include "oox/xls/pivottablefragment.hxx"
40cdf0e10cSrcweir #include "oox/xls/querytablefragment.hxx"
41cdf0e10cSrcweir #include "oox/xls/scenariobuffer.hxx"
42cdf0e10cSrcweir #include "oox/xls/scenariocontext.hxx"
43cdf0e10cSrcweir #include "oox/xls/sheetdatabuffer.hxx"
44cdf0e10cSrcweir #include "oox/xls/sheetdatacontext.hxx"
45cdf0e10cSrcweir #include "oox/xls/tablefragment.hxx"
46cdf0e10cSrcweir #include "oox/xls/viewsettings.hxx"
47cdf0e10cSrcweir #include "oox/xls/workbooksettings.hxx"
48cdf0e10cSrcweir #include "oox/xls/worksheetsettings.hxx"
49cdf0e10cSrcweir 
50cdf0e10cSrcweir namespace oox {
51cdf0e10cSrcweir namespace xls {
52cdf0e10cSrcweir 
53cdf0e10cSrcweir // ============================================================================
54cdf0e10cSrcweir 
55cdf0e10cSrcweir using namespace ::com::sun::star::table;
56cdf0e10cSrcweir using namespace ::com::sun::star::uno;
57cdf0e10cSrcweir using namespace ::oox::core;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir using ::rtl::OUString;
60cdf0e10cSrcweir using ::rtl::OUStringBuffer;
61cdf0e10cSrcweir 
62cdf0e10cSrcweir // ============================================================================
63cdf0e10cSrcweir 
64cdf0e10cSrcweir namespace {
65cdf0e10cSrcweir 
66cdf0e10cSrcweir const sal_uInt16 BIFF_COLINFO_HIDDEN        = 0x0001;
67cdf0e10cSrcweir const sal_uInt16 BIFF_COLINFO_SHOWPHONETIC  = 0x0008;
68cdf0e10cSrcweir const sal_uInt16 BIFF_COLINFO_COLLAPSED     = 0x1000;
69cdf0e10cSrcweir 
70cdf0e10cSrcweir const sal_uInt16 BIFF_DEFROW_CUSTOMHEIGHT   = 0x0001;
71cdf0e10cSrcweir const sal_uInt16 BIFF_DEFROW_HIDDEN         = 0x0002;
72cdf0e10cSrcweir const sal_uInt16 BIFF_DEFROW_THICKTOP       = 0x0004;
73cdf0e10cSrcweir const sal_uInt16 BIFF_DEFROW_THICKBOTTOM    = 0x0008;
74cdf0e10cSrcweir const sal_uInt16 BIFF2_DEFROW_DEFHEIGHT     = 0x8000;
75cdf0e10cSrcweir const sal_uInt16 BIFF2_DEFROW_MASK          = 0x7FFF;
76cdf0e10cSrcweir 
77cdf0e10cSrcweir const sal_uInt32 BIFF_DATAVAL_STRINGLIST    = 0x00000080;
78cdf0e10cSrcweir const sal_uInt32 BIFF_DATAVAL_ALLOWBLANK    = 0x00000100;
79cdf0e10cSrcweir const sal_uInt32 BIFF_DATAVAL_NODROPDOWN    = 0x00000200;
80cdf0e10cSrcweir const sal_uInt32 BIFF_DATAVAL_SHOWINPUT     = 0x00040000;
81cdf0e10cSrcweir const sal_uInt32 BIFF_DATAVAL_SHOWERROR     = 0x00080000;
82cdf0e10cSrcweir 
83cdf0e10cSrcweir const sal_uInt32 BIFF_SHRFEATHEAD_SHEETPROT = 2;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir const sal_Int32 BIFF12_OLEOBJECT_CONTENT    = 1;
86cdf0e10cSrcweir const sal_Int32 BIFF12_OLEOBJECT_ICON       = 4;
87cdf0e10cSrcweir const sal_Int32 BIFF12_OLEOBJECT_ALWAYS     = 1;
88cdf0e10cSrcweir const sal_Int32 BIFF12_OLEOBJECT_ONCALL     = 3;
89cdf0e10cSrcweir const sal_uInt16 BIFF12_OLEOBJECT_LINKED    = 0x0001;
90cdf0e10cSrcweir const sal_uInt16 BIFF12_OLEOBJECT_AUTOLOAD  = 0x0002;
91cdf0e10cSrcweir 
92cdf0e10cSrcweir } // namespace
93cdf0e10cSrcweir 
94cdf0e10cSrcweir // ============================================================================
95cdf0e10cSrcweir 
96cdf0e10cSrcweir DataValidationsContext::DataValidationsContext( WorksheetFragmentBase& rFragment ) :
97cdf0e10cSrcweir     WorksheetContextBase( rFragment )
98cdf0e10cSrcweir {
99cdf0e10cSrcweir }
100cdf0e10cSrcweir 
101cdf0e10cSrcweir ContextHandlerRef DataValidationsContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
102cdf0e10cSrcweir {
103cdf0e10cSrcweir     switch( getCurrentElement() )
104cdf0e10cSrcweir     {
105cdf0e10cSrcweir         case XLS_TOKEN( dataValidations ):
106cdf0e10cSrcweir             if( nElement == XLS_TOKEN( dataValidation ) )
107cdf0e10cSrcweir             {
108cdf0e10cSrcweir                 importDataValidation( rAttribs );
109cdf0e10cSrcweir                 return this;
110cdf0e10cSrcweir             }
111cdf0e10cSrcweir         break;
112cdf0e10cSrcweir         case XLS_TOKEN( dataValidation ):
113cdf0e10cSrcweir             switch( nElement )
114cdf0e10cSrcweir             {
115cdf0e10cSrcweir                 case XLS_TOKEN( formula1 ):
116cdf0e10cSrcweir                 case XLS_TOKEN( formula2 ):
117cdf0e10cSrcweir                     return this;    // collect formulas in onCharacters()
118cdf0e10cSrcweir             }
119cdf0e10cSrcweir         break;
120cdf0e10cSrcweir     }
121cdf0e10cSrcweir     return 0;
122cdf0e10cSrcweir }
123cdf0e10cSrcweir 
124cdf0e10cSrcweir void DataValidationsContext::onCharacters( const OUString& rChars )
125cdf0e10cSrcweir {
126cdf0e10cSrcweir     if( mxValModel.get() ) switch( getCurrentElement() )
127cdf0e10cSrcweir     {
128cdf0e10cSrcweir         case XLS_TOKEN( formula1 ):
129cdf0e10cSrcweir             mxValModel->maTokens1 = getFormulaParser().importFormula( mxValModel->maRanges.getBaseAddress(), rChars );
130cdf0e10cSrcweir             // process string list of a list validation (convert to list of string tokens)
131cdf0e10cSrcweir             if( mxValModel->mnType == XML_list )
132cdf0e10cSrcweir                 getFormulaParser().convertStringToStringList( mxValModel->maTokens1, ',', true );
133cdf0e10cSrcweir         break;
134cdf0e10cSrcweir         case XLS_TOKEN( formula2 ):
135cdf0e10cSrcweir             mxValModel->maTokens2 = getFormulaParser().importFormula( mxValModel->maRanges.getBaseAddress(), rChars );
136cdf0e10cSrcweir         break;
137cdf0e10cSrcweir     }
138cdf0e10cSrcweir }
139cdf0e10cSrcweir 
140cdf0e10cSrcweir void DataValidationsContext::onEndElement()
141cdf0e10cSrcweir {
142cdf0e10cSrcweir     if( isCurrentElement( XLS_TOKEN( dataValidation ) ) && mxValModel.get() )
143cdf0e10cSrcweir     {
144cdf0e10cSrcweir         setValidation( *mxValModel );
145cdf0e10cSrcweir         mxValModel.reset();
146cdf0e10cSrcweir     }
147cdf0e10cSrcweir }
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 
150cdf0e10cSrcweir ContextHandlerRef DataValidationsContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir     if( nRecId == BIFF12_ID_DATAVALIDATION )
153cdf0e10cSrcweir         importDataValidation( rStrm );
154cdf0e10cSrcweir     return 0;
155cdf0e10cSrcweir }
156cdf0e10cSrcweir 
157cdf0e10cSrcweir void DataValidationsContext::importDataValidation( const AttributeList& rAttribs )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir     mxValModel.reset( new ValidationModel );
160cdf0e10cSrcweir     getAddressConverter().convertToCellRangeList( mxValModel->maRanges, rAttribs.getString( XML_sqref, OUString() ), getSheetIndex(), true );
161cdf0e10cSrcweir     mxValModel->maInputTitle   = rAttribs.getXString( XML_promptTitle, OUString() );
162cdf0e10cSrcweir     mxValModel->maInputMessage = rAttribs.getXString( XML_prompt, OUString() );
163cdf0e10cSrcweir     mxValModel->maErrorTitle   = rAttribs.getXString( XML_errorTitle, OUString() );
164cdf0e10cSrcweir     mxValModel->maErrorMessage = rAttribs.getXString( XML_error, OUString() );
165cdf0e10cSrcweir     mxValModel->mnType         = rAttribs.getToken( XML_type, XML_none );
166cdf0e10cSrcweir     mxValModel->mnOperator     = rAttribs.getToken( XML_operator, XML_between );
167cdf0e10cSrcweir     mxValModel->mnErrorStyle   = rAttribs.getToken( XML_errorStyle, XML_stop );
168cdf0e10cSrcweir     mxValModel->mbShowInputMsg = rAttribs.getBool( XML_showInputMessage, false );
169cdf0e10cSrcweir     mxValModel->mbShowErrorMsg = rAttribs.getBool( XML_showErrorMessage, false );
170cdf0e10cSrcweir     /*  The attribute showDropDown@dataValidation is in fact a "suppress
171cdf0e10cSrcweir         dropdown" flag, as it was in the BIFF format! ECMA specification
172cdf0e10cSrcweir         and attribute name are plain wrong! */
173cdf0e10cSrcweir     mxValModel->mbNoDropDown   = rAttribs.getBool( XML_showDropDown, false );
174cdf0e10cSrcweir     mxValModel->mbAllowBlank   = rAttribs.getBool( XML_allowBlank, false );
175cdf0e10cSrcweir }
176cdf0e10cSrcweir 
177cdf0e10cSrcweir void DataValidationsContext::importDataValidation( SequenceInputStream& rStrm )
178cdf0e10cSrcweir {
179cdf0e10cSrcweir     ValidationModel aModel;
180cdf0e10cSrcweir 
181cdf0e10cSrcweir     sal_uInt32 nFlags;
182cdf0e10cSrcweir     BinRangeList aRanges;
183cdf0e10cSrcweir     rStrm >> nFlags >> aRanges >> aModel.maErrorTitle >> aModel.maErrorMessage >> aModel.maInputTitle >> aModel.maInputMessage;
184cdf0e10cSrcweir 
185cdf0e10cSrcweir     // equal flags in all BIFFs
186cdf0e10cSrcweir     aModel.setBiffType( extractValue< sal_uInt8 >( nFlags, 0, 4 ) );
187cdf0e10cSrcweir     aModel.setBiffOperator( extractValue< sal_uInt8 >( nFlags, 20, 4 ) );
188cdf0e10cSrcweir     aModel.setBiffErrorStyle( extractValue< sal_uInt8 >( nFlags, 4, 3 ) );
189cdf0e10cSrcweir     aModel.mbAllowBlank   = getFlag( nFlags, BIFF_DATAVAL_ALLOWBLANK );
190cdf0e10cSrcweir     aModel.mbNoDropDown   = getFlag( nFlags, BIFF_DATAVAL_NODROPDOWN );
191cdf0e10cSrcweir     aModel.mbShowInputMsg = getFlag( nFlags, BIFF_DATAVAL_SHOWINPUT );
192cdf0e10cSrcweir     aModel.mbShowErrorMsg = getFlag( nFlags, BIFF_DATAVAL_SHOWERROR );
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     // cell range list
195cdf0e10cSrcweir     getAddressConverter().convertToCellRangeList( aModel.maRanges, aRanges, getSheetIndex(), true );
196cdf0e10cSrcweir 
197cdf0e10cSrcweir     // condition formula(s)
198cdf0e10cSrcweir     FormulaParser& rParser = getFormulaParser();
199cdf0e10cSrcweir     CellAddress aBaseAddr = aModel.maRanges.getBaseAddress();
200cdf0e10cSrcweir     aModel.maTokens1 = rParser.importFormula( aBaseAddr, FORMULATYPE_VALIDATION, rStrm );
201cdf0e10cSrcweir     aModel.maTokens2 = rParser.importFormula( aBaseAddr, FORMULATYPE_VALIDATION, rStrm );
202cdf0e10cSrcweir     // process string list of a list validation (convert to list of string tokens)
203cdf0e10cSrcweir     if( (aModel.mnType == XML_list) && getFlag( nFlags, BIFF_DATAVAL_STRINGLIST ) )
204cdf0e10cSrcweir         rParser.convertStringToStringList( aModel.maTokens1, ',', true );
205cdf0e10cSrcweir 
206cdf0e10cSrcweir     // set validation data
207cdf0e10cSrcweir     setValidation( aModel );
208cdf0e10cSrcweir }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir // ============================================================================
211cdf0e10cSrcweir 
212cdf0e10cSrcweir WorksheetFragment::WorksheetFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) :
213cdf0e10cSrcweir     WorksheetFragmentBase( rHelper, rFragmentPath )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir     // import data tables related to this worksheet
216cdf0e10cSrcweir     RelationsRef xTableRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATION_TYPE( "table" ) );
217cdf0e10cSrcweir     for( Relations::const_iterator aIt = xTableRels->begin(), aEnd = xTableRels->end(); aIt != aEnd; ++aIt )
218cdf0e10cSrcweir         importOoxFragment( new TableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) );
219cdf0e10cSrcweir 
220cdf0e10cSrcweir     // import comments related to this worksheet
221cdf0e10cSrcweir     OUString aCommentsFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "comments" ) );
222cdf0e10cSrcweir     if( aCommentsFragmentPath.getLength() > 0 )
223cdf0e10cSrcweir         importOoxFragment( new CommentsFragment( *this, aCommentsFragmentPath ) );
224cdf0e10cSrcweir }
225cdf0e10cSrcweir 
226cdf0e10cSrcweir ContextHandlerRef WorksheetFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
227cdf0e10cSrcweir {
228cdf0e10cSrcweir     switch( getCurrentElement() )
229cdf0e10cSrcweir     {
230cdf0e10cSrcweir         case XML_ROOT_CONTEXT: switch( getSheetType() )
231cdf0e10cSrcweir         {
232cdf0e10cSrcweir             case SHEETTYPE_WORKSHEET:   return (nElement == XLS_TOKEN( worksheet )) ? this : 0;
233cdf0e10cSrcweir             case SHEETTYPE_CHARTSHEET:  return 0;
234cdf0e10cSrcweir             case SHEETTYPE_MACROSHEET:  return (nElement == XM_TOKEN( macrosheet )) ? this : 0;
235cdf0e10cSrcweir             case SHEETTYPE_DIALOGSHEET: return (nElement == XLS_TOKEN( dialogsheet )) ? this : 0;
236cdf0e10cSrcweir             case SHEETTYPE_MODULESHEET: return 0;
237cdf0e10cSrcweir             case SHEETTYPE_EMPTYSHEET:  return 0;
238cdf0e10cSrcweir         }
239cdf0e10cSrcweir         break;
240cdf0e10cSrcweir 
241cdf0e10cSrcweir         case XLS_TOKEN( worksheet ):
242cdf0e10cSrcweir         case XM_TOKEN( macrosheet ):
243cdf0e10cSrcweir         case XLS_TOKEN( dialogsheet ):
244cdf0e10cSrcweir             switch( nElement )
245cdf0e10cSrcweir             {
246cdf0e10cSrcweir                 case XLS_TOKEN( sheetData ):                return new SheetDataContext( *this );
247cdf0e10cSrcweir                 case XLS_TOKEN( conditionalFormatting ):    return new CondFormatContext( *this );
248cdf0e10cSrcweir                 case XLS_TOKEN( dataValidations ):          return new DataValidationsContext( *this );
249cdf0e10cSrcweir                 case XLS_TOKEN( autoFilter ):               return new AutoFilterContext( *this, getAutoFilters().createAutoFilter() );
250cdf0e10cSrcweir                 case XLS_TOKEN( scenarios ):                return new ScenariosContext( *this );
251cdf0e10cSrcweir 
252cdf0e10cSrcweir                 case XLS_TOKEN( sheetViews ):
253cdf0e10cSrcweir                 case XLS_TOKEN( cols ):
254cdf0e10cSrcweir                 case XLS_TOKEN( mergeCells ):
255cdf0e10cSrcweir                 case XLS_TOKEN( hyperlinks ):
256cdf0e10cSrcweir                 case XLS_TOKEN( rowBreaks ):
257cdf0e10cSrcweir                 case XLS_TOKEN( colBreaks ):
258cdf0e10cSrcweir                 case XLS_TOKEN( oleObjects ):
259cdf0e10cSrcweir                 case XLS_TOKEN( controls ):         return this;
260cdf0e10cSrcweir 
261cdf0e10cSrcweir                 case XLS_TOKEN( sheetPr ):          getWorksheetSettings().importSheetPr( rAttribs );               return this;
262cdf0e10cSrcweir                 case XLS_TOKEN( dimension ):        importDimension( rAttribs );                                    break;
263cdf0e10cSrcweir                 case XLS_TOKEN( sheetFormatPr ):    importSheetFormatPr( rAttribs );                                break;
264cdf0e10cSrcweir                 case XLS_TOKEN( sheetProtection ):  getWorksheetSettings().importSheetProtection( rAttribs );       break;
265cdf0e10cSrcweir                 case XLS_TOKEN( phoneticPr ):       getWorksheetSettings().importPhoneticPr( rAttribs );            break;
266cdf0e10cSrcweir                 case XLS_TOKEN( printOptions ):     getPageSettings().importPrintOptions( rAttribs );               break;
267cdf0e10cSrcweir                 case XLS_TOKEN( pageMargins ):      getPageSettings().importPageMargins( rAttribs );                break;
268cdf0e10cSrcweir                 case XLS_TOKEN( pageSetup ):        getPageSettings().importPageSetup( getRelations(), rAttribs );  break;
269cdf0e10cSrcweir                 case XLS_TOKEN( headerFooter ):     getPageSettings().importHeaderFooter( rAttribs );               return this;
270cdf0e10cSrcweir                 case XLS_TOKEN( picture ):          getPageSettings().importPicture( getRelations(), rAttribs );    break;
271cdf0e10cSrcweir                 case XLS_TOKEN( drawing ):          importDrawing( rAttribs );                                      break;
272cdf0e10cSrcweir                 case XLS_TOKEN( legacyDrawing ):    importLegacyDrawing( rAttribs );                                break;
273cdf0e10cSrcweir             }
274cdf0e10cSrcweir         break;
275cdf0e10cSrcweir 
276cdf0e10cSrcweir         case XLS_TOKEN( sheetPr ):
277cdf0e10cSrcweir             switch( nElement )
278cdf0e10cSrcweir             {
279cdf0e10cSrcweir                 case XLS_TOKEN( tabColor ):         getWorksheetSettings().importTabColor( rAttribs );              break;
280cdf0e10cSrcweir                 case XLS_TOKEN( outlinePr ):        getWorksheetSettings().importOutlinePr( rAttribs );             break;
281cdf0e10cSrcweir                 case XLS_TOKEN( pageSetUpPr ):      importPageSetUpPr( rAttribs );                                  break;
282cdf0e10cSrcweir             }
283cdf0e10cSrcweir         break;
284cdf0e10cSrcweir 
285cdf0e10cSrcweir         case XLS_TOKEN( sheetViews ):
286cdf0e10cSrcweir             switch( nElement )
287cdf0e10cSrcweir             {
288cdf0e10cSrcweir                 case XLS_TOKEN( sheetView ):        getSheetViewSettings().importSheetView( rAttribs );             return this;
289cdf0e10cSrcweir             }
290cdf0e10cSrcweir         break;
291cdf0e10cSrcweir         case XLS_TOKEN( sheetView ):
292cdf0e10cSrcweir             switch( nElement )
293cdf0e10cSrcweir             {
294cdf0e10cSrcweir                 case XLS_TOKEN( pane ):             getSheetViewSettings().importPane( rAttribs );                  break;
295cdf0e10cSrcweir                 case XLS_TOKEN( selection ):        getSheetViewSettings().importSelection( rAttribs );             break;
296cdf0e10cSrcweir             }
297cdf0e10cSrcweir         break;
298cdf0e10cSrcweir 
299cdf0e10cSrcweir         case XLS_TOKEN( cols ):
300cdf0e10cSrcweir             if( nElement == XLS_TOKEN( col ) ) importCol( rAttribs );
301cdf0e10cSrcweir         break;
302cdf0e10cSrcweir         case XLS_TOKEN( mergeCells ):
303cdf0e10cSrcweir             if( nElement == XLS_TOKEN( mergeCell ) ) importMergeCell( rAttribs );
304cdf0e10cSrcweir         break;
305cdf0e10cSrcweir         case XLS_TOKEN( hyperlinks ):
306cdf0e10cSrcweir             if( nElement == XLS_TOKEN( hyperlink ) ) importHyperlink( rAttribs );
307cdf0e10cSrcweir         break;
308cdf0e10cSrcweir         case XLS_TOKEN( rowBreaks ):
309cdf0e10cSrcweir             if( nElement == XLS_TOKEN( brk ) ) importBrk( rAttribs, true );
310cdf0e10cSrcweir         break;
311cdf0e10cSrcweir         case XLS_TOKEN( colBreaks ):
312cdf0e10cSrcweir             if( nElement == XLS_TOKEN( brk ) ) importBrk( rAttribs, false );
313cdf0e10cSrcweir         break;
314cdf0e10cSrcweir 
315cdf0e10cSrcweir         case XLS_TOKEN( headerFooter ):
316cdf0e10cSrcweir             switch( nElement )
317cdf0e10cSrcweir             {
318cdf0e10cSrcweir                 case XLS_TOKEN( firstHeader ):
319cdf0e10cSrcweir                 case XLS_TOKEN( firstFooter ):
320cdf0e10cSrcweir                 case XLS_TOKEN( oddHeader ):
321cdf0e10cSrcweir                 case XLS_TOKEN( oddFooter ):
322cdf0e10cSrcweir                 case XLS_TOKEN( evenHeader ):
323cdf0e10cSrcweir                 case XLS_TOKEN( evenFooter ):       return this;    // collect h/f contents in onCharacters()
324cdf0e10cSrcweir             }
325cdf0e10cSrcweir         break;
326cdf0e10cSrcweir 
327cdf0e10cSrcweir         case XLS_TOKEN( oleObjects ):
328cdf0e10cSrcweir             if( nElement == XLS_TOKEN( oleObject ) ) importOleObject( rAttribs );
329cdf0e10cSrcweir         break;
330cdf0e10cSrcweir         case XLS_TOKEN( controls ):
331cdf0e10cSrcweir             if( nElement == XLS_TOKEN( control ) ) importControl( rAttribs );
332cdf0e10cSrcweir         break;
333cdf0e10cSrcweir     }
334cdf0e10cSrcweir     return 0;
335cdf0e10cSrcweir }
336cdf0e10cSrcweir 
337cdf0e10cSrcweir void WorksheetFragment::onCharacters( const OUString& rChars )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir     switch( getCurrentElement() )
340cdf0e10cSrcweir     {
341cdf0e10cSrcweir         case XLS_TOKEN( firstHeader ):
342cdf0e10cSrcweir         case XLS_TOKEN( firstFooter ):
343cdf0e10cSrcweir         case XLS_TOKEN( oddHeader ):
344cdf0e10cSrcweir         case XLS_TOKEN( oddFooter ):
345cdf0e10cSrcweir         case XLS_TOKEN( evenHeader ):
346cdf0e10cSrcweir         case XLS_TOKEN( evenFooter ):
347cdf0e10cSrcweir             getPageSettings().importHeaderFooterCharacters( rChars, getCurrentElement() );
348cdf0e10cSrcweir         break;
349cdf0e10cSrcweir     }
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
352cdf0e10cSrcweir ContextHandlerRef WorksheetFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
353cdf0e10cSrcweir {
354cdf0e10cSrcweir     switch( getCurrentElement() )
355cdf0e10cSrcweir     {
356cdf0e10cSrcweir         case XML_ROOT_CONTEXT:
357cdf0e10cSrcweir             if( nRecId == BIFF12_ID_WORKSHEET ) return this;
358cdf0e10cSrcweir         break;
359cdf0e10cSrcweir 
360cdf0e10cSrcweir         case BIFF12_ID_WORKSHEET:
361cdf0e10cSrcweir             switch( nRecId )
362cdf0e10cSrcweir             {
363cdf0e10cSrcweir                 case BIFF12_ID_SHEETDATA:       return new SheetDataContext( *this );
364cdf0e10cSrcweir                 case BIFF12_ID_CONDFORMATTING:  return new CondFormatContext( *this );
365cdf0e10cSrcweir                 case BIFF12_ID_DATAVALIDATIONS: return new DataValidationsContext( *this );
366cdf0e10cSrcweir                 case BIFF12_ID_AUTOFILTER:      return new AutoFilterContext( *this, getAutoFilters().createAutoFilter() );
367cdf0e10cSrcweir                 case BIFF12_ID_SCENARIOS:       return new ScenariosContext( *this );
368cdf0e10cSrcweir 
369cdf0e10cSrcweir                 case BIFF12_ID_SHEETVIEWS:
370cdf0e10cSrcweir                 case BIFF12_ID_COLS:
371cdf0e10cSrcweir                 case BIFF12_ID_MERGECELLS:
372cdf0e10cSrcweir                 case BIFF12_ID_ROWBREAKS:
373cdf0e10cSrcweir                 case BIFF12_ID_COLBREAKS:
374cdf0e10cSrcweir                 case BIFF12_ID_OLEOBJECTS:
375cdf0e10cSrcweir                 case BIFF12_ID_CONTROLS:        return this;
376cdf0e10cSrcweir 
377cdf0e10cSrcweir                 case BIFF12_ID_SHEETPR:         getWorksheetSettings().importSheetPr( rStrm );              break;
378cdf0e10cSrcweir                 case BIFF12_ID_DIMENSION:       importDimension( rStrm );                                   break;
379cdf0e10cSrcweir                 case BIFF12_ID_SHEETFORMATPR:   importSheetFormatPr( rStrm );                               break;
380cdf0e10cSrcweir                 case BIFF12_ID_HYPERLINK:       importHyperlink( rStrm );                                   break;
381cdf0e10cSrcweir                 case BIFF12_ID_PAGEMARGINS:     getPageSettings().importPageMargins( rStrm );               break;
382cdf0e10cSrcweir                 case BIFF12_ID_PAGESETUP:       getPageSettings().importPageSetup( getRelations(), rStrm ); break;
383cdf0e10cSrcweir                 case BIFF12_ID_PRINTOPTIONS:    getPageSettings().importPrintOptions( rStrm );              break;
384cdf0e10cSrcweir                 case BIFF12_ID_HEADERFOOTER:    getPageSettings().importHeaderFooter( rStrm );              break;
385cdf0e10cSrcweir                 case BIFF12_ID_PICTURE:         getPageSettings().importPicture( getRelations(), rStrm );   break;
386cdf0e10cSrcweir                 case BIFF12_ID_SHEETPROTECTION: getWorksheetSettings().importSheetProtection( rStrm );      break;
387cdf0e10cSrcweir                 case BIFF12_ID_PHONETICPR:      getWorksheetSettings().importPhoneticPr( rStrm );           break;
388cdf0e10cSrcweir                 case BIFF12_ID_DRAWING:         importDrawing( rStrm );                                     break;
389cdf0e10cSrcweir                 case BIFF12_ID_LEGACYDRAWING:   importLegacyDrawing( rStrm );                               break;
390cdf0e10cSrcweir             }
391cdf0e10cSrcweir         break;
392cdf0e10cSrcweir 
393cdf0e10cSrcweir         case BIFF12_ID_SHEETVIEWS:
394cdf0e10cSrcweir             switch( nRecId )
395cdf0e10cSrcweir             {
396cdf0e10cSrcweir                 case BIFF12_ID_SHEETVIEW:       getSheetViewSettings().importSheetView( rStrm );            return this;
397cdf0e10cSrcweir             }
398cdf0e10cSrcweir         break;
399cdf0e10cSrcweir         case BIFF12_ID_SHEETVIEW:
400cdf0e10cSrcweir             switch( nRecId )
401cdf0e10cSrcweir             {
402cdf0e10cSrcweir                 case BIFF12_ID_PANE:            getSheetViewSettings().importPane( rStrm );                 break;
403cdf0e10cSrcweir                 case BIFF12_ID_SELECTION:       getSheetViewSettings().importSelection( rStrm );            break;
404cdf0e10cSrcweir             }
405cdf0e10cSrcweir         break;
406cdf0e10cSrcweir 
407cdf0e10cSrcweir         case BIFF12_ID_COLS:
408cdf0e10cSrcweir             if( nRecId == BIFF12_ID_COL ) importCol( rStrm );
409cdf0e10cSrcweir         break;
410cdf0e10cSrcweir         case BIFF12_ID_MERGECELLS:
411cdf0e10cSrcweir             if( nRecId == BIFF12_ID_MERGECELL ) importMergeCell( rStrm );
412cdf0e10cSrcweir         break;
413cdf0e10cSrcweir         case BIFF12_ID_ROWBREAKS:
414cdf0e10cSrcweir             if( nRecId == BIFF12_ID_BRK ) importBrk( rStrm, true );
415cdf0e10cSrcweir         break;
416cdf0e10cSrcweir         case BIFF12_ID_COLBREAKS:
417cdf0e10cSrcweir             if( nRecId == BIFF12_ID_BRK ) importBrk( rStrm, false );
418cdf0e10cSrcweir         break;
419cdf0e10cSrcweir         case BIFF12_ID_OLEOBJECTS:
420cdf0e10cSrcweir             if( nRecId == BIFF12_ID_OLEOBJECT ) importOleObject( rStrm );
421cdf0e10cSrcweir         break;
422cdf0e10cSrcweir         case BIFF12_ID_CONTROLS:
423cdf0e10cSrcweir             if( nRecId == BIFF12_ID_CONTROL ) importControl( rStrm );
424cdf0e10cSrcweir         break;
425cdf0e10cSrcweir     }
426cdf0e10cSrcweir     return 0;
427cdf0e10cSrcweir }
428cdf0e10cSrcweir 
429cdf0e10cSrcweir const RecordInfo* WorksheetFragment::getRecordInfos() const
430cdf0e10cSrcweir {
431cdf0e10cSrcweir     static const RecordInfo spRecInfos[] =
432cdf0e10cSrcweir     {
433cdf0e10cSrcweir         { BIFF12_ID_AUTOFILTER,         BIFF12_ID_AUTOFILTER + 1        },
434cdf0e10cSrcweir         { BIFF12_ID_CFRULE,             BIFF12_ID_CFRULE + 1            },
435cdf0e10cSrcweir         { BIFF12_ID_COLBREAKS,          BIFF12_ID_COLBREAKS + 1         },
436cdf0e10cSrcweir         { BIFF12_ID_COLORSCALE,         BIFF12_ID_COLORSCALE + 1        },
437cdf0e10cSrcweir         { BIFF12_ID_COLS,               BIFF12_ID_COLS + 1              },
438cdf0e10cSrcweir         { BIFF12_ID_CONDFORMATTING,     BIFF12_ID_CONDFORMATTING + 1    },
439cdf0e10cSrcweir         { BIFF12_ID_CONTROLS,           BIFF12_ID_CONTROLS + 2          },
440cdf0e10cSrcweir         { BIFF12_ID_CUSTOMFILTERS,      BIFF12_ID_CUSTOMFILTERS + 1     },
441cdf0e10cSrcweir         { BIFF12_ID_CUSTOMSHEETVIEW,    BIFF12_ID_CUSTOMSHEETVIEW + 1   },
442cdf0e10cSrcweir         { BIFF12_ID_CUSTOMSHEETVIEWS,   BIFF12_ID_CUSTOMSHEETVIEWS + 3  },
443cdf0e10cSrcweir         { BIFF12_ID_DATABAR,            BIFF12_ID_DATABAR + 1           },
444cdf0e10cSrcweir         { BIFF12_ID_DATAVALIDATIONS,    BIFF12_ID_DATAVALIDATIONS + 1   },
445cdf0e10cSrcweir         { BIFF12_ID_DISCRETEFILTERS,    BIFF12_ID_DISCRETEFILTERS + 1   },
446cdf0e10cSrcweir         { BIFF12_ID_FILTERCOLUMN,       BIFF12_ID_FILTERCOLUMN + 1      },
447cdf0e10cSrcweir         { BIFF12_ID_HEADERFOOTER,       BIFF12_ID_HEADERFOOTER + 1      },
448cdf0e10cSrcweir         { BIFF12_ID_ICONSET,            BIFF12_ID_ICONSET + 1           },
449cdf0e10cSrcweir         { BIFF12_ID_MERGECELLS,         BIFF12_ID_MERGECELLS + 1        },
450cdf0e10cSrcweir         { BIFF12_ID_OLEOBJECTS,         BIFF12_ID_OLEOBJECTS + 2        },
451cdf0e10cSrcweir         { BIFF12_ID_ROW,                -1                              },
452cdf0e10cSrcweir         { BIFF12_ID_ROWBREAKS,          BIFF12_ID_ROWBREAKS + 1         },
453cdf0e10cSrcweir         { BIFF12_ID_SCENARIO,           BIFF12_ID_SCENARIO + 1          },
454cdf0e10cSrcweir         { BIFF12_ID_SCENARIOS,          BIFF12_ID_SCENARIOS + 1         },
455cdf0e10cSrcweir         { BIFF12_ID_SHEETDATA,          BIFF12_ID_SHEETDATA + 1         },
456cdf0e10cSrcweir         { BIFF12_ID_SHEETVIEW,          BIFF12_ID_SHEETVIEW + 1         },
457cdf0e10cSrcweir         { BIFF12_ID_SHEETVIEWS,         BIFF12_ID_SHEETVIEWS + 1        },
458cdf0e10cSrcweir         { BIFF12_ID_TABLEPARTS,         BIFF12_ID_TABLEPARTS + 2        },
459cdf0e10cSrcweir         { BIFF12_ID_WORKSHEET,          BIFF12_ID_WORKSHEET + 1         },
460cdf0e10cSrcweir         { -1,                           -1                              }
461cdf0e10cSrcweir     };
462cdf0e10cSrcweir     return spRecInfos;
463cdf0e10cSrcweir }
464cdf0e10cSrcweir 
465cdf0e10cSrcweir void WorksheetFragment::initializeImport()
466cdf0e10cSrcweir {
467cdf0e10cSrcweir     // initial processing in base class WorksheetHelper
468cdf0e10cSrcweir     initializeWorksheetImport();
469cdf0e10cSrcweir 
470cdf0e10cSrcweir     // import query table fragments related to this worksheet
471cdf0e10cSrcweir     RelationsRef xQueryRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATION_TYPE( "queryTable" ) );
472cdf0e10cSrcweir     for( Relations::const_iterator aIt = xQueryRels->begin(), aEnd = xQueryRels->end(); aIt != aEnd; ++aIt )
473cdf0e10cSrcweir         importOoxFragment( new QueryTableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) );
474cdf0e10cSrcweir 
475cdf0e10cSrcweir     // import pivot table fragments related to this worksheet
476cdf0e10cSrcweir     RelationsRef xPivotRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATION_TYPE( "pivotTable" ) );
477cdf0e10cSrcweir     for( Relations::const_iterator aIt = xPivotRels->begin(), aEnd = xPivotRels->end(); aIt != aEnd; ++aIt )
478cdf0e10cSrcweir         importOoxFragment( new PivotTableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) );
479cdf0e10cSrcweir }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir void WorksheetFragment::finalizeImport()
482cdf0e10cSrcweir {
483cdf0e10cSrcweir     // final processing in base class WorksheetHelper
484cdf0e10cSrcweir     finalizeWorksheetImport();
485cdf0e10cSrcweir }
486cdf0e10cSrcweir 
487cdf0e10cSrcweir // private --------------------------------------------------------------------
488cdf0e10cSrcweir 
489cdf0e10cSrcweir void WorksheetFragment::importPageSetUpPr( const AttributeList& rAttribs )
490cdf0e10cSrcweir {
491cdf0e10cSrcweir     // for whatever reason, this flag is still stored separated from the page settings
492cdf0e10cSrcweir     getPageSettings().setFitToPagesMode( rAttribs.getBool( XML_fitToPage, false ) );
493cdf0e10cSrcweir }
494cdf0e10cSrcweir 
495cdf0e10cSrcweir void WorksheetFragment::importDimension( const AttributeList& rAttribs )
496cdf0e10cSrcweir {
497cdf0e10cSrcweir     CellRangeAddress aRange;
498cdf0e10cSrcweir     getAddressConverter().convertToCellRangeUnchecked( aRange, rAttribs.getString( XML_ref, OUString() ), getSheetIndex() );
499cdf0e10cSrcweir     /*  OOXML stores the used area, if existing, or "A1" if the sheet is empty.
500cdf0e10cSrcweir         In case of "A1", the dimension at the WorksheetHelper object will not
501cdf0e10cSrcweir         be set. If the cell A1 exists, the used area will be updated while
502cdf0e10cSrcweir         importing the cell. */
503cdf0e10cSrcweir     if( (aRange.EndColumn > 0) || (aRange.EndRow > 0) )
504cdf0e10cSrcweir         extendUsedArea( aRange );
505cdf0e10cSrcweir }
506cdf0e10cSrcweir 
507cdf0e10cSrcweir void WorksheetFragment::importSheetFormatPr( const AttributeList& rAttribs )
508cdf0e10cSrcweir {
509cdf0e10cSrcweir     // default column settings
510cdf0e10cSrcweir     setBaseColumnWidth( rAttribs.getInteger( XML_baseColWidth, 8 ) );
511cdf0e10cSrcweir     setDefaultColumnWidth( rAttribs.getDouble( XML_defaultColWidth, 0.0 ) );
512cdf0e10cSrcweir     // default row settings
513cdf0e10cSrcweir     setDefaultRowSettings(
514cdf0e10cSrcweir         rAttribs.getDouble( XML_defaultRowHeight, 0.0 ),
515cdf0e10cSrcweir         rAttribs.getBool( XML_customHeight, false ),
516cdf0e10cSrcweir         rAttribs.getBool( XML_zeroHeight, false ),
517cdf0e10cSrcweir         rAttribs.getBool( XML_thickTop, false ),
518cdf0e10cSrcweir         rAttribs.getBool( XML_thickBottom, false ) );
519cdf0e10cSrcweir }
520cdf0e10cSrcweir 
521cdf0e10cSrcweir void WorksheetFragment::importCol( const AttributeList& rAttribs )
522cdf0e10cSrcweir {
523cdf0e10cSrcweir     ColumnModel aModel;
524cdf0e10cSrcweir     aModel.maRange.mnFirst = rAttribs.getInteger( XML_min, -1 );
525cdf0e10cSrcweir     aModel.maRange.mnLast  = rAttribs.getInteger( XML_max, -1 );
526cdf0e10cSrcweir     aModel.mfWidth         = rAttribs.getDouble( XML_width, 0.0 );
527cdf0e10cSrcweir     aModel.mnXfId          = rAttribs.getInteger( XML_style, -1 );
528cdf0e10cSrcweir     aModel.mnLevel         = rAttribs.getInteger( XML_outlineLevel, 0 );
529cdf0e10cSrcweir     aModel.mbShowPhonetic  = rAttribs.getBool( XML_phonetic, false );
530cdf0e10cSrcweir     aModel.mbHidden        = rAttribs.getBool( XML_hidden, false );
531cdf0e10cSrcweir     aModel.mbCollapsed     = rAttribs.getBool( XML_collapsed, false );
532cdf0e10cSrcweir     // set column properties in the current sheet
533cdf0e10cSrcweir     setColumnModel( aModel );
534cdf0e10cSrcweir }
535cdf0e10cSrcweir 
536cdf0e10cSrcweir void WorksheetFragment::importMergeCell( const AttributeList& rAttribs )
537cdf0e10cSrcweir {
538cdf0e10cSrcweir     CellRangeAddress aRange;
539cdf0e10cSrcweir     if( getAddressConverter().convertToCellRange( aRange, rAttribs.getString( XML_ref, OUString() ), getSheetIndex(), true, true ) )
540cdf0e10cSrcweir         getSheetData().setMergedRange( aRange );
541cdf0e10cSrcweir }
542cdf0e10cSrcweir 
543cdf0e10cSrcweir void WorksheetFragment::importHyperlink( const AttributeList& rAttribs )
544cdf0e10cSrcweir {
545cdf0e10cSrcweir     HyperlinkModel aModel;
546cdf0e10cSrcweir     if( getAddressConverter().convertToCellRange( aModel.maRange, rAttribs.getString( XML_ref, OUString() ), getSheetIndex(), true, true ) )
547cdf0e10cSrcweir     {
548cdf0e10cSrcweir         aModel.maTarget   = getRelations().getExternalTargetFromRelId( rAttribs.getString( R_TOKEN( id ), OUString() ) );
549cdf0e10cSrcweir         aModel.maLocation = rAttribs.getXString( XML_location, OUString() );
550cdf0e10cSrcweir         aModel.maDisplay  = rAttribs.getXString( XML_display, OUString() );
551cdf0e10cSrcweir         aModel.maTooltip  = rAttribs.getXString( XML_tooltip, OUString() );
552cdf0e10cSrcweir         setHyperlink( aModel );
553cdf0e10cSrcweir     }
554cdf0e10cSrcweir }
555cdf0e10cSrcweir 
556cdf0e10cSrcweir void WorksheetFragment::importBrk( const AttributeList& rAttribs, bool bRowBreak )
557cdf0e10cSrcweir {
558cdf0e10cSrcweir     PageBreakModel aModel;
559cdf0e10cSrcweir     aModel.mnColRow = rAttribs.getInteger( XML_id, 0 );
560cdf0e10cSrcweir     aModel.mnMin    = rAttribs.getInteger( XML_id, 0 );
561cdf0e10cSrcweir     aModel.mnMax    = rAttribs.getInteger( XML_id, 0 );
562cdf0e10cSrcweir     aModel.mbManual = rAttribs.getBool( XML_man, false );
563cdf0e10cSrcweir     setPageBreak( aModel, bRowBreak );
564cdf0e10cSrcweir }
565cdf0e10cSrcweir 
566cdf0e10cSrcweir void WorksheetFragment::importDrawing( const AttributeList& rAttribs )
567cdf0e10cSrcweir {
568cdf0e10cSrcweir     setDrawingPath( getFragmentPathFromRelId( rAttribs.getString( R_TOKEN( id ), OUString() ) ) );
569cdf0e10cSrcweir }
570cdf0e10cSrcweir 
571cdf0e10cSrcweir void WorksheetFragment::importLegacyDrawing( const AttributeList& rAttribs )
572cdf0e10cSrcweir {
573cdf0e10cSrcweir     setVmlDrawingPath( getFragmentPathFromRelId( rAttribs.getString( R_TOKEN( id ), OUString() ) ) );
574cdf0e10cSrcweir }
575cdf0e10cSrcweir 
576cdf0e10cSrcweir void WorksheetFragment::importOleObject( const AttributeList& rAttribs )
577cdf0e10cSrcweir {
578cdf0e10cSrcweir     ::oox::vml::OleObjectInfo aInfo;
579cdf0e10cSrcweir     aInfo.setShapeId( rAttribs.getInteger( XML_shapeId, 0 ) );
580cdf0e10cSrcweir     OSL_ENSURE( rAttribs.hasAttribute( XML_link ) != rAttribs.hasAttribute( R_TOKEN( id ) ),
581cdf0e10cSrcweir         "WorksheetFragment::importOleObject - OLE object must be either linked or embedded" );
582cdf0e10cSrcweir     aInfo.mbLinked = rAttribs.hasAttribute( XML_link );
583cdf0e10cSrcweir     if( aInfo.mbLinked )
584cdf0e10cSrcweir         aInfo.maTargetLink = getFormulaParser().importOleTargetLink( rAttribs.getString( XML_link, OUString() ) );
585cdf0e10cSrcweir     else if( rAttribs.hasAttribute( R_TOKEN( id ) ) )
586cdf0e10cSrcweir         importEmbeddedOleData( aInfo.maEmbeddedData, rAttribs.getString( R_TOKEN( id ), OUString() ) );
587cdf0e10cSrcweir     aInfo.maProgId = rAttribs.getString( XML_progId, OUString() );
588cdf0e10cSrcweir     aInfo.mbShowAsIcon = rAttribs.getToken( XML_dvAspect, XML_DVASPECT_CONTENT ) == XML_DVASPECT_ICON;
589cdf0e10cSrcweir     aInfo.mbAutoUpdate = rAttribs.getToken( XML_oleUpdate, XML_OLEUPDATE_ONCALL ) == XML_OLEUPDATE_ALWAYS;
590cdf0e10cSrcweir     aInfo.mbAutoLoad = rAttribs.getBool( XML_autoLoad, false );
591cdf0e10cSrcweir     getVmlDrawing().registerOleObject( aInfo );
592cdf0e10cSrcweir }
593cdf0e10cSrcweir 
594cdf0e10cSrcweir void WorksheetFragment::importControl( const AttributeList& rAttribs )
595cdf0e10cSrcweir {
596cdf0e10cSrcweir     ::oox::vml::ControlInfo aInfo;
597cdf0e10cSrcweir     aInfo.setShapeId( rAttribs.getInteger( XML_shapeId, 0 ) );
598cdf0e10cSrcweir     aInfo.maFragmentPath = getFragmentPathFromRelId( rAttribs.getString( R_TOKEN( id ), OUString() ) );
599cdf0e10cSrcweir     aInfo.maName = rAttribs.getString( XML_name, OUString() );
600cdf0e10cSrcweir     getVmlDrawing().registerControl( aInfo );
601cdf0e10cSrcweir }
602cdf0e10cSrcweir 
603cdf0e10cSrcweir void WorksheetFragment::importDimension( SequenceInputStream& rStrm )
604cdf0e10cSrcweir {
605cdf0e10cSrcweir     BinRange aBinRange;
606cdf0e10cSrcweir     aBinRange.read( rStrm );
607cdf0e10cSrcweir     CellRangeAddress aRange;
608cdf0e10cSrcweir     getAddressConverter().convertToCellRangeUnchecked( aRange, aBinRange, getSheetIndex() );
609cdf0e10cSrcweir     /*  BIFF12 stores the used area, if existing, or "A1" if the sheet is
610cdf0e10cSrcweir         empty. In case of "A1", the dimension at the WorksheetHelper object
611cdf0e10cSrcweir         will not be set. If the cell A1 exists, the used area will be updated
612cdf0e10cSrcweir         while importing the cell. */
613cdf0e10cSrcweir     if( (aRange.EndColumn > 0) || (aRange.EndRow > 0) )
614cdf0e10cSrcweir         extendUsedArea( aRange );
615cdf0e10cSrcweir }
616cdf0e10cSrcweir 
617cdf0e10cSrcweir void WorksheetFragment::importSheetFormatPr( SequenceInputStream& rStrm )
618cdf0e10cSrcweir {
619cdf0e10cSrcweir     sal_Int32 nDefaultWidth;
620cdf0e10cSrcweir     sal_uInt16 nBaseWidth, nDefaultHeight, nFlags;
621cdf0e10cSrcweir     rStrm >> nDefaultWidth >> nBaseWidth >> nDefaultHeight >> nFlags;
622cdf0e10cSrcweir 
623cdf0e10cSrcweir     // base column with
624cdf0e10cSrcweir     setBaseColumnWidth( nBaseWidth );
625cdf0e10cSrcweir     // default width is stored as 1/256th of a character in BIFF12, convert to entire character
626cdf0e10cSrcweir     setDefaultColumnWidth( static_cast< double >( nDefaultWidth ) / 256.0 );
627cdf0e10cSrcweir     // row height is in twips in BIFF12, convert to points; equal flags in all BIFFs
628cdf0e10cSrcweir     setDefaultRowSettings(
629cdf0e10cSrcweir         nDefaultHeight / 20.0,
630cdf0e10cSrcweir         getFlag( nFlags, BIFF_DEFROW_CUSTOMHEIGHT ),
631cdf0e10cSrcweir         getFlag( nFlags, BIFF_DEFROW_HIDDEN ),
632cdf0e10cSrcweir         getFlag( nFlags, BIFF_DEFROW_THICKTOP ),
633cdf0e10cSrcweir         getFlag( nFlags, BIFF_DEFROW_THICKBOTTOM ) );
634cdf0e10cSrcweir }
635cdf0e10cSrcweir 
636cdf0e10cSrcweir void WorksheetFragment::importCol( SequenceInputStream& rStrm )
637cdf0e10cSrcweir {
638cdf0e10cSrcweir     ColumnModel aModel;
639cdf0e10cSrcweir 
640cdf0e10cSrcweir     sal_Int32 nWidth;
641cdf0e10cSrcweir     sal_uInt16 nFlags;
642cdf0e10cSrcweir     rStrm >> aModel.maRange.mnFirst >> aModel.maRange.mnLast >> nWidth >> aModel.mnXfId >> nFlags;
643cdf0e10cSrcweir 
644cdf0e10cSrcweir     // column indexes are 0-based in BIFF12, but ColumnModel expects 1-based
645cdf0e10cSrcweir     ++aModel.maRange.mnFirst;
646cdf0e10cSrcweir     ++aModel.maRange.mnLast;
647cdf0e10cSrcweir     // width is stored as 1/256th of a character in BIFF12, convert to entire character
648cdf0e10cSrcweir     aModel.mfWidth        = static_cast< double >( nWidth ) / 256.0;
649cdf0e10cSrcweir     // equal flags in all BIFFs
650cdf0e10cSrcweir     aModel.mnLevel        = extractValue< sal_Int32 >( nFlags, 8, 3 );
651cdf0e10cSrcweir     aModel.mbShowPhonetic = getFlag( nFlags, BIFF_COLINFO_SHOWPHONETIC );
652cdf0e10cSrcweir     aModel.mbHidden       = getFlag( nFlags, BIFF_COLINFO_HIDDEN );
653cdf0e10cSrcweir     aModel.mbCollapsed    = getFlag( nFlags, BIFF_COLINFO_COLLAPSED );
654cdf0e10cSrcweir     // set column properties in the current sheet
655cdf0e10cSrcweir     setColumnModel( aModel );
656cdf0e10cSrcweir }
657cdf0e10cSrcweir 
658cdf0e10cSrcweir void WorksheetFragment::importMergeCell( SequenceInputStream& rStrm )
659cdf0e10cSrcweir {
660cdf0e10cSrcweir     BinRange aBinRange;
661cdf0e10cSrcweir     rStrm >> aBinRange;
662cdf0e10cSrcweir     CellRangeAddress aRange;
663cdf0e10cSrcweir     if( getAddressConverter().convertToCellRange( aRange, aBinRange, getSheetIndex(), true, true ) )
664cdf0e10cSrcweir         getSheetData().setMergedRange( aRange );
665cdf0e10cSrcweir }
666cdf0e10cSrcweir 
667cdf0e10cSrcweir void WorksheetFragment::importHyperlink( SequenceInputStream& rStrm )
668cdf0e10cSrcweir {
669cdf0e10cSrcweir     BinRange aBinRange;
670cdf0e10cSrcweir     rStrm >> aBinRange;
671cdf0e10cSrcweir     HyperlinkModel aModel;
672cdf0e10cSrcweir     if( getAddressConverter().convertToCellRange( aModel.maRange, aBinRange, getSheetIndex(), true, true ) )
673cdf0e10cSrcweir     {
674cdf0e10cSrcweir         aModel.maTarget = getRelations().getExternalTargetFromRelId( BiffHelper::readString( rStrm ) );
675cdf0e10cSrcweir         rStrm >> aModel.maLocation >> aModel.maTooltip >> aModel.maDisplay;
676cdf0e10cSrcweir         setHyperlink( aModel );
677cdf0e10cSrcweir     }
678cdf0e10cSrcweir }
679cdf0e10cSrcweir 
680cdf0e10cSrcweir void WorksheetFragment::importBrk( SequenceInputStream& rStrm, bool bRowBreak )
681cdf0e10cSrcweir {
682cdf0e10cSrcweir     PageBreakModel aModel;
683cdf0e10cSrcweir     sal_Int32 nManual;
684cdf0e10cSrcweir     rStrm >> aModel.mnColRow >> aModel.mnMin >> aModel.mnMax >> nManual;
685cdf0e10cSrcweir     aModel.mbManual = nManual != 0;
686cdf0e10cSrcweir     setPageBreak( aModel, bRowBreak );
687cdf0e10cSrcweir }
688cdf0e10cSrcweir 
689cdf0e10cSrcweir void WorksheetFragment::importDrawing( SequenceInputStream& rStrm )
690cdf0e10cSrcweir {
691cdf0e10cSrcweir     setDrawingPath( getFragmentPathFromRelId( BiffHelper::readString( rStrm ) ) );
692cdf0e10cSrcweir }
693cdf0e10cSrcweir 
694cdf0e10cSrcweir void WorksheetFragment::importLegacyDrawing( SequenceInputStream& rStrm )
695cdf0e10cSrcweir {
696cdf0e10cSrcweir     setVmlDrawingPath( getFragmentPathFromRelId( BiffHelper::readString( rStrm ) ) );
697cdf0e10cSrcweir }
698cdf0e10cSrcweir 
699cdf0e10cSrcweir void WorksheetFragment::importOleObject( SequenceInputStream& rStrm )
700cdf0e10cSrcweir {
701cdf0e10cSrcweir     ::oox::vml::OleObjectInfo aInfo;
702cdf0e10cSrcweir     sal_Int32 nAspect, nUpdateMode, nShapeId;
703cdf0e10cSrcweir     sal_uInt16 nFlags;
704cdf0e10cSrcweir     rStrm >> nAspect >> nUpdateMode >> nShapeId >> nFlags >> aInfo.maProgId;
705cdf0e10cSrcweir     aInfo.mbLinked = getFlag( nFlags, BIFF12_OLEOBJECT_LINKED );
706cdf0e10cSrcweir     if( aInfo.mbLinked )
707cdf0e10cSrcweir         aInfo.maTargetLink = getFormulaParser().importOleTargetLink( rStrm );
708cdf0e10cSrcweir     else
709cdf0e10cSrcweir         importEmbeddedOleData( aInfo.maEmbeddedData, BiffHelper::readString( rStrm ) );
710cdf0e10cSrcweir     aInfo.setShapeId( nShapeId );
711cdf0e10cSrcweir     aInfo.mbShowAsIcon = nAspect == BIFF12_OLEOBJECT_ICON;
712cdf0e10cSrcweir     aInfo.mbAutoUpdate = nUpdateMode == BIFF12_OLEOBJECT_ALWAYS;
713cdf0e10cSrcweir     aInfo.mbAutoLoad = getFlag( nFlags, BIFF12_OLEOBJECT_AUTOLOAD );
714cdf0e10cSrcweir     getVmlDrawing().registerOleObject( aInfo );
715cdf0e10cSrcweir }
716cdf0e10cSrcweir 
717cdf0e10cSrcweir void WorksheetFragment::importControl( SequenceInputStream& rStrm )
718cdf0e10cSrcweir {
719cdf0e10cSrcweir     ::oox::vml::ControlInfo aInfo;
720cdf0e10cSrcweir     aInfo.setShapeId( rStrm.readInt32() );
721cdf0e10cSrcweir     aInfo.maFragmentPath = getFragmentPathFromRelId( BiffHelper::readString( rStrm ) );
722cdf0e10cSrcweir     rStrm >> aInfo.maName;
723cdf0e10cSrcweir     getVmlDrawing().registerControl( aInfo );
724cdf0e10cSrcweir }
725cdf0e10cSrcweir 
726cdf0e10cSrcweir void WorksheetFragment::importEmbeddedOleData( StreamDataSequence& orEmbeddedData, const OUString& rRelId )
727cdf0e10cSrcweir {
728cdf0e10cSrcweir     OUString aFragmentPath = getFragmentPathFromRelId( rRelId );
729cdf0e10cSrcweir     if( aFragmentPath.getLength() > 0 )
730cdf0e10cSrcweir         getBaseFilter().importBinaryData( orEmbeddedData, aFragmentPath );
731cdf0e10cSrcweir }
732cdf0e10cSrcweir 
733cdf0e10cSrcweir // ============================================================================
734cdf0e10cSrcweir 
735cdf0e10cSrcweir BiffWorksheetFragment::BiffWorksheetFragment( const WorksheetHelper& rHelper, const BiffWorkbookFragmentBase& rParent ) :
736cdf0e10cSrcweir     BiffWorksheetFragmentBase( rHelper, rParent )
737cdf0e10cSrcweir {
738cdf0e10cSrcweir }
739cdf0e10cSrcweir 
740cdf0e10cSrcweir BiffWorksheetFragment::~BiffWorksheetFragment()
741cdf0e10cSrcweir {
742cdf0e10cSrcweir }
743cdf0e10cSrcweir 
744cdf0e10cSrcweir bool BiffWorksheetFragment::importFragment()
745cdf0e10cSrcweir {
746cdf0e10cSrcweir     // initial processing in base class WorksheetHelper
747cdf0e10cSrcweir     initializeWorksheetImport();
748cdf0e10cSrcweir 
749cdf0e10cSrcweir     // create a SheetDataContext object that implements cell import
750cdf0e10cSrcweir     BiffSheetDataContext aSheetData( *this );
751cdf0e10cSrcweir 
752cdf0e10cSrcweir     WorkbookSettings& rWorkbookSett   = getWorkbookSettings();
753cdf0e10cSrcweir     WorksheetSettings& rWorksheetSett = getWorksheetSettings();
754cdf0e10cSrcweir     SheetViewSettings& rSheetViewSett = getSheetViewSettings();
755cdf0e10cSrcweir     CondFormatBuffer& rCondFormats    = getCondFormats();
756cdf0e10cSrcweir     PageSettings& rPageSett           = getPageSettings();
757cdf0e10cSrcweir     BiffSheetDrawing& rDrawing        = getBiffDrawing();
758cdf0e10cSrcweir 
759cdf0e10cSrcweir     // process all record in this sheet fragment
760cdf0e10cSrcweir     BiffInputStream& rStrm = getInputStream();
761cdf0e10cSrcweir     while( rStrm.startNextRecord() && (rStrm.getRecId() != BIFF_ID_EOF) )
762cdf0e10cSrcweir     {
763cdf0e10cSrcweir         if( BiffHelper::isBofRecord( rStrm ) )
764cdf0e10cSrcweir         {
765cdf0e10cSrcweir             // skip unknown embedded fragments (BOF/EOF blocks)
766cdf0e10cSrcweir             skipFragment();
767cdf0e10cSrcweir         }
768cdf0e10cSrcweir         else
769cdf0e10cSrcweir         {
770cdf0e10cSrcweir             // cache base stream position to detect if record is already processed
771cdf0e10cSrcweir             sal_Int64 nStrmPos = rStrm.tellBase();
772cdf0e10cSrcweir             sal_uInt16 nRecId = rStrm.getRecId();
773cdf0e10cSrcweir 
774cdf0e10cSrcweir             switch( nRecId )
775cdf0e10cSrcweir             {
776cdf0e10cSrcweir                 // records in all BIFF versions
777cdf0e10cSrcweir                 case BIFF_ID_BOTTOMMARGIN:      rPageSett.importBottomMargin( rStrm );      break;
778cdf0e10cSrcweir                 case BIFF_ID_CALCCOUNT:         rWorkbookSett.importCalcCount( rStrm );     break;
779cdf0e10cSrcweir                 case BIFF_ID_CALCMODE:          rWorkbookSett.importCalcMode( rStrm );      break;
780cdf0e10cSrcweir                 case BIFF_ID_DEFCOLWIDTH:       importDefColWidth( rStrm );                 break;
781cdf0e10cSrcweir                 case BIFF_ID_DELTA:             rWorkbookSett.importDelta( rStrm );         break;
782cdf0e10cSrcweir                 case BIFF2_ID_DIMENSION:        importDimension( rStrm );                   break;
783cdf0e10cSrcweir                 case BIFF3_ID_DIMENSION:        importDimension( rStrm );                   break;
784cdf0e10cSrcweir                 case BIFF_ID_FOOTER:            rPageSett.importFooter( rStrm );            break;
785cdf0e10cSrcweir                 case BIFF_ID_HEADER:            rPageSett.importHeader( rStrm );            break;
786cdf0e10cSrcweir                 case BIFF_ID_HORPAGEBREAKS:     importPageBreaks( rStrm, true );            break;
787cdf0e10cSrcweir                 case BIFF_ID_ITERATION:         rWorkbookSett.importIteration( rStrm );     break;
788cdf0e10cSrcweir                 case BIFF_ID_LEFTMARGIN:        rPageSett.importLeftMargin( rStrm );        break;
789cdf0e10cSrcweir                 case BIFF_ID_NOTE:              importNote( rStrm );                        break;
790cdf0e10cSrcweir                 case BIFF_ID_PANE:              rSheetViewSett.importPane( rStrm );         break;
791cdf0e10cSrcweir                 case BIFF_ID_PASSWORD:          rWorksheetSett.importPassword( rStrm );     break;
792cdf0e10cSrcweir                 case BIFF_ID_PRINTGRIDLINES:    rPageSett.importPrintGridLines( rStrm );    break;
793cdf0e10cSrcweir                 case BIFF_ID_PRINTHEADERS:      rPageSett.importPrintHeaders( rStrm );      break;
794cdf0e10cSrcweir                 case BIFF_ID_PROTECT:           rWorksheetSett.importProtect( rStrm );      break;
795cdf0e10cSrcweir                 case BIFF_ID_REFMODE:           rWorkbookSett.importRefMode( rStrm );       break;
796cdf0e10cSrcweir                 case BIFF_ID_RIGHTMARGIN:       rPageSett.importRightMargin( rStrm );       break;
797cdf0e10cSrcweir                 case BIFF_ID_SELECTION:         rSheetViewSett.importSelection( rStrm );    break;
798cdf0e10cSrcweir                 case BIFF_ID_TOPMARGIN:         rPageSett.importTopMargin( rStrm );         break;
799cdf0e10cSrcweir                 case BIFF_ID_VERPAGEBREAKS:     importPageBreaks( rStrm, false );           break;
800cdf0e10cSrcweir 
801cdf0e10cSrcweir                 // BIFF specific records
802cdf0e10cSrcweir                 default: switch( getBiff() )
803cdf0e10cSrcweir                 {
804cdf0e10cSrcweir                     case BIFF2: switch( nRecId )
805cdf0e10cSrcweir                     {
806cdf0e10cSrcweir                         case BIFF_ID_COLUMNDEFAULT: importColumnDefault( rStrm );           break;
807cdf0e10cSrcweir                         case BIFF_ID_COLWIDTH:      importColWidth( rStrm );                break;
808cdf0e10cSrcweir                         case BIFF2_ID_DEFROWHEIGHT: importDefRowHeight( rStrm );            break;
809cdf0e10cSrcweir                         case BIFF2_ID_WINDOW2:      rSheetViewSett.importWindow2( rStrm );  break;
810cdf0e10cSrcweir                     }
811cdf0e10cSrcweir                     break;
812cdf0e10cSrcweir 
813cdf0e10cSrcweir                     case BIFF3: switch( nRecId )
814cdf0e10cSrcweir                     {
815cdf0e10cSrcweir                         case BIFF_ID_COLINFO:       importColInfo( rStrm );                         break;
816cdf0e10cSrcweir                         case BIFF_ID_DEFCOLWIDTH:   importDefColWidth( rStrm );                     break;
817cdf0e10cSrcweir                         case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight( rStrm );                    break;
818cdf0e10cSrcweir                         case BIFF_ID_HCENTER:       rPageSett.importHorCenter( rStrm );             break;
819cdf0e10cSrcweir                         case BIFF_ID_OBJ:           rDrawing.importObj( rStrm );                    break;
820cdf0e10cSrcweir                         case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm );    break;
821cdf0e10cSrcweir                         case BIFF_ID_SAVERECALC:    rWorkbookSett.importSaveRecalc( rStrm );        break;
822cdf0e10cSrcweir                         case BIFF_ID_SHEETPR:       rWorksheetSett.importSheetPr( rStrm );          break;
823cdf0e10cSrcweir                         case BIFF_ID_UNCALCED:      rWorkbookSett.importUncalced( rStrm );          break;
824cdf0e10cSrcweir                         case BIFF_ID_VCENTER:       rPageSett.importVerCenter( rStrm );             break;
825cdf0e10cSrcweir                         case BIFF3_ID_WINDOW2:      rSheetViewSett.importWindow2( rStrm );          break;
826cdf0e10cSrcweir                     }
827cdf0e10cSrcweir                     break;
828cdf0e10cSrcweir 
829cdf0e10cSrcweir                     case BIFF4: switch( nRecId )
830cdf0e10cSrcweir                     {
831cdf0e10cSrcweir                         case BIFF_ID_COLINFO:       importColInfo( rStrm );                         break;
832cdf0e10cSrcweir                         case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight( rStrm );                    break;
833cdf0e10cSrcweir                         case BIFF_ID_HCENTER:       rPageSett.importHorCenter( rStrm );             break;
834cdf0e10cSrcweir                         case BIFF_ID_OBJ:           rDrawing.importObj( rStrm );                    break;
835cdf0e10cSrcweir                         case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm );    break;
836cdf0e10cSrcweir                         case BIFF_ID_PAGESETUP:     rPageSett.importPageSetup( rStrm );             break;
837cdf0e10cSrcweir                         case BIFF_ID_SAVERECALC:    rWorkbookSett.importSaveRecalc( rStrm );        break;
838cdf0e10cSrcweir                         case BIFF_ID_SHEETPR:       rWorksheetSett.importSheetPr( rStrm );          break;
839cdf0e10cSrcweir                         case BIFF_ID_STANDARDWIDTH: importStandardWidth( rStrm );                   break;
840cdf0e10cSrcweir                         case BIFF_ID_UNCALCED:      rWorkbookSett.importUncalced( rStrm );          break;
841cdf0e10cSrcweir                         case BIFF_ID_VCENTER:       rPageSett.importVerCenter( rStrm );             break;
842cdf0e10cSrcweir                         case BIFF3_ID_WINDOW2:      rSheetViewSett.importWindow2( rStrm );          break;
843cdf0e10cSrcweir                     }
844cdf0e10cSrcweir                     break;
845cdf0e10cSrcweir 
846cdf0e10cSrcweir                     case BIFF5: switch( nRecId )
847cdf0e10cSrcweir                     {
848cdf0e10cSrcweir                         case BIFF_ID_AUTOFILTER:    importAutoFilter( rStrm );                      break;
849cdf0e10cSrcweir                         case BIFF_ID_COLINFO:       importColInfo( rStrm );                         break;
850cdf0e10cSrcweir                         case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight( rStrm );                    break;
851cdf0e10cSrcweir                         case BIFF_ID_HCENTER:       rPageSett.importHorCenter( rStrm );             break;
852cdf0e10cSrcweir                         case BIFF_ID_MERGEDCELLS:   importMergedCells( rStrm );                     break;  // #i62300# also in BIFF5
853cdf0e10cSrcweir                         case BIFF_ID_OBJ:           rDrawing.importObj( rStrm );                    break;
854cdf0e10cSrcweir                         case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm );    break;
855cdf0e10cSrcweir                         case BIFF_ID_PAGESETUP:     rPageSett.importPageSetup( rStrm );             break;
856cdf0e10cSrcweir                         case BIFF_ID_PTDEFINITION:  importPTDefinition( rStrm );                    break;
857cdf0e10cSrcweir                         case BIFF_ID_SAVERECALC:    rWorkbookSett.importSaveRecalc( rStrm );        break;
858cdf0e10cSrcweir                         case BIFF_ID_SCENPROTECT:   rWorksheetSett.importScenProtect( rStrm );      break;
859cdf0e10cSrcweir                         case BIFF_ID_SCL:           rSheetViewSett.importScl( rStrm );              break;
860cdf0e10cSrcweir                         case BIFF_ID_SHEETPR:       rWorksheetSett.importSheetPr( rStrm );          break;
861cdf0e10cSrcweir                         case BIFF_ID_STANDARDWIDTH: importStandardWidth( rStrm );                   break;
862cdf0e10cSrcweir                         case BIFF_ID_UNCALCED:      rWorkbookSett.importUncalced( rStrm );          break;
863cdf0e10cSrcweir                         case BIFF_ID_VCENTER:       rPageSett.importVerCenter( rStrm );             break;
864cdf0e10cSrcweir                         case BIFF3_ID_WINDOW2:      rSheetViewSett.importWindow2( rStrm );          break;
865cdf0e10cSrcweir                     }
866cdf0e10cSrcweir                     break;
867cdf0e10cSrcweir 
868cdf0e10cSrcweir                     case BIFF8: switch( nRecId )
869cdf0e10cSrcweir                     {
870cdf0e10cSrcweir                         case BIFF_ID_AUTOFILTER:        importAutoFilter( rStrm );                      break;
871cdf0e10cSrcweir                         case BIFF_ID_CFHEADER:          rCondFormats.importCfHeader( rStrm );           break;
872cdf0e10cSrcweir                         case BIFF_ID_CODENAME:          rWorksheetSett.importCodeName( rStrm );         break;
873cdf0e10cSrcweir                         case BIFF_ID_COLINFO:           importColInfo( rStrm );                         break;
874cdf0e10cSrcweir                         case BIFF_ID_DATAVALIDATION:    importDataValidation( rStrm );                  break;
875cdf0e10cSrcweir                         case BIFF_ID_DATAVALIDATIONS:   importDataValidations( rStrm );                 break;
876cdf0e10cSrcweir                         case BIFF3_ID_DEFROWHEIGHT:     importDefRowHeight( rStrm );                    break;
877cdf0e10cSrcweir                         case BIFF_ID_HCENTER:           rPageSett.importHorCenter( rStrm );             break;
878cdf0e10cSrcweir                         case BIFF_ID_HYPERLINK:         importHyperlink( rStrm );                       break;
879cdf0e10cSrcweir                         case BIFF_ID_LABELRANGES:       importLabelRanges( rStrm );                     break;
880cdf0e10cSrcweir                         case BIFF_ID_MERGEDCELLS:       importMergedCells( rStrm );                     break;
881cdf0e10cSrcweir                         case BIFF_ID_OBJ:               rDrawing.importObj( rStrm );                    break;
882cdf0e10cSrcweir                         case BIFF_ID_OBJECTPROTECT:     rWorksheetSett.importObjectProtect( rStrm );    break;
883cdf0e10cSrcweir                         case BIFF_ID_PAGESETUP:         rPageSett.importPageSetup( rStrm );             break;
884cdf0e10cSrcweir                         case BIFF_ID_PHONETICPR:        rWorksheetSett.importPhoneticPr( rStrm );       break;
885cdf0e10cSrcweir                         case BIFF_ID_PICTURE:           rPageSett.importPicture( rStrm );               break;
886cdf0e10cSrcweir                         case BIFF_ID_PTDEFINITION:      importPTDefinition( rStrm );                    break;
887cdf0e10cSrcweir                         case BIFF_ID_QUERYTABLE:        importQueryTable( rStrm );                      break;
888cdf0e10cSrcweir                         case BIFF_ID_SAVERECALC:        rWorkbookSett.importSaveRecalc( rStrm );        break;
889cdf0e10cSrcweir                         case BIFF_ID_SCENARIOS:         importScenarios( rStrm );                       break;
890cdf0e10cSrcweir                         case BIFF_ID_SCENPROTECT:       rWorksheetSett.importScenProtect( rStrm );      break;
891cdf0e10cSrcweir                         case BIFF_ID_SCL:               rSheetViewSett.importScl( rStrm );              break;
892cdf0e10cSrcweir                         case BIFF_ID_SHEETEXT:          rWorksheetSett.importSheetExt( rStrm );         break;
893cdf0e10cSrcweir                         case BIFF_ID_SHEETPR:           rWorksheetSett.importSheetPr( rStrm );          break;
894cdf0e10cSrcweir                         case BIFF_ID_SHAREDFEATHEAD:    importSharedFeatHead( rStrm );                  break;
895cdf0e10cSrcweir                         case BIFF_ID_STANDARDWIDTH:     importStandardWidth( rStrm );                   break;
896cdf0e10cSrcweir                         case BIFF_ID_UNCALCED:          rWorkbookSett.importUncalced( rStrm );          break;
897cdf0e10cSrcweir                         case BIFF_ID_VCENTER:           rPageSett.importVerCenter( rStrm );             break;
898cdf0e10cSrcweir                         case BIFF3_ID_WINDOW2:          rSheetViewSett.importWindow2( rStrm );          break;
899cdf0e10cSrcweir                     }
900cdf0e10cSrcweir                     break;
901cdf0e10cSrcweir 
902cdf0e10cSrcweir                     case BIFF_UNKNOWN: break;
903cdf0e10cSrcweir                 }
904cdf0e10cSrcweir             }
905cdf0e10cSrcweir 
906cdf0e10cSrcweir             // record not processed, try record context objects
907cdf0e10cSrcweir             if( rStrm.tellBase() == nStrmPos )
908cdf0e10cSrcweir             {
909cdf0e10cSrcweir                 // first, try cell table records
910cdf0e10cSrcweir                 aSheetData.importRecord( rStrm );
911cdf0e10cSrcweir                 // handle another open record context
912cdf0e10cSrcweir                 if( mxContext.get() )
913cdf0e10cSrcweir                 {
914cdf0e10cSrcweir                     // if it was a cell table record, forget the other record context
915cdf0e10cSrcweir                     if( rStrm.tellBase() == nStrmPos )
916cdf0e10cSrcweir                         mxContext->importRecord( rStrm );
917cdf0e10cSrcweir                     else
918cdf0e10cSrcweir                         mxContext.reset();
919cdf0e10cSrcweir                 }
920cdf0e10cSrcweir             }
921cdf0e10cSrcweir         }
922cdf0e10cSrcweir     }
923cdf0e10cSrcweir 
924cdf0e10cSrcweir     // final processing in base class WorksheetHelper
925cdf0e10cSrcweir     finalizeWorksheetImport();
926cdf0e10cSrcweir     return rStrm.getRecId() == BIFF_ID_EOF;
927cdf0e10cSrcweir }
928cdf0e10cSrcweir 
929cdf0e10cSrcweir // private --------------------------------------------------------------------
930cdf0e10cSrcweir 
931cdf0e10cSrcweir void BiffWorksheetFragment::importAutoFilter( BiffInputStream& rStrm )
932cdf0e10cSrcweir {
933cdf0e10cSrcweir     mxContext.reset( new BiffAutoFilterContext( *this, getAutoFilters().createAutoFilter() ) );
934cdf0e10cSrcweir     mxContext->importRecord( rStrm );
935cdf0e10cSrcweir }
936cdf0e10cSrcweir 
937cdf0e10cSrcweir void BiffWorksheetFragment::importColInfo( BiffInputStream& rStrm )
938cdf0e10cSrcweir {
939cdf0e10cSrcweir     sal_uInt16 nFirstCol, nLastCol, nWidth, nXfId, nFlags;
940cdf0e10cSrcweir     rStrm >> nFirstCol >> nLastCol >> nWidth >> nXfId >> nFlags;
941cdf0e10cSrcweir 
942cdf0e10cSrcweir     ColumnModel aModel;
943cdf0e10cSrcweir     // column indexes are 0-based in BIFF, but ColumnModel expects 1-based
944cdf0e10cSrcweir     aModel.maRange.mnFirst = static_cast< sal_Int32 >( nFirstCol ) + 1;
945cdf0e10cSrcweir     aModel.maRange.mnLast  = static_cast< sal_Int32 >( nLastCol ) + 1;
946cdf0e10cSrcweir     // width is stored as 1/256th of a character in BIFF, convert to entire character
947cdf0e10cSrcweir     aModel.mfWidth         = static_cast< double >( nWidth ) / 256.0;
948cdf0e10cSrcweir     aModel.mnXfId          = nXfId;
949cdf0e10cSrcweir     aModel.mnLevel         = extractValue< sal_Int32 >( nFlags, 8, 3 );
950cdf0e10cSrcweir     aModel.mbShowPhonetic  = getFlag( nFlags, BIFF_COLINFO_SHOWPHONETIC );
951cdf0e10cSrcweir     aModel.mbHidden        = getFlag( nFlags, BIFF_COLINFO_HIDDEN );
952cdf0e10cSrcweir     aModel.mbCollapsed     = getFlag( nFlags, BIFF_COLINFO_COLLAPSED );
953cdf0e10cSrcweir     // set column properties in the current sheet
954cdf0e10cSrcweir     setColumnModel( aModel );
955cdf0e10cSrcweir }
956cdf0e10cSrcweir 
957cdf0e10cSrcweir void BiffWorksheetFragment::importColumnDefault( BiffInputStream& rStrm )
958cdf0e10cSrcweir {
959cdf0e10cSrcweir     sal_uInt16 nFirstCol, nLastCol, nXfId;
960cdf0e10cSrcweir     rStrm >> nFirstCol >> nLastCol >> nXfId;
961cdf0e10cSrcweir     setDefaultColumnFormat( nFirstCol, nLastCol, nXfId );
962cdf0e10cSrcweir }
963cdf0e10cSrcweir 
964cdf0e10cSrcweir void BiffWorksheetFragment::importColWidth( BiffInputStream& rStrm )
965cdf0e10cSrcweir {
966cdf0e10cSrcweir     sal_uInt8 nFirstCol, nLastCol;
967cdf0e10cSrcweir     sal_uInt16 nWidth;
968cdf0e10cSrcweir     rStrm >> nFirstCol >> nLastCol >> nWidth;
969cdf0e10cSrcweir 
970cdf0e10cSrcweir     ColumnModel aModel;
971cdf0e10cSrcweir     // column indexes are 0-based in BIFF, but ColumnModel expects 1-based
972cdf0e10cSrcweir     aModel.maRange.mnFirst = static_cast< sal_Int32 >( nFirstCol ) + 1;
973cdf0e10cSrcweir     aModel.maRange.mnLast = static_cast< sal_Int32 >( nLastCol ) + 1;
974cdf0e10cSrcweir     // width is stored as 1/256th of a character in BIFF, convert to entire character
975cdf0e10cSrcweir     aModel.mfWidth = static_cast< double >( nWidth ) / 256.0;
976cdf0e10cSrcweir     // set column properties in the current sheet
977cdf0e10cSrcweir     setColumnModel( aModel );
978cdf0e10cSrcweir }
979cdf0e10cSrcweir 
980cdf0e10cSrcweir void BiffWorksheetFragment::importDefColWidth( BiffInputStream& rStrm )
981cdf0e10cSrcweir {
982cdf0e10cSrcweir     /*  Stored as entire number of characters without padding pixels, which
983cdf0e10cSrcweir         will be added in setBaseColumnWidth(). Call has no effect, if a
984cdf0e10cSrcweir         width has already been set from the STANDARDWIDTH record. */
985cdf0e10cSrcweir     setBaseColumnWidth( rStrm.readuInt16() );
986cdf0e10cSrcweir }
987cdf0e10cSrcweir 
988cdf0e10cSrcweir void BiffWorksheetFragment::importDefRowHeight( BiffInputStream& rStrm )
989cdf0e10cSrcweir {
990cdf0e10cSrcweir     sal_uInt16 nFlags = BIFF_DEFROW_CUSTOMHEIGHT, nHeight;
991cdf0e10cSrcweir     if( getBiff() != BIFF2 )
992cdf0e10cSrcweir         rStrm >> nFlags;
993cdf0e10cSrcweir     rStrm >> nHeight;
994cdf0e10cSrcweir     if( getBiff() == BIFF2 )
995cdf0e10cSrcweir         nHeight &= BIFF2_DEFROW_MASK;
996cdf0e10cSrcweir     // row height is in twips in BIFF, convert to points
997cdf0e10cSrcweir     setDefaultRowSettings(
998cdf0e10cSrcweir         nHeight / 20.0,
999cdf0e10cSrcweir         getFlag( nFlags, BIFF_DEFROW_CUSTOMHEIGHT ),
1000cdf0e10cSrcweir         getFlag( nFlags, BIFF_DEFROW_HIDDEN ),
1001cdf0e10cSrcweir         getFlag( nFlags, BIFF_DEFROW_THICKTOP ),
1002cdf0e10cSrcweir         getFlag( nFlags, BIFF_DEFROW_THICKBOTTOM ) );
1003cdf0e10cSrcweir }
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir void BiffWorksheetFragment::importDataValidations( BiffInputStream& rStrm )
1006cdf0e10cSrcweir {
1007cdf0e10cSrcweir     sal_Int32 nObjId;
1008cdf0e10cSrcweir     rStrm.skip( 10 );
1009cdf0e10cSrcweir     rStrm >> nObjId;
1010cdf0e10cSrcweir     //! TODO: invalidate object id in drawing object manager
1011cdf0e10cSrcweir }
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir namespace {
1014cdf0e10cSrcweir 
1015cdf0e10cSrcweir OUString lclReadDataValMessage( BiffInputStream& rStrm )
1016cdf0e10cSrcweir {
1017cdf0e10cSrcweir     // empty strings are single NUL characters (string length is 1)
1018cdf0e10cSrcweir     OUString aMessage = rStrm.readUniString( true );
1019cdf0e10cSrcweir     if( (aMessage.getLength() == 1) && (aMessage[ 0 ] == 0) )
1020cdf0e10cSrcweir         aMessage = OUString();
1021cdf0e10cSrcweir     return aMessage;
1022cdf0e10cSrcweir }
1023cdf0e10cSrcweir 
1024cdf0e10cSrcweir ApiTokenSequence lclReadDataValFormula( BiffInputStream& rStrm, FormulaParser& rParser )
1025cdf0e10cSrcweir {
1026cdf0e10cSrcweir     sal_uInt16 nFmlaSize = rStrm.readuInt16();
1027cdf0e10cSrcweir     rStrm.skip( 2 );
1028cdf0e10cSrcweir     return rParser.importFormula( CellAddress(), FORMULATYPE_VALIDATION, rStrm, &nFmlaSize );
1029cdf0e10cSrcweir }
1030cdf0e10cSrcweir 
1031cdf0e10cSrcweir } // namespace
1032cdf0e10cSrcweir 
1033cdf0e10cSrcweir void BiffWorksheetFragment::importDataValidation( BiffInputStream& rStrm )
1034cdf0e10cSrcweir {
1035cdf0e10cSrcweir     ValidationModel aModel;
1036cdf0e10cSrcweir 
1037cdf0e10cSrcweir     // flags
1038cdf0e10cSrcweir     sal_uInt32 nFlags;
1039cdf0e10cSrcweir     rStrm >> nFlags;
1040cdf0e10cSrcweir     aModel.setBiffType( extractValue< sal_uInt8 >( nFlags, 0, 4 ) );
1041cdf0e10cSrcweir     aModel.setBiffOperator( extractValue< sal_uInt8 >( nFlags, 20, 4 ) );
1042cdf0e10cSrcweir     aModel.setBiffErrorStyle( extractValue< sal_uInt8 >( nFlags, 4, 3 ) );
1043cdf0e10cSrcweir     aModel.mbAllowBlank   = getFlag( nFlags, BIFF_DATAVAL_ALLOWBLANK );
1044cdf0e10cSrcweir     aModel.mbNoDropDown   = getFlag( nFlags, BIFF_DATAVAL_NODROPDOWN );
1045cdf0e10cSrcweir     aModel.mbShowInputMsg = getFlag( nFlags, BIFF_DATAVAL_SHOWINPUT );
1046cdf0e10cSrcweir     aModel.mbShowErrorMsg = getFlag( nFlags, BIFF_DATAVAL_SHOWERROR );
1047cdf0e10cSrcweir 
1048cdf0e10cSrcweir     // message strings
1049cdf0e10cSrcweir     aModel.maInputTitle   = lclReadDataValMessage( rStrm );
1050cdf0e10cSrcweir     aModel.maErrorTitle   = lclReadDataValMessage( rStrm );
1051cdf0e10cSrcweir     aModel.maInputMessage = lclReadDataValMessage( rStrm );
1052cdf0e10cSrcweir     aModel.maErrorMessage = lclReadDataValMessage( rStrm );
1053cdf0e10cSrcweir 
1054cdf0e10cSrcweir     // condition formula(s)
1055cdf0e10cSrcweir     FormulaParser& rParser = getFormulaParser();
1056cdf0e10cSrcweir     aModel.maTokens1 = lclReadDataValFormula( rStrm, rParser );
1057cdf0e10cSrcweir     aModel.maTokens2 = lclReadDataValFormula( rStrm, rParser );
1058cdf0e10cSrcweir     // process string list of a list validation (convert to list of string tokens)
1059cdf0e10cSrcweir     if( (aModel.mnType == XML_list) && getFlag( nFlags, BIFF_DATAVAL_STRINGLIST ) )
1060cdf0e10cSrcweir         rParser.convertStringToStringList( aModel.maTokens1, '\0', true );
1061cdf0e10cSrcweir 
1062cdf0e10cSrcweir     // cell range list
1063cdf0e10cSrcweir     BinRangeList aRanges;
1064cdf0e10cSrcweir     rStrm >> aRanges;
1065cdf0e10cSrcweir     getAddressConverter().convertToCellRangeList( aModel.maRanges, aRanges, getSheetIndex(), true );
1066cdf0e10cSrcweir 
1067cdf0e10cSrcweir     // set validation data
1068cdf0e10cSrcweir     setValidation( aModel );
1069cdf0e10cSrcweir }
1070cdf0e10cSrcweir 
1071cdf0e10cSrcweir void BiffWorksheetFragment::importDimension( BiffInputStream& rStrm )
1072cdf0e10cSrcweir {
1073cdf0e10cSrcweir     // 32-bit row indexes in BIFF8
1074cdf0e10cSrcweir     bool bInt32Rows = (rStrm.getRecId() == BIFF3_ID_DIMENSION) && (getBiff() == BIFF8);
1075cdf0e10cSrcweir     BinRange aBinRange;
1076cdf0e10cSrcweir     aBinRange.read( rStrm, true, bInt32Rows );
1077cdf0e10cSrcweir     /*  BIFF stores the used area with end column and end row increased by 1
1078cdf0e10cSrcweir         (first unused column and row). */
1079cdf0e10cSrcweir     if( (aBinRange.maFirst.mnCol < aBinRange.maLast.mnCol) && (aBinRange.maFirst.mnRow < aBinRange.maLast.mnRow) )
1080cdf0e10cSrcweir     {
1081cdf0e10cSrcweir         // reduce range to used area
1082cdf0e10cSrcweir         --aBinRange.maLast.mnCol;
1083cdf0e10cSrcweir         --aBinRange.maLast.mnRow;
1084cdf0e10cSrcweir         CellRangeAddress aRange;
1085cdf0e10cSrcweir         getAddressConverter().convertToCellRangeUnchecked( aRange, aBinRange, getSheetIndex() );
1086cdf0e10cSrcweir         extendUsedArea( aRange );
1087cdf0e10cSrcweir     }
1088cdf0e10cSrcweir }
1089cdf0e10cSrcweir 
1090cdf0e10cSrcweir void BiffWorksheetFragment::importHyperlink( BiffInputStream& rStrm )
1091cdf0e10cSrcweir {
1092cdf0e10cSrcweir     HyperlinkModel aModel;
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir     // read cell range for the hyperlink
1095cdf0e10cSrcweir     BinRange aBiffRange;
1096cdf0e10cSrcweir     rStrm >> aBiffRange;
1097cdf0e10cSrcweir     // #i80006# Excel silently ignores invalid hi-byte of column index (TODO: everywhere?)
1098cdf0e10cSrcweir     aBiffRange.maFirst.mnCol &= 0xFF;
1099cdf0e10cSrcweir     aBiffRange.maLast.mnCol &= 0xFF;
1100cdf0e10cSrcweir     if( !getAddressConverter().convertToCellRange( aModel.maRange, aBiffRange, getSheetIndex(), true, true ) )
1101cdf0e10cSrcweir         return;
1102cdf0e10cSrcweir 
1103cdf0e10cSrcweir     // try to read the StdHlink data
1104cdf0e10cSrcweir     if( !::oox::ole::OleHelper::importStdHlink( aModel, rStrm, true ) )
1105cdf0e10cSrcweir         return;
1106cdf0e10cSrcweir 
1107cdf0e10cSrcweir     // try to read the optional following SCREENTIP record
1108cdf0e10cSrcweir     if( (rStrm.getNextRecId() == BIFF_ID_SCREENTIP) && rStrm.startNextRecord() )
1109cdf0e10cSrcweir     {
1110cdf0e10cSrcweir         rStrm.skip( 2 );      // repeated record id
1111cdf0e10cSrcweir         // the cell range, again
1112cdf0e10cSrcweir         rStrm >> aBiffRange;
1113cdf0e10cSrcweir         CellRangeAddress aRange;
1114cdf0e10cSrcweir         if( getAddressConverter().convertToCellRange( aRange, aBiffRange, getSheetIndex(), true, true ) &&
1115cdf0e10cSrcweir             (aRange.StartColumn == aModel.maRange.StartColumn) &&
1116cdf0e10cSrcweir             (aRange.StartRow == aModel.maRange.StartRow) &&
1117cdf0e10cSrcweir             (aRange.EndColumn == aModel.maRange.EndColumn) &&
1118cdf0e10cSrcweir             (aRange.EndRow == aModel.maRange.EndRow) )
1119cdf0e10cSrcweir         {
1120cdf0e10cSrcweir             /*  This time, we have no string length, no flag field, and a
1121cdf0e10cSrcweir                 null-terminated 16-bit character array. */
1122cdf0e10cSrcweir             aModel.maTooltip = rStrm.readNulUnicodeArray();
1123cdf0e10cSrcweir         }
1124cdf0e10cSrcweir     }
1125cdf0e10cSrcweir 
1126cdf0e10cSrcweir     // store the hyperlink settings
1127cdf0e10cSrcweir     setHyperlink( aModel );
1128cdf0e10cSrcweir }
1129cdf0e10cSrcweir 
1130cdf0e10cSrcweir void BiffWorksheetFragment::importLabelRanges( BiffInputStream& rStrm )
1131cdf0e10cSrcweir {
1132cdf0e10cSrcweir     BinRangeList aBiffRowRanges, aBiffColRanges;
1133cdf0e10cSrcweir     rStrm >> aBiffRowRanges >> aBiffColRanges;
1134cdf0e10cSrcweir     ApiCellRangeList aColRanges, aRowRanges;
1135cdf0e10cSrcweir     getAddressConverter().convertToCellRangeList( aColRanges, aBiffColRanges, getSheetIndex(), true );
1136cdf0e10cSrcweir     getAddressConverter().convertToCellRangeList( aRowRanges, aBiffRowRanges, getSheetIndex(), true );
1137cdf0e10cSrcweir     setLabelRanges( aColRanges, aRowRanges );
1138cdf0e10cSrcweir }
1139cdf0e10cSrcweir 
1140cdf0e10cSrcweir void BiffWorksheetFragment::importMergedCells( BiffInputStream& rStrm )
1141cdf0e10cSrcweir {
1142cdf0e10cSrcweir     BinRangeList aBiffRanges;
1143cdf0e10cSrcweir     rStrm >> aBiffRanges;
1144cdf0e10cSrcweir     ApiCellRangeList aRanges;
1145cdf0e10cSrcweir     getAddressConverter().convertToCellRangeList( aRanges, aBiffRanges, getSheetIndex(), true );
1146cdf0e10cSrcweir     for( ApiCellRangeList::const_iterator aIt = aRanges.begin(), aEnd = aRanges.end(); aIt != aEnd; ++aIt )
1147cdf0e10cSrcweir         getSheetData().setMergedRange( *aIt );
1148cdf0e10cSrcweir }
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir void BiffWorksheetFragment::importNote( BiffInputStream& rStrm )
1151cdf0e10cSrcweir {
1152cdf0e10cSrcweir     getComments().createComment()->importNote( rStrm );
1153cdf0e10cSrcweir }
1154cdf0e10cSrcweir 
1155cdf0e10cSrcweir void BiffWorksheetFragment::importPageBreaks( BiffInputStream& rStrm, bool bRowBreak )
1156cdf0e10cSrcweir {
1157cdf0e10cSrcweir     PageBreakModel aModel;
1158cdf0e10cSrcweir     aModel.mbManual = true;             // only manual breaks stored in BIFF
1159cdf0e10cSrcweir     bool bBiff8 = getBiff() == BIFF8;   // skip start/end columns or rows in BIFF8
1160cdf0e10cSrcweir 
1161cdf0e10cSrcweir     sal_uInt16 nCount;
1162cdf0e10cSrcweir     rStrm >> nCount;
1163cdf0e10cSrcweir     for( sal_uInt16 nIndex = 0; !rStrm.isEof() && (nIndex < nCount); ++nIndex )
1164cdf0e10cSrcweir     {
1165cdf0e10cSrcweir         aModel.mnColRow = rStrm.readuInt16();
1166cdf0e10cSrcweir         setPageBreak( aModel, bRowBreak );
1167cdf0e10cSrcweir         if( bBiff8 )
1168cdf0e10cSrcweir             rStrm.skip( 4 );
1169cdf0e10cSrcweir     }
1170cdf0e10cSrcweir }
1171cdf0e10cSrcweir 
1172cdf0e10cSrcweir void BiffWorksheetFragment::importPTDefinition( BiffInputStream& rStrm )
1173cdf0e10cSrcweir {
1174cdf0e10cSrcweir     mxContext.reset( new BiffPivotTableContext( *this ) );
1175cdf0e10cSrcweir     mxContext->importRecord( rStrm );
1176cdf0e10cSrcweir }
1177cdf0e10cSrcweir 
1178cdf0e10cSrcweir void BiffWorksheetFragment::importQueryTable( BiffInputStream& rStrm )
1179cdf0e10cSrcweir {
1180cdf0e10cSrcweir     mxContext.reset( new BiffQueryTableContext( *this ) );
1181cdf0e10cSrcweir     mxContext->importRecord( rStrm );
1182cdf0e10cSrcweir }
1183cdf0e10cSrcweir 
1184cdf0e10cSrcweir void BiffWorksheetFragment::importScenarios( BiffInputStream& rStrm )
1185cdf0e10cSrcweir {
1186cdf0e10cSrcweir     getScenarios().createSheetScenarios( getSheetIndex() ).importScenarios( rStrm );
1187cdf0e10cSrcweir }
1188cdf0e10cSrcweir 
1189cdf0e10cSrcweir void BiffWorksheetFragment::importSharedFeatHead( BiffInputStream& rStrm )
1190cdf0e10cSrcweir {
1191cdf0e10cSrcweir     rStrm.skip( 12 );
1192cdf0e10cSrcweir     sal_uInt16 nType = rStrm.readuInt16();
1193cdf0e10cSrcweir     rStrm.skip( 5 );
1194cdf0e10cSrcweir     switch( nType )
1195cdf0e10cSrcweir     {
1196cdf0e10cSrcweir         case BIFF_SHRFEATHEAD_SHEETPROT:
1197cdf0e10cSrcweir             if( rStrm.getRemaining() >= 4 )
1198cdf0e10cSrcweir                 getWorksheetSettings().importSheetProtection( rStrm );
1199cdf0e10cSrcweir         break;
1200cdf0e10cSrcweir     }
1201cdf0e10cSrcweir }
1202cdf0e10cSrcweir 
1203cdf0e10cSrcweir void BiffWorksheetFragment::importStandardWidth( BiffInputStream& rStrm )
1204cdf0e10cSrcweir {
1205cdf0e10cSrcweir     sal_uInt16 nWidth;
1206cdf0e10cSrcweir     rStrm >> nWidth;
1207cdf0e10cSrcweir     // width is stored as 1/256th of a character in BIFF, convert to entire character
1208cdf0e10cSrcweir     double fWidth = static_cast< double >( nWidth ) / 256.0;
1209cdf0e10cSrcweir     // set as default width, will override the width from DEFCOLWIDTH record
1210cdf0e10cSrcweir     setDefaultColumnWidth( fWidth );
1211cdf0e10cSrcweir }
1212cdf0e10cSrcweir 
1213cdf0e10cSrcweir // ============================================================================
1214cdf0e10cSrcweir 
1215cdf0e10cSrcweir } // namespace xls
1216cdf0e10cSrcweir } // namespace oox
1217