| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef OOX_XLS_DEFINEDNAMESBUFFER_HXX |
| #define OOX_XLS_DEFINEDNAMESBUFFER_HXX |
| |
| #include "oox/xls/formulabase.hxx" |
| |
| namespace com { namespace sun { namespace star { |
| namespace sheet { class XNamedRange; } |
| } } } |
| |
| namespace oox { |
| namespace xls { |
| |
| class BiffInputStreamPos; |
| |
| // ============================================================================ |
| |
| // codes for built-in names |
| const sal_Unicode BIFF_DEFNAME_CONSOLIDATEAREA = '\x00'; |
| const sal_Unicode BIFF_DEFNAME_AUTOOPEN = '\x01'; // Sheet macro executed when workbook is opened. |
| const sal_Unicode BIFF_DEFNAME_AUTOCLOSE = '\x02'; // Sheet macro executed when workbook is closed. |
| const sal_Unicode BIFF_DEFNAME_EXTRACT = '\x03'; // Filter output destination for advanced filter. |
| const sal_Unicode BIFF_DEFNAME_DATABASE = '\x04'; |
| const sal_Unicode BIFF_DEFNAME_CRITERIA = '\x05'; // Filter criteria source range for advanced filter. |
| const sal_Unicode BIFF_DEFNAME_PRINTAREA = '\x06'; // Print ranges. |
| const sal_Unicode BIFF_DEFNAME_PRINTTITLES = '\x07'; // Rows/columns repeated on each page when printing. |
| const sal_Unicode BIFF_DEFNAME_RECORDER = '\x08'; |
| const sal_Unicode BIFF_DEFNAME_DATAFORM = '\x09'; |
| const sal_Unicode BIFF_DEFNAME_AUTOACTIVATE = '\x0A'; // Sheet macro executed when workbook is activated. |
| const sal_Unicode BIFF_DEFNAME_AUTODEACTIVATE = '\x0B'; // Sheet macro executed when workbook is deactivated. |
| const sal_Unicode BIFF_DEFNAME_SHEETTITLE = '\x0C'; |
| const sal_Unicode BIFF_DEFNAME_FILTERDATABASE = '\x0D'; // Sheet range autofilter or advanced filter works on. |
| const sal_Unicode BIFF_DEFNAME_UNKNOWN = '\x0E'; |
| |
| // ============================================================================ |
| |
| struct DefinedNameModel |
| { |
| ::rtl::OUString maName; /// The original name. |
| ::rtl::OUString maFormula; /// The formula string. |
| sal_Int32 mnSheet; /// Sheet index for local names. |
| sal_Int32 mnFuncGroupId; /// Function group identifier. |
| bool mbMacro; /// True = Macro name (VBA or sheet macro). |
| bool mbFunction; /// True = function, false = command. |
| bool mbVBName; /// True = VBA macro, false = sheet macro. |
| bool mbHidden; /// True = name hidden in UI. |
| |
| explicit DefinedNameModel(); |
| }; |
| |
| // ============================================================================ |
| |
| /** Base class for defined names and external names. */ |
| class DefinedNameBase : public WorkbookHelper |
| { |
| public: |
| explicit DefinedNameBase( const WorkbookHelper& rHelper ); |
| |
| /** Returns the original name as imported from or exported to the file. */ |
| inline const ::rtl::OUString& getModelName() const { return maModel.maName; } |
| /** Returns the name as used in the Calc document. */ |
| inline const ::rtl::OUString& getCalcName() const { return maCalcName; } |
| |
| /** Returns the original name as imported from or exported to the file. */ |
| const ::rtl::OUString& getUpcaseModelName() const; |
| /** Returns an Any with a SingleReference or ComplexReference, or an empty Any. */ |
| ::com::sun::star::uno::Any getReference( const ::com::sun::star::table::CellAddress& rBaseAddr ) const; |
| |
| protected: |
| /** Converts the OOXML formula string stored in the own model. */ |
| ApiTokenSequence importOoxFormula( sal_Int16 nBaseSheet ); |
| /** Imports the BIFF12 formula from the passed stream. */ |
| ApiTokenSequence importBiff12Formula( sal_Int16 nBaseSheet, SequenceInputStream& rStrm ); |
| /** Imports the BIFF formula from the passed stream. */ |
| ApiTokenSequence importBiffFormula( sal_Int16 nBaseSheet, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize = 0 ); |
| |
| /** Tries to convert the passed token sequence to a SingleReference or ComplexReference. */ |
| void extractReference( const ApiTokenSequence& rTokens ); |
| |
| protected: |
| DefinedNameModel maModel; /// Model data for this defined name. |
| mutable ::rtl::OUString maUpModelName; /// Model name converted to uppercase ASCII. |
| ::rtl::OUString maCalcName; /// Final name used in the Calc document. |
| ::com::sun::star::uno::Any maRefAny; /// Single cell/range reference. |
| }; |
| |
| // ============================================================================ |
| |
| class DefinedName : public DefinedNameBase |
| { |
| public: |
| explicit DefinedName( const WorkbookHelper& rHelper ); |
| |
| /** Sets the attributes for this defined name from the passed attribute set. */ |
| void importDefinedName( const AttributeList& rAttribs ); |
| /** Sets the formula string from the body of the definedName element. */ |
| void setFormula( const ::rtl::OUString& rFormula ); |
| /** Imports the defined name from a DEFINEDNAME record in the passed stream. */ |
| void importDefinedName( SequenceInputStream& rStrm ); |
| /** Imports the defined name from a DEFINEDNAME record in the passed BIFF stream. */ |
| void importDefinedName( BiffInputStream& rStrm, sal_Int16 nCalcSheet ); |
| |
| /** Creates a defined name in the Calc document. */ |
| void createNameObject(); |
| /** Converts the formula string or BIFF token array for this defined name. */ |
| void convertFormula(); |
| |
| /** Returns true, if this defined name is global in the document. */ |
| inline bool isGlobalName() const { return mnCalcSheet < 0; } |
| /** Returns true, if this defined name is a special builtin name. */ |
| inline bool isBuiltinName() const { return mcBuiltinId != BIFF_DEFNAME_UNKNOWN; } |
| /** Returns true, if this defined name is a macro function call. */ |
| inline bool isMacroFunction() const { return maModel.mbMacro && maModel.mbFunction; } |
| /** Returns true, if this defined name is a reference to a VBA macro. */ |
| inline bool isVBName() const { return maModel.mbMacro && maModel.mbVBName; } |
| |
| /** Returns the 0-based sheet index for local names, or -1 for global names. */ |
| inline sal_Int16 getLocalCalcSheet() const { return mnCalcSheet; } |
| /** Returns the built-in identifier of the defined name. */ |
| inline sal_Unicode getBuiltinId() const { return mcBuiltinId; } |
| /** Returns the token index used in API token arrays (com.sun.star.sheet.FormulaToken). */ |
| inline sal_Int32 getTokenIndex() const { return mnTokenIndex; } |
| /** Tries to resolve the defined name to an absolute cell range. */ |
| bool getAbsoluteRange( ::com::sun::star::table::CellRangeAddress& orRange ) const; |
| |
| private: |
| /** Imports the OOXML or BIFF12 definition of the name. */ |
| void implImportOoxFormula(); |
| /** Imports the BIFF definition of the name. */ |
| void implImportBiffFormula(); |
| |
| private: |
| typedef ::std::auto_ptr< StreamDataSequence > StreamDataSeqPtr; |
| typedef ::std::auto_ptr< BiffInputStreamPos > BiffStreamPosPtr; |
| |
| ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRange2 > |
| mxNamedRange; /// XNamedRange interface of the defined name. |
| sal_Int32 mnTokenIndex; /// Name index used in API token array. |
| sal_Int16 mnCalcSheet; /// Calc sheet index for sheet-local names. |
| sal_Unicode mcBuiltinId; /// Identifier for built-in defined names. |
| StreamDataSeqPtr mxFormula; /// Formula data for BIFF12 import. |
| BiffStreamPosPtr mxBiffStrm; /// Cached BIFF stream for formula import. |
| sal_uInt16 mnFmlaSize; /// Cached BIFF formula size for formula import. |
| }; |
| |
| typedef ::boost::shared_ptr< DefinedName > DefinedNameRef; |
| |
| // ============================================================================ |
| |
| class DefinedNamesBuffer : public WorkbookHelper |
| { |
| public: |
| explicit DefinedNamesBuffer( const WorkbookHelper& rHelper ); |
| |
| /** Sets the sheet index for local names (BIFF2-BIFF4 only). */ |
| void setLocalCalcSheet( sal_Int16 nCalcSheet ); |
| |
| /** Imports a defined name from the passed attribute set. */ |
| DefinedNameRef importDefinedName( const AttributeList& rAttribs ); |
| /** Imports a defined name from a DEFINEDNAME record in the passed stream. */ |
| void importDefinedName( SequenceInputStream& rStrm ); |
| /** Imports a defined name from a DEFINEDNAME record in the passed BIFF stream. */ |
| void importDefinedName( BiffInputStream& rStrm ); |
| |
| /** Creates all defined names in the document. */ |
| void finalizeImport(); |
| |
| /** Returns a defined name by zero-based index (order of appearance). */ |
| DefinedNameRef getByIndex( sal_Int32 nIndex ) const; |
| /** Returns a defined name by token index (index in XDefinedNames container). */ |
| DefinedNameRef getByTokenIndex( sal_Int32 nIndex ) const; |
| /** Returns a defined name by its model name. |
| @param nSheet The sheet index for local names or -1 for global names. |
| If no local name is found, tries to find a matching global name. |
| @return Reference to the defined name or empty reference. */ |
| DefinedNameRef getByModelName( const ::rtl::OUString& rModelName, sal_Int16 nCalcSheet = -1 ) const; |
| /** Returns a built-in defined name by its built-in identifier. |
| @param nSheet The sheet index of the built-in name. |
| @return Reference to the defined name or empty reference. */ |
| DefinedNameRef getByBuiltinId( sal_Unicode cBuiltinId, sal_Int16 nCalcSheet ) const; |
| |
| private: |
| DefinedNameRef createDefinedName(); |
| |
| private: |
| typedef ::std::pair< sal_Int16, ::rtl::OUString > SheetNameKey; |
| typedef ::std::pair< sal_Int16, sal_Unicode > BuiltinKey; |
| |
| typedef RefVector< DefinedName > DefNameVector; |
| typedef RefMap< SheetNameKey, DefinedName > DefNameNameMap; |
| typedef RefMap< BuiltinKey, DefinedName > DefNameBuiltinMap; |
| typedef RefMap< sal_Int32, DefinedName > DefNameTokenIdMap; |
| |
| DefNameVector maDefNames; /// List of all defined names in insertion order. |
| DefNameNameMap maModelNameMap; /// Maps all defined names by sheet index and model name. |
| DefNameBuiltinMap maBuiltinMap; /// Maps all defined names by sheet index and built-in identifier. |
| DefNameTokenIdMap maTokenIdMap; /// Maps all defined names by API token index. |
| sal_Int16 mnCalcSheet; /// Current sheet index for BIFF2-BIFF4 names (always sheet-local). |
| }; |
| |
| // ============================================================================ |
| |
| } // namespace xls |
| } // namespace oox |
| |
| #endif |