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