xref: /AOO41X/main/oox/source/xls/workbookhelper.cxx (revision ca5ec2004b000a7d9aaa8381be8ac2853e3b1dc7)
1*ca5ec200SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*ca5ec200SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*ca5ec200SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*ca5ec200SAndrew Rist  * distributed with this work for additional information
6*ca5ec200SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*ca5ec200SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*ca5ec200SAndrew Rist  * "License"); you may not use this file except in compliance
9*ca5ec200SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*ca5ec200SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*ca5ec200SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*ca5ec200SAndrew Rist  * software distributed under the License is distributed on an
15*ca5ec200SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*ca5ec200SAndrew Rist  * KIND, either express or implied.  See the License for the
17*ca5ec200SAndrew Rist  * specific language governing permissions and limitations
18*ca5ec200SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*ca5ec200SAndrew Rist  *************************************************************/
21*ca5ec200SAndrew Rist 
22*ca5ec200SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "oox/xls/workbookhelper.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include <com/sun/star/container/XIndexAccess.hpp>
27cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
28cdf0e10cSrcweir #include <com/sun/star/document/XActionLockable.hpp>
29cdf0e10cSrcweir #include <com/sun/star/sheet/XDatabaseRange.hpp>
30cdf0e10cSrcweir #include <com/sun/star/sheet/XDatabaseRanges.hpp>
31cdf0e10cSrcweir #include <com/sun/star/sheet/XNamedRange.hpp>
32cdf0e10cSrcweir #include <com/sun/star/sheet/XNamedRanges.hpp>
33cdf0e10cSrcweir #include <com/sun/star/sheet/XSpreadsheet.hpp>
34cdf0e10cSrcweir #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
35cdf0e10cSrcweir #include <com/sun/star/style/XStyle.hpp>
36cdf0e10cSrcweir #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
37cdf0e10cSrcweir #include <com/sun/star/table/CellAddress.hpp>
38cdf0e10cSrcweir #include <osl/thread.h>
39cdf0e10cSrcweir #include "oox/drawingml/theme.hxx"
40cdf0e10cSrcweir #include "oox/helper/progressbar.hxx"
41cdf0e10cSrcweir #include "oox/helper/propertyset.hxx"
42cdf0e10cSrcweir #include "oox/ole/vbaproject.hxx"
43cdf0e10cSrcweir #include "oox/xls/addressconverter.hxx"
44cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx"
45cdf0e10cSrcweir #include "oox/xls/biffcodec.hxx"
46cdf0e10cSrcweir #include "oox/xls/connectionsbuffer.hxx"
47cdf0e10cSrcweir #include "oox/xls/defnamesbuffer.hxx"
48cdf0e10cSrcweir #include "oox/xls/excelchartconverter.hxx"
49cdf0e10cSrcweir #include "oox/xls/excelfilter.hxx"
50cdf0e10cSrcweir #include "oox/xls/externallinkbuffer.hxx"
51cdf0e10cSrcweir #include "oox/xls/formulaparser.hxx"
52cdf0e10cSrcweir #include "oox/xls/pagesettings.hxx"
53cdf0e10cSrcweir #include "oox/xls/pivotcachebuffer.hxx"
54cdf0e10cSrcweir #include "oox/xls/pivottablebuffer.hxx"
55cdf0e10cSrcweir #include "oox/xls/scenariobuffer.hxx"
56cdf0e10cSrcweir #include "oox/xls/sharedstringsbuffer.hxx"
57cdf0e10cSrcweir #include "oox/xls/stylesbuffer.hxx"
58cdf0e10cSrcweir #include "oox/xls/tablebuffer.hxx"
59cdf0e10cSrcweir #include "oox/xls/themebuffer.hxx"
60cdf0e10cSrcweir #include "oox/xls/unitconverter.hxx"
61cdf0e10cSrcweir #include "oox/xls/viewsettings.hxx"
62cdf0e10cSrcweir #include "oox/xls/workbooksettings.hxx"
63cdf0e10cSrcweir #include "oox/xls/worksheetbuffer.hxx"
64cdf0e10cSrcweir 
65cdf0e10cSrcweir namespace oox {
66cdf0e10cSrcweir namespace xls {
67cdf0e10cSrcweir 
68cdf0e10cSrcweir // ============================================================================
69cdf0e10cSrcweir 
70cdf0e10cSrcweir using namespace ::com::sun::star::awt;
71cdf0e10cSrcweir using namespace ::com::sun::star::container;
72cdf0e10cSrcweir using namespace ::com::sun::star::document;
73cdf0e10cSrcweir using namespace ::com::sun::star::lang;
74cdf0e10cSrcweir using namespace ::com::sun::star::sheet;
75cdf0e10cSrcweir using namespace ::com::sun::star::style;
76cdf0e10cSrcweir using namespace ::com::sun::star::table;
77cdf0e10cSrcweir using namespace ::com::sun::star::uno;
78cdf0e10cSrcweir 
79cdf0e10cSrcweir using ::oox::core::BinaryFilterBase;
80cdf0e10cSrcweir using ::oox::core::FilterBase;
81cdf0e10cSrcweir using ::oox::core::FragmentHandler;
82cdf0e10cSrcweir using ::oox::core::XmlFilterBase;
83cdf0e10cSrcweir using ::oox::drawingml::Theme;
84cdf0e10cSrcweir using ::rtl::OUString;
85cdf0e10cSrcweir 
86cdf0e10cSrcweir // ============================================================================
87cdf0e10cSrcweir 
88cdf0e10cSrcweir bool IgnoreCaseCompare::operator()( const OUString& rName1, const OUString& rName2 ) const
89cdf0e10cSrcweir {
90cdf0e10cSrcweir     // there is no wrapper in rtl::OUString, TODO: compare with collator
91cdf0e10cSrcweir     return ::rtl_ustr_compareIgnoreAsciiCase_WithLength(
92cdf0e10cSrcweir         rName1.getStr(), rName1.getLength(), rName2.getStr(), rName2.getLength() ) < 0;
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
95cdf0e10cSrcweir // ============================================================================
96cdf0e10cSrcweir 
97cdf0e10cSrcweir class WorkbookGlobals
98cdf0e10cSrcweir {
99cdf0e10cSrcweir public:
100cdf0e10cSrcweir     explicit            WorkbookGlobals( ExcelFilter& rFilter );
101cdf0e10cSrcweir     explicit            WorkbookGlobals( ExcelBiffFilter& rFilter, BiffType eBiff );
102cdf0e10cSrcweir                         ~WorkbookGlobals();
103cdf0e10cSrcweir 
104cdf0e10cSrcweir     /** Returns true, if this helper refers to a valid document. */
105cdf0e10cSrcweir     inline bool         isValid() const { return mxDoc.is(); }
106cdf0e10cSrcweir 
107cdf0e10cSrcweir     // filter -----------------------------------------------------------------
108cdf0e10cSrcweir 
109cdf0e10cSrcweir     /** Returns the base filter object (base class of all filters). */
110cdf0e10cSrcweir     inline FilterBase&  getBaseFilter() const { return mrBaseFilter; }
111cdf0e10cSrcweir     /** Returns the filter progress bar. */
112cdf0e10cSrcweir     inline SegmentProgressBar& getProgressBar() const { return *mxProgressBar; }
113cdf0e10cSrcweir     /** Returns the file type of the current filter. */
114cdf0e10cSrcweir     inline FilterType   getFilterType() const { return meFilterType; }
115cdf0e10cSrcweir     /** Returns true, if the file is a multi-sheet document, or false if single-sheet. */
116cdf0e10cSrcweir     inline bool         isWorkbookFile() const { return mbWorkbook; }
117cdf0e10cSrcweir     /** Returns the VBA project storage. */
118cdf0e10cSrcweir     inline StorageRef   getVbaProjectStorage() const { return mxVbaPrjStrg; }
119cdf0e10cSrcweir     /** Returns the index of the current Calc sheet, if filter currently processes a sheet. */
120cdf0e10cSrcweir     inline sal_Int16    getCurrentSheetIndex() const { return mnCurrSheet; }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     /** Sets the VBA project storage used to import VBA source code and forms. */
123cdf0e10cSrcweir     inline void         setVbaProjectStorage( const StorageRef& rxVbaPrjStrg ) { mxVbaPrjStrg = rxVbaPrjStrg; }
124cdf0e10cSrcweir     /** Sets the index of the current Calc sheet, if filter currently processes a sheet. */
125cdf0e10cSrcweir     inline void         setCurrentSheetIndex( sal_Int16 nSheet ) { mnCurrSheet = nSheet; }
126cdf0e10cSrcweir 
127cdf0e10cSrcweir     // document model ---------------------------------------------------------
128cdf0e10cSrcweir 
129cdf0e10cSrcweir     /** Returns a reference to the source/target spreadsheet document model. */
130cdf0e10cSrcweir     inline Reference< XSpreadsheetDocument > getDocument() const { return mxDoc; }
131cdf0e10cSrcweir     /** Returns the cell or page styles container from the Calc document. */
132cdf0e10cSrcweir     Reference< XNameContainer > getStyleFamily( bool bPageStyles ) const;
133cdf0e10cSrcweir     /** Returns the specified cell or page style from the Calc document. */
134cdf0e10cSrcweir     Reference< XStyle > getStyleObject( const OUString& rStyleName, bool bPageStyle ) const;
135cdf0e10cSrcweir     /** Creates and returns a defined name on-the-fly in the Calc document. */
136cdf0e10cSrcweir     Reference< XNamedRange > createNamedRangeObject( OUString& orName, sal_Int32 nNameFlags ) const;
137cdf0e10cSrcweir     /** Creates and returns a database range on-the-fly in the Calc document. */
138cdf0e10cSrcweir     Reference< XDatabaseRange > createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const;
139cdf0e10cSrcweir     /** Creates and returns a com.sun.star.style.Style object for cells or pages. */
140cdf0e10cSrcweir     Reference< XStyle > createStyleObject( OUString& orStyleName, bool bPageStyle ) const;
141cdf0e10cSrcweir 
142cdf0e10cSrcweir     // buffers ----------------------------------------------------------------
143cdf0e10cSrcweir 
144cdf0e10cSrcweir     /** Returns the global workbook settings object. */
145cdf0e10cSrcweir     inline WorkbookSettings& getWorkbookSettings() const { return *mxWorkbookSettings; }
146cdf0e10cSrcweir     /** Returns the workbook and sheet view settings object. */
147cdf0e10cSrcweir     inline ViewSettings& getViewSettings() const { return *mxViewSettings; }
148cdf0e10cSrcweir     /** Returns the worksheet buffer containing sheet names and properties. */
149cdf0e10cSrcweir     inline WorksheetBuffer& getWorksheets() const { return *mxWorksheets; }
150cdf0e10cSrcweir     /** Returns the office theme object read from the theme substorage. */
151cdf0e10cSrcweir     inline ThemeBuffer& getTheme() const { return *mxTheme; }
152cdf0e10cSrcweir     /** Returns all cell formatting objects read from the styles substream. */
153cdf0e10cSrcweir     inline StylesBuffer& getStyles() const { return *mxStyles; }
154cdf0e10cSrcweir     /** Returns the shared strings read from the shared strings substream. */
155cdf0e10cSrcweir     inline SharedStringsBuffer& getSharedStrings() const { return *mxSharedStrings; }
156cdf0e10cSrcweir     /** Returns the external links read from the external links substream. */
157cdf0e10cSrcweir     inline ExternalLinkBuffer& getExternalLinks() const { return *mxExtLinks; }
158cdf0e10cSrcweir     /** Returns the defined names read from the workbook globals. */
159cdf0e10cSrcweir     inline DefinedNamesBuffer& getDefinedNames() const { return *mxDefNames; }
160cdf0e10cSrcweir     /** Returns the tables collection (equivalent to Calc's database ranges). */
161cdf0e10cSrcweir     inline TableBuffer& getTables() const { return *mxTables; }
162cdf0e10cSrcweir     /** Returns the scenarios collection. */
163cdf0e10cSrcweir     inline ScenarioBuffer& getScenarios() const { return *mxScenarios; }
164cdf0e10cSrcweir     /** Returns the collection of external data connections. */
165cdf0e10cSrcweir     inline ConnectionsBuffer&  getConnections() const { return *mxConnections; }
166cdf0e10cSrcweir     /** Returns the collection of pivot caches. */
167cdf0e10cSrcweir     inline PivotCacheBuffer& getPivotCaches() const { return *mxPivotCaches; }
168cdf0e10cSrcweir     /** Returns the collection of pivot tables. */
169cdf0e10cSrcweir     inline PivotTableBuffer& getPivotTables() { return *mxPivotTables; }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir     // converters -------------------------------------------------------------
172cdf0e10cSrcweir 
173cdf0e10cSrcweir     /** Returns the import formula parser. */
174cdf0e10cSrcweir     inline FormulaParser& getFormulaParser() const { return *mxFmlaParser; }
175cdf0e10cSrcweir     /** Returns the measurement unit converter. */
176cdf0e10cSrcweir     inline UnitConverter& getUnitConverter() const { return *mxUnitConverter; }
177cdf0e10cSrcweir     /** Returns the converter for string to cell address/range conversion. */
178cdf0e10cSrcweir     inline AddressConverter& getAddressConverter() const { return *mxAddrConverter; }
179cdf0e10cSrcweir     /** Returns the chart object converter. */
180cdf0e10cSrcweir     inline ExcelChartConverter& getChartConverter() const { return *mxChartConverter; }
181cdf0e10cSrcweir     /** Returns the page/print settings converter. */
182cdf0e10cSrcweir     inline PageSettingsConverter& getPageSettingsConverter() const { return *mxPageSettConverter; }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir     // OOXML/BIFF12 specific --------------------------------------------------
185cdf0e10cSrcweir 
186cdf0e10cSrcweir     /** Returns the base OOXML/BIFF12 filter object. */
187cdf0e10cSrcweir     inline XmlFilterBase& getOoxFilter() const { return *mpOoxFilter; }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir     // BIFF2-BIFF8 specific ---------------------------------------------------
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     /** Returns the base BIFF filter object. */
192cdf0e10cSrcweir     inline BinaryFilterBase& getBiffFilter() const { return *mpBiffFilter; }
193cdf0e10cSrcweir     /** Returns the BIFF type in binary filter. */
194cdf0e10cSrcweir     inline BiffType     getBiff() const { return meBiff; }
195cdf0e10cSrcweir     /** Returns the text encoding used to import/export byte strings. */
196cdf0e10cSrcweir     inline rtl_TextEncoding getTextEncoding() const { return meTextEnc; }
197cdf0e10cSrcweir     /** Sets the text encoding to import/export byte strings. */
198cdf0e10cSrcweir     void                setTextEncoding( rtl_TextEncoding eTextEnc );
199cdf0e10cSrcweir     /** Sets code page read from a CODEPAGE record for byte string import. */
200cdf0e10cSrcweir     void                setCodePage( sal_uInt16 nCodePage );
201cdf0e10cSrcweir     /** Sets text encoding from the default application font, if CODEPAGE record is missing. */
202cdf0e10cSrcweir     void                setAppFontEncoding( rtl_TextEncoding eAppFontEnc );
203cdf0e10cSrcweir     /** Enables workbook file mode, used for BIFF4 workspace files. */
204cdf0e10cSrcweir     void                setIsWorkbookFile();
205cdf0e10cSrcweir     /** Recreates global buffers that are used per sheet in specific BIFF versions. */
206cdf0e10cSrcweir     void                createBuffersPerSheet( sal_Int16 nSheet );
207cdf0e10cSrcweir     /** Returns the codec helper that stores the encoder/decoder object. */
208cdf0e10cSrcweir     inline BiffCodecHelper& getCodecHelper() { return *mxCodecHelper; }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir private:
211cdf0e10cSrcweir     /** Initializes some basic members and sets needed document properties. */
212cdf0e10cSrcweir     void                initialize( bool bWorkbookFile );
213cdf0e10cSrcweir     /** Finalizes the filter process (sets some needed document properties). */
214cdf0e10cSrcweir     void                finalize();
215cdf0e10cSrcweir 
216cdf0e10cSrcweir private:
217cdf0e10cSrcweir     typedef ::std::auto_ptr< SegmentProgressBar >       ProgressBarPtr;
218cdf0e10cSrcweir     typedef ::std::auto_ptr< WorkbookSettings >         WorkbookSettPtr;
219cdf0e10cSrcweir     typedef ::std::auto_ptr< ViewSettings >             ViewSettingsPtr;
220cdf0e10cSrcweir     typedef ::std::auto_ptr< WorksheetBuffer >          WorksheetBfrPtr;
221cdf0e10cSrcweir     typedef ::boost::shared_ptr< ThemeBuffer >          ThemeBfrRef;
222cdf0e10cSrcweir     typedef ::std::auto_ptr< StylesBuffer >             StylesBfrPtr;
223cdf0e10cSrcweir     typedef ::std::auto_ptr< SharedStringsBuffer >      SharedStrBfrPtr;
224cdf0e10cSrcweir     typedef ::std::auto_ptr< ExternalLinkBuffer >       ExtLinkBfrPtr;
225cdf0e10cSrcweir     typedef ::std::auto_ptr< DefinedNamesBuffer >       DefNamesBfrPtr;
226cdf0e10cSrcweir     typedef ::std::auto_ptr< TableBuffer >              TableBfrPtr;
227cdf0e10cSrcweir     typedef ::std::auto_ptr< ScenarioBuffer >           ScenarioBfrPtr;
228cdf0e10cSrcweir     typedef ::std::auto_ptr< ConnectionsBuffer >        ConnectionsBfrPtr;
229cdf0e10cSrcweir     typedef ::std::auto_ptr< PivotCacheBuffer >         PivotCacheBfrPtr;
230cdf0e10cSrcweir     typedef ::std::auto_ptr< PivotTableBuffer >         PivotTableBfrPtr;
231cdf0e10cSrcweir     typedef ::std::auto_ptr< FormulaParser >            FormulaParserPtr;
232cdf0e10cSrcweir     typedef ::std::auto_ptr< UnitConverter >            UnitConvPtr;
233cdf0e10cSrcweir     typedef ::std::auto_ptr< AddressConverter >         AddressConvPtr;
234cdf0e10cSrcweir     typedef ::std::auto_ptr< ExcelChartConverter >      ExcelChartConvPtr;
235cdf0e10cSrcweir     typedef ::std::auto_ptr< PageSettingsConverter >    PageSettConvPtr;
236cdf0e10cSrcweir     typedef ::std::auto_ptr< BiffCodecHelper >          BiffCodecHelperPtr;
237cdf0e10cSrcweir 
238cdf0e10cSrcweir     OUString            maCellStyles;           /// Style family name for cell styles.
239cdf0e10cSrcweir     OUString            maPageStyles;           /// Style family name for page styles.
240cdf0e10cSrcweir     OUString            maCellStyleServ;        /// Service name for a cell style.
241cdf0e10cSrcweir     OUString            maPageStyleServ;        /// Service name for a page style.
242cdf0e10cSrcweir     Reference< XSpreadsheetDocument > mxDoc;    /// Document model.
243cdf0e10cSrcweir     FilterBase&         mrBaseFilter;           /// Base filter object.
244cdf0e10cSrcweir     ExcelFilterBase&    mrExcelBase;            /// Base object for registration of this structure.
245cdf0e10cSrcweir     FilterType          meFilterType;           /// File type of the filter.
246cdf0e10cSrcweir     ProgressBarPtr      mxProgressBar;          /// The progress bar.
247cdf0e10cSrcweir     StorageRef          mxVbaPrjStrg;           /// Storage containing the VBA project.
248cdf0e10cSrcweir     sal_Int16           mnCurrSheet;            /// Current sheet index in Calc dcument.
249cdf0e10cSrcweir     bool                mbWorkbook;             /// True = multi-sheet file.
250cdf0e10cSrcweir 
251cdf0e10cSrcweir     // buffers
252cdf0e10cSrcweir     WorkbookSettPtr     mxWorkbookSettings;     /// Global workbook settings.
253cdf0e10cSrcweir     ViewSettingsPtr     mxViewSettings;         /// Workbook and sheet view settings.
254cdf0e10cSrcweir     WorksheetBfrPtr     mxWorksheets;           /// Sheet info buffer.
255cdf0e10cSrcweir     ThemeBfrRef         mxTheme;                /// Formatting theme from theme substream.
256cdf0e10cSrcweir     StylesBfrPtr        mxStyles;               /// All cell style objects from styles substream.
257cdf0e10cSrcweir     SharedStrBfrPtr     mxSharedStrings;        /// All strings from shared strings substream.
258cdf0e10cSrcweir     ExtLinkBfrPtr       mxExtLinks;             /// All external links.
259cdf0e10cSrcweir     DefNamesBfrPtr      mxDefNames;             /// All defined names.
260cdf0e10cSrcweir     TableBfrPtr         mxTables;               /// All tables (database ranges).
261cdf0e10cSrcweir     ScenarioBfrPtr      mxScenarios;            /// All scenarios.
262cdf0e10cSrcweir     ConnectionsBfrPtr   mxConnections;          /// All external data connections.
263cdf0e10cSrcweir     PivotCacheBfrPtr    mxPivotCaches;          /// All pivot caches in the document.
264cdf0e10cSrcweir     PivotTableBfrPtr    mxPivotTables;          /// All pivot tables in the document.
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     // converters
267cdf0e10cSrcweir     FormulaParserPtr    mxFmlaParser;           /// Import formula parser.
268cdf0e10cSrcweir     UnitConvPtr         mxUnitConverter;        /// General unit converter.
269cdf0e10cSrcweir     AddressConvPtr      mxAddrConverter;        /// Cell address and cell range address converter.
270cdf0e10cSrcweir     ExcelChartConvPtr   mxChartConverter;       /// Chart object converter.
271cdf0e10cSrcweir     PageSettConvPtr     mxPageSettConverter;    /// Page/print settings converter.
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     // OOXML/BIFF12 specific
274cdf0e10cSrcweir     XmlFilterBase*      mpOoxFilter;            /// Base OOXML/BIFF12 filter object.
275cdf0e10cSrcweir 
276cdf0e10cSrcweir     // BIFF2-BIFF8 specific
277cdf0e10cSrcweir     BinaryFilterBase*   mpBiffFilter;           /// Base BIFF2-BIFF8 filter object.
278cdf0e10cSrcweir     BiffCodecHelperPtr  mxCodecHelper;          /// Encoder/decoder helper.
279cdf0e10cSrcweir     BiffType            meBiff;                 /// BIFF version for BIFF import/export.
280cdf0e10cSrcweir     rtl_TextEncoding    meTextEnc;              /// BIFF byte string text encoding.
281cdf0e10cSrcweir     bool                mbHasCodePage;          /// True = CODEPAGE record exists in imported stream.
282cdf0e10cSrcweir };
283cdf0e10cSrcweir 
284cdf0e10cSrcweir // ----------------------------------------------------------------------------
285cdf0e10cSrcweir 
286cdf0e10cSrcweir WorkbookGlobals::WorkbookGlobals( ExcelFilter& rFilter ) :
287cdf0e10cSrcweir     mrBaseFilter( rFilter ),
288cdf0e10cSrcweir     mrExcelBase( rFilter ),
289cdf0e10cSrcweir     meFilterType( FILTER_OOXML ),
290cdf0e10cSrcweir     mpOoxFilter( &rFilter ),
291cdf0e10cSrcweir     mpBiffFilter( 0 ),
292cdf0e10cSrcweir     meBiff( BIFF_UNKNOWN )
293cdf0e10cSrcweir {
294cdf0e10cSrcweir     // register at the filter, needed for virtual callbacks (even during construction)
295cdf0e10cSrcweir     mrExcelBase.registerWorkbookGlobals( *this );
296cdf0e10cSrcweir     initialize( true );
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir WorkbookGlobals::WorkbookGlobals( ExcelBiffFilter& rFilter, BiffType eBiff ) :
300cdf0e10cSrcweir     mrBaseFilter( rFilter ),
301cdf0e10cSrcweir     mrExcelBase( rFilter ),
302cdf0e10cSrcweir     meFilterType( FILTER_BIFF ),
303cdf0e10cSrcweir     mpOoxFilter( 0 ),
304cdf0e10cSrcweir     mpBiffFilter( &rFilter ),
305cdf0e10cSrcweir     meBiff( eBiff )
306cdf0e10cSrcweir {
307cdf0e10cSrcweir     // register at the filter, needed for virtual callbacks (even during construction)
308cdf0e10cSrcweir     mrExcelBase.registerWorkbookGlobals( *this );
309cdf0e10cSrcweir     initialize( eBiff >= BIFF5 );
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir WorkbookGlobals::~WorkbookGlobals()
313cdf0e10cSrcweir {
314cdf0e10cSrcweir     finalize();
315cdf0e10cSrcweir     mrExcelBase.unregisterWorkbookGlobals();
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir // document model -------------------------------------------------------------
319cdf0e10cSrcweir 
320cdf0e10cSrcweir Reference< XNameContainer > WorkbookGlobals::getStyleFamily( bool bPageStyles ) const
321cdf0e10cSrcweir {
322cdf0e10cSrcweir     Reference< XNameContainer > xStylesNC;
323cdf0e10cSrcweir     try
324cdf0e10cSrcweir     {
325cdf0e10cSrcweir         Reference< XStyleFamiliesSupplier > xFamiliesSup( mxDoc, UNO_QUERY_THROW );
326cdf0e10cSrcweir         Reference< XNameAccess > xFamiliesNA( xFamiliesSup->getStyleFamilies(), UNO_QUERY_THROW );
327cdf0e10cSrcweir         xStylesNC.set( xFamiliesNA->getByName( bPageStyles ? maPageStyles : maCellStyles ), UNO_QUERY );
328cdf0e10cSrcweir     }
329cdf0e10cSrcweir     catch( Exception& )
330cdf0e10cSrcweir     {
331cdf0e10cSrcweir     }
332cdf0e10cSrcweir     OSL_ENSURE( xStylesNC.is(), "WorkbookGlobals::getStyleFamily - cannot access style family" );
333cdf0e10cSrcweir     return xStylesNC;
334cdf0e10cSrcweir }
335cdf0e10cSrcweir 
336cdf0e10cSrcweir Reference< XStyle > WorkbookGlobals::getStyleObject( const OUString& rStyleName, bool bPageStyle ) const
337cdf0e10cSrcweir {
338cdf0e10cSrcweir     Reference< XStyle > xStyle;
339cdf0e10cSrcweir     try
340cdf0e10cSrcweir     {
341cdf0e10cSrcweir         Reference< XNameContainer > xStylesNC( getStyleFamily( bPageStyle ), UNO_SET_THROW );
342cdf0e10cSrcweir         xStyle.set( xStylesNC->getByName( rStyleName ), UNO_QUERY );
343cdf0e10cSrcweir     }
344cdf0e10cSrcweir     catch( Exception& )
345cdf0e10cSrcweir     {
346cdf0e10cSrcweir     }
347cdf0e10cSrcweir     OSL_ENSURE( xStyle.is(), "WorkbookGlobals::getStyleObject - cannot access style object" );
348cdf0e10cSrcweir     return xStyle;
349cdf0e10cSrcweir }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir Reference< XNamedRange > WorkbookGlobals::createNamedRangeObject( OUString& orName, sal_Int32 nNameFlags ) const
352cdf0e10cSrcweir {
353cdf0e10cSrcweir     // create the name and insert it into the Calc document
354cdf0e10cSrcweir     Reference< XNamedRange > xNamedRange;
355cdf0e10cSrcweir     if( orName.getLength() > 0 ) try
356cdf0e10cSrcweir     {
357cdf0e10cSrcweir         // find an unused name
358cdf0e10cSrcweir         PropertySet aDocProps( mxDoc );
359cdf0e10cSrcweir         Reference< XNamedRanges > xNamedRanges( aDocProps.getAnyProperty( PROP_NamedRanges ), UNO_QUERY_THROW );
360cdf0e10cSrcweir         Reference< XNameAccess > xNameAccess( xNamedRanges, UNO_QUERY_THROW );
361cdf0e10cSrcweir         orName = ContainerHelper::getUnusedName( xNameAccess, orName, '_' );
362cdf0e10cSrcweir         // create the named range
363cdf0e10cSrcweir         xNamedRanges->addNewByName( orName, OUString(), CellAddress( 0, 0, 0 ), nNameFlags );
364cdf0e10cSrcweir         xNamedRange.set( xNamedRanges->getByName( orName ), UNO_QUERY );
365cdf0e10cSrcweir     }
366cdf0e10cSrcweir     catch( Exception& )
367cdf0e10cSrcweir     {
368cdf0e10cSrcweir     }
369cdf0e10cSrcweir     OSL_ENSURE( xNamedRange.is(), "WorkbookGlobals::createNamedRangeObject - cannot create defined name" );
370cdf0e10cSrcweir     return xNamedRange;
371cdf0e10cSrcweir }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir Reference< XDatabaseRange > WorkbookGlobals::createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const
374cdf0e10cSrcweir {
375cdf0e10cSrcweir     // validate cell range
376cdf0e10cSrcweir     CellRangeAddress aDestRange = rRangeAddr;
377cdf0e10cSrcweir     bool bValidRange = getAddressConverter().validateCellRange( aDestRange, true, true );
378cdf0e10cSrcweir 
379cdf0e10cSrcweir     // create database range and insert it into the Calc document
380cdf0e10cSrcweir     Reference< XDatabaseRange > xDatabaseRange;
381cdf0e10cSrcweir     if( bValidRange && (orName.getLength() > 0) ) try
382cdf0e10cSrcweir     {
383cdf0e10cSrcweir         // find an unused name
384cdf0e10cSrcweir         PropertySet aDocProps( mxDoc );
385cdf0e10cSrcweir         Reference< XDatabaseRanges > xDatabaseRanges( aDocProps.getAnyProperty( PROP_DatabaseRanges ), UNO_QUERY_THROW );
386cdf0e10cSrcweir         Reference< XNameAccess > xNameAccess( xDatabaseRanges, UNO_QUERY_THROW );
387cdf0e10cSrcweir         orName = ContainerHelper::getUnusedName( xNameAccess, orName, '_' );
388cdf0e10cSrcweir         // create the database range
389cdf0e10cSrcweir         xDatabaseRanges->addNewByName( orName, aDestRange );
390cdf0e10cSrcweir         xDatabaseRange.set( xDatabaseRanges->getByName( orName ), UNO_QUERY );
391cdf0e10cSrcweir     }
392cdf0e10cSrcweir     catch( Exception& )
393cdf0e10cSrcweir     {
394cdf0e10cSrcweir     }
395cdf0e10cSrcweir     OSL_ENSURE( xDatabaseRange.is(), "WorkbookGlobals::createDatabaseRangeObject - cannot create database range" );
396cdf0e10cSrcweir     return xDatabaseRange;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir 
399cdf0e10cSrcweir Reference< XStyle > WorkbookGlobals::createStyleObject( OUString& orStyleName, bool bPageStyle ) const
400cdf0e10cSrcweir {
401cdf0e10cSrcweir     Reference< XStyle > xStyle;
402cdf0e10cSrcweir     try
403cdf0e10cSrcweir     {
404cdf0e10cSrcweir         Reference< XNameContainer > xStylesNC( getStyleFamily( bPageStyle ), UNO_SET_THROW );
405cdf0e10cSrcweir         xStyle.set( mrBaseFilter.getModelFactory()->createInstance( bPageStyle ? maPageStyleServ : maCellStyleServ ), UNO_QUERY_THROW );
406cdf0e10cSrcweir         orStyleName = ContainerHelper::insertByUnusedName( xStylesNC, orStyleName, ' ', Any( xStyle ), false );
407cdf0e10cSrcweir     }
408cdf0e10cSrcweir     catch( Exception& )
409cdf0e10cSrcweir     {
410cdf0e10cSrcweir     }
411cdf0e10cSrcweir     OSL_ENSURE( xStyle.is(), "WorkbookGlobals::createStyleObject - cannot create style" );
412cdf0e10cSrcweir     return xStyle;
413cdf0e10cSrcweir }
414cdf0e10cSrcweir 
415cdf0e10cSrcweir // BIFF specific --------------------------------------------------------------
416cdf0e10cSrcweir 
417cdf0e10cSrcweir void WorkbookGlobals::setTextEncoding( rtl_TextEncoding eTextEnc )
418cdf0e10cSrcweir {
419cdf0e10cSrcweir     if( eTextEnc != RTL_TEXTENCODING_DONTKNOW )
420cdf0e10cSrcweir         meTextEnc = eTextEnc;
421cdf0e10cSrcweir }
422cdf0e10cSrcweir 
423cdf0e10cSrcweir void WorkbookGlobals::setCodePage( sal_uInt16 nCodePage )
424cdf0e10cSrcweir {
425cdf0e10cSrcweir     setTextEncoding( BiffHelper::calcTextEncodingFromCodePage( nCodePage ) );
426cdf0e10cSrcweir     mbHasCodePage = true;
427cdf0e10cSrcweir }
428cdf0e10cSrcweir 
429cdf0e10cSrcweir void WorkbookGlobals::setAppFontEncoding( rtl_TextEncoding eAppFontEnc )
430cdf0e10cSrcweir {
431cdf0e10cSrcweir     if( !mbHasCodePage )
432cdf0e10cSrcweir         setTextEncoding( eAppFontEnc );
433cdf0e10cSrcweir }
434cdf0e10cSrcweir 
435cdf0e10cSrcweir void WorkbookGlobals::setIsWorkbookFile()
436cdf0e10cSrcweir {
437cdf0e10cSrcweir     OSL_ENSURE( meBiff == BIFF4, "WorkbookGlobals::setIsWorkbookFile - invalid call" );
438cdf0e10cSrcweir     mbWorkbook = true;
439cdf0e10cSrcweir }
440cdf0e10cSrcweir 
441cdf0e10cSrcweir void WorkbookGlobals::createBuffersPerSheet( sal_Int16 nSheet )
442cdf0e10cSrcweir {
443cdf0e10cSrcweir     switch( meBiff )
444cdf0e10cSrcweir     {
445cdf0e10cSrcweir         case BIFF2:
446cdf0e10cSrcweir         case BIFF3:
447cdf0e10cSrcweir             OSL_ENSURE( nSheet == 0, "WorkbookGlobals::createBuffersPerSheet - unexpected sheet index" );
448cdf0e10cSrcweir             mxDefNames->setLocalCalcSheet( nSheet );
449cdf0e10cSrcweir         break;
450cdf0e10cSrcweir 
451cdf0e10cSrcweir         case BIFF4:
452cdf0e10cSrcweir             OSL_ENSURE( mbWorkbook || (nSheet == 0), "WorkbookGlobals::createBuffersPerSheet - unexpected sheet index" );
453cdf0e10cSrcweir             // #i11183# sheets in BIFF4W files have own styles and names
454cdf0e10cSrcweir             if( nSheet > 0 )
455cdf0e10cSrcweir             {
456cdf0e10cSrcweir                 mxStyles.reset( new StylesBuffer( *this ) );
457cdf0e10cSrcweir                 mxDefNames.reset( new DefinedNamesBuffer( *this ) );
458cdf0e10cSrcweir                 mxExtLinks.reset( new ExternalLinkBuffer( *this ) );
459cdf0e10cSrcweir             }
460cdf0e10cSrcweir             mxDefNames->setLocalCalcSheet( nSheet );
461cdf0e10cSrcweir         break;
462cdf0e10cSrcweir 
463cdf0e10cSrcweir         case BIFF5:
464cdf0e10cSrcweir             // BIFF5 stores external references per sheet
465cdf0e10cSrcweir             if( nSheet > 0 )
466cdf0e10cSrcweir                 mxExtLinks.reset( new ExternalLinkBuffer( *this ) );
467cdf0e10cSrcweir         break;
468cdf0e10cSrcweir 
469cdf0e10cSrcweir         case BIFF8:
470cdf0e10cSrcweir         break;
471cdf0e10cSrcweir 
472cdf0e10cSrcweir         case BIFF_UNKNOWN:
473cdf0e10cSrcweir         break;
474cdf0e10cSrcweir     }
475cdf0e10cSrcweir }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir // private --------------------------------------------------------------------
478cdf0e10cSrcweir 
479cdf0e10cSrcweir void WorkbookGlobals::initialize( bool bWorkbookFile )
480cdf0e10cSrcweir {
481cdf0e10cSrcweir     maCellStyles = CREATE_OUSTRING( "CellStyles" );
482cdf0e10cSrcweir     maPageStyles = CREATE_OUSTRING( "PageStyles" );
483cdf0e10cSrcweir     maCellStyleServ = CREATE_OUSTRING( "com.sun.star.style.CellStyle" );
484cdf0e10cSrcweir     maPageStyleServ = CREATE_OUSTRING( "com.sun.star.style.PageStyle" );
485cdf0e10cSrcweir     mnCurrSheet = -1;
486cdf0e10cSrcweir     mbWorkbook = bWorkbookFile;
487cdf0e10cSrcweir     meTextEnc = osl_getThreadTextEncoding();
488cdf0e10cSrcweir     mbHasCodePage = false;
489cdf0e10cSrcweir 
490cdf0e10cSrcweir     // the spreadsheet document
491cdf0e10cSrcweir     mxDoc.set( mrBaseFilter.getModel(), UNO_QUERY );
492cdf0e10cSrcweir     OSL_ENSURE( mxDoc.is(), "WorkbookGlobals::initialize - no spreadsheet document" );
493cdf0e10cSrcweir 
494cdf0e10cSrcweir     mxWorkbookSettings.reset( new WorkbookSettings( *this ) );
495cdf0e10cSrcweir     mxViewSettings.reset( new ViewSettings( *this ) );
496cdf0e10cSrcweir     mxWorksheets.reset( new WorksheetBuffer( *this ) );
497cdf0e10cSrcweir     mxTheme.reset( new ThemeBuffer( *this ) );
498cdf0e10cSrcweir     mxStyles.reset( new StylesBuffer( *this ) );
499cdf0e10cSrcweir     mxSharedStrings.reset( new SharedStringsBuffer( *this ) );
500cdf0e10cSrcweir     mxExtLinks.reset( new ExternalLinkBuffer( *this ) );
501cdf0e10cSrcweir     mxDefNames.reset( new DefinedNamesBuffer( *this ) );
502cdf0e10cSrcweir     mxTables.reset( new TableBuffer( *this ) );
503cdf0e10cSrcweir     mxScenarios.reset( new ScenarioBuffer( *this ) );
504cdf0e10cSrcweir     mxConnections.reset( new ConnectionsBuffer( *this ) );
505cdf0e10cSrcweir     mxPivotCaches.reset( new PivotCacheBuffer( *this ) );
506cdf0e10cSrcweir     mxPivotTables.reset( new PivotTableBuffer( *this ) );
507cdf0e10cSrcweir 
508cdf0e10cSrcweir     mxUnitConverter.reset( new UnitConverter( *this ) );
509cdf0e10cSrcweir     mxAddrConverter.reset( new AddressConverter( *this ) );
510cdf0e10cSrcweir     mxChartConverter.reset( new ExcelChartConverter( *this ) );
511cdf0e10cSrcweir     mxPageSettConverter.reset( new PageSettingsConverter( *this ) );
512cdf0e10cSrcweir 
513cdf0e10cSrcweir     // set some document properties needed during import
514cdf0e10cSrcweir     if( mrBaseFilter.isImportFilter() )
515cdf0e10cSrcweir     {
516cdf0e10cSrcweir         PropertySet aPropSet( mxDoc );
517cdf0e10cSrcweir         // enable editing read-only documents (e.g. from read-only files)
518cdf0e10cSrcweir         aPropSet.setProperty( PROP_IsChangeReadOnlyEnabled, true );
519cdf0e10cSrcweir         // #i76026# disable Undo while loading the document
520cdf0e10cSrcweir         aPropSet.setProperty( PROP_IsUndoEnabled, false );
521cdf0e10cSrcweir         // #i79826# disable calculating automatic row height while loading the document
522cdf0e10cSrcweir         aPropSet.setProperty( PROP_IsAdjustHeightEnabled, false );
523cdf0e10cSrcweir         // disable automatic update of linked sheets and DDE links
524cdf0e10cSrcweir         aPropSet.setProperty( PROP_IsExecuteLinkEnabled, false );
525cdf0e10cSrcweir         // #i79890# disable automatic update of defined names
526cdf0e10cSrcweir         Reference< XActionLockable > xLockable( aPropSet.getAnyProperty( PROP_NamedRanges ), UNO_QUERY );
527cdf0e10cSrcweir         if( xLockable.is() )
528cdf0e10cSrcweir             xLockable->addActionLock();
529cdf0e10cSrcweir 
530cdf0e10cSrcweir         //! TODO: localize progress bar text
531cdf0e10cSrcweir         mxProgressBar.reset( new SegmentProgressBar( mrBaseFilter.getStatusIndicator(), CREATE_OUSTRING( "Loading..." ) ) );
532cdf0e10cSrcweir         mxFmlaParser.reset( new FormulaParser( *this ) );
533cdf0e10cSrcweir     }
534cdf0e10cSrcweir     else if( mrBaseFilter.isExportFilter() )
535cdf0e10cSrcweir     {
536cdf0e10cSrcweir         //! TODO: localize progress bar text
537cdf0e10cSrcweir         mxProgressBar.reset( new SegmentProgressBar( mrBaseFilter.getStatusIndicator(), CREATE_OUSTRING( "Saving..." ) ) );
538cdf0e10cSrcweir     }
539cdf0e10cSrcweir 
540cdf0e10cSrcweir     // filter specific
541cdf0e10cSrcweir     switch( getFilterType() )
542cdf0e10cSrcweir     {
543cdf0e10cSrcweir         case FILTER_BIFF:
544cdf0e10cSrcweir             mxCodecHelper.reset( new BiffCodecHelper( *this ) );
545cdf0e10cSrcweir         break;
546cdf0e10cSrcweir 
547cdf0e10cSrcweir         case FILTER_OOXML:
548cdf0e10cSrcweir         break;
549cdf0e10cSrcweir 
550cdf0e10cSrcweir         case FILTER_UNKNOWN:
551cdf0e10cSrcweir         break;
552cdf0e10cSrcweir     }
553cdf0e10cSrcweir }
554cdf0e10cSrcweir 
555cdf0e10cSrcweir void WorkbookGlobals::finalize()
556cdf0e10cSrcweir {
557cdf0e10cSrcweir     // set some document properties needed after import
558cdf0e10cSrcweir     if( mrBaseFilter.isImportFilter() )
559cdf0e10cSrcweir     {
560cdf0e10cSrcweir         PropertySet aPropSet( mxDoc );
561cdf0e10cSrcweir         // #i74668# do not insert default sheets
562cdf0e10cSrcweir         aPropSet.setProperty( PROP_IsLoaded, true );
563cdf0e10cSrcweir         // #i79890# enable automatic update of defined names (before IsAdjustHeightEnabled!)
564cdf0e10cSrcweir         Reference< XActionLockable > xLockable( aPropSet.getAnyProperty( PROP_NamedRanges ), UNO_QUERY );
565cdf0e10cSrcweir         if( xLockable.is() )
566cdf0e10cSrcweir             xLockable->removeActionLock();
567cdf0e10cSrcweir         // enable automatic update of linked sheets and DDE links
568cdf0e10cSrcweir         aPropSet.setProperty( PROP_IsExecuteLinkEnabled, true );
569cdf0e10cSrcweir         // #i79826# enable updating automatic row height after loading the document
570cdf0e10cSrcweir         aPropSet.setProperty( PROP_IsAdjustHeightEnabled, true );
571cdf0e10cSrcweir         // #i76026# enable Undo after loading the document
572cdf0e10cSrcweir         aPropSet.setProperty( PROP_IsUndoEnabled, true );
573cdf0e10cSrcweir         // disable editing read-only documents (e.g. from read-only files)
574cdf0e10cSrcweir         aPropSet.setProperty( PROP_IsChangeReadOnlyEnabled, false );
575cdf0e10cSrcweir         // #111099# open forms in alive mode (has no effect, if no controls in document)
576cdf0e10cSrcweir         aPropSet.setProperty( PROP_ApplyFormDesignMode, false );
577cdf0e10cSrcweir     }
578cdf0e10cSrcweir }
579cdf0e10cSrcweir 
580cdf0e10cSrcweir // ============================================================================
581cdf0e10cSrcweir 
582cdf0e10cSrcweir WorkbookHelper::~WorkbookHelper()
583cdf0e10cSrcweir {
584cdf0e10cSrcweir }
585cdf0e10cSrcweir 
586cdf0e10cSrcweir /*static*/ WorkbookGlobalsRef WorkbookHelper::constructGlobals( ExcelFilter& rFilter )
587cdf0e10cSrcweir {
588cdf0e10cSrcweir     WorkbookGlobalsRef xBookGlob( new WorkbookGlobals( rFilter ) );
589cdf0e10cSrcweir     if( !xBookGlob->isValid() )
590cdf0e10cSrcweir         xBookGlob.reset();
591cdf0e10cSrcweir     return xBookGlob;
592cdf0e10cSrcweir }
593cdf0e10cSrcweir 
594cdf0e10cSrcweir /*static*/ WorkbookGlobalsRef WorkbookHelper::constructGlobals( ExcelBiffFilter& rFilter, BiffType eBiff )
595cdf0e10cSrcweir {
596cdf0e10cSrcweir     WorkbookGlobalsRef xBookGlob( new WorkbookGlobals( rFilter, eBiff ) );
597cdf0e10cSrcweir     if( !xBookGlob->isValid() )
598cdf0e10cSrcweir         xBookGlob.reset();
599cdf0e10cSrcweir     return xBookGlob;
600cdf0e10cSrcweir }
601cdf0e10cSrcweir 
602cdf0e10cSrcweir // filter ---------------------------------------------------------------------
603cdf0e10cSrcweir 
604cdf0e10cSrcweir FilterBase& WorkbookHelper::getBaseFilter() const
605cdf0e10cSrcweir {
606cdf0e10cSrcweir     return mrBookGlob.getBaseFilter();
607cdf0e10cSrcweir }
608cdf0e10cSrcweir 
609cdf0e10cSrcweir FilterType WorkbookHelper::getFilterType() const
610cdf0e10cSrcweir {
611cdf0e10cSrcweir     return mrBookGlob.getFilterType();
612cdf0e10cSrcweir }
613cdf0e10cSrcweir 
614cdf0e10cSrcweir SegmentProgressBar& WorkbookHelper::getProgressBar() const
615cdf0e10cSrcweir {
616cdf0e10cSrcweir     return mrBookGlob.getProgressBar();
617cdf0e10cSrcweir }
618cdf0e10cSrcweir 
619cdf0e10cSrcweir bool WorkbookHelper::isWorkbookFile() const
620cdf0e10cSrcweir {
621cdf0e10cSrcweir     return mrBookGlob.isWorkbookFile();
622cdf0e10cSrcweir }
623cdf0e10cSrcweir 
624cdf0e10cSrcweir sal_Int16 WorkbookHelper::getCurrentSheetIndex() const
625cdf0e10cSrcweir {
626cdf0e10cSrcweir     return mrBookGlob.getCurrentSheetIndex();
627cdf0e10cSrcweir }
628cdf0e10cSrcweir 
629cdf0e10cSrcweir void WorkbookHelper::setVbaProjectStorage( const StorageRef& rxVbaPrjStrg )
630cdf0e10cSrcweir {
631cdf0e10cSrcweir     mrBookGlob.setVbaProjectStorage( rxVbaPrjStrg );
632cdf0e10cSrcweir }
633cdf0e10cSrcweir 
634cdf0e10cSrcweir void WorkbookHelper::setCurrentSheetIndex( sal_Int16 nSheet )
635cdf0e10cSrcweir {
636cdf0e10cSrcweir     mrBookGlob.setCurrentSheetIndex( nSheet );
637cdf0e10cSrcweir }
638cdf0e10cSrcweir 
639cdf0e10cSrcweir void WorkbookHelper::finalizeWorkbookImport()
640cdf0e10cSrcweir {
641cdf0e10cSrcweir     // workbook settings, document and sheet view settings
642cdf0e10cSrcweir     mrBookGlob.getWorkbookSettings().finalizeImport();
643cdf0e10cSrcweir     mrBookGlob.getViewSettings().finalizeImport();
644cdf0e10cSrcweir 
645cdf0e10cSrcweir     /*  Insert all pivot tables. Must be done after loading all sheets, because
646cdf0e10cSrcweir         data pilots expect existing source data on creation. */
647cdf0e10cSrcweir     mrBookGlob.getPivotTables().finalizeImport();
648cdf0e10cSrcweir 
649cdf0e10cSrcweir     /*  Insert scenarios after all sheet processing is done, because new hidden
650cdf0e10cSrcweir         sheets are created for scenarios which would confuse code that relies
651cdf0e10cSrcweir         on certain sheet indexes. Must be done after pivot tables too. */
652cdf0e10cSrcweir     mrBookGlob.getScenarios().finalizeImport();
653cdf0e10cSrcweir 
654cdf0e10cSrcweir     /*  Set 'Default' page style to automatic page numbering (default is manual
655cdf0e10cSrcweir         number 1). Otherwise hidden sheets (e.g. for scenarios) which have
656cdf0e10cSrcweir         'Default' page style will break automatic page numbering for following
657cdf0e10cSrcweir         sheets. Automatic numbering is set by passing the value 0. */
658cdf0e10cSrcweir     PropertySet aDefPageStyle( getStyleObject( CREATE_OUSTRING( "Default" ), true ) );
659cdf0e10cSrcweir     aDefPageStyle.setProperty< sal_Int16 >( PROP_FirstPageNumber, 0 );
660cdf0e10cSrcweir 
661cdf0e10cSrcweir     /*  Import the VBA project (after finalizing workbook settings which
662cdf0e10cSrcweir         contains the workbook code name). */
663cdf0e10cSrcweir     StorageRef xVbaPrjStrg = mrBookGlob.getVbaProjectStorage();
664cdf0e10cSrcweir     if( xVbaPrjStrg.get() && xVbaPrjStrg->isStorage() )
665cdf0e10cSrcweir         getBaseFilter().getVbaProject().importVbaProject( *xVbaPrjStrg, getBaseFilter().getGraphicHelper() );
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir // document model -------------------------------------------------------------
669cdf0e10cSrcweir 
670cdf0e10cSrcweir Reference< XSpreadsheetDocument > WorkbookHelper::getDocument() const
671cdf0e10cSrcweir {
672cdf0e10cSrcweir     return mrBookGlob.getDocument();
673cdf0e10cSrcweir }
674cdf0e10cSrcweir 
675cdf0e10cSrcweir Reference< XSpreadsheet > WorkbookHelper::getSheetFromDoc( sal_Int16 nSheet ) const
676cdf0e10cSrcweir {
677cdf0e10cSrcweir     Reference< XSpreadsheet > xSheet;
678cdf0e10cSrcweir     try
679cdf0e10cSrcweir     {
680cdf0e10cSrcweir         Reference< XIndexAccess > xSheetsIA( getDocument()->getSheets(), UNO_QUERY_THROW );
681cdf0e10cSrcweir         xSheet.set( xSheetsIA->getByIndex( nSheet ), UNO_QUERY_THROW );
682cdf0e10cSrcweir     }
683cdf0e10cSrcweir     catch( Exception& )
684cdf0e10cSrcweir     {
685cdf0e10cSrcweir     }
686cdf0e10cSrcweir     return xSheet;
687cdf0e10cSrcweir }
688cdf0e10cSrcweir 
689cdf0e10cSrcweir Reference< XSpreadsheet > WorkbookHelper::getSheetFromDoc( const OUString& rSheet ) const
690cdf0e10cSrcweir {
691cdf0e10cSrcweir     Reference< XSpreadsheet > xSheet;
692cdf0e10cSrcweir     try
693cdf0e10cSrcweir     {
694cdf0e10cSrcweir         Reference< XNameAccess > xSheetsNA( getDocument()->getSheets(), UNO_QUERY_THROW );
695cdf0e10cSrcweir         xSheet.set( xSheetsNA->getByName( rSheet ), UNO_QUERY );
696cdf0e10cSrcweir     }
697cdf0e10cSrcweir     catch( Exception& )
698cdf0e10cSrcweir     {
699cdf0e10cSrcweir     }
700cdf0e10cSrcweir     return xSheet;
701cdf0e10cSrcweir }
702cdf0e10cSrcweir 
703cdf0e10cSrcweir Reference< XCell > WorkbookHelper::getCellFromDoc( const CellAddress& rAddress ) const
704cdf0e10cSrcweir {
705cdf0e10cSrcweir     Reference< XCell > xCell;
706cdf0e10cSrcweir     try
707cdf0e10cSrcweir     {
708cdf0e10cSrcweir         Reference< XSpreadsheet > xSheet( getSheetFromDoc( rAddress.Sheet ), UNO_SET_THROW );
709cdf0e10cSrcweir         xCell = xSheet->getCellByPosition( rAddress.Column, rAddress.Row );
710cdf0e10cSrcweir     }
711cdf0e10cSrcweir     catch( Exception& )
712cdf0e10cSrcweir     {
713cdf0e10cSrcweir     }
714cdf0e10cSrcweir     return xCell;
715cdf0e10cSrcweir }
716cdf0e10cSrcweir 
717cdf0e10cSrcweir Reference< XCellRange > WorkbookHelper::getCellRangeFromDoc( const CellRangeAddress& rRange ) const
718cdf0e10cSrcweir {
719cdf0e10cSrcweir     Reference< XCellRange > xRange;
720cdf0e10cSrcweir     try
721cdf0e10cSrcweir     {
722cdf0e10cSrcweir         Reference< XSpreadsheet > xSheet( getSheetFromDoc( rRange.Sheet ), UNO_SET_THROW );
723cdf0e10cSrcweir         xRange = xSheet->getCellRangeByPosition( rRange.StartColumn, rRange.StartRow, rRange.EndColumn, rRange.EndRow );
724cdf0e10cSrcweir     }
725cdf0e10cSrcweir     catch( Exception& )
726cdf0e10cSrcweir     {
727cdf0e10cSrcweir     }
728cdf0e10cSrcweir     return xRange;
729cdf0e10cSrcweir }
730cdf0e10cSrcweir 
731cdf0e10cSrcweir Reference< XNameContainer > WorkbookHelper::getStyleFamily( bool bPageStyles ) const
732cdf0e10cSrcweir {
733cdf0e10cSrcweir     return mrBookGlob.getStyleFamily( bPageStyles );
734cdf0e10cSrcweir }
735cdf0e10cSrcweir 
736cdf0e10cSrcweir Reference< XStyle > WorkbookHelper::getStyleObject( const OUString& rStyleName, bool bPageStyle ) const
737cdf0e10cSrcweir {
738cdf0e10cSrcweir     return mrBookGlob.getStyleObject( rStyleName, bPageStyle );
739cdf0e10cSrcweir }
740cdf0e10cSrcweir 
741cdf0e10cSrcweir Reference< XNamedRange > WorkbookHelper::createNamedRangeObject( OUString& orName, sal_Int32 nNameFlags ) const
742cdf0e10cSrcweir {
743cdf0e10cSrcweir     return mrBookGlob.createNamedRangeObject( orName, nNameFlags );
744cdf0e10cSrcweir }
745cdf0e10cSrcweir 
746cdf0e10cSrcweir Reference< XDatabaseRange > WorkbookHelper::createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const
747cdf0e10cSrcweir {
748cdf0e10cSrcweir     return mrBookGlob.createDatabaseRangeObject( orName, rRangeAddr );
749cdf0e10cSrcweir }
750cdf0e10cSrcweir 
751cdf0e10cSrcweir Reference< XStyle > WorkbookHelper::createStyleObject( OUString& orStyleName, bool bPageStyle ) const
752cdf0e10cSrcweir {
753cdf0e10cSrcweir     return mrBookGlob.createStyleObject( orStyleName, bPageStyle );
754cdf0e10cSrcweir }
755cdf0e10cSrcweir 
756cdf0e10cSrcweir // buffers --------------------------------------------------------------------
757cdf0e10cSrcweir 
758cdf0e10cSrcweir WorkbookSettings& WorkbookHelper::getWorkbookSettings() const
759cdf0e10cSrcweir {
760cdf0e10cSrcweir     return mrBookGlob.getWorkbookSettings();
761cdf0e10cSrcweir }
762cdf0e10cSrcweir 
763cdf0e10cSrcweir ViewSettings& WorkbookHelper::getViewSettings() const
764cdf0e10cSrcweir {
765cdf0e10cSrcweir     return mrBookGlob.getViewSettings();
766cdf0e10cSrcweir }
767cdf0e10cSrcweir 
768cdf0e10cSrcweir WorksheetBuffer& WorkbookHelper::getWorksheets() const
769cdf0e10cSrcweir {
770cdf0e10cSrcweir     return mrBookGlob.getWorksheets();
771cdf0e10cSrcweir }
772cdf0e10cSrcweir 
773cdf0e10cSrcweir ThemeBuffer& WorkbookHelper::getTheme() const
774cdf0e10cSrcweir {
775cdf0e10cSrcweir     return mrBookGlob.getTheme();
776cdf0e10cSrcweir }
777cdf0e10cSrcweir 
778cdf0e10cSrcweir StylesBuffer& WorkbookHelper::getStyles() const
779cdf0e10cSrcweir {
780cdf0e10cSrcweir     return mrBookGlob.getStyles();
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
783cdf0e10cSrcweir SharedStringsBuffer& WorkbookHelper::getSharedStrings() const
784cdf0e10cSrcweir {
785cdf0e10cSrcweir     return mrBookGlob.getSharedStrings();
786cdf0e10cSrcweir }
787cdf0e10cSrcweir 
788cdf0e10cSrcweir ExternalLinkBuffer& WorkbookHelper::getExternalLinks() const
789cdf0e10cSrcweir {
790cdf0e10cSrcweir     return mrBookGlob.getExternalLinks();
791cdf0e10cSrcweir }
792cdf0e10cSrcweir 
793cdf0e10cSrcweir DefinedNamesBuffer& WorkbookHelper::getDefinedNames() const
794cdf0e10cSrcweir {
795cdf0e10cSrcweir     return mrBookGlob.getDefinedNames();
796cdf0e10cSrcweir }
797cdf0e10cSrcweir 
798cdf0e10cSrcweir TableBuffer& WorkbookHelper::getTables() const
799cdf0e10cSrcweir {
800cdf0e10cSrcweir     return mrBookGlob.getTables();
801cdf0e10cSrcweir }
802cdf0e10cSrcweir 
803cdf0e10cSrcweir ScenarioBuffer& WorkbookHelper::getScenarios() const
804cdf0e10cSrcweir {
805cdf0e10cSrcweir     return mrBookGlob.getScenarios();
806cdf0e10cSrcweir }
807cdf0e10cSrcweir 
808cdf0e10cSrcweir ConnectionsBuffer& WorkbookHelper::getConnections() const
809cdf0e10cSrcweir {
810cdf0e10cSrcweir     return mrBookGlob.getConnections();
811cdf0e10cSrcweir }
812cdf0e10cSrcweir 
813cdf0e10cSrcweir PivotCacheBuffer& WorkbookHelper::getPivotCaches() const
814cdf0e10cSrcweir {
815cdf0e10cSrcweir     return mrBookGlob.getPivotCaches();
816cdf0e10cSrcweir }
817cdf0e10cSrcweir 
818cdf0e10cSrcweir PivotTableBuffer& WorkbookHelper::getPivotTables() const
819cdf0e10cSrcweir {
820cdf0e10cSrcweir     return mrBookGlob.getPivotTables();
821cdf0e10cSrcweir }
822cdf0e10cSrcweir 
823cdf0e10cSrcweir // converters -----------------------------------------------------------------
824cdf0e10cSrcweir 
825cdf0e10cSrcweir FormulaParser& WorkbookHelper::getFormulaParser() const
826cdf0e10cSrcweir {
827cdf0e10cSrcweir     return mrBookGlob.getFormulaParser();
828cdf0e10cSrcweir }
829cdf0e10cSrcweir 
830cdf0e10cSrcweir UnitConverter& WorkbookHelper::getUnitConverter() const
831cdf0e10cSrcweir {
832cdf0e10cSrcweir     return mrBookGlob.getUnitConverter();
833cdf0e10cSrcweir }
834cdf0e10cSrcweir 
835cdf0e10cSrcweir AddressConverter& WorkbookHelper::getAddressConverter() const
836cdf0e10cSrcweir {
837cdf0e10cSrcweir     return mrBookGlob.getAddressConverter();
838cdf0e10cSrcweir }
839cdf0e10cSrcweir 
840cdf0e10cSrcweir ExcelChartConverter& WorkbookHelper::getChartConverter() const
841cdf0e10cSrcweir {
842cdf0e10cSrcweir     return mrBookGlob.getChartConverter();
843cdf0e10cSrcweir }
844cdf0e10cSrcweir 
845cdf0e10cSrcweir PageSettingsConverter& WorkbookHelper::getPageSettingsConverter() const
846cdf0e10cSrcweir {
847cdf0e10cSrcweir     return mrBookGlob.getPageSettingsConverter();
848cdf0e10cSrcweir }
849cdf0e10cSrcweir 
850cdf0e10cSrcweir // OOXML/BIFF12 specific ------------------------------------------------------
851cdf0e10cSrcweir 
852cdf0e10cSrcweir XmlFilterBase& WorkbookHelper::getOoxFilter() const
853cdf0e10cSrcweir {
854cdf0e10cSrcweir     OSL_ENSURE( mrBookGlob.getFilterType() == FILTER_OOXML, "WorkbookHelper::getOoxFilter - invalid call" );
855cdf0e10cSrcweir     return mrBookGlob.getOoxFilter();
856cdf0e10cSrcweir }
857cdf0e10cSrcweir 
858cdf0e10cSrcweir bool WorkbookHelper::importOoxFragment( const ::rtl::Reference< FragmentHandler >& rxHandler )
859cdf0e10cSrcweir {
860cdf0e10cSrcweir     return getOoxFilter().importFragment( rxHandler );
861cdf0e10cSrcweir }
862cdf0e10cSrcweir 
863cdf0e10cSrcweir // BIFF specific --------------------------------------------------------------
864cdf0e10cSrcweir 
865cdf0e10cSrcweir BinaryFilterBase& WorkbookHelper::getBiffFilter() const
866cdf0e10cSrcweir {
867cdf0e10cSrcweir     OSL_ENSURE( mrBookGlob.getFilterType() == FILTER_BIFF, "WorkbookHelper::getBiffFilter - invalid call" );
868cdf0e10cSrcweir     return mrBookGlob.getBiffFilter();
869cdf0e10cSrcweir }
870cdf0e10cSrcweir 
871cdf0e10cSrcweir BiffType WorkbookHelper::getBiff() const
872cdf0e10cSrcweir {
873cdf0e10cSrcweir     return mrBookGlob.getBiff();
874cdf0e10cSrcweir }
875cdf0e10cSrcweir 
876cdf0e10cSrcweir rtl_TextEncoding WorkbookHelper::getTextEncoding() const
877cdf0e10cSrcweir {
878cdf0e10cSrcweir     return mrBookGlob.getTextEncoding();
879cdf0e10cSrcweir }
880cdf0e10cSrcweir 
881cdf0e10cSrcweir void WorkbookHelper::setTextEncoding( rtl_TextEncoding eTextEnc )
882cdf0e10cSrcweir {
883cdf0e10cSrcweir     mrBookGlob.setTextEncoding( eTextEnc );
884cdf0e10cSrcweir }
885cdf0e10cSrcweir 
886cdf0e10cSrcweir void WorkbookHelper::setCodePage( sal_uInt16 nCodePage )
887cdf0e10cSrcweir {
888cdf0e10cSrcweir     mrBookGlob.setCodePage( nCodePage );
889cdf0e10cSrcweir }
890cdf0e10cSrcweir 
891cdf0e10cSrcweir void WorkbookHelper::setAppFontEncoding( rtl_TextEncoding eAppFontEnc )
892cdf0e10cSrcweir {
893cdf0e10cSrcweir     mrBookGlob.setAppFontEncoding( eAppFontEnc );
894cdf0e10cSrcweir }
895cdf0e10cSrcweir 
896cdf0e10cSrcweir void WorkbookHelper::setIsWorkbookFile()
897cdf0e10cSrcweir {
898cdf0e10cSrcweir     mrBookGlob.setIsWorkbookFile();
899cdf0e10cSrcweir }
900cdf0e10cSrcweir 
901cdf0e10cSrcweir void WorkbookHelper::createBuffersPerSheet( sal_Int16 nSheet )
902cdf0e10cSrcweir {
903cdf0e10cSrcweir     mrBookGlob.createBuffersPerSheet( nSheet );
904cdf0e10cSrcweir }
905cdf0e10cSrcweir 
906cdf0e10cSrcweir BiffCodecHelper& WorkbookHelper::getCodecHelper() const
907cdf0e10cSrcweir {
908cdf0e10cSrcweir     return mrBookGlob.getCodecHelper();
909cdf0e10cSrcweir }
910cdf0e10cSrcweir 
911cdf0e10cSrcweir // ============================================================================
912cdf0e10cSrcweir 
913cdf0e10cSrcweir } // namespace xls
914cdf0e10cSrcweir } // namespace oox
915