/************************************************************** * * 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 SC_XELINK_HXX #define SC_XELINK_HXX #include "markdata.hxx" #include "xllink.hxx" #include "xerecord.hxx" #include "xehelper.hxx" #include "xeformula.hxx" #include "externalrefmgr.hxx" class ScRange; struct ScSingleRefData; struct ScComplexRefData; /* ============================================================================ Classes for export of different kinds of internal/external references. - 3D cell and cell range links - External cell and cell range links - External defined names - Macro calls - Add-in functions - DDE links - OLE object links ============================================================================ */ // Excel sheet indexes ======================================================== /** Stores the correct Excel sheet index for each Calc sheet. @descr The class knows all sheets which will not exported (i.e. external link sheets, scenario sheets). */ class XclExpTabInfo : protected XclExpRoot { public: /** Initializes the complete buffer from the current exported document. */ explicit XclExpTabInfo( const XclExpRoot& rRoot ); /** Returns true, if the specified Calc sheet will be exported. */ bool IsExportTab( SCTAB nScTab ) const; /** Returns true, if the specified Calc sheet is used to store external cell contents. */ bool IsExternalTab( SCTAB nScTab ) const; /** Returns true, if the specified Calc sheet is visible and will be exported. */ bool IsVisibleTab( SCTAB nScTab ) const; /** Returns true, if the specified Calc sheet is selected and will be exported. */ bool IsSelectedTab( SCTAB nScTab ) const; /** Returns true, if the specified Calc sheet is the displayed (active) sheet. */ bool IsDisplayedTab( SCTAB nScTab ) const; /** Returns true, if the specified Calc sheet is displayed in right-to-left mode. */ bool IsMirroredTab( SCTAB nScTab ) const; /** Returns the Calc name of the specified sheet. */ const String& GetScTabName( SCTAB nScTab ) const; /** Returns the Excel sheet index for a given Calc sheet. */ sal_uInt16 GetXclTab( SCTAB nScTab ) const; /** Returns the Calc sheet index of the nSortedTab-th entry in the sorted sheet names list. */ SCTAB GetRealScTab( SCTAB nSortedScTab ) const; //UNUSED2009-05 /** Returns the index of the passed Calc sheet in the sorted sheet names list. */ //UNUSED2009-05 SCTAB GetSortedScTab( SCTAB nScTab ) const; /** Returns the number of Calc sheets. */ inline SCTAB GetScTabCount() const { return mnScCnt; } /** Returns the number of Excel sheets to be exported. */ inline sal_uInt16 GetXclTabCount() const { return mnXclCnt; } /** Returns the number of external linked sheets. */ inline sal_uInt16 GetXclExtTabCount() const { return mnXclExtCnt; } /** Returns the number of exported selected sheets. */ inline sal_uInt16 GetXclSelectedCount() const { return mnXclSelCnt; } /** Returns the Excel index of the active, displayed sheet. */ inline sal_uInt16 GetDisplayedXclTab() const { return mnDisplXclTab; } /** Returns the Excel index of the first visible sheet. */ inline sal_uInt16 GetFirstVisXclTab() const { return mnFirstVisXclTab; } private: /** Returns true, if any of the passed flags is set for the specified Calc sheet. */ bool GetFlag( SCTAB nScTab, sal_uInt8 nFlags ) const; /** Sets or clears (depending on bSet) all passed flags for the specified Calc sheet. */ void SetFlag( SCTAB nScTab, sal_uInt8 nFlags, bool bSet = true ); /** Searches for sheets not to be exported. */ void CalcXclIndexes(); /** Sorts the names of all tables and stores the indexes of the sorted indexes. */ void CalcSortedIndexes(); private: /** Data structure with infoemation about one Calc sheet. */ struct XclExpTabInfoEntry { String maScName; sal_uInt16 mnXclTab; sal_uInt8 mnFlags; inline explicit XclExpTabInfoEntry() : mnXclTab( 0 ), mnFlags( 0 ) {} }; typedef ::std::vector< XclExpTabInfoEntry > XclExpTabInfoVec; typedef ::std::vector< SCTAB > ScTabVec; XclExpTabInfoVec maTabInfoVec; /// Array of Calc sheet index information. SCTAB mnScCnt; /// Count of Calc sheets. sal_uInt16 mnXclCnt; /// Count of Excel sheets to be exported. sal_uInt16 mnXclExtCnt; /// Count of external link sheets. sal_uInt16 mnXclSelCnt; /// Count of selected and exported sheets. sal_uInt16 mnDisplXclTab; /// Displayed (active) sheet. sal_uInt16 mnFirstVisXclTab; /// First visible sheet. ScTabVec maFromSortedVec; /// Sorted Calc sheet index -> real Calc sheet index. ScTabVec maToSortedVec; /// Real Calc sheet index -> sorted Calc sheet index. }; // Export link manager ======================================================== class XclExpLinkManagerImpl; /** Stores all data for internal/external references (the link table). */ class XclExpLinkManager : public XclExpRecordBase, protected XclExpRoot { public: explicit XclExpLinkManager( const XclExpRoot& rRoot ); virtual ~XclExpLinkManager(); /** Searches for an EXTERNSHEET index for the given Calc sheet. @descr See above for the meaning of EXTERNSHEET indexes. @param rnExtSheet (out-param) Returns the EXTERNSHEET index. @param rnXclTab (out-param) Returns the Excel sheet index. @param nScTab The Calc sheet index to process. param pRefLogEntry If not 0, data about the external link is stored here. */ void FindExtSheet( sal_uInt16& rnExtSheet, sal_uInt16& rnXclTab, SCTAB nScTab, XclExpRefLogEntry* pRefLogEntry = 0 ); /** Searches for an EXTERNSHEET index for the given Calc sheet range. @descr See above for the meaning of EXTERNSHEET indexes. @param rnExtSheet (out-param) Returns the EXTERNSHEET index. @param rnFirstXclTab (out-param) Returns the Excel sheet index of the first sheet. @param rnXclTab (out-param) Returns the Excel sheet index of the last sheet. @param nFirstScTab The first Calc sheet index to process. @param nLastScTab The last Calc sheet index to process. param pRefLogEntry If not 0, data about the external link is stored here. */ void FindExtSheet( sal_uInt16& rnExtSheet, sal_uInt16& rnFirstXclTab, sal_uInt16& rnLastXclTab, SCTAB nFirstScTab, SCTAB nLastScTab, XclExpRefLogEntry* pRefLogEntry = 0 ); /** Searches for a special EXTERNSHEET index for the own document. */ sal_uInt16 FindExtSheet( sal_Unicode cCode ); void FindExtSheet( sal_uInt16 nFileId, const String& rTabName, sal_uInt16 nXclTabSpan, sal_uInt16& rnExtSheet, sal_uInt16& rnFirstSBTab, sal_uInt16& rnLastSBTab, XclExpRefLogEntry* pRefLogEntry = NULL ); /** Stores the cell with the given address in a CRN record list. */ void StoreCell( const ScSingleRefData& rRef ); /** Stores all cells in the given range in a CRN record list. */ void StoreCellRange( const ScComplexRefData& rRef ); void StoreCell( sal_uInt16 nFileId, const String& rTabName, const ScSingleRefData& rRef ); void StoreCellRange( sal_uInt16 nFileId, const String& rTabName, const ScComplexRefData& rRef ); /** Finds or inserts an EXTERNNAME record for an add-in function name. @param rnExtSheet (out-param) Returns the index of the EXTSHEET structure for the add-in function name. @param rnExtName (out-param) Returns the 1-based EXTERNNAME record index. @return true = add-in function inserted; false = error (i.e. not supported in current BIFF). */ bool InsertAddIn( sal_uInt16& rnExtSheet, sal_uInt16& rnExtName, const String& rName ); /** InsertEuroTool */ bool InsertEuroTool( sal_uInt16& rnExtSheet, sal_uInt16& rnExtName, const String& rName ); /** Finds or inserts an EXTERNNAME record for DDE links. @param rnExtSheet (out-param) Returns the index of the EXTSHEET structure for the DDE link. @param rnExtName (out-param) Returns the 1-based EXTERNNAME record index. @return true = DDE link inserted; false = error (i.e. not supported in current BIFF). */ bool InsertDde( sal_uInt16& rnExtSheet, sal_uInt16& rnExtName, const String& rApplic, const String& rTopic, const String& rItem ); bool InsertExtName( sal_uInt16& rnExtSheet, sal_uInt16& rnExtName, const String& rUrl, const String& rName, const ScExternalRefCache::TokenArrayRef pArray ); /** Writes the entire Link table. */ virtual void Save( XclExpStream& rStrm ); private: typedef ScfRef< XclExpLinkManagerImpl > XclExpLinkMgrImplPtr; XclExpLinkMgrImplPtr mxImpl; }; // ============================================================================ #endif