blob: e7dc104fac5aba661f0f9a7f0b3db94052f413c2 [file] [log] [blame]
/**************************************************************
*
* 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