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