diff options
Diffstat (limited to 'sc/source/filter/inc')
101 files changed, 29103 insertions, 0 deletions
diff --git a/sc/source/filter/inc/XclExpChangeTrack.hxx b/sc/source/filter/inc/XclExpChangeTrack.hxx new file mode 100644 index 000000000000..01eb076f6b3d --- /dev/null +++ b/sc/source/filter/inc/XclExpChangeTrack.hxx @@ -0,0 +1,641 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XCLEXPCHANGETRACK_HXX +#define SC_XCLEXPCHANGETRACK_HXX + +#include <tools/debug.hxx> +#include <tools/datetime.hxx> +#include <rtl/uuid.h> +#include "bigrange.hxx" +#include "chgtrack.hxx" +#include "xelink.hxx" +#include "ftools.hxx" +#include "excrecds.hxx" + +//___________________________________________________________________ + +class ScBaseCell; + +//___________________________________________________________________ +// XclExpUserBView - one UserBView record for each user + +class XclExpUserBView : public ExcRecord +{ +private: + XclExpString sUsername; + sal_uInt8 aGUID[ 16 ]; + + virtual void SaveCont( XclExpStream& rStrm ); + +public: + XclExpUserBView( const String& rUsername, const sal_uInt8* pGUID ); + + inline const sal_uInt8* GetGUID() const { return aGUID; } + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// XclExpUserBViewList - list of UserBView records + +class XclExpUserBViewList : public ExcEmptyRec, private List +{ +private: + inline XclExpUserBView* _First() { return (XclExpUserBView*) List::First(); } + inline XclExpUserBView* _Next() { return (XclExpUserBView*) List::Next(); } + +public: + XclExpUserBViewList( const ScChangeTrack& rChangeTrack ); + virtual ~XclExpUserBViewList(); + + inline const XclExpUserBView* First() { return (const XclExpUserBView*) List::First(); } + inline const XclExpUserBView* Next() { return (const XclExpUserBView*) List::Next(); } + + virtual void Save( XclExpStream& rStrm ); +}; + +//___________________________________________________________________ +// XclExpUsersViewBegin - begin of view block (one per sheet) + +class XclExpUsersViewBegin : public ExcRecord +{ +private: + sal_uInt8 aGUID[ 16 ]; + sal_uInt32 nCurrTab; + + virtual void SaveCont( XclExpStream& rStrm ); + +public: + XclExpUsersViewBegin( const sal_uInt8* pGUID, sal_uInt32 nTab ); + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// XclExpUsersViewEnd - end of view block (one per sheet) + +class XclExpUsersViewEnd : public ExcRecord +{ +private: + virtual void SaveCont( XclExpStream& rStrm ); + +public: + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// dummy record for "User Names" stream + +class XclExpChTr0x0191 : public ExcRecord +{ +private: + virtual void SaveCont( XclExpStream& rStrm ); + +public: + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// dummy record for "User Names" stream + +class XclExpChTr0x0198 : public ExcRecord +{ +private: + virtual void SaveCont( XclExpStream& rStrm ); + +public: + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// dummy record for "User Names" stream + +class XclExpChTr0x0192 : public ExcRecord +{ +private: + virtual void SaveCont( XclExpStream& rStrm ); + +public: + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// dummy record for "User Names" stream + +class XclExpChTr0x0197 : public ExcRecord +{ +private: + virtual void SaveCont( XclExpStream& rStrm ); + +public: + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// dummy record without content + +class XclExpChTrEmpty : public ExcRecord +{ +private: + UINT16 nRecNum; + +public: + inline XclExpChTrEmpty( UINT16 nNum ) : nRecNum( nNum ) {} + virtual ~XclExpChTrEmpty(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// dummy record for "Revision Log" stream + +class XclExpChTr0x0195 : public ExcRecord +{ +private: + virtual void SaveCont( XclExpStream& rStrm ); + +public: + virtual ~XclExpChTr0x0195(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// dummy record for "Revision Log" stream + +class XclExpChTr0x0194 : public ExcRecord +{ +private: + XclExpString sUsername; + DateTime aDateTime; + + virtual void SaveCont( XclExpStream& rStrm ); + +public: + inline XclExpChTr0x0194( const ScChangeTrack& rChangeTrack ); + virtual ~XclExpChTr0x0194(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +inline XclExpChTr0x0194::XclExpChTr0x0194( const ScChangeTrack& rChangeTrack ) : + sUsername( rChangeTrack.GetUser() ), + aDateTime( rChangeTrack.GetFixDateTime() ) +{ +} + +//___________________________________________________________________ +// XclExpChTrHeader - header record, includes action count + +class XclExpChTrHeader : public ExcRecord +{ +private: + sal_uInt8 aGUID[ 16 ]; + sal_uInt32 nCount; + + virtual void SaveCont( XclExpStream& rStrm ); + +public: + inline XclExpChTrHeader() : nCount( 0 ) {} + virtual ~XclExpChTrHeader(); + + inline void SetGUID( const sal_uInt8* pGUID ) { memcpy( aGUID, pGUID, 16 ); } + inline void SetCount( sal_uInt32 nNew ) { nCount = nNew; } + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// XclExpChTrInfo - header of action group of a user + +class XclExpChTrInfo : public ExcRecord +{ +private: + XclExpString sUsername; + DateTime aDateTime; + sal_uInt8 aGUID[ 16 ]; + + virtual void SaveCont( XclExpStream& rStrm ); + +public: + inline XclExpChTrInfo( + const String& rUsername, + const DateTime& rDateTime, + const sal_uInt8* pGUID ); + virtual ~XclExpChTrInfo(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +inline XclExpChTrInfo::XclExpChTrInfo( const String& rUsername, const DateTime& rDateTime, const sal_uInt8* pGUID ) : + sUsername( rUsername ), + aDateTime( rDateTime ) +{ + memcpy( aGUID, pGUID, 16 ); +} + +//___________________________________________________________________ +// XclExpChTrTabIdBuffer - buffer for tab id's + +class XclExpChTrTabIdBuffer +{ +private: + sal_uInt16* pBuffer; + sal_uInt16* pLast; + sal_uInt16 nBufSize; + sal_uInt16 nLastId; + +public: + XclExpChTrTabIdBuffer( sal_uInt16 nCount ); + XclExpChTrTabIdBuffer( const XclExpChTrTabIdBuffer& rCopy ); + ~XclExpChTrTabIdBuffer(); + + void InitFill( sal_uInt16 nIndex ); + void InitFillup(); + + sal_uInt16 GetId( sal_uInt16 nIndex ) const; + void Remove(); + + inline sal_uInt16 GetBufferCount() const + { return static_cast< sal_uInt16 >( (pLast - pBuffer) + 1 ); } + inline void GetBufferCopy( sal_uInt16* pDest ) const + { memcpy( pDest, pBuffer, sizeof(sal_uInt16) * GetBufferCount() ); } +}; + +//___________________________________________________________________ +// XclExpChTrTabIdBufferList + +class XclExpChTrTabIdBufferList : private List +{ +private: + inline XclExpChTrTabIdBuffer* First() { return (XclExpChTrTabIdBuffer*) List::First(); } + inline XclExpChTrTabIdBuffer* Next() { return (XclExpChTrTabIdBuffer*) List::Next(); } + +public: + virtual ~XclExpChTrTabIdBufferList(); + + inline void Append( XclExpChTrTabIdBuffer* pNew ) + { List::Insert( pNew, LIST_APPEND ); } +}; + +//___________________________________________________________________ +// XclExpChTrTabId - tab id record + +class XclExpChTrTabId : public ExcRecord +{ +private: + sal_uInt16* pBuffer; + sal_uInt16 nTabCount; + + inline void Clear() { if( pBuffer ) delete[] pBuffer; pBuffer = NULL; } + + virtual void SaveCont( XclExpStream& rStrm ); + +public: + inline XclExpChTrTabId( sal_uInt16 nCount ) : + pBuffer( NULL ), nTabCount( nCount ) {} + XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer ); + virtual ~XclExpChTrTabId(); + + void Copy( const XclExpChTrTabIdBuffer& rBuffer ); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +//___________________________________________________________________ +// XclExpChTrAction - base class for action records + +class XclExpChTrAction : public ExcRecord +{ +private: + String sUsername; + DateTime aDateTime; + sal_uInt32 nIndex; // action number + XclExpChTrAction* pAddAction; // additional record for this action + sal_Bool bAccepted; + +protected: + const XclExpTabInfo& rTabInfo; // for table num export (sc num -> xcl num) + const XclExpChTrTabIdBuffer& rIdBuffer; // for table num export (xcl num -> tab id) + sal_uInt32 nLength; // this is not the record size + sal_uInt16 nOpCode; // EXC_CHTR_OP_*** + sal_Bool bForceInfo; + + XclExpChTrAction( const XclExpChTrAction& rCopy ); + + void SetAddAction( XclExpChTrAction* pAction ); + void AddDependentContents( + const ScChangeAction& rAction, + const XclExpRoot& rRoot, + ScChangeTrack& rChangeTrack ); + + inline void Write2DAddress( XclExpStream& rStrm, const ScAddress& rAddress ) const; + inline void Write2DRange( XclExpStream& rStrm, const ScRange& rRange ) const; + inline void WriteTabId( XclExpStream& rStrm, SCTAB nTabId ) const; + + // save header data, call SaveActionData() + virtual void SaveCont( XclExpStream& rStrm ); + inline sal_Size GetHeaderByteCount() const { return 12; } + + // overload to save action data without header, called by SaveCont() + virtual void SaveActionData( XclExpStream& rStrm ) const = 0; + // overload to get action size without header, called by GetLen() + virtual sal_Size GetActionByteCount() const = 0; + + // do something before writing the record + virtual void PrepareSaveAction( XclExpStream& rStrm ) const; + // do something after writing the record + virtual void CompleteSaveAction( XclExpStream& rStrm ) const; + +public: + XclExpChTrAction( + const ScChangeAction& rAction, + const XclExpRoot& rRoot, + const XclExpChTrTabIdBuffer& rTabIdBuffer, + sal_uInt16 nNewOpCode = EXC_CHTR_OP_UNKNOWN ); + virtual ~XclExpChTrAction(); + + inline const String& GetUsername() const { return sUsername; } + inline const DateTime& GetDateTime() const { return aDateTime; } + inline const XclExpChTrTabIdBuffer& GetTabIdBuffer() const { return rIdBuffer; } + inline sal_Bool ForceInfoRecord() const { return bForceInfo; } + + // set own index & return new index + // could be overloaded to use more indexes per action + virtual void SetIndex( sal_uInt32& rIndex ); + + virtual void Save( XclExpStream& rStrm ); + virtual sal_Size GetLen() const; +}; + +inline void XclExpChTrAction::Write2DAddress( XclExpStream& rStrm, const ScAddress& rAddress ) const +{ + rStrm << (sal_uInt16) rAddress.Row() + << (sal_uInt16) rAddress.Col(); +} + +inline void XclExpChTrAction::Write2DRange( XclExpStream& rStrm, const ScRange& rRange ) const +{ + rStrm << (sal_uInt16) rRange.aStart.Row() + << (sal_uInt16) rRange.aEnd.Row() + << (sal_uInt16) rRange.aStart.Col() + << (sal_uInt16) rRange.aEnd.Col(); +} + +inline void XclExpChTrAction::WriteTabId( XclExpStream& rStrm, SCTAB nTab ) const +{ + rStrm << rIdBuffer.GetId( rTabInfo.GetXclTab( nTab ) ); +} + +//___________________________________________________________________ +// XclExpChTrData - cell content itself + +struct XclExpChTrData +{ + XclExpString* pString; + XclTokenArrayRef mxTokArr; + XclExpRefLog maRefLog; + double fValue; + sal_Int32 nRKValue; + sal_uInt16 nType; + sal_Size nSize; + + XclExpChTrData(); + ~XclExpChTrData(); + void Clear(); + + void WriteFormula( + XclExpStream& rStrm, + const XclExpChTrTabIdBuffer& rTabIdBuffer ); + void Write( + XclExpStream& rStrm, + const XclExpChTrTabIdBuffer& rTabIdBuffer ); +}; + +//___________________________________________________________________ +// XclExpChTrCellContent - changed cell content + +class XclExpChTrCellContent : public XclExpChTrAction, protected XclExpRoot +{ +private: + XclExpChTrData* pOldData; + XclExpChTrData* pNewData; + sal_uInt16 nOldLength; // this is not the record size + + void MakeEmptyChTrData( XclExpChTrData*& rpData ); + +protected: + ScAddress aPosition; + + void GetCellData( + const ScBaseCell* pScCell, + XclExpChTrData*& rpData, + sal_uInt32& rXclLength1, + sal_uInt16& rXclLength2 ); + + virtual void SaveActionData( XclExpStream& rStrm ) const; + +public: + XclExpChTrCellContent( + const ScChangeActionContent& rAction, + const XclExpRoot& rRoot, + const XclExpChTrTabIdBuffer& rTabIdBuffer ); + virtual ~XclExpChTrCellContent(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetActionByteCount() const; +}; + +//___________________________________________________________________ +// XclExpChTrInsert - insert/delete columns/rows + +class XclExpChTrInsert : public XclExpChTrAction +{ +protected: + ScRange aRange; + + XclExpChTrInsert( const XclExpChTrInsert& rCopy ) : + XclExpChTrAction( rCopy ), aRange( rCopy.aRange ) {} + + virtual void SaveActionData( XclExpStream& rStrm ) const; + virtual void PrepareSaveAction( XclExpStream& rStrm ) const; + virtual void CompleteSaveAction( XclExpStream& rStrm ) const; + +public: + XclExpChTrInsert( + const ScChangeAction& rAction, + const XclExpRoot& rRoot, + const XclExpChTrTabIdBuffer& rTabIdBuffer, + ScChangeTrack& rChangeTrack ); + virtual ~XclExpChTrInsert(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetActionByteCount() const; +}; + +//___________________________________________________________________ +// XclExpChTrInsertTab - insert table + +class XclExpChTrInsertTab : public XclExpChTrAction, protected XclExpRoot +{ +private: + SCTAB nTab; + +protected: + virtual void SaveActionData( XclExpStream& rStrm ) const; + +public: + XclExpChTrInsertTab( + const ScChangeAction& rAction, + const XclExpRoot& rRoot, + const XclExpChTrTabIdBuffer& rTabIdBuffer ); + virtual ~XclExpChTrInsertTab(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetActionByteCount() const; +}; + +//___________________________________________________________________ +// XclExpChTrMoveRange - move cell range + +class XclExpChTrMoveRange : public XclExpChTrAction +{ +protected: + ScRange aSourceRange; + ScRange aDestRange; + + virtual void SaveActionData( XclExpStream& rStrm ) const; + virtual void PrepareSaveAction( XclExpStream& rStrm ) const; + virtual void CompleteSaveAction( XclExpStream& rStrm ) const; + +public: + XclExpChTrMoveRange( + const ScChangeActionMove& rAction, + const XclExpRoot& rRoot, + const XclExpChTrTabIdBuffer& rTabIdBuffer, + ScChangeTrack& rChangeTrack ); + virtual ~XclExpChTrMoveRange(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetActionByteCount() const; +}; + +//___________________________________________________________________ +// XclExpChTr0x019A - additional data for delete action + +class XclExpChTr0x014A : public XclExpChTrInsert +{ +protected: + virtual void SaveActionData( XclExpStream& rStrm ) const; + +public: + XclExpChTr0x014A( const XclExpChTrInsert& rAction ); + virtual ~XclExpChTr0x014A(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetActionByteCount() const; +}; + +//___________________________________________________________________ +// XclExpChTrActionStack - temporary action stack + +class XclExpChTrActionStack : private Stack +{ +public: + virtual ~XclExpChTrActionStack(); + + void Push( XclExpChTrAction* pNewRec ); + inline XclExpChTrAction* Pop() { return (XclExpChTrAction*) Stack::Pop(); } + +private: + using Stack::Push; +}; + +//___________________________________________________________________ +// XclExpChTrRecordList - list of "Revision Log" stream records + +class XclExpChTrRecordList : private List +{ +private: + inline ExcRecord* First() { return (ExcRecord*) List::First(); } + inline ExcRecord* Next() { return (ExcRecord*) List::Next(); } + +public: + virtual ~XclExpChTrRecordList(); + + using List::Count; + void Append( ExcRecord* pNewRec ); + void Save( XclExpStream& rStrm ); +}; + +//___________________________________________________________________ +// XclExpChangeTrack - exports the "Revision Log" stream + +class XclExpChangeTrack : protected XclExpRoot +{ +private: + XclExpChTrRecordList aRecList; + XclExpChTrActionStack aActionStack; + XclExpChTrTabIdBufferList aTabIdBufferList; + XclExpChTrTabIdBuffer* pTabIdBuffer; + + ScDocument* pTempDoc; // empty document + + sal_uInt32 nNewAction; // action number, 1-based + XclExpChTrHeader* pHeader; // header record for last GUID + sal_uInt8 aGUID[ 16 ]; // GUID for action info records + sal_Bool bValidGUID; + + ScChangeTrack* CreateTempChangeTrack(); + void PushActionRecord( const ScChangeAction& rAction ); + + sal_Bool WriteUserNamesStream(); + +public: + XclExpChangeTrack( const XclExpRoot& rRoot ); + ~XclExpChangeTrack(); + + void Write(); +}; + +//___________________________________________________________________ + +#endif + diff --git a/sc/source/filter/inc/XclImpChangeTrack.hxx b/sc/source/filter/inc/XclImpChangeTrack.hxx new file mode 100644 index 000000000000..c850d6681235 --- /dev/null +++ b/sc/source/filter/inc/XclImpChangeTrack.hxx @@ -0,0 +1,202 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XCLIMPCHANGETRACK_HXX +#define SC_XCLIMPCHANGETRACK_HXX + +#include <tools/datetime.hxx> +#include "xiroot.hxx" +#include "xistream.hxx" +#include "excform.hxx" +#include "imp_op.hxx" + + +//___________________________________________________________________ + +class ScBaseCell; +class ScChangeAction; +class ScChangeTrack; +class XclImpChTrFmlConverter; + +//___________________________________________________________________ + +struct XclImpChTrRecHeader +{ + sal_uInt32 nSize; + sal_uInt32 nIndex; + sal_uInt16 nOpCode; + sal_uInt16 nAccept; +}; + +inline XclImpStream& operator>>( XclImpStream& rStrm, XclImpChTrRecHeader& rRecHeader ) +{ + rStrm >> rRecHeader.nSize >> rRecHeader.nIndex >> rRecHeader.nOpCode >> rRecHeader.nAccept; + return rStrm; +} + +//___________________________________________________________________ + +class XclImpChangeTrack : protected XclImpRoot +{ +private: + XclImpChTrRecHeader aRecHeader; + String sOldUsername; + + ScChangeTrack* pChangeTrack; + SotStorageStreamRef xInStrm; // input stream + XclImpStream* pStrm; // stream import class + sal_uInt16 nTabIdCount; + sal_Bool bGlobExit; // global exit loop + + enum { nmBase, nmFound, nmNested } + eNestedMode; // action with nested content actions + + inline sal_Bool FoundNestedMode() { return eNestedMode == nmFound; } + + void DoAcceptRejectAction( ScChangeAction* pAction ); + void DoAcceptRejectAction( sal_uInt32 nFirst, sal_uInt32 nLast ); + + void DoInsertRange( const ScRange& rRange ); + void DoDeleteRange( const ScRange& rRange ); + + inline sal_uInt8 LookAtuInt8(); + inline double ReadRK(); + inline sal_Bool ReadBool(); + inline void Read2DAddress( ScAddress& rAddress ); + inline void Read2DRange( ScRange& rRange ); + SCTAB ReadTabNum(); + void ReadDateTime( DateTime& rDateTime ); + + inline void ReadString( String& rString ); + inline void IgnoreString(); + + sal_Bool CheckRecord( sal_uInt16 nOpCode ); + + void ReadFormula( + ScTokenArray*& rpTokenArray, + const ScAddress& rPosition ); + void ReadCell( + ScBaseCell*& rpCell, + sal_uInt32& rFormat, + sal_uInt16 nFlags, + const ScAddress& rPosition ); + + void ReadChTrInsert(); // 0x0137 + void ReadChTrInfo(); // 0x0138 + void ReadChTrCellContent(); // 0x013B + void ReadChTrTabId(); // 0x013D + void ReadChTrMoveRange(); // 0x0140 + void ReadChTrInsertTab(); // 0x014D + void InitNestedMode(); // 0x014E, 0x0150 + void ReadNestedRecords(); + sal_Bool EndNestedMode(); // 0x014F, 0x0151 + + void ReadRecords(); + +public: + XclImpChangeTrack( const XclImpRoot& rRoot, const XclImpStream& rBookStrm ); + ~XclImpChangeTrack(); + + // reads extended 3D ref info following the formulas, returns sc tab nums + // ( called by XclImpChTrFmlConverter::Read3DTabReference() ) + sal_Bool Read3DTabRefInfo( SCTAB& rFirstTab, SCTAB& rLastTab, ExcelToSc8::ExternalTabInfo& rExtInfo ); + + void Apply(); +}; + +inline sal_uInt8 XclImpChangeTrack::LookAtuInt8() +{ + pStrm->PushPosition(); + sal_uInt8 nValue; + *pStrm >> nValue; + pStrm->PopPosition(); + return nValue; +} + +inline double XclImpChangeTrack::ReadRK() +{ + return XclTools::GetDoubleFromRK( pStrm->ReadInt32() ); +} + +inline sal_Bool XclImpChangeTrack::ReadBool() +{ + return (pStrm->ReaduInt16() != 0); +} + +inline void XclImpChangeTrack::Read2DAddress( ScAddress& rAddress ) +{ + rAddress.SetRow( static_cast<SCROW>(pStrm->ReaduInt16()) ); + rAddress.SetCol( static_cast<SCCOL>(pStrm->ReaduInt16()) ); +} + +inline void XclImpChangeTrack::Read2DRange( ScRange& rRange ) +{ + rRange.aStart.SetRow( static_cast<SCROW>(pStrm->ReaduInt16()) ); + rRange.aEnd.SetRow( static_cast<SCROW>(pStrm->ReaduInt16()) ); + rRange.aStart.SetCol( static_cast<SCCOL>(pStrm->ReaduInt16()) ); + rRange.aEnd.SetCol( static_cast<SCCOL>(pStrm->ReaduInt16()) ); +} + +inline void XclImpChangeTrack::ReadString( String& rString ) +{ + rString = pStrm->ReadUniString(); +} + +inline void XclImpChangeTrack::IgnoreString() +{ + pStrm->IgnoreUniString(); +} + +//___________________________________________________________________ +// derived class for special 3D ref handling + +class XclImpChTrFmlConverter : public ExcelToSc8 +{ +private: + XclImpChangeTrack& rChangeTrack; + + virtual bool Read3DTabReference( UINT16 nIxti, SCTAB& rFirstTab, SCTAB& rLastTab, ExternalTabInfo& rExtInfo ); + +public: + inline XclImpChTrFmlConverter( + const XclImpRoot& rRoot, + XclImpChangeTrack& rXclChTr ); + virtual ~XclImpChTrFmlConverter(); +}; + +inline XclImpChTrFmlConverter::XclImpChTrFmlConverter( + const XclImpRoot& rRoot, + XclImpChangeTrack& rXclChTr ) : + ExcelToSc8( rRoot ), + rChangeTrack( rXclChTr ) +{ +} + +//___________________________________________________________________ + +#endif + diff --git a/sc/source/filter/inc/biff.hxx b/sc/source/filter/inc/biff.hxx new file mode 100644 index 000000000000..479dc0f577f5 --- /dev/null +++ b/sc/source/filter/inc/biff.hxx @@ -0,0 +1,64 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#ifndef SC_BASE_HXX +#define SC_BASE_HXX + +#include <sal/config.h> +#include "filter.hxx" +#include "document.hxx" +#include "cell.hxx" +#include <tools/string.hxx> + +#include <tools/color.hxx> +#include "flttypes.hxx" +#include "ftools.hxx" + +// Stream wrapper class +class ScBiffReader +{ + protected: + sal_uInt16 mnId; + sal_uInt16 mnLength; + sal_uInt32 mnOffset; + SvStream *mpStream; + bool mbEndOfFile; + + public: + ScBiffReader( SfxMedium& rMedium ); + ~ScBiffReader(); + bool recordsLeft() { return mpStream && !mpStream->IsEof(); } + bool IsEndOfFile() { return mbEndOfFile; } + void SetEof( bool bValue ){ mbEndOfFile = bValue; } + bool nextRecord(); + sal_uInt16 getId() { return mnId; } + sal_uInt16 getLength() { return mnLength; } + SvStream& getStream() { return *mpStream; } +}; +#endif + diff --git a/sc/source/filter/inc/colrowst.hxx b/sc/source/filter/inc/colrowst.hxx new file mode 100644 index 000000000000..325d380cc19c --- /dev/null +++ b/sc/source/filter/inc/colrowst.hxx @@ -0,0 +1,80 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_COLROWST_HXX +#define SC_COLROWST_HXX + +#include "xiroot.hxx" + +class XclImpStream; + +// ============================================================================ + +class XclImpColRowSettings : protected XclImpRoot +{ +public: + explicit XclImpColRowSettings( const XclImpRoot& rRoot ); + virtual ~XclImpColRowSettings(); + + void SetDefWidth( sal_uInt16 nDefWidth, bool bStdWidthRec = false ); + void SetWidthRange( SCCOL nCol1, SCCOL nCol2, sal_uInt16 nWidth ); + void HideCol( SCCOL nCol ); + void HideColRange( SCCOL nCol1, SCCOL nCol2 ); + + void SetDefHeight( sal_uInt16 nDefHeight, sal_uInt16 nFlags ); + void SetHeight( SCROW nRow, sal_uInt16 nHeight ); + void SetRowSettings( SCROW nRow, sal_uInt16 nHeight, sal_uInt16 nFlags ); + void SetManualRowHeight( SCROW nScRow ); + + void SetDefaultXF( SCCOL nScCol1, SCCOL nScCol2, sal_uInt16 nXFIndex ); + /** Inserts all column and row settings of the specified sheet, except the hidden flags. */ + void Convert( SCTAB nScTab ); + /** Sets the HIDDEN flags at all hidden columns and rows in the specified sheet. */ + void ConvertHiddenFlags( SCTAB nScTab ); + +private: + ScfUInt16Vec maWidths; /// Column widths in twips. + ScfUInt8Vec maColFlags; /// Flags for all columns. + ScfUInt16Vec maHeights; /// Row heights in twips. + ScfUInt8Vec maRowFlags; /// Flags for all rows. + + SCROW mnLastScRow; + + sal_uInt16 mnDefWidth; /// Default width from DEFCOLWIDTH or STANDARDWIDTH record. + sal_uInt16 mnDefHeight; /// Default height from DEFAULTROWHEIGHT record. + sal_uInt16 mnDefRowFlags; /// Default row flags from DEFAULTROWHEIGHT record. + + bool mbHasStdWidthRec; /// true = Width from STANDARDWIDTH (overrides DEFCOLWIDTH record). + bool mbHasDefHeight; /// true = mnDefHeight and mnDefRowFlags are valid. + bool mbDirty; +}; + + + + +#endif + diff --git a/sc/source/filter/inc/decl.h b/sc/source/filter/inc/decl.h new file mode 100644 index 000000000000..e888b7dca5fe --- /dev/null +++ b/sc/source/filter/inc/decl.h @@ -0,0 +1,44 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#ifndef SC_DECL_H +#define SC_DECL_H + +#include <tools/solar.h> +#include <tools/string.hxx> + +enum WKTYP { eWK_UNKNOWN = -2, eWK_1 = 0, eWK_2, eWK3, eWK4, eWK_Error, eWK123 }; +typedef void ( BEARBFKT )( void ); +typedef sal_Char STRING16[ 16 ]; +typedef sal_Char STRING14[ 14 ]; +typedef sal_Char STRING8[ 8 ]; +typedef sal_Char STRING6[ 6 ]; +typedef USHORT USHORT4[ 4 ]; +//typedef unsigned short USHORT4[ 4 ]; +#endif + diff --git a/sc/source/filter/inc/dif.hxx b/sc/source/filter/inc/dif.hxx new file mode 100644 index 000000000000..20b2400cf5a2 --- /dev/null +++ b/sc/source/filter/inc/dif.hxx @@ -0,0 +1,227 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#ifndef SC_DIF_HXX +#define SC_DIF_HXX + +#include <tools/debug.hxx> +#include <tools/list.hxx> +#include <tools/string.hxx> +#include "global.hxx" +#include "address.hxx" + + +class SvStream; +class SvNumberFormatter; +class ScDocument; +class ScPatternAttr; + +extern const sal_Unicode pKeyTABLE[]; +extern const sal_Unicode pKeyVECTORS[]; +extern const sal_Unicode pKeyTUPLES[]; +extern const sal_Unicode pKeyDATA[]; +extern const sal_Unicode pKeyBOT[]; +extern const sal_Unicode pKeyEOD[]; +extern const sal_Unicode pKeyTRUE[]; +extern const sal_Unicode pKeyFALSE[]; +extern const sal_Unicode pKeyNA[]; +extern const sal_Unicode pKeyV[]; +extern const sal_Unicode pKey1_0[]; + + +enum TOPIC +{ + T_UNKNOWN, + T_TABLE, T_VECTORS, T_TUPLES, T_DATA, T_LABEL, T_COMMENT, T_SIZE, + T_PERIODICITY, T_MAJORSTART, T_MINORSTART, T_TRUELENGTH, T_UINITS, + T_DISPLAYUNITS, + T_END +}; + +enum DATASET { D_BOT, D_EOD, D_NUMERIC, D_STRING, D_UNKNOWN, D_SYNT_ERROR }; + + +class DifParser +{ +public: + String aData; + double fVal; + UINT32 nVector; + UINT32 nVal; + UINT32 nNumFormat; + CharSet eCharSet; +private: + SvNumberFormatter* pNumFormatter; + SvStream& rIn; + BOOL bPlain; + String aLookAheadLine; + + bool ReadNextLine( String& rStr ); + bool LookAhead(); + DATASET GetNumberDataset( const sal_Unicode* pPossibleNumericData ); + static inline BOOL IsBOT( const sal_Unicode* pRef ); + static inline BOOL IsEOD( const sal_Unicode* pRef ); + static inline BOOL Is1_0( const sal_Unicode* pRef ); +public: + DifParser( SvStream&, const UINT32 nOption, ScDocument&, CharSet ); + + TOPIC GetNextTopic( void ); + + DATASET GetNextDataset( void ); + + const sal_Unicode* ScanIntVal( const sal_Unicode* pStart, UINT32& rRet ); + BOOL ScanFloatVal( const sal_Unicode* pStart ); + + inline BOOL IsNumber( const sal_Unicode cChar ); + inline BOOL IsNumberEnding( const sal_Unicode cChar ); + + static inline BOOL IsV( const sal_Unicode* pRef ); + + inline BOOL IsPlain( void ) const; +}; + + +inline BOOL DifParser::IsBOT( const sal_Unicode* pRef ) +{ + return ( pRef[ 0 ] == pKeyBOT[0] && + pRef[ 1 ] == pKeyBOT[1] && + pRef[ 2 ] == pKeyBOT[2] && + pRef[ 3 ] == pKeyBOT[3] ); +} + + +inline BOOL DifParser::IsEOD( const sal_Unicode* pRef ) +{ + return ( pRef[ 0 ] == pKeyEOD[0] && + pRef[ 1 ] == pKeyEOD[1] && + pRef[ 2 ] == pKeyEOD[2] && + pRef[ 3 ] == pKeyEOD[3] ); +} + + +inline BOOL DifParser::Is1_0( const sal_Unicode* pRef ) +{ + return ( pRef[ 0 ] == pKey1_0[0] && + pRef[ 1 ] == pKey1_0[1] && + pRef[ 2 ] == pKey1_0[2] && + pRef[ 3 ] == pKey1_0[3] ); +} + + +inline BOOL DifParser::IsV( const sal_Unicode* pRef ) +{ + return ( pRef[ 0 ] == pKeyV[0] && + pRef[ 1 ] == pKeyV[1] ); +} + + +inline BOOL DifParser::IsNumber( const sal_Unicode cChar ) +{ + return ( cChar >= '0' && cChar <= '9' ); +} + + +inline BOOL DifParser::IsNumberEnding( const sal_Unicode cChar ) +{ + return ( cChar == 0x00 ); +} + + +inline BOOL DifParser::IsPlain( void ) const +{ + return bPlain; +} + + + + +class DifAttrCache; +class ScPatternAttr; + + +class DifColumn : private List +{ +private: + friend class DifAttrCache; + struct ENTRY + { + UINT32 nNumFormat; + + SCROW nStart; + SCROW nEnd; + }; + + ENTRY* pAkt; + + inline DifColumn( void ); + ~DifColumn(); + void SetLogical( SCROW nRow ); + void SetNumFormat( SCROW nRow, const UINT32 nNumFormat ); + void NewEntry( const SCROW nPos, const UINT32 nNumFormat ); + void Apply( ScDocument&, const SCCOL nCol, const SCTAB nTab, const ScPatternAttr& ); + void Apply( ScDocument &rDoc, const SCCOL nCol, const SCTAB nTab ); +public: // geht niemanden etwas an... +}; + + +inline DifColumn::DifColumn( void ) +{ + pAkt = NULL; +} + + + + +class DifAttrCache +{ +private: + DifColumn** ppCols; + BOOL bPlain; +public: + DifAttrCache( const BOOL bPlain ); + ~DifAttrCache(); + inline void SetLogical( const SCCOL nCol, const SCROW nRow ); + void SetNumFormat( const SCCOL nCol, const SCROW nRow, const UINT32 nNumFormat ); + void Apply( ScDocument&, SCTAB nTab ); +}; + + +inline void DifAttrCache::SetLogical( const SCCOL nCol, const SCROW nRow ) +{ + DBG_ASSERT( ValidCol(nCol), "-DifAttrCache::SetLogical(): Col zu gross!" ); + DBG_ASSERT( bPlain, "*DifAttrCache::SetLogical(): muss Plain sein!" ); + + if( !ppCols[ nCol ] ) + ppCols[ nCol ] = new DifColumn; + ppCols[ nCol ]->SetLogical( nRow ); +} + + +#endif + + diff --git a/sc/source/filter/inc/eeimport.hxx b/sc/source/filter/inc/eeimport.hxx new file mode 100644 index 000000000000..634dfd1b4a33 --- /dev/null +++ b/sc/source/filter/inc/eeimport.hxx @@ -0,0 +1,68 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef SC_EEIMPORT_HXX +#define SC_EEIMPORT_HXX + +#include "global.hxx" +#include "address.hxx" +#include "filter.hxx" +#include "scdllapi.h" + +class ScDocument; +class ScEEParser; +class ScTabEditEngine; +class SvStream; +class Table; + +struct ScEEParseEntry; + +class ScEEImport : public ScEEAbsImport +{ +protected: + ScRange maRange; + ScDocument* mpDoc; + ScEEParser* mpParser; + ScTabEditEngine* mpEngine; + Table* mpRowHeights; + + BOOL GraphicSize( SCCOL nCol, SCROW nRow, SCTAB nTab, + ScEEParseEntry* ); + void InsertGraphic( SCCOL nCol, SCROW nRow, SCTAB nTab, + ScEEParseEntry* ); +public: + ScEEImport( ScDocument* pDoc, const ScRange& rRange ); + virtual ~ScEEImport(); + + virtual ULONG Read( SvStream& rStream, const String& rBaseURL ); + virtual ScRange GetRange() { return maRange; } + virtual void WriteToDocument( BOOL bSizeColsRows = FALSE, + double nOutputFactor = 1.0, + SvNumberFormatter* pFormatter = NULL, + bool bConvertDate = true ); +}; + +#endif diff --git a/sc/source/filter/inc/eeparser.hxx b/sc/source/filter/inc/eeparser.hxx new file mode 100644 index 000000000000..afc8c959392b --- /dev/null +++ b/sc/source/filter/inc/eeparser.hxx @@ -0,0 +1,153 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_EEPARSER_HXX +#define SC_EEPARSER_HXX + +#include <tools/string.hxx> +#include <tools/gen.hxx> +#include <vcl/graph.hxx> +#include <tools/table.hxx> +#include <svl/itemset.hxx> +#include <editeng/editdata.hxx> +#include <address.hxx> + +const sal_Char nHorizontal = 1; +const sal_Char nVertical = 2; +const sal_Char nHoriVerti = nHorizontal | nVertical; + +struct ScHTMLImage +{ + String aURL; + Size aSize; + Point aSpace; + String aFilterName; + Graphic* pGraphic; // wird von WriteToDocument uebernommen + sal_Char nDir; // 1==hori, 2==verti, 3==beides + + ScHTMLImage() : + aSize( 0, 0 ), aSpace( 0, 0 ), pGraphic( NULL ), + nDir( nHorizontal ) + {} + ~ScHTMLImage() + { if ( pGraphic ) delete pGraphic; } +}; +DECLARE_LIST( ScHTMLImageList, ScHTMLImage* ) + +struct ScEEParseEntry +{ + SfxItemSet aItemSet; + ESelection aSel; // Selection in EditEngine + String* pValStr; // HTML evtl. SDVAL String + String* pNumStr; // HTML evtl. SDNUM String + String* pName; // HTML evtl. Anchor/RangeName + String aAltText; // HTML IMG ALT Text + ScHTMLImageList* pImageList; // Grafiken in dieser Zelle + SCCOL nCol; // relativ zum Beginn des Parse + SCROW nRow; + USHORT nTab; // HTML TableInTable + USHORT nTwips; // RTF ColAdjust etc. + SCCOL nColOverlap; // merged cells wenn >1 + SCROW nRowOverlap; // merged cells wenn >1 + USHORT nOffset; // HTML PixelOffset + USHORT nWidth; // HTML PixelWidth + BOOL bHasGraphic; // HTML any image loaded + bool bEntirePara; // TRUE = use entire paragraph, false = use selection + + ScEEParseEntry( SfxItemPool* pPool ) : + aItemSet( *pPool ), pValStr( NULL ), + pNumStr( NULL ), pName( NULL ), pImageList( NULL ), + nCol(SCCOL_MAX), nRow(SCROW_MAX), nTab(0), + nColOverlap(1), nRowOverlap(1), + nOffset(0), nWidth(0), bHasGraphic(FALSE), bEntirePara(true) + {} + ScEEParseEntry( const SfxItemSet& rItemSet ) : + aItemSet( rItemSet ), pValStr( NULL ), + pNumStr( NULL ), pName( NULL ), pImageList( NULL ), + nCol(SCCOL_MAX), nRow(SCROW_MAX), nTab(0), + nColOverlap(1), nRowOverlap(1), + nOffset(0), nWidth(0), bHasGraphic(FALSE), bEntirePara(true) + {} + ~ScEEParseEntry() + { + if ( pValStr ) + delete pValStr; + if ( pNumStr ) + delete pNumStr; + if ( pName ) + delete pName; + if ( pImageList ) + { + for ( ScHTMLImage* pI = pImageList->First(); + pI; pI = pImageList->Next() ) + { + delete pI; + } + delete pImageList; + } + } +}; +DECLARE_LIST( ScEEParseList, ScEEParseEntry* ) + + +class EditEngine; + +class ScEEParser +{ +protected: + EditEngine* pEdit; + SfxItemPool* pPool; + SfxItemPool* pDocPool; + ScEEParseList* pList; + ScEEParseEntry* pActEntry; + Table* pColWidths; + int nLastToken; + SCCOL nColCnt; + SCROW nRowCnt; + SCCOL nColMax; + SCROW nRowMax; + + void NewActEntry( ScEEParseEntry* ); + +public: + ScEEParser( EditEngine* ); + virtual ~ScEEParser(); + + virtual ULONG Read( SvStream&, const String& rBaseURL ) = 0; + + void GetDimensions( SCCOL& nCols, SCROW& nRows ) const + { nCols = nColMax; nRows = nRowMax; } + ULONG Count() const { return pList->Count(); } + ScEEParseEntry* First() const { return pList->First(); } + ScEEParseEntry* Next() const { return pList->Next(); } + Table* GetColWidths() const { return pColWidths; } +}; + + + +#endif + diff --git a/sc/source/filter/inc/excdefs.hxx b/sc/source/filter/inc/excdefs.hxx new file mode 100644 index 000000000000..2d489af7e427 --- /dev/null +++ b/sc/source/filter/inc/excdefs.hxx @@ -0,0 +1,106 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_EXCDEFS_HXX +#define SC_EXCDEFS_HXX + +#include <sal/types.h> + +// (0x009B, 0x009D, 0x009E) AUTOFILTER ======================================== + +// flags +const sal_uInt16 EXC_AFFLAG_AND = 0x0000; +const sal_uInt16 EXC_AFFLAG_OR = 0x0001; +const sal_uInt16 EXC_AFFLAG_ANDORMASK = 0x0003; +const sal_uInt16 EXC_AFFLAG_SIMPLE1 = 0x0004; +const sal_uInt16 EXC_AFFLAG_SIMPLE2 = 0x0008; +const sal_uInt16 EXC_AFFLAG_TOP10 = 0x0010; +const sal_uInt16 EXC_AFFLAG_TOP10TOP = 0x0020; +const sal_uInt16 EXC_AFFLAG_TOP10PERC = 0x0040; + +// data types +const sal_uInt8 EXC_AFTYPE_NOTUSED = 0x00; +const sal_uInt8 EXC_AFTYPE_RK = 0x02; +const sal_uInt8 EXC_AFTYPE_DOUBLE = 0x04; +const sal_uInt8 EXC_AFTYPE_STRING = 0x06; +const sal_uInt8 EXC_AFTYPE_BOOLERR = 0x08; +const sal_uInt8 EXC_AFTYPE_INVALID = 0x0A; +const sal_uInt8 EXC_AFTYPE_EMPTY = 0x0C; +const sal_uInt8 EXC_AFTYPE_NOTEMPTY = 0x0E; + +// comparison operands +const sal_uInt8 EXC_AFOPER_NONE = 0x00; +const sal_uInt8 EXC_AFOPER_LESS = 0x01; +const sal_uInt8 EXC_AFOPER_EQUAL = 0x02; +const sal_uInt8 EXC_AFOPER_LESSEQUAL = 0x03; +const sal_uInt8 EXC_AFOPER_GREATER = 0x04; +const sal_uInt8 EXC_AFOPER_NOTEQUAL = 0x05; +const sal_uInt8 EXC_AFOPER_GREATEREQUAL = 0x06; + +// (0x00AE, 0x00AF) SCENARIO, SCENMAN ========================================= + +#define EXC_SCEN_MAXCELL 32 + +// defines for change tracking ================================================ + +#define EXC_STREAM_USERNAMES CREATE_STRING( "User Names" ) +#define EXC_STREAM_REVLOG CREATE_STRING( "Revision Log" ) + +// opcodes +#define EXC_CHTR_OP_COLFLAG 0x0001 +#define EXC_CHTR_OP_DELFLAG 0x0002 +#define EXC_CHTR_OP_INSROW 0x0000 +#define EXC_CHTR_OP_INSCOL EXC_CHTR_OP_COLFLAG +#define EXC_CHTR_OP_DELROW EXC_CHTR_OP_DELFLAG +#define EXC_CHTR_OP_DELCOL (EXC_CHTR_OP_COLFLAG|EXC_CHTR_OP_DELFLAG) +#define EXC_CHTR_OP_MOVE 0x0004 +#define EXC_CHTR_OP_INSTAB 0x0005 +#define EXC_CHTR_OP_CELL 0x0008 +#define EXC_CHTR_OP_RENAME 0x0009 +#define EXC_CHTR_OP_NAME 0x000A +#define EXC_CHTR_OP_FORMAT 0x000B +#define EXC_CHTR_OP_UNKNOWN 0xFFFF + +// data types +#define EXC_CHTR_TYPE_MASK 0x0007 +#define EXC_CHTR_TYPE_FORMATMASK 0xFF00 +#define EXC_CHTR_TYPE_EMPTY 0x0000 +#define EXC_CHTR_TYPE_RK 0x0001 +#define EXC_CHTR_TYPE_DOUBLE 0x0002 +#define EXC_CHTR_TYPE_STRING 0x0003 +#define EXC_CHTR_TYPE_BOOL 0x0004 +#define EXC_CHTR_TYPE_FORMULA 0x0005 + +// accept flags +#define EXC_CHTR_NOTHING 0x0000 +#define EXC_CHTR_ACCEPT 0x0001 +#define EXC_CHTR_REJECT 0x0003 + +// ============================================================================ + +#endif // _EXCDEFS_HXX + diff --git a/sc/source/filter/inc/excdoc.hxx b/sc/source/filter/inc/excdoc.hxx new file mode 100644 index 000000000000..f00e8d091590 --- /dev/null +++ b/sc/source/filter/inc/excdoc.hxx @@ -0,0 +1,120 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_EXCDOC_HXX +#define SC_EXCDOC_HXX + +#include <tools/solar.h> +#include "excrecds.hxx" +#include "xeroot.hxx" +#include "root.hxx" + +//------------------------------------------------------------------ Forwards - + +class SvStream; +class ScBaseCell; +class ScHorizontalCellIterator; +class ScDocument; +class ScProgress; + +class NameBuffer; + +class XclExpChangeTrack; + + +//------------------------------------------------------------ class ExcTable - + +class XclExpCellTable; + +class ExcTable : public XclExpRecordBase, public XclExpRoot +{ +private: + typedef XclExpRecordList< ExcBundlesheetBase > ExcBoundsheetList; + typedef ScfRef< XclExpCellTable > XclExpCellTableRef; + + XclExpRecordList<> aRecList; + XclExpCellTableRef mxCellTable; + + SCTAB mnScTab; // table number SC document + UINT16 nExcTab; // table number Excel document + UINT16 nAktRow; // fuer'n Iterator + UINT16 nAktCol; + + NameBuffer* pTabNames; + + // pRec mit new anlegen und vergessen, delete macht ExcTable selber! + void Add( XclExpRecordBase* pRec ); + + void FillAsXmlTable( size_t nCodeNameIdx ); + +public: + ExcTable( const XclExpRoot& rRoot ); + ExcTable( const XclExpRoot& rRoot, SCTAB nScTab ); + ~ExcTable(); + + void FillAsHeader( ExcBoundsheetList& rBoundsheetList ); + void FillAsTable( size_t nCodeNameIdx ); + void FillAsEmptyTable( size_t nCodeNameIdx ); + + void Write( XclExpStream& ); + void WriteXml( XclExpXmlStream& ); +}; + + +//--------------------------------------------------------- class ExcDocument - + +class ExcDocument : protected XclExpRoot +{ +friend class ExcTable; + +private: + typedef XclExpRecordList< ExcTable > ExcTableList; + typedef ExcTableList::RecordRefType ExcTableRef; + typedef XclExpRecordList< ExcBundlesheetBase > ExcBoundsheetList; + typedef ExcBoundsheetList::RecordRefType ExcBoundsheetRef; + + ExcTable aHeader; + + ExcTableList maTableList; + ExcBoundsheetList maBoundsheetList; + + XclExpChangeTrack* pExpChangeTrack; + +public: + explicit ExcDocument( const XclExpRoot& rRoot ); + virtual ~ExcDocument(); + + void ReadDoc( void ); + void Write( SvStream& rSvStrm ); + void WriteXml( SvStream& rSvStrm ); +}; + + + + +#endif + diff --git a/sc/source/filter/inc/excform.hxx b/sc/source/filter/inc/excform.hxx new file mode 100644 index 000000000000..ed771637b704 --- /dev/null +++ b/sc/source/filter/inc/excform.hxx @@ -0,0 +1,160 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_EXCFORM_HXX +#define SC_EXCFORM_HXX + +#include "xlformula.hxx" +#include "xiroot.hxx" +#include "formel.hxx" + +#include <vector> + +class ScRangeList; + + +class ExcelToSc : public ExcelConverterBase, protected XclImpRoot +{ +protected: + enum ExtensionType { EXTENSION_ARRAY, EXTENSION_NLR, EXTENSION_MEMAREA }; + typedef ::std::vector< ExtensionType > ExtensionTypeVec; + + BOOL bExternName; // wenn External Name gefunden wurde + static const UINT16 nRowMask; + static const UINT16 nLastInd; // letzter Index fuer Excel->SC- + // Token Umsetzung + XclFunctionProvider maFuncProv; + const XclBiff meBiff; + + // --------------------------------------------------------------- + void DoMulArgs( DefTokenId eId, sal_uInt8 nNumArgs, sal_uInt8 mnMinParamCount = 0 ); + + void ExcRelToScRel( UINT16 nRow, UINT8 nCol, ScSingleRefData&, const BOOL bName ); + +public: + ExcelToSc( const XclImpRoot& rRoot ); + virtual ~ExcelToSc(); + virtual ConvErr Convert( const ScTokenArray*&, XclImpStream& rStrm, sal_Size nFormulaLen, + bool bAllowArrays, const FORMULA_TYPE eFT = FT_CellFormula ); + + virtual ConvErr Convert( _ScRangeListTabs&, XclImpStream& rStrm, sal_Size nFormulaLen, const FORMULA_TYPE eFT = FT_CellFormula ); + + virtual ConvErr ConvertExternName( const ScTokenArray*& rpArray, XclImpStream& rStrm, sal_Size nFormulaLen, + const String& rUrl, const ::std::vector<String>& rTabNames ); + + virtual BOOL GetAbsRefs( ScRangeList& rRangeList, XclImpStream& rStrm, sal_Size nLen ); + + void GetDummy( const ScTokenArray*& ); + const ScTokenArray* GetBoolErr( XclBoolError ); + BOOL GetShrFmla( const ScTokenArray*&, XclImpStream& rStrm, sal_Size nFormulaLen ); + +#if 0 + // return = TRUE -> String-Record folgt! + static BOOL SetCurVal( ScFormulaCell& rCell, double& rCurVal ); +#endif + static void SetError( ScFormulaCell& rCell, const ConvErr eErr ); + + static inline BOOL IsComplColRange( const UINT16 nCol1, const UINT16 nCol2 ); + static inline BOOL IsComplRowRange( const UINT16 nRow1, const UINT16 nRow2 ); + + void SetComplCol( ScComplexRefData& ); + void SetComplRow( ScComplexRefData& ); + + void ReadExtensions( const ExtensionTypeVec& rExtensions, + XclImpStream& aIn ); + void ReadExtensionArray( unsigned int n, + XclImpStream& aIn ); + void ReadExtensionNlr( XclImpStream& aIn ); + void ReadExtensionMemArea( XclImpStream& aIn ); +}; + + +inline BOOL ExcelToSc::IsComplColRange( const UINT16 nCol1, const UINT16 nCol2 ) +{ + return ( nCol1 == 0x00 ) && ( nCol2 == 0xFF ); +} + + +inline BOOL ExcelToSc::IsComplRowRange( const UINT16 nRow1, const UINT16 nRow2 ) +{ + return ( ( nRow1 & 0x3FFF ) == 0x0000 ) && ( ( nRow2 & 0x3FFF ) == 0x3FFF ); +} + +// ============================================================================ + +class XclImpLinkManager; + +class ExcelToSc8 : public ExcelToSc +{ +public: + + struct ExternalTabInfo + { + String maTabName; + sal_uInt16 mnFileId; + bool mbExternal; + + ExternalTabInfo(); + }; + +private: + const XclImpLinkManager& rLinkMan; + + void ExcRelToScRel8( UINT16 nRow, UINT16 nCol, ScSingleRefData&, + const BOOL bName ); + + bool GetExternalFileIdFromXti( UINT16 nIxti, sal_uInt16& rFileId ) const; + + virtual bool Read3DTabReference( UINT16 nIxti, SCTAB& rFirstTab, SCTAB& rLastTab, ExternalTabInfo& rExtInfo ); + +public: + ExcelToSc8( const XclImpRoot& rRoot ); + virtual ~ExcelToSc8(); + + virtual ConvErr Convert( const ScTokenArray*& rpTokArray, XclImpStream& rStrm, sal_Size nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT = FT_CellFormula ); + + virtual ConvErr Convert( _ScRangeListTabs&, XclImpStream& rStrm, sal_Size nFormulaLen, const FORMULA_TYPE eFT = FT_CellFormula ); + + virtual ConvErr ConvertExternName( const ScTokenArray*& rpArray, XclImpStream& rStrm, sal_Size nFormulaLen, + const String& rUrl, const ::std::vector<String>& rTabNames ); + + static inline BOOL IsComplRowRange( const UINT16 nRow1, const UINT16 nRow2 ); + + virtual BOOL GetAbsRefs( ScRangeList& rRangeList, XclImpStream& rStrm, sal_Size nLen ); +}; + + +inline BOOL ExcelToSc8::IsComplRowRange( const UINT16 nRow1, const UINT16 nRow2 ) +{ + return ( nRow1 == 0x0000 ) && ( nRow2 == 0xFFFF ); +} + + + + + +#endif diff --git a/sc/source/filter/inc/excimp8.hxx b/sc/source/filter/inc/excimp8.hxx new file mode 100644 index 000000000000..5b2bbe2e7b5d --- /dev/null +++ b/sc/source/filter/inc/excimp8.hxx @@ -0,0 +1,166 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_EXCIMP8_HXX +#define SC_EXCIMP8_HXX + +#include <string.h> +#include "imp_op.hxx" +#include "root.hxx" +#include "excscen.hxx" +#include "excdefs.hxx" +#include "ftools.hxx" +#include "queryparam.hxx" + +class SotStorage; + +class ScBaseCell; +class ScRangeList; +class ScDBData; + +class ScfSimpleProgressBar; + +class XclImpStream; + + + +class ImportExcel8 : public ImportExcel +{ +public: + ImportExcel8( XclImpRootData& rImpData, SvStream& rStrm ); + virtual ~ImportExcel8( void ); + + virtual FltError Read( void ); + +protected: + ExcScenarioList aScenList; + + void Calccount( void ); // 0x0C + void Precision( void ); // 0x0E + void Delta( void ); // 0x10 + void Iteration( void ); // 0x11 + void Boundsheet( void ); // 0x85 + void FilterMode( void ); // 0x9B + void AutoFilterInfo( void ); // 0x9D + void AutoFilter( void ); // 0x9E + void Scenman( void ); // 0xAE + void Scenario( void ); // 0xAF + void ReadBasic( void ); // 0xD3 + void Labelsst( void ); // 0xFD + + void Hlink( void ); // 0x01B8 + void Codename( BOOL bWBGlobals ); // 0x01BA + void SheetProtection( void ); // 0x0867 + + virtual void EndSheet( void ); + virtual void PostDocLoad( void ); + +private: + void LoadDocumentProperties(); + void AttachDocumentEvents(); +}; + + + +//___________________________________________________________________ +// classes AutoFilterData, AutoFilterBuffer + +class XclImpAutoFilterData : private ExcRoot +{ +private: + ScDBData* pCurrDBData; + ScQueryParam aParam; + SCSIZE nFirstEmpty; + BOOL bActive; + BOOL bHasConflict; + BOOL bCriteria; + BOOL bAutoOrAdvanced; + ScRange aCriteriaRange; + String aFilterName; + + void CreateFromDouble( String& rStr, double fVal ); + void SetCellAttribs(); + void InsertQueryParam(); + void AmendAFName(const BOOL bUseUnNamed); + +protected: +public: + XclImpAutoFilterData( + RootData* pRoot, + const ScRange& rRange, + const String& rName ); + + inline bool IsActive() const { return bActive; } + inline bool IsFiltered() const { return bAutoOrAdvanced; } + inline SCTAB Tab() const { return aParam.nTab; } + inline SCCOL StartCol() const { return aParam.nCol1; } + inline SCROW StartRow() const { return aParam.nRow1; } + inline SCCOL EndCol() const { return aParam.nCol2; } + inline SCROW EndRow() const { return aParam.nRow2; } + + void ReadAutoFilter( XclImpStream& rStrm ); + + inline void Activate() { bActive = TRUE; } + void SetAdvancedRange( const ScRange* pRange ); + void SetExtractPos( const ScAddress& rAddr ); + inline void SetAutoOrAdvanced() { bAutoOrAdvanced = TRUE; } + void Apply( const BOOL bUseUnNamed = FALSE ); + void CreateScDBData( const BOOL bUseUnNamed ); + void EnableRemoveFilter(); +}; + + +class XclImpAutoFilterBuffer : private List +{ +private: + using List::Insert; + + UINT16 nAFActiveCount; + + inline XclImpAutoFilterData* _First() { return (XclImpAutoFilterData*) List::First(); } + inline XclImpAutoFilterData* _Next() { return (XclImpAutoFilterData*) List::Next(); } + + inline void Append( XclImpAutoFilterData* pData ) + { List::Insert( pData, LIST_APPEND ); } +protected: +public: + XclImpAutoFilterBuffer(); + virtual ~XclImpAutoFilterBuffer(); + + void Insert( RootData* pRoot, const ScRange& rRange, + const String& rName ); + void AddAdvancedRange( const ScRange& rRange ); + void AddExtractPos( const ScRange& rRange ); + void Apply(); + + XclImpAutoFilterData* GetByTab( SCTAB nTab ); + inline void IncrementActiveAF() { nAFActiveCount++; } + inline BOOL UseUnNamed() { return nAFActiveCount == 1; } +}; + +#endif + diff --git a/sc/source/filter/inc/excrecds.hxx b/sc/source/filter/inc/excrecds.hxx new file mode 100644 index 000000000000..bc960f05b3a5 --- /dev/null +++ b/sc/source/filter/inc/excrecds.hxx @@ -0,0 +1,506 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_EXCRECDS_HXX +#define SC_EXCRECDS_HXX + +#include <tools/solar.h> +#include <svl/zforlist.hxx> +#include <tools/string.hxx> +#include <vcl/vclenum.hxx> +#include <tools/color.hxx> + + +#include <vector> +#include "olinetab.hxx" +#include "filter.hxx" +#include "rangelst.hxx" +#include "xerecord.hxx" +#include "xeroot.hxx" +#include "xeformula.hxx" +#include "xestring.hxx" +#include "root.hxx" +#include "excdefs.hxx" +#include "cell.hxx" + +//------------------------------------------------------------------ Forwards - + +class SvxBorderLine; + +class SvStream; +class Font; +class List; +class ScPatternAttr; +class ScTokenArray; +class ScRangeData; +class ScDBData; +class ScEditCell; +class SfxItemSet; +class EditTextObject; +class ScPageHFItem; +class ScProgress; + +class ExcTable; + +//----------------------------------------------------------- class ExcRecord - + +class ExcRecord : public XclExpRecord +{ +public: + virtual void Save( XclExpStream& rStrm ); + + virtual UINT16 GetNum() const = 0; + virtual sal_Size GetLen() const = 0; + +protected: + virtual void SaveCont( XclExpStream& rStrm ); + +private: + /** Writes the body of the record. */ + virtual void WriteBody( XclExpStream& rStrm ); +}; + + +//--------------------------------------------------------- class ExcEmptyRec - + +class ExcEmptyRec : public ExcRecord +{ +private: +protected: +public: + virtual void Save( XclExpStream& rStrm ); + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + + +//------------------------------------------------------- class ExcRecordList - + +class ExcRecordList : protected List, public ExcEmptyRec +{ +private: +protected: +public: + virtual ~ExcRecordList(); + + using List::Count; + + inline ExcRecord* First( void ) { return ( ExcRecord* ) List::First(); } + inline ExcRecord* Next( void ) { return ( ExcRecord* ) List::Next(); } + + inline void Append( ExcRecord* pNew ) { if( pNew ) List::Insert( pNew, LIST_APPEND ); } + inline const ExcRecord* Get( UINT32 nNum ) const { return ( ExcRecord* ) List::GetObject( nNum ); } + + virtual void Save( XclExpStream& rStrm ); +}; + + +//--------------------------------------------------------- class ExcDummyRec - + +class ExcDummyRec : public ExcRecord +{ +protected: +public: + virtual void Save( XclExpStream& rStrm ); + virtual UINT16 GetNum() const; + virtual const BYTE* GetData() const = 0; // byte data must contain header and body +}; + + +//------------------------------------------------------- class ExcBoolRecord - +// stores BOOL as 16bit val ( 0x0000 | 0x0001 ) + +class ExcBoolRecord : public ExcRecord +{ +private: + virtual void SaveCont( XclExpStream& rStrm ); + +protected: + BOOL bVal; + + inline ExcBoolRecord() : bVal( FALSE ) {} + +public: + inline ExcBoolRecord( const BOOL bDefault ) : bVal( bDefault ) {} + + virtual sal_Size GetLen( void ) const; +}; + + +//--------------------------------------------------------- class ExcBof_Base - + +class ExcBof_Base : public ExcRecord +{ +private: +protected: + UINT16 nDocType; + UINT16 nVers; + UINT16 nRupBuild; + UINT16 nRupYear; +public: + ExcBof_Base( void ); +}; + + +//-------------------------------------------------------------- class ExcBof - +// Header Record fuer WORKSHEETS + +class ExcBof : public ExcBof_Base +{ +private: + virtual void SaveCont( XclExpStream& rStrm ); +public: + ExcBof( void ); + + virtual UINT16 GetNum( void ) const; + virtual sal_Size GetLen( void ) const; +}; + + +//------------------------------------------------------------- class ExcBofW - +// Header Record fuer WORKBOOKS + +class ExcBofW : public ExcBof_Base +{ +private: + virtual void SaveCont( XclExpStream& rStrm ); +public: + ExcBofW( void ); + + virtual UINT16 GetNum( void ) const; + virtual sal_Size GetLen( void ) const; +}; + + +//-------------------------------------------------------------- class ExcEof - + +class ExcEof : public ExcRecord +{ +private: +public: + virtual UINT16 GetNum( void ) const; + virtual sal_Size GetLen( void ) const; +}; + + +//--------------------------------------------------------- class ExcDummy_00 - +// INTERFACEHDR to FNGROUPCOUNT (see excrecds.cxx) + +class ExcDummy_00 : public ExcDummyRec +{ +private: + static const BYTE pMyData[]; + static const sal_Size nMyLen; +public: + virtual sal_Size GetLen( void ) const; + virtual const BYTE* GetData( void ) const; +}; + +// EXC_ID_WINDOWPROTECTION +class XclExpWindowProtection : public XclExpBoolRecord +{ + public: + XclExpWindowProtection(bool bValue); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + +// EXC_ID_PROTECT Document Protection +class XclExpProtection : public XclExpBoolRecord +{ + public: + XclExpProtection(bool bValue); +}; + +class XclExpPassHash : public XclExpRecord +{ +public: + XclExpPassHash(const ::com::sun::star::uno::Sequence<sal_Int8>& aHash); + virtual ~XclExpPassHash(); + +private: + virtual void WriteBody(XclExpStream& rStrm); + +private: + sal_uInt16 mnHash; +}; + + +//-------------------------------------------------------- class ExcDummy_04x - +// PASSWORD to BOOKBOOL (see excrecds.cxx), no 1904 + +class ExcDummy_040 : public ExcDummyRec +{ +private: + static const BYTE pMyData[]; + static const sal_Size nMyLen; +public: + virtual sal_Size GetLen( void ) const; + virtual const BYTE* GetData( void ) const; +}; + + + +class ExcDummy_041 : public ExcDummyRec +{ +private: + static const BYTE pMyData[]; + static const sal_Size nMyLen; +public: + virtual sal_Size GetLen( void ) const; + virtual const BYTE* GetData( void ) const; +}; + + +//------------------------------------------------------------- class Exc1904 - + +class Exc1904 : public ExcBoolRecord +{ +public: + Exc1904( ScDocument& rDoc ); + virtual UINT16 GetNum( void ) const; + + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + + +//------------------------------------------------------ class ExcBundlesheet - + +class ExcBundlesheetBase : public ExcRecord +{ +protected: + sal_Size nStrPos; + sal_Size nOwnPos; // Position NACH # und Len + UINT16 nGrbit; + SCTAB nTab; + + ExcBundlesheetBase(); + +public: + ExcBundlesheetBase( RootData& rRootData, SCTAB nTab ); + + inline void SetStreamPos( sal_Size nNewStrPos ) { nStrPos = nNewStrPos; } + void UpdateStreamPos( XclExpStream& rStrm ); + + virtual UINT16 GetNum() const; +}; + + + +class ExcBundlesheet : public ExcBundlesheetBase +{ +private: + ByteString aName; + + virtual void SaveCont( XclExpStream& rStrm ); + +public: + ExcBundlesheet( RootData& rRootData, SCTAB nTab ); + virtual sal_Size GetLen() const; +}; + +//--------------------------------------------------------- class ExcDummy_02 - +// sheet dummies: CALCMODE to SETUP + +class ExcDummy_02a : public ExcDummyRec +{ +private: + static const BYTE pMyData[]; + static const sal_Size nMyLen; +public: + virtual sal_Size GetLen( void ) const; + virtual const BYTE* GetData( void ) const; +}; + + +// ---------------------------------------------------------------------------- + +/** This record contains the Windows country IDs for the UI and document language. */ +class XclExpCountry : public XclExpRecord +{ +public: + explicit XclExpCountry( const XclExpRoot& rRoot ); + +private: + sal_uInt16 mnUICountry; /// The UI country ID. + sal_uInt16 mnDocCountry; /// The document country ID. + + /** Writes the body of the COUNTRY record. */ + virtual void WriteBody( XclExpStream& rStrm ); +}; + + +// XclExpWsbool =============================================================== + +class XclExpWsbool : public XclExpUInt16Record +{ +public: + explicit XclExpWsbool( bool bFitToPages, SCTAB nScTab = -1, XclExpFilterManager* pManager = NULL ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + SCTAB mnScTab; + XclExpFilterManager* mpManager; +}; + + +// ============================================================================ + +class XclExpFiltermode : public XclExpEmptyRecord +{ +public: + explicit XclExpFiltermode(); +}; + +// ---------------------------------------------------------------------------- + +class XclExpAutofilterinfo : public XclExpUInt16Record +{ +public: + explicit XclExpAutofilterinfo( const ScAddress& rStartPos, SCCOL nScCol ); + + inline const ScAddress GetStartPos() const { return maStartPos; } + inline SCCOL GetColCount() const { return static_cast< SCCOL >( GetValue() ); } + +private: + ScAddress maStartPos; +}; + +// ---------------------------------------------------------------------------- + +class ExcFilterCondition +{ +private: + UINT8 nType; + UINT8 nOper; + double fVal; + XclExpString* pText; + +protected: +public: + ExcFilterCondition(); + ~ExcFilterCondition(); + + inline BOOL IsEmpty() const { return (nType == EXC_AFTYPE_NOTUSED); } + inline BOOL HasEqual() const { return (nOper == EXC_AFOPER_EQUAL); } + ULONG GetTextBytes() const; + + void SetCondition( UINT8 nTp, UINT8 nOp, double fV, String* pT ); + + void Save( XclExpStream& rStrm ); + void SaveXml( XclExpXmlStream& rStrm ); + void SaveText( XclExpStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +class XclExpAutofilter : public XclExpRecord, protected XclExpRoot +{ +private: + UINT16 nCol; + UINT16 nFlags; + ExcFilterCondition aCond[ 2 ]; + + BOOL AddCondition( ScQueryConnect eConn, UINT8 nType, + UINT8 nOp, double fVal, String* pText, + BOOL bSimple = FALSE ); + + virtual void WriteBody( XclExpStream& rStrm ); + +protected: +public: + XclExpAutofilter( const XclExpRoot& rRoot, UINT16 nC ); + + inline UINT16 GetCol() const { return nCol; } + inline BOOL HasCondition() const { return !aCond[ 0 ].IsEmpty(); } + inline BOOL HasTop10() const { return ::get_flag( nFlags, EXC_AFFLAG_TOP10 ); } + + BOOL AddEntry( const ScQueryEntry& rEntry ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +class ExcAutoFilterRecs : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit ExcAutoFilterRecs( const XclExpRoot& rRoot, SCTAB nTab ); + virtual ~ExcAutoFilterRecs(); + + void AddObjRecs(); + + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + + bool HasFilterMode() const; + +private: + XclExpAutofilter* GetByCol( SCCOL nCol ); // always 0-based + BOOL IsFiltered( SCCOL nCol ); + +private: + typedef XclExpRecordList< XclExpAutofilter > XclExpAutofilterList; + typedef XclExpAutofilterList::RecordRefType XclExpAutofilterRef; + + XclExpAutofilterList maFilterList; + XclExpFiltermode* pFilterMode; + XclExpAutofilterinfo* pFilterInfo; + ScRange maRef; +}; + +// ---------------------------------------------------------------------------- + +/** Sheet filter manager. Contains auto filters or advanced filters from all sheets. */ +class XclExpFilterManager : protected XclExpRoot +{ +public: + explicit XclExpFilterManager( const XclExpRoot& rRoot ); + + /** Creates the filter records for the specified sheet. + @descr Creates and inserts related built-in NAME records. Therefore this + function is called from the name buffer itself. */ + void InitTabFilter( SCTAB nScTab ); + + /** Returns a record object containing all filter records for the specified sheet. */ + XclExpRecordRef CreateRecord( SCTAB nScTab ); + + /** Returns whether or not FilterMode is present */ + bool HasFilterMode( SCTAB nScTab ); + +private: + using XclExpRoot::CreateRecord; + + typedef ScfRef< ExcAutoFilterRecs > XclExpTabFilterRef; + typedef ::std::map< SCTAB, XclExpTabFilterRef > XclExpTabFilterMap; + + XclExpTabFilterMap maFilterMap; +}; + + +#endif + diff --git a/sc/source/filter/inc/excscen.hxx b/sc/source/filter/inc/excscen.hxx new file mode 100644 index 000000000000..125f74e9fa54 --- /dev/null +++ b/sc/source/filter/inc/excscen.hxx @@ -0,0 +1,147 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_EXCSCEN_HXX +#define SC_EXCSCEN_HXX + +#include <tools/solar.h> +#include <tools/list.hxx> +#include <tools/string.hxx> + + +struct RootData; +class XclImpRoot; +class XclImpStream; +class ScDocument; + + + +class ExcScenarioCell +{ +private: + String aValue; +public: + const UINT16 nCol; + const UINT16 nRow; + + ExcScenarioCell( const UINT16 nC, const UINT16 nR ); + void SetValue( const String& rVal ); + inline const String& GetValue( void ) const; +}; + + + + +class ExcScenario : protected List +{ +private: + friend class ExcScenarioList; +protected: + String* pName; + String* pComment; + String* pUserName; + UINT8 nProtected; + + const UINT16 nTab; + + void Apply( const XclImpRoot& rRoot, const BOOL bLast = FALSE ); +public: + ExcScenario( XclImpStream& rIn, const RootData& rRoot ); + virtual ~ExcScenario(); +}; + + + + +class ExcScenarioList : protected List +{ +private: + UINT16 nLastScenario; + inline ExcScenario* _First( void ) { return ( ExcScenario* ) List::First(); } + inline ExcScenario* _Next( void ) { return ( ExcScenario* ) List::Next(); } + inline ExcScenario* _Last( void ) { return ( ExcScenario* ) List::Last(); } + inline ExcScenario* _Prev( void ) { return ( ExcScenario* ) List::Prev(); } +protected: +public: + ExcScenarioList( void ); + virtual ~ExcScenarioList(); + + inline void Append( ExcScenario* pNew ); + + inline void SetLast( const UINT16 nIndex4Last ); + + inline const ExcScenario* First( void ); + inline const ExcScenario* Next( void ); + + using List::Count; + + void Apply( const XclImpRoot& rRoot ); +}; + + + + +inline const String& ExcScenarioCell::GetValue( void ) const +{ + return aValue; +} + + + + +inline ExcScenarioList::ExcScenarioList( void ) +{ + nLastScenario = 0; +} + + +inline void ExcScenarioList::Append( ExcScenario* p ) +{ + List::Insert( p, LIST_APPEND ); +} + + +inline const ExcScenario* ExcScenarioList::First( void ) +{ + return ( const ExcScenario* ) List::First(); +} + + +inline const ExcScenario* ExcScenarioList::Next( void ) +{ + return ( const ExcScenario* ) List::Next(); +} + + +inline void ExcScenarioList::SetLast( const UINT16 n ) +{ + nLastScenario = n; +} + + +#endif + diff --git a/sc/source/filter/inc/exp_op.hxx b/sc/source/filter/inc/exp_op.hxx new file mode 100644 index 000000000000..79fff8675d84 --- /dev/null +++ b/sc/source/filter/inc/exp_op.hxx @@ -0,0 +1,147 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_EXP_OP_HXX +#define SC_EXP_OP_HXX + +#include "filter.hxx" +#include "root.hxx" +#include "xeroot.hxx" + + +class ScDocument; +class ScPatternAttr; +class ScFormulaCell; +class ExcDocument; +class SotStorage; + + +class ExportTyp +{ +protected: + SvStream& aOut; // Ausgabe-Stream + ScDocument* pD; // Dokument + CharSet eZielChar; // Ziel-Zeichensatz +public: + ExportTyp( SvStream& aStream, ScDocument* pDoc, CharSet eDest ): + aOut( aStream ) + { + eZielChar = eDest; + pD = pDoc; + } + + virtual FltError Write() = 0; +}; + + + +#if ENABLE_LOTUS123_EXPORT +class ExportWK1 : public ExportTyp +{ +private: + BYTE GenFormByte( const ScPatternAttr& ); + void Bof(); + void Eof(); + void Calcmode(); + void Calcorder(); + void Split(); + void Sync(); + void Dimensions(); + void Window1(); + void Colw(); + void Blank( const UINT16 nC, const UINT16 nR, const ScPatternAttr& ); + void Number( const UINT16 nC, const UINT16 nR, const double f, const ScPatternAttr& ); + void Label( const UINT16 nC, const UINT16 nR, const String&, const ScPatternAttr& ); + void Formula( const UINT16 nC, const UINT16 nR, const ScFormulaCell*, const ScPatternAttr& ); + void Protect(); + void Footer(); + void Header(); + void Margins(); + void Labelfmt(); + void Calccount(); + void Cursorw12(); + void WKString( const UINT16 nC, const UINT16 nR, const ScFormulaCell*, const ScPatternAttr& ); + void Snrange(); + void Hidcol(); + void Cpi(); +public: + + static const USHORT WK1MAXCOL; + static const USHORT WK1MAXROW; + + inline ExportWK1( SvStream& r, ScDocument* p, CharSet e ) : + ExportTyp( r, p, e ) {}; + + FltError Write(); +}; +#endif + + + +class ExportBiff5 : public ExportTyp, protected XclExpRoot +{ +private: + ExcDocument* pExcDoc; + +protected: + RootData* pExcRoot; + +public: + ExportBiff5( XclExpRootData& rExpData, SvStream& rStrm ); + virtual ~ExportBiff5(); + FltError Write(); +}; + + + + +class ExportBiff8 : public ExportBiff5 +{ +public: + ExportBiff8( XclExpRootData& rExpData, SvStream& rStrm ); + virtual ~ExportBiff8(); +}; + + +class ExportXml2007 : public ExportTyp, protected XclExpRoot +{ +private: + ExcDocument* pExcDoc; + +protected: + RootData* pExcRoot; + +public: + ExportXml2007( XclExpRootData& rExpData, SvStream& rStrm ); + virtual ~ExportXml2007(); + FltError Write(); +}; + + +#endif + + diff --git a/sc/source/filter/inc/expbase.hxx b/sc/source/filter/inc/expbase.hxx new file mode 100644 index 000000000000..3744bf497927 --- /dev/null +++ b/sc/source/filter/inc/expbase.hxx @@ -0,0 +1,82 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_EXPBASE_HXX +#define SC_EXPBASE_HXX + +#include <tools/solar.h> +#include "global.hxx" +#include "address.hxx" + + +class SvStream; +class ScFieldEditEngine; + +class ScExportBase +{ +public: +#if defined UNX + static const sal_Char __FAR_DATA sNewLine; +#else + static const sal_Char __FAR_DATA sNewLine[]; +#endif + +protected: + + SvStream& rStrm; + ScRange aRange; + ScDocument* pDoc; + SvNumberFormatter* pFormatter; + ScFieldEditEngine* pEditEngine; + +public: + + ScExportBase( SvStream&, ScDocument*, const ScRange& ); + virtual ~ScExportBase(); + + // Hidden Cols/Rows an den Raendern trimmen, + // return: TRUE wenn Bereich vorhanden + // Start/End/Col/Row muessen gueltige Ausgangswerte sein + BOOL TrimDataArea( SCTAB nTab, SCCOL& nStartCol, + SCROW& nStartRow, SCCOL& nEndCol, SCROW& nEndRow ) const; + + // Ausgabebereich einer Tabelle ermitteln, + // Hidden Cols/Rows an den Raendern beruecksichtigt, + // return: TRUE wenn Bereich vorhanden + BOOL GetDataArea( SCTAB nTab, SCCOL& nStartCol, + SCROW& nStartRow, SCCOL& nEndCol, SCROW& nEndRow ) const; + + // Tabelle nicht vorhanden oder leer + BOOL IsEmptyTable( SCTAB nTab ) const; + + ScFieldEditEngine& GetEditEngine() const; + +}; + + +#endif // SC_EXPBASE_HXX + diff --git a/sc/source/filter/inc/fapihelper.hxx b/sc/source/filter/inc/fapihelper.hxx new file mode 100644 index 000000000000..8c204f1cef35 --- /dev/null +++ b/sc/source/filter/inc/fapihelper.hxx @@ -0,0 +1,352 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_FAPIHELPER_HXX +#define SC_FAPIHELPER_HXX + +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/XMultiPropertySet.hpp> +#include <tools/color.hxx> +#include <comphelper/types.hxx> +#include "ftools.hxx" +#include "scdllapi.h" + +namespace com { namespace sun { namespace star { + namespace lang { class XMultiServiceFactory; } +} } } + +namespace comphelper { class IDocPasswordVerifier; } + +// Static helper functions ==================================================== + +class SfxMedium; +class SfxObjectShell; + +/** Static API helper functions. */ +class ScfApiHelper +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > XInterfaceRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > XServiceFactoryRef; + typedef ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > UnoAnySequence; + +public: + /** Converts a tools color to a UNO color value. */ + inline static sal_Int32 ConvertToApiColor( const Color& rColor ) + { return static_cast< sal_Int32 >( rColor.GetColor() ); } + /** Converts a UNO color value to a tools color. */ + inline static Color ConvertFromApiColor( sal_Int32 nApiColor ) + { return Color( static_cast< ColorData >( nApiColor ) ); } + + /** Converts a non-empty vector into a UNO sequence containing elements of the same type. */ + template< typename Type > + static ::com::sun::star::uno::Sequence< Type > + VectorToSequence( const ::std::vector< Type >& rVector ); + + /** Returns the service name provided via the XServiceName interface, or an empty string on error. */ + static ::rtl::OUString GetServiceName( XInterfaceRef xInt ); + + /** Returns the multi service factory from a document shell. */ + static XServiceFactoryRef GetServiceFactory( SfxObjectShell* pShell ); + + /** Creates an instance from the passed service name, using the passed service factory. */ + static XInterfaceRef CreateInstance( + XServiceFactoryRef xFactory, + const ::rtl::OUString& rServiceName ); + + /** Creates an instance from the passed service name, using the service factory of the passed object. */ + static XInterfaceRef CreateInstance( + SfxObjectShell* pShell, + const ::rtl::OUString& rServiceName ); + + /** Creates an instance from the passed service name, using the process service factory. */ + static XInterfaceRef CreateInstance( const ::rtl::OUString& rServiceName ); + + /** Creates an instance from the passed service name, using the passed service factory. */ + static XInterfaceRef CreateInstanceWithArgs( + XServiceFactoryRef xFactory, + const ::rtl::OUString& rServiceName, + const UnoAnySequence& rArgs ); + +//UNUSED2008-05 /** Creates an instance from the passed service name, using the service factory of the passed object. */ +//UNUSED2008-05 static XInterfaceRef CreateInstanceWithArgs( +//UNUSED2008-05 SfxObjectShell* pShell, +//UNUSED2008-05 const ::rtl::OUString& rServiceName, +//UNUSED2008-05 const UnoAnySequence& rArgs ); + + /** Creates an instance from the passed service name, using the process service factory. */ + static XInterfaceRef CreateInstanceWithArgs( + const ::rtl::OUString& rServiceName, + const UnoAnySequence& rArgs ); + + /** Opens a password dialog and returns the entered password. + @return The entered password or an empty string on 'Cancel' or any error. */ + static String QueryPasswordForMedium( SfxMedium& rMedium, + ::comphelper::IDocPasswordVerifier& rVerifier, + const ::std::vector< ::rtl::OUString >* pDefaultPasswords = 0 ); +}; + +template< typename Type > +::com::sun::star::uno::Sequence< Type > ScfApiHelper::VectorToSequence( const ::std::vector< Type >& rVector ) +{ + DBG_ASSERT( !rVector.empty(), "ScfApiHelper::VectorToSequence - vector is empty" ); + return ::com::sun::star::uno::Sequence< Type >( &rVector.front(), static_cast< sal_Int32 >( rVector.size() ) ); +} + +// Property sets ============================================================== + +/** A wrapper for a UNO property set. + + This class provides functions to silently get and set properties (without + exceptions, without the need to check validity of the UNO property set). + + An instance is constructed with the reference to a UNO property set or any + other interface (the constructor will query for the XPropertySet interface + then). The reference to the property set will be kept as long as the + instance of this class is alive. + + The functions GetProperties() and SetProperties() try to handle all passed + values at once, using the XMultiPropertySet interface. If the + implementation does not support the XMultiPropertySet interface, all + properties are handled separately in a loop. + */ +class ScfPropertySet +{ +public: + typedef ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XPropertySet > XPropertySetRef; + typedef ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XMultiPropertySet > XMultiPropSetRef; + typedef ::com::sun::star::uno::Any UnoAny; + typedef ::com::sun::star::uno::Sequence< UnoAny > UnoAnySequence; + typedef ::com::sun::star::uno::Sequence< ::rtl::OUString > OUStringSequence; + +public: + inline explicit ScfPropertySet() {} + /** Constructs a property set wrapper with the passed UNO property set. */ + inline explicit ScfPropertySet( XPropertySetRef xPropSet ) { Set( xPropSet ); } + /** Constructs a property set wrapper after querying the XPropertySet interface. */ + template< typename InterfaceType > + inline explicit ScfPropertySet( ::com::sun::star::uno::Reference< InterfaceType > xInterface ) { Set( xInterface ); } + + /** Sets the passed UNO property set and releases the old UNO property set. */ + void Set( XPropertySetRef xPropSet ); + /** Queries the passed interface for an XPropertySet and releases the old UNO property set. */ + template< typename InterfaceType > + inline void Set( ::com::sun::star::uno::Reference< InterfaceType > xInterface ) + { Set( XPropertySetRef( xInterface, ::com::sun::star::uno::UNO_QUERY ) ); } + + /** Returns true, if the contained XPropertySet interface is valid. */ + inline bool Is() const { return mxPropSet.is(); } + + /** Returns the contained XPropertySet interface. */ + inline XPropertySetRef GetApiPropertySet() const { return mxPropSet; } + + /** Returns the service name provided via the XServiceName interface, or an empty string on error. */ + ::rtl::OUString GetServiceName() const; + + // Get properties --------------------------------------------------------- + + /** Returns true, if the property set contains the specified property. */ + bool HasProperty( const ::rtl::OUString& rPropName ) const; + + /** Gets the specified property from the property set. + @return true, if the Any could be filled with the property value. */ + bool GetAnyProperty( UnoAny& rValue, const ::rtl::OUString& rPropName ) const; + + /** Gets the specified property from the property set. + @return true, if the passed variable could be filled with the property value. */ + template< typename Type > + inline bool GetProperty( Type& rValue, const ::rtl::OUString& rPropName ) const + { UnoAny aAny; return GetAnyProperty( aAny, rPropName ) && (aAny >>= rValue); } + + /** Gets the specified Boolean property from the property set. + @return true = property contains true; false = property contains false or error occured. */ + bool GetBoolProperty( const ::rtl::OUString& rPropName ) const; + + /** Gets the specified Boolean property from the property set. + @return true, if the passed Boolean variable could be filled with the property value. */ + bool GetStringProperty( String& rValue, const ::rtl::OUString& rPropName ) const; + + /** Gets the specified color property from the property set. + @return true, if the passed color variable could be filled with the property value. */ + bool GetColorProperty( Color& rColor, const ::rtl::OUString& rPropName ) const; + + /** Gets the specified properties from the property set. Tries to use the XMultiPropertySet interface. + @param rPropNames The property names. MUST be ordered alphabetically. + @param rValues The related property values. */ + void GetProperties( UnoAnySequence& rValues, const OUStringSequence& rPropNames ) const; + + // Set properties --------------------------------------------------------- + + /** Puts the passed Any into the property set. */ + void SetAnyProperty( const ::rtl::OUString& rPropName, const UnoAny& rValue ); + + /** Puts the passed value into the property set. */ + template< typename Type > + inline void SetProperty( const ::rtl::OUString& rPropName, const Type& rValue ) + { SetAnyProperty( rPropName, ::com::sun::star::uno::makeAny( rValue ) ); } + + /** Puts the passed Boolean value into the property set. */ + inline void SetBoolProperty( const ::rtl::OUString& rPropName, bool bValue ) + { SetAnyProperty( rPropName, ::comphelper::makeBoolAny( bValue ) ); } + + /** Puts the passed string into the property set. */ + inline void SetStringProperty( const ::rtl::OUString& rPropName, const String& rValue ) + { SetProperty( rPropName, ::rtl::OUString( rValue ) ); } + + /** Puts the passed color into the property set. */ + inline void SetColorProperty( const ::rtl::OUString& rPropName, const Color& rColor ) + { SetProperty( rPropName, ScfApiHelper::ConvertToApiColor( rColor ) ); } + + /** Puts the passed properties into the property set. Tries to use the XMultiPropertySet interface. + @param rPropNames The property names. MUST be ordered alphabetically. + @param rValues The related property values. */ + void SetProperties( const OUStringSequence& rPropNames, const UnoAnySequence& rValues ); + + // ------------------------------------------------------------------------ +private: + XPropertySetRef mxPropSet; /// The mandatory property set interface. + XMultiPropSetRef mxMultiPropSet; /// The optional multi property set interface. +}; + +// ---------------------------------------------------------------------------- + +/** Generic helper class for reading from and writing to property sets. + + Usage: + 1) Call the constructor with a null-terminated array of ASCII strings. + 2a) Read properties from a property set: Call the ReadFromPropertySet() + function, then get the properties with the ReadValue() functions or the + operator>> stream operator. The properties are returned in order of the + array of property names passed in the constructor. + 2b) Write properties to a property set: Call InitializeWrite() to start a + new cycle. Set the values with the WriteValue() functions or the + operator<< stream operator. The order of the properties is equal to the + array of property names passed in the constructor. Finally, call the + WriteToPropertySet() function. + */ +class ScfPropSetHelper +{ +public: + typedef ::com::sun::star::uno::Any UnoAny; + +public: + /** @param ppPropNames A null-terminated array of ASCII property names. */ + explicit ScfPropSetHelper( const sal_Char* const* ppcPropNames ); + + // read properties -------------------------------------------------------- + + /** Reads all values from the passed property set. */ + void ReadFromPropertySet( const ScfPropertySet& rPropSet ); + + /** Reads the next value from the value sequence. */ + template< typename Type > + bool ReadValue( Type& rValue ); + /** Reads an Any from the value sequence. */ + bool ReadValue( UnoAny& rAny ); + /** Reads a tools string from the value sequence. */ + bool ReadValue( String& rString ); + /** Reads a color value from the value sequence. */ + bool ReadValue( Color& rColor ); + /** Reads a C++ boolean value from the value sequence. */ + bool ReadValue( bool& rbValue ); + + // write properties ------------------------------------------------------- + + /** Must be called before reading or storing property values in the helper. */ + void InitializeWrite( bool bClearAllAnys = false ); + + /** Writes the next value to the value sequence. */ + template< typename Type > + void WriteValue( const Type& rValue ); + /** Writes an Any to the value sequence. */ + void WriteValue( const UnoAny& rAny ); + /** Writes a tools string to the value sequence. */ + inline void WriteValue( const String& rString ) + { WriteValue( ::rtl::OUString( rString ) ); } + /** Writes a color value to the value sequence. */ + inline void WriteValue( const Color& rColor ) + { WriteValue( ScfApiHelper::ConvertToApiColor( rColor ) ); } + /** Writes a C++ boolean value to the value sequence. */ + void WriteValue( const bool& rbValue ); + + /** Writes all values to the passed property set. */ + void WriteToPropertySet( ScfPropertySet& rPropSet ) const; + + // ------------------------------------------------------------------------ +private: + /** Returns a pointer to the next Any to be written to. */ + UnoAny* GetNextAny(); + +private: + typedef ::com::sun::star::uno::Sequence< ::rtl::OUString > OUStringSequence; + typedef ::com::sun::star::uno::Sequence< UnoAny > UnoAnySequence; + + OUStringSequence maNameSeq; /// Sequence of property names. + UnoAnySequence maValueSeq; /// Sequence of property values. + ScfInt32Vec maNameOrder; /// Maps initial order to alphabetical order. + size_t mnNextIdx; /// Counter for next Any to be processed. +}; + +// ---------------------------------------------------------------------------- + +template< typename Type > +bool ScfPropSetHelper::ReadValue( Type& rValue ) +{ + UnoAny* pAny = GetNextAny(); + return pAny && (*pAny >>= rValue); +} + +template< typename Type > +void ScfPropSetHelper::WriteValue( const Type& rValue ) +{ + if( UnoAny* pAny = GetNextAny() ) + *pAny <<= rValue; +} + +template< typename Type > +ScfPropSetHelper& operator>>( ScfPropSetHelper& rPropSetHelper, Type& rValue ) +{ + rPropSetHelper.ReadValue( rValue ); + return rPropSetHelper; +} + +template< typename Type > +ScfPropSetHelper& operator<<( ScfPropSetHelper& rPropSetHelper, const Type& rValue ) +{ + rPropSetHelper.WriteValue( rValue ); + return rPropSetHelper; +} + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/filt_pch.hxx b/sc/source/filter/inc/filt_pch.hxx new file mode 100644 index 000000000000..7ab2aadf1511 --- /dev/null +++ b/sc/source/filter/inc/filt_pch.hxx @@ -0,0 +1,321 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// ItemID-Defines etc. muessen immer ganz vorne stehen + +#include "scitems.hxx" + + +#define _ZFORLIST_DECLARE_TABLE + +#define SC_PROGRESS_CXX + +// ab hier automatisch per makepch generiert +// folgende duerfen nicht aufgenommen werden: +// ... + +#include <tools/solar.h> +#include <tools/string.hxx> +#include <rtl/textenc.h> +#include <sal/types.h> +#include <sal/config.h> +#include <rtl/textcvt.h> +#include <rtl/string.hxx> +#include <rtl/string.h> +#include <rtl/ustring.h> +#include <rtl/memory.h> +#include <rtl/ustring.hxx> +#include <rtl/locale.hxx> +#include <rtl/locale.h> +#include <tools/contnr.hxx> +#include <i18npool/lang.h> +#include <tools/list.hxx> +#include <global.hxx> +#include <tools/stream.hxx> +#include <tools/errinf.hxx> +#include <tools/rtti.hxx> +#include <tools/errcode.hxx> +#include <tools/ref.hxx> +#include <tools/link.hxx> +#include <tools/debug.hxx> +#include <tools/time.hxx> +#include <tools/date.hxx> +#include <svl/svarray.hxx> +#include <vcl/sv.h> +#include <vcl/timer.hxx> +#include <tools/gen.hxx> +#include <tools/color.hxx> +#include <tools/color.hxx> +#include <filter.hxx> +#include <rangelst.hxx> +#include <osl/mutex.h> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/uno/Any.h> +#include <cppu/macros.hxx> +#include <uno/lbnames.h> +#include <uno/any2.h> +#include <uno/data.h> +#include <typelib/typedescription.h> +#include <typelib/uik.h> +#include <typelib/typeclass.h> +#include <com/sun/star/uno/Type.h> +#include <com/sun/star/uno/TypeClass.hdl> +#include <com/sun/star/uno/Type.hxx> +#include <osl/mutex.hxx> +#include <com/sun/star/uno/genfunc.hxx> +#include <com/sun/star/uno/genfunc.h> +#include <com/sun/star/uno/XInterface.hpp> +#include <com/sun/star/uno/XInterface.hdl> +#include <com/sun/star/uno/Reference.h> +#include <com/sun/star/uno/RuntimeException.hdl> +#include <com/sun/star/uno/Exception.hdl> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/RuntimeException.hpp> +#include <com/sun/star/uno/Exception.hpp> +#include <svl/hint.hxx> +#include <svl/poolitem.hxx> +#include <document.hxx> +#include <vcl/prntypes.hxx> +#include <table.hxx> +#include <column.hxx> +#include <markarr.hxx> +#include <root.hxx> +#include <flttypes.hxx> +#include <svl/solar.hrc> +#include <sfx2/sfxsids.hrc> +#include <svl/cntwids.hrc> +#include <sfx2/cntids.hrc> +#include <tools/mempool.hxx> +#include <compiler.hxx> +#include <formula/compiler.hrc> +#include <sfx2/sfx.hrc> +#include <scitems.hxx> +#include <svx/svxids.hrc> +#include <svl/itemset.hxx> +#include <svl/memberid.hrc> +#include <tools/table.hxx> +#include <flttools.hxx> +#include <vcl/vclenum.hxx> +#include <tools/resid.hxx> +#include <tools/rc.hxx> +#include <tools/resmgr.hxx> +#include <tools/fract.hxx> +#include <vcl/bitmap.hxx> +#include <vcl/mapmod.hxx> +#include <vcl/mapunit.hxx> +#include <vcl/region.hxx> +#include <svl/lstner.hxx> +#include <patattr.hxx> +#include <vcl/font.hxx> +#include <svl/cenumitm.hxx> +#include <svl/eitem.hxx> +#include <svl/intitem.hxx> +#include <svl/cintitem.hxx> +#include <svl/brdcst.hxx> +#include <sot/sotref.hxx> +#include <tools/globname.hxx> +#include <sot/factory.hxx> +#include <sot/object.hxx> +#include <sot/sotdata.hxx> +#include <vcl/bitmapex.hxx> +#include <vcl/alpha.hxx> +#include <vcl/gdimtf.hxx> +#include <tools/unqidx.hxx> +#include <vcl/graph.hxx> +#include <vcl/animate.hxx> +#include <vcl/graph.h> +#include <vcl/gfxlink.hxx> +#include <rsc/rscsfx.hxx> +#include <vcl/wall.hxx> +#include <vcl/settings.hxx> +#include <vcl/accel.hxx> +#include <vcl/keycod.hxx> +#include <vcl/keycodes.hxx> +#include <namebuff.hxx> +#include <tools/shl.hxx> +#include <tools/pstm.hxx> +#include <editeng/fhgtitem.hxx> +#include <vos/types.hxx> +#include <vos/object.hxx> +#include <vos/macros.hxx> +#include <tools/unqid.hxx> +#include <com/sun/star/uno/Sequence.h> +#include <uno/sequence2.h> +#include <com/sun/star/uno/Sequence.hxx> +#include <attrib.hxx> +#include <svl/zforlist.hxx> +#include <editeng/fontitem.hxx> +#include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/lang/XEventListener.hdl> +#include <com/sun/star/lang/EventObject.hdl> +#include <com/sun/star/lang/EventObject.hpp> +#include <vcl/outdev.hxx> +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/beans/PropertyValue.hdl> +#include <com/sun/star/beans/PropertyState.hdl> +#include <com/sun/star/beans/PropertyState.hpp> +#include <collect.hxx> +#include <vcl/window.hxx> +#include <vcl/pointr.hxx> +#include <vcl/ptrstyle.hxx> +#include <vcl/wintypes.hxx> +#include <vcl/inputctx.hxx> +#include <vcl/event.hxx> +#include <tools/ownlist.hxx> +#include <vcl/cmdevt.hxx> +#include <vcl/vclenum.hxx> +#include <cell.hxx> +#include <osl/interlck.h> +#include <sfx2/sfxuno.hxx> +#include <colrowst.hxx> +#include <com/sun/star/util/URL.hpp> +#include <com/sun/star/util/URL.hdl> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hdl> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/lang/XSingleServiceFactory.hdl> +#include <com/sun/star/lang/XTypeProvider.hpp> +#include <com/sun/star/lang/XTypeProvider.hdl> +#include <cppuhelper/typeprovider.hxx> +#include <rtl/uuid.h> +#include <cppuhelper/queryinterface.hxx> +#include <cppuhelper/factory.hxx> +#include <uno/dispatcher.h> +#include <com/sun/star/registry/XRegistryKey.hpp> +#include <com/sun/star/registry/XRegistryKey.hdl> +#include <com/sun/star/registry/InvalidRegistryException.hdl> +#include <com/sun/star/registry/InvalidValueException.hdl> +#include <com/sun/star/registry/RegistryKeyType.hdl> +#include <com/sun/star/registry/RegistryValueType.hdl> +#include <com/sun/star/registry/InvalidRegistryException.hpp> +#include <com/sun/star/registry/InvalidValueException.hpp> +#include <com/sun/star/registry/RegistryKeyType.hpp> +#include <com/sun/star/registry/RegistryValueType.hpp> +#include <sot/storage.hxx> +#include <tools/datetime.hxx> +#include <osl/thread.h> +#include <imp_op.hxx> +#include <otlnbuff.hxx> +#include <tokstack.hxx> +#include <com/sun/star/container/NoSuchElementException.hdl> +#include <com/sun/star/container/NoSuchElementException.hpp> +#include <vcl/svapp.hxx> +#include <vos/thread.hxx> +#include <vos/runnable.hxx> +#include <vos/refernce.hxx> +#include <vcl/apptypes.hxx> +#include <editeng/editdata.hxx> +#include <editeng/editeng.hxx> +#include <com/sun/star/lang/WrappedTargetException.hdl> +#include <com/sun/star/lang/WrappedTargetException.hpp> +#include <sfx2/shell.hxx> +#include <tools/stack.hxx> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/lang/XComponent.hdl> +#include <editeng/svxenum.hxx> +#include <formel.hxx> +#include <com/sun/star/container/XElementAccess.hdl> +#include <com/sun/star/container/XElementAccess.hpp> +#include <svl/itempool.hxx> +#include <editeng/eeitem.hxx> +#include <rangenam.hxx> +#include <vcl/syswin.hxx> +#include <svl/smplhint.hxx> +#include <fontbuff.hxx> +#include <vcl/ctrl.hxx> +#include <vcl/field.hxx> +#include <vcl/spinfld.hxx> +#include <vcl/edit.hxx> +#include <vcl/menu.hxx> +#include <vcl/combobox.hxx> +#include <vcl/combobox.h> +#include <vcl/fldunit.hxx> +#include <com/sun/star/frame/XFrame.hpp> +#include <com/sun/star/frame/XFrame.hdl> +#include <com/sun/star/awt/XWindow.hpp> +#include <com/sun/star/awt/XWindow.hdl> +#include <com/sun/star/awt/Rectangle.hdl> +#include <com/sun/star/awt/Rectangle.hpp> +#include <com/sun/star/awt/XFocusListener.hpp> +#include <com/sun/star/awt/XFocusListener.hdl> +#include <com/sun/star/awt/FocusEvent.hdl> +#include <com/sun/star/awt/FocusEvent.hpp> +#include <com/sun/star/awt/XKeyListener.hpp> +#include <com/sun/star/awt/XKeyListener.hdl> +#include <com/sun/star/awt/KeyEvent.hdl> +#include <com/sun/star/awt/InputEvent.hdl> +#include <com/sun/star/awt/KeyEvent.hpp> +#include <com/sun/star/awt/InputEvent.hpp> +#include <com/sun/star/awt/XMouseListener.hpp> +#include <com/sun/star/awt/XMouseListener.hdl> +#include <com/sun/star/awt/MouseEvent.hdl> +#include <com/sun/star/awt/MouseEvent.hpp> +#include <com/sun/star/awt/XMouseMotionListener.hpp> +#include <com/sun/star/awt/XMouseMotionListener.hdl> +#include <com/sun/star/awt/XPaintListener.hpp> +#include <com/sun/star/awt/XPaintListener.hdl> +#include <com/sun/star/awt/PaintEvent.hdl> +#include <com/sun/star/awt/PaintEvent.hpp> +#include <com/sun/star/awt/XWindowListener.hpp> +#include <com/sun/star/awt/XWindowListener.hdl> +#include <com/sun/star/awt/WindowEvent.hdl> +#include <com/sun/star/awt/WindowEvent.hpp> +#include <com/sun/star/frame/XController.hpp> +#include <com/sun/star/frame/XController.hdl> +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/frame/XModel.hdl> +#include <com/sun/star/lang/IndexOutOfBoundsException.hdl> +#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> +#include <com/sun/star/container/XIndexAccess.hdl> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <excrecds.hxx> +#include <scerrors.hxx> +#include <docpool.hxx> +#include <svx/msdffimp.hxx> +#include <com/sun/star/lang/IllegalArgumentException.hdl> +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <tools/urlobj.hxx> +#include <editeng/colritem.hxx> +#include <vcl/wrkwin.hxx> +#include <excimp8.hxx> +#include <excscen.hxx> +#include <com/sun/star/frame/XFrameActionListener.hpp> +#include <com/sun/star/frame/XFrameActionListener.hdl> +#include <com/sun/star/frame/FrameActionEvent.hdl> +#include <com/sun/star/frame/FrameAction.hdl> +#include <com/sun/star/frame/FrameActionEvent.hpp> +#include <com/sun/star/frame/FrameAction.hpp> +#include <com/sun/star/frame/XFramesSupplier.hpp> +#include <com/sun/star/frame/XFramesSupplier.hdl> +#include <com/sun/star/frame/XFrames.hpp> +#include <com/sun/star/frame/XFrames.hdl> +#include <svx/msdffdef.hxx> +#include <vcl/image.hxx> + + + + diff --git a/sc/source/filter/inc/fkttab.h b/sc/source/filter/inc/fkttab.h new file mode 100644 index 000000000000..3d834c5cf04d --- /dev/null +++ b/sc/source/filter/inc/fkttab.h @@ -0,0 +1,46 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_FKTTAB_H +#define SC_FKTTAB_H + +#include "decl.h" + +// Prefixes der Operationen +extern const sal_Char *cPre[ 256 ]; + +// Infixes der Operationen +extern const sal_Char *cInf[ 256 ]; + +// Postfixes der Operationen +extern const sal_Char *cPost[ 256 ]; + +// Bearbeitungsfunktion sal_Char *X( sal_Char * ) +extern BEARBFKT *pFkt[ 256 ]; + +#endif + diff --git a/sc/source/filter/inc/flttypes.hxx b/sc/source/filter/inc/flttypes.hxx new file mode 100644 index 000000000000..0a78889feb8c --- /dev/null +++ b/sc/source/filter/inc/flttypes.hxx @@ -0,0 +1,51 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_FLTTYPES_HXX +#define SC_FLTTYPES_HXX + +enum BiffTyp +{ + BiffX = 0x0000, + Biff2 = 0x2000, Biff2M = 0x2002, Biff2C = 0x2004, + Biff3 = 0x3000, Biff3W = 0x3001, Biff3M = 0x3002, Biff3C = 0x3004, + Biff4 = 0x4000, Biff4W = 0x4001, Biff4M = 0x4002, Biff4C = 0x4004, + Biff5 = 0x5000, Biff5W = 0x5001, Biff5V = 0x5002, Biff5C = 0x5004, Biff5M4 = 0x5008, + Biff8 = 0x8000, Biff8W = 0x8001, Biff8V = 0x8002, Biff8C = 0x8004, Biff8M4 = 0x8008 +}; + +enum Lotus123Typ +{ + Lotus_X, + Lotus_WK1, + Lotus_WK3, + Lotus_WK4, + Lotus_FM3 +}; + +#endif + diff --git a/sc/source/filter/inc/formel.hxx b/sc/source/filter/inc/formel.hxx new file mode 100644 index 000000000000..6c7d4288c372 --- /dev/null +++ b/sc/source/filter/inc/formel.hxx @@ -0,0 +1,296 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_FORMEL_HXX +#define SC_FORMEL_HXX + +#include <tools/solar.h> +#include <tools/list.hxx> +#include <tools/string.hxx> +#include "tokstack.hxx" +#include "root.hxx" +#include <global.hxx> +#include <compiler.hxx> + + +// ----- forwards -------------------------------------------------------- + +class XclImpStream; +class ScTokenArray; +class ScFormulaCell; +struct ScSingleRefData; +struct ScComplexRefData; + + + + +//------------------------------------------------------------------------ + +enum ConvErr +{ + ConvOK = 0, + ConvErrNi, // nicht implemntierter/unbekannter Opcode aufgetreten + ConvErrNoMem, // Fehler beim Speicheranfordern + ConvErrExternal,// Add-Ins aus Excel werden nicht umgesetzt + ConvErrCount // Nicht alle Bytes der Formel 'erwischt' +}; + + +enum FORMULA_TYPE +{ + FT_CellFormula, + FT_RangeName, + FT_SharedFormula +}; + + + + +//--------------------------------------------------------- class ScRangeList - + +class _ScRangeList : protected List +{ +private: +protected: +public: + virtual ~_ScRangeList(); + inline void Append( const ScRange& rRange ); + inline void Append( ScRange* pRange ); + inline void Append( const ScSingleRefData& rSRD ); + inline void Append( const ScComplexRefData& rCRD ); + + using List::Count; + inline BOOL HasRanges( void ) const; + + inline const ScRange* First( void ); + inline const ScRange* Next( void ); +}; + + +inline void _ScRangeList::Append( const ScRange& r ) +{ + List::Insert( new ScRange( r ), LIST_APPEND ); +} + + +inline void _ScRangeList::Append( ScRange* p ) +{ + List::Insert( p, LIST_APPEND ); +} + + +inline BOOL _ScRangeList::HasRanges( void ) const +{ + return Count() > 0; +} + + +inline const ScRange* _ScRangeList::First( void ) +{ + return ( const ScRange* ) List::First(); +} + + +inline const ScRange* _ScRangeList::Next( void ) +{ + return ( const ScRange* ) List::Next(); +} + + +inline void _ScRangeList::Append( const ScSingleRefData& r ) +{ + List::Insert( new ScRange( r.nCol, r.nRow, r.nTab ), LIST_APPEND ); +} + + +inline void _ScRangeList::Append( const ScComplexRefData& r ) +{ + List::Insert( new ScRange( r.Ref1.nCol, r.Ref1.nRow, r.Ref1.nTab, + r.Ref2.nCol, r.Ref2.nRow, r.Ref2.nTab ), + LIST_APPEND ); +} + + + + +//----------------------------------------------------- class ScRangeListTabs - + +class _ScRangeListTabs +{ +private: +protected: + BOOL bHasRanges; + _ScRangeList** ppTabLists; + _ScRangeList* pAct; + UINT16 nAct; +public: + _ScRangeListTabs( void ); + virtual ~_ScRangeListTabs(); + + void Append( ScSingleRefData aSRD, const BOOL bLimit = TRUE ); + void Append( ScComplexRefData aCRD, const BOOL bLimit = TRUE ); + + inline BOOL HasRanges( void ) const; + + const ScRange* First( const UINT16 nTab = 0 ); + const ScRange* Next( void ); +// const ScRange* NextContinue( void ); + inline const _ScRangeList* GetActList( void ) const; +}; + + +inline BOOL _ScRangeListTabs::HasRanges( void ) const +{ + return bHasRanges; +} + + +inline const _ScRangeList* _ScRangeListTabs::GetActList( void ) const +{ + return pAct; +} + + + + +class ConverterBase +{ +protected: + TokenPool aPool; // User Token + Predefined Token + TokenStack aStack; + ScAddress aEingPos; + ConvErr eStatus; + sal_Char* pBuffer; // Universal-Puffer + UINT16 nBufferSize; // ...und seine Groesse + + ConverterBase( UINT16 nNewBuffer ); + virtual ~ConverterBase(); + + void Reset(); + +public: + inline SCCOL GetEingabeCol( void ) const { return aEingPos.Col(); } + inline SCROW GetEingabeRow( void ) const { return aEingPos.Row(); } + inline SCTAB GetEingabeTab( void ) const { return aEingPos.Tab(); } + inline ScAddress GetEingPos( void ) const { return aEingPos; } +}; + + + +class ExcelConverterBase : public ConverterBase +{ +protected: + ExcelConverterBase( UINT16 nNewBuffer ); + virtual ~ExcelConverterBase(); + +public: + void Reset(); + void Reset( const ScAddress& rEingPos ); + + virtual ConvErr Convert( const ScTokenArray*& rpErg, XclImpStream& rStrm, sal_Size nFormulaLen, + bool bAllowArrays, const FORMULA_TYPE eFT = FT_CellFormula ) = 0; + virtual ConvErr Convert( _ScRangeListTabs&, XclImpStream& rStrm, sal_Size nFormulaLen, + const FORMULA_TYPE eFT = FT_CellFormula ) = 0; +}; + + + +class LotusConverterBase : public ConverterBase +{ +protected: + SvStream& aIn; + INT32 nBytesLeft; + + inline void Ignore( const long nSeekRel ); + inline void Read( sal_Char& nByte ); + inline void Read( BYTE& nByte ); + inline void Read( UINT16& nUINT16 ); + inline void Read( INT16& nINT16 ); + inline void Read( double& fDouble ); + inline void Read( UINT32& nUINT32 ); + + LotusConverterBase( SvStream& rStr, UINT16 nNewBuffer ); + virtual ~LotusConverterBase(); + +public: +//UNUSED2008-05 void Reset( INT32 nLen ); +//UNUSED2008-05 void Reset( INT32 nLen, const ScAddress& rEingPos ); + void Reset( const ScAddress& rEingPos ); + + virtual ConvErr Convert( const ScTokenArray*& rpErg, INT32& nRest, + const FORMULA_TYPE eFT = FT_CellFormula ) = 0; + +protected: + using ConverterBase::Reset; +}; + + +inline void LotusConverterBase::Ignore( const long nSeekRel ) +{ + aIn.SeekRel( nSeekRel ); + nBytesLeft -= nSeekRel; +} + +inline void LotusConverterBase::Read( sal_Char& nByte ) +{ + aIn >> nByte; + nBytesLeft--; +} + +inline void LotusConverterBase::Read( BYTE& nByte ) +{ + aIn >> nByte; + nBytesLeft--; +} + +inline void LotusConverterBase::Read( UINT16& nUINT16 ) +{ + aIn >> nUINT16; + nBytesLeft -= 2; +} + +inline void LotusConverterBase::Read( INT16& nINT16 ) +{ + aIn >> nINT16; + nBytesLeft -= 2; +} + +inline void LotusConverterBase::Read( double& fDouble ) +{ + aIn >> fDouble; + nBytesLeft -= 8; +} + +inline void LotusConverterBase::Read( UINT32& nUINT32 ) +{ + aIn >> nUINT32; + nBytesLeft -= 4; +} + +#endif + + diff --git a/sc/source/filter/inc/fprogressbar.hxx b/sc/source/filter/inc/fprogressbar.hxx new file mode 100644 index 000000000000..f399d7ea5064 --- /dev/null +++ b/sc/source/filter/inc/fprogressbar.hxx @@ -0,0 +1,243 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_FPROGRESSBAR_HXX +#define SC_FPROGRESSBAR_HXX + +#include "globstr.hrc" +#include "ftools.hxx" +#include "scdllapi.h" + +class SfxObjectShell; +class ScProgress; + +// ============================================================================ + +const sal_Int32 SCF_INV_SEGMENT = -1; + +// ============================================================================ + +/** Progress bar for complex progress representation. + + The progress bar contains one or more segments, each with customable + size. Each segment is represented by a unique identifier. While showing the + progress bar, several segments can be started simultaneously. The progress + bar displays the sum of all started segments on screen. + + It is possible to create a full featured ScfProgressBar object from + any segment. This sub progress bar works only on that parent segment, with + the effect, that if the sub progress bar reaches 100%, the parent segment is + filled completely. + + After adding segments, the progress bar has to be activated. In this step the + total size of all segments is calculated. Therefore it is not possible to add + more segments from here. + + If a sub progress bar is created from a segment, and the main progress bar + has been started (but not the sub progress bar), it is still possible to add + segments to the sub progress bar. It is not allowed to get the sub progress bar + of a started segment. And it is not allowed to modify the segment containing + a sub progress bar directly. + + Following a few code examples, how to use the progress bar. + + Example 1: Simple progress bar (see also ScfSimpleProgressBar below). + + ScfProgressBar aProgress( ... ); + sal_Int32 nSeg = aProgress.AddSegment( 50 ); // segment with 50 steps (1 step = 2%) + + aProgress.ActivateSegment( nSeg ); // start segment nSeg + aProgress.Progress(); // 0->1; display: 2% + aProgress.ProgressAbs( 9 ); // 1->9; display: 18% + + Example 2: Progress bar with 2 segments. + + ScfProgressBar aProgress( ... ); + sal_Int32 nSeg1 = aProgress.AddSegment( 70 ); // segment with 70 steps + sal_Int32 nSeg2 = aProgress.AddSegment( 30 ); // segment with 30 steps + // both segments: 100 steps (1 step = 1%) + + aProgress.ActivateSegment( nSeg1 ); // start first segment + aProgress.Progress(); // 0->1, display: 1% + aProgress.Progress( 2 ); // 1->3, display: 3% + aProgress.ActivateSegment( nSeg2 ); // start second segment + aProgress.Progress( 5 ); // 0->5, display: 8% (5+3 steps) + aProgress.ActivateSegment( nSeg1 ); // continue with first segment + aProgress.Progress(); // 3->4, display: 9% (5+4 steps) + + Example 3: Progress bar with 2 segments, one contains a sub progress bar. + + ScfProgressBar aProgress( ... ); + sal_Int32 nSeg1 = aProgress.AddSegment( 75 ); // segment with 75 steps + sal_Int32 nSeg2 = aProgress.AddSegment( 25 ); // segment with 25 steps + // both segments: 100 steps (1 step = 1%) + + aProgress.ActivateSegment( nSeg1 ); // start first segment + aProgress.Progress(); // 0->1, display: 1% + + ScfProgressBar& rSubProgress = aProgress.GetSegmentProgressBar( nSeg2 ); + // sub progress bar from second segment + sal_Int32 nSubSeg = rSubProgress.AddSegment( 5 ); // 5 steps, mapped to second segment + // => 1 step = 5 steps in parent = 5% + + rSubProgress.ActivateSegment( nSubSeg ); // start the segment (auto activate parent segment) + rSubProgress.Progress(); // 0->1 (0->5 in parent); display: 6% (1+5) + + // not allowed (second segment active): aProgress.Progress(); + // not allowed (first segment not empty): aProgress.GetSegmentProgressBar( nSeg1 ); + */ +class ScfProgressBar : ScfNoCopy +{ +public: + explicit ScfProgressBar( SfxObjectShell* pDocShell, const String& rText ); + explicit ScfProgressBar( SfxObjectShell* pDocShell, USHORT nResId ); + virtual ~ScfProgressBar(); + + /** Adds a new segment to the progress bar. + @return the identifier of the segment. */ + sal_Int32 AddSegment( sal_Size nSize ); + /** Returns a complete progress bar for the specified segment. + @descr The progress bar can be used to create sub segments inside of the + segment. Do not delete it (done by root progress bar)! + @return A reference to an ScfProgressBar connected to the segment. */ + ScfProgressBar& GetSegmentProgressBar( sal_Int32 nSegment ); + + /** Returns true, if any progress segment has been started. */ + inline bool IsStarted() const { return mbInProgress; } + /** Returns true, if the current progress segment is already full. */ + bool IsFull() const; + + /** Starts the progress bar or activates another segment. */ + void ActivateSegment( sal_Int32 nSegment ); + /** Starts the progress bar (with first segment). */ + inline void Activate() { ActivateSegment( 0 ); } + /** Set current segment to the specified absolute position. */ + void ProgressAbs( sal_Size nPos ); + /** Increase current segment by the passed value. */ + void Progress( sal_Size nDelta = 1 ); + +private: + struct ScfProgressSegment; + + /** Used to create sub progress bars. */ + explicit ScfProgressBar( + ScfProgressBar& rParProgress, + ScfProgressSegment* pParSegment ); + + /** Initializes all members on construction. */ + void Init( SfxObjectShell* pDocShell ); + + /** Returns the segment specified by list index. */ + ScfProgressSegment* GetSegment( sal_Int32 nSegment ) const; + /** Activates progress bar and sets current segment. */ + void SetCurrSegment( ScfProgressSegment* pSegment ); + /** Increases mnTotalPos and calls the system progress bar. */ + void IncreaseProgressBar( sal_Size nDelta ); + +private: + /** Contains all data of a segment of the progress bar. */ + struct ScfProgressSegment + { + typedef ::std::auto_ptr< ScfProgressBar > ScfProgressBarPtr; + + ScfProgressBarPtr mxProgress; /// Pointer to sub progress bar for this segment. + sal_Size mnSize; /// Size of this segment. + sal_Size mnPos; /// Current position of this segment. + + explicit ScfProgressSegment( sal_Size nSize ); + ~ScfProgressSegment(); + }; + + typedef ::std::auto_ptr< ScProgress > ScProgressPtr; + typedef ScfDelList< ScfProgressSegment > ScfSegmentList; + + ScfSegmentList maSegments; /// List of progress segments. + String maText; /// UI string for system progress. + + ScProgressPtr mxSysProgress; /// System progress bar. + SfxObjectShell* mpDocShell; /// The document shell for the progress bar. + ScfProgressBar* mpParentProgress; /// Parent progress bar, if this is a segment progress bar. + ScfProgressSegment* mpParentSegment; /// Parent segment, if this is a segment progress bar. + ScfProgressSegment* mpCurrSegment; /// Current segment for progress. + + sal_Size mnTotalSize; /// Total size of all segments. + sal_Size mnTotalPos; /// Sum of positions of all segments. + sal_Size mnUnitSize; /// Size between two calls of system progress. + sal_Size mnNextUnitPos; /// Limit for next system progress call. + sal_Size mnSysProgressScale; /// Additionally scaling factor for system progress. + bool mbInProgress; /// true = progress bar started. +}; + +// ============================================================================ + +/** A simplified progress bar with only one segment. */ +class ScfSimpleProgressBar +{ +public: + explicit ScfSimpleProgressBar( sal_Size nSize, SfxObjectShell* pDocShell, const String& rText ); + explicit ScfSimpleProgressBar( sal_Size nSize, SfxObjectShell* pDocShell, USHORT nResId ); + + /** Set progress bar to the specified position. */ + inline void ProgressAbs( sal_Size nPos ) { maProgress.ProgressAbs( nPos ); } + /** Increase progress bar by 1. */ + inline void Progress( sal_Size nDelta = 1 ) { maProgress.Progress( nDelta ); } + +private: + /** Initializes and starts the progress bar. */ + void Init( sal_Size nSize ); + +private: + ScfProgressBar maProgress; /// The used progress bar. +}; + +// ============================================================================ + +/** A simplified progress bar based on the stream position of an existing stream. */ +class ScfStreamProgressBar +{ +public: +//UNUSED2008-05 explicit ScfStreamProgressBar( SvStream& rStrm, SfxObjectShell* pDocShell, const String& rText ); + explicit ScfStreamProgressBar( SvStream& rStrm, SfxObjectShell* pDocShell, USHORT nResId = STR_LOAD_DOC ); + + /** Sets the progress bar to the current stream position. */ + void Progress(); + +private: + /** Initializes and starts the progress bar. */ + void Init( SfxObjectShell* pDocShell, const String& rText ); + +private: + typedef ::std::auto_ptr< ScfSimpleProgressBar > ScfSimpleProgressBarPtr; + + ScfSimpleProgressBarPtr mxProgress; /// The used progress bar. + SvStream& mrStrm; /// The used stream. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/ftools.hxx b/sc/source/filter/inc/ftools.hxx new file mode 100644 index 000000000000..c17aaa70445c --- /dev/null +++ b/sc/source/filter/inc/ftools.hxx @@ -0,0 +1,544 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_FTOOLS_HXX +#define SC_FTOOLS_HXX + +#include <vector> +#include <map> +#include <limits> +#include <memory> +#include <tools/string.hxx> +#include <tools/list.hxx> +#include <tools/debug.hxx> +#include <oox/helper/helper.hxx> +#include "filter.hxx" +#include "scdllapi.h" + +// Common macros ============================================================== + +/** Expands to the size of a STATIC data array. */ +#define STATIC_TABLE_SIZE( array ) (sizeof(array)/sizeof(*(array))) +/** Expands to a pointer behind the last element of a STATIC data array (like STL end()). */ +#define STATIC_TABLE_END( array ) ((array)+STATIC_TABLE_SIZE(array)) + +/** Expands to a temporary String, created from an ASCII character array. */ +#define CREATE_STRING( ascii ) String( RTL_CONSTASCII_USTRINGPARAM( ascii ) ) + +// items and item sets -------------------------------------------------------- + +/** Expands to the item (with type 'itemtype') with Which-ID 'which'. */ +#define GETITEM( itemset, itemtype, which ) \ + static_cast< const itemtype & >( (itemset).Get( which ) ) + +/** Expands to the value (with type 'valuetype') of the item with Which-ID 'which'. */ +#define GETITEMVALUE( itemset, itemtype, which, valuetype ) \ + static_cast< valuetype >( GETITEM( itemset, itemtype, which ).GetValue() ) + +/** Expands to the value of the SfxBoolItem with Which-ID 'which'. */ +#define GETITEMBOOL( itemset, which ) \ + GETITEMVALUE( itemset, SfxBoolItem, which, bool ) + +// Global static helpers ====================================================== + +// Value range limit helpers -------------------------------------------------- + +/** Returns the value, if it is not less than nMin, otherwise nMin. */ +template< typename ReturnType, typename Type > +inline ReturnType llimit_cast( Type nValue, ReturnType nMin ) +{ return static_cast< ReturnType >( ::std::max< Type >( nValue, nMin ) ); } + +/** Returns the value, if it fits into ReturnType, otherwise the minimum value of ReturnType. */ +template< typename ReturnType, typename Type > +inline ReturnType llimit_cast( Type nValue ) +{ return llimit_cast( nValue, ::std::numeric_limits< ReturnType >::min() ); } + +/** Returns the value, if it is not greater than nMax, otherwise nMax. */ +template< typename ReturnType, typename Type > +inline ReturnType ulimit_cast( Type nValue, ReturnType nMax ) +{ return static_cast< ReturnType >( ::std::min< Type >( nValue, nMax ) ); } + +/** Returns the value, if it fits into ReturnType, otherwise the maximum value of ReturnType. */ +template< typename ReturnType, typename Type > +inline ReturnType ulimit_cast( Type nValue ) +{ return ulimit_cast( nValue, ::std::numeric_limits< ReturnType >::max() ); } + +/** Returns the value, if it is not less than nMin and not greater than nMax, otherwise one of the limits. */ +template< typename ReturnType, typename Type > +inline ReturnType limit_cast( Type nValue, ReturnType nMin, ReturnType nMax ) +{ return static_cast< ReturnType >( ::std::max< Type >( ::std::min< Type >( nValue, nMax ), nMin ) ); } + +/** Returns the value, if it fits into ReturnType, otherwise one of the limits of ReturnType. */ +template< typename ReturnType, typename Type > +inline ReturnType limit_cast( Type nValue ) +{ return limit_cast( nValue, ::std::numeric_limits< ReturnType >::min(), ::std::numeric_limits< ReturnType >::max() ); } + +// Read from bitfields -------------------------------------------------------- + +/** Returns true, if at least one of the bits set in nMask is set in nBitField. */ +template< typename Type > +inline bool get_flag( Type nBitField, Type nMask ) +{ return (nBitField & nMask) != 0; } + +/** Returns nSet, if at least one bit of nMask is set in nBitField, otherwise nUnset. */ +template< typename ReturnType, typename Type > +inline ReturnType get_flagvalue( Type nBitField, Type nMask, ReturnType nSet, ReturnType nUnset ) +{ return ::get_flag( nBitField, nMask ) ? nSet : nUnset; } + +/** Extracts a value from a bit field. + @descr Returns in rnRet the data fragment from nBitField, that starts at bit nStartBit + (0-based, bit 0 is rightmost) with the width of nBitCount. rnRet will be right-aligned (normalized). + For instance: extract_value( n, 0x4321, 8, 4 ) stores 3 in n (value in bits 8-11). */ +template< typename ReturnType, typename Type > +inline ReturnType extract_value( Type nBitField, sal_uInt8 nStartBit, sal_uInt8 nBitCount ) +{ return static_cast< ReturnType >( ((1UL << nBitCount) - 1) & (nBitField >> nStartBit) ); } + +// Write to bitfields --------------------------------------------------------- + +/** Sets or clears (according to bSet) all set bits of nMask in rnBitField. */ +template< typename Type > +inline void set_flag( Type& rnBitField, Type nMask, bool bSet = true ) +{ if( bSet ) rnBitField |= nMask; else rnBitField &= ~nMask; } + +/** Inserts a value into a bitfield. + @descr Inserts the lower nBitCount bits of nValue into rnBitField, starting + there at bit nStartBit. Other contents of rnBitField keep unchanged. */ +template< typename Type, typename InsertType > +void insert_value( Type& rnBitField, InsertType nValue, sal_uInt8 nStartBit, sal_uInt8 nBitCount ) +{ + unsigned long nMask = ((1UL << nBitCount) - 1); + Type nNewValue = static_cast< Type >( nValue & nMask ); + (rnBitField &= ~(nMask << nStartBit)) |= (nNewValue << nStartBit); +} + +// ============================================================================ + +/** Deriving from this class prevents copy construction. */ +class ScfNoCopy +{ +private: + ScfNoCopy( const ScfNoCopy& ); + ScfNoCopy& operator=( const ScfNoCopy& ); +protected: + inline ScfNoCopy() {} +}; + +// ---------------------------------------------------------------------------- + +/** Deriving from this class prevents construction in general. */ +class ScfNoInstance : private ScfNoCopy {}; + +// ============================================================================ + +/** Simple shared pointer (NOT thread-save, but faster than boost::shared_ptr). */ +template< typename Type > +class ScfRef +{ + template< typename > friend class ScfRef; + +public: + typedef Type element_type; + typedef ScfRef this_type; + + inline explicit ScfRef( element_type* pObj = 0 ) { eat( pObj ); } + inline /*implicit*/ ScfRef( const this_type& rRef ) { eat( rRef.mpObj, rRef.mpnCount ); } + template< typename Type2 > + inline /*implicit*/ ScfRef( const ScfRef< Type2 >& rRef ) { eat( rRef.mpObj, rRef.mpnCount ); } + inline ~ScfRef() { rel(); } + + inline void reset( element_type* pObj = 0 ) { rel(); eat( pObj ); } + inline this_type& operator=( const this_type& rRef ) { if( this != &rRef ) { rel(); eat( rRef.mpObj, rRef.mpnCount ); } return *this; } + template< typename Type2 > + inline this_type& operator=( const ScfRef< Type2 >& rRef ) { rel(); eat( rRef.mpObj, rRef.mpnCount ); return *this; } + + inline element_type* get() const { return mpObj; } + inline bool is() const { return mpObj != 0; } + + inline element_type* operator->() const { return mpObj; } + inline element_type& operator*() const { return *mpObj; } + + inline bool operator!() const { return mpObj == 0; } + +private: + inline void eat( element_type* pObj, size_t* pnCount = 0 ) { mpObj = pObj; mpnCount = mpObj ? (pnCount ? pnCount : new size_t( 0 )) : 0; if( mpnCount ) ++*mpnCount; } + inline void rel() { if( mpnCount && !--*mpnCount ) { DELETEZ( mpObj ); DELETEZ( mpnCount ); } } + +private: + Type* mpObj; + size_t* mpnCount; +}; + +template< typename Type > +inline bool operator==( const ScfRef< Type >& rxRef1, const ScfRef< Type >& rxRef2 ) +{ + return rxRef1.get() == rxRef2.get(); +} + +template< typename Type > +inline bool operator!=( const ScfRef< Type >& rxRef1, const ScfRef< Type >& rxRef2 ) +{ + return rxRef1.get() != rxRef2.get(); +} + +template< typename Type > +inline bool operator<( const ScfRef< Type >& rxRef1, const ScfRef< Type >& rxRef2 ) +{ + return rxRef1.get() < rxRef2.get(); +} + +template< typename Type > +inline bool operator>( const ScfRef< Type >& rxRef1, const ScfRef< Type >& rxRef2 ) +{ + return rxRef1.get() > rxRef2.get(); +} + +template< typename Type > +inline bool operator<=( const ScfRef< Type >& rxRef1, const ScfRef< Type >& rxRef2 ) +{ + return rxRef1.get() <= rxRef2.get(); +} + +template< typename Type > +inline bool operator>=( const ScfRef< Type >& rxRef1, const ScfRef< Type >& rxRef2 ) +{ + return rxRef1.get() >= rxRef2.get(); +} + +// ---------------------------------------------------------------------------- + +/** Template for a map of ref-counted objects with additional accessor functions. */ +template< typename KeyType, typename ObjType > +class ScfRefMap : public ::std::map< KeyType, ScfRef< ObjType > > +{ +public: + typedef KeyType key_type; + typedef ScfRef< ObjType > ref_type; + typedef ::std::map< key_type, ref_type > map_type; + + /** Returns true, if the object accossiated to the passed key exists. */ + inline bool has( key_type nKey ) const + { + typename map_type::const_iterator aIt = find( nKey ); + return (aIt != this->end()) && aIt->second.is(); + } + + /** Returns a reference to the object accossiated to the passed key, or 0 on error. */ + inline ref_type get( key_type nKey ) const + { + typename map_type::const_iterator aIt = find( nKey ); + if( aIt != this->end() ) return aIt->second; + return ref_type(); + } +}; + +// ============================================================================ + +class Color; +class SfxPoolItem; +class SfxItemSet; +class ScStyleSheet; +class ScStyleSheetPool; +class SotStorage; +class SotStorageRef; +class SotStorageStreamRef; +class SvStream; + +/** Contains static methods used anywhere in the filters. */ +class ScfTools : ScfNoInstance +{ +public: + +// *** common methods *** ----------------------------------------------------- + + /** Reads a 10-byte-long-double and converts it to double. */ + static double ReadLongDouble( SvStream& rStrm ); + /** Returns system text encoding for byte string conversion. */ + static rtl_TextEncoding GetSystemTextEncoding(); + /** Returns a string representing the hexadecimal value of nValue. */ + static String GetHexStr( sal_uInt16 nValue ); + + /** Mixes RGB components with given transparence. + @param nTrans Foreground transparence (0x00 == full nFore ... 0x80 = full nBack). */ + static sal_uInt8 GetMixedColorComp( sal_uInt8 nFore, sal_uInt8 nBack, sal_uInt8 nTrans ); + /** Mixes colors with given transparence. + @param nTrans Foreground transparence (0x00 == full rFore ... 0x80 = full rBack). */ + static Color GetMixedColor( const Color& rFore, const Color& rBack, sal_uInt8 nTrans ); + +// *** conversion of names *** ------------------------------------------------ + + /** Converts a string to a valid Calc defined name or database range name. + @descr Defined names in Calc may contain letters, digits (*), underscores, periods (*), + colons (*), question marks, and dollar signs. + (*) = not allowed at first position. */ + static void ConvertToScDefinedName( String& rName ); + +// *** streams and storages *** ----------------------------------------------- + + /** Tries to open an existing storage with the specified name in the passed storage (read-only). */ + static SotStorageRef OpenStorageRead( SotStorageRef xStrg, const String& rStrgName ); + /** Creates and opens a storage with the specified name in the passed storage (read/write). */ + static SotStorageRef OpenStorageWrite( SotStorageRef xStrg, const String& rStrgName ); + + /** Tries to open an existing stream with the specified name in the passed storage (read-only). */ + static SotStorageStreamRef OpenStorageStreamRead( SotStorageRef xStrg, const String& rStrmName ); + /** Creates and opens a stream with the specified name in the passed storage (read/write). */ + static SotStorageStreamRef OpenStorageStreamWrite( SotStorageRef xStrg, const String& rStrmName ); + +// *** item handling *** ------------------------------------------------------ + + /** Returns true, if the passed item set contains the item. + @param bDeep true = Searches in parent item sets too. */ + static bool CheckItem( const SfxItemSet& rItemSet, USHORT nWhichId, bool bDeep ); + /** Returns true, if the passed item set contains at least one of the items. + @param pnWhichIds Zero-terminated array of Which-IDs. + @param bDeep true = Searches in parent item sets too. */ + static bool CheckItems( const SfxItemSet& rItemSet, const USHORT* pnWhichIds, bool bDeep ); + + /** Puts the item into the passed item set. + @descr The item will be put into the item set, if bSkipPoolDef is false, + or if the item differs from the default pool item. + @param rItemSet The destination item set. + @param rItem The item to put into the item set. + @param nWhichId The Which-ID to set with the item. + @param bSkipPoolDef true = Do not put item if it is equal to pool default; false = Always put the item. */ + static void PutItem( + SfxItemSet& rItemSet, const SfxPoolItem& rItem, + USHORT nWhichId, bool bSkipPoolDef ); + + /** Puts the item into the passed item set. + @descr The item will be put into the item set, if bSkipPoolDef is false, + or if the item differs from the default pool item. + @param rItemSet The destination item set. + @param rItem The item to put into the item set. + @param bSkipPoolDef true = Do not put item if it is equal to pool default; false = Always put the item. */ + static void PutItem( SfxItemSet& rItemSet, const SfxPoolItem& rItem, bool bSkipPoolDef ); + +// *** style sheet handling *** ----------------------------------------------- + + /** Creates and returns a cell style sheet and inserts it into the pool. + @descr If the style sheet is already in the pool, another unused style name is used. + @param bForceName Controls behaviour, if the style already exists: + true = Old existing style will be renamed; false = New style gets another name. */ + static ScStyleSheet& MakeCellStyleSheet( + ScStyleSheetPool& rPool, + const String& rStyleName, bool bForceName ); + /** Creates and returns a page style sheet and inserts it into the pool. + @descr If the style sheet is already in the pool, another unused style name is used. + @param bForceName Controls behaviour, if the style already exists: + true = Old existing style will be renamed; false = New style gets another name. */ + static ScStyleSheet& MakePageStyleSheet( + ScStyleSheetPool& rPool, + const String& rStyleName, bool bForceName ); + +// *** byte string import operations *** -------------------------------------- + + /** Reads and returns a zero terminted byte string. */ + static ByteString ReadCString( SvStream& rStrm ); + /** Reads and returns a zero terminted byte string. */ + inline static String ReadCString( SvStream& rStrm, rtl_TextEncoding eTextEnc ) + { return String( ReadCString( rStrm ), eTextEnc ); } + + /** Reads and returns a zero terminted byte string and decreases a stream counter. */ + static ByteString ReadCString( SvStream& rStrm, sal_Int32& rnBytesLeft ); + /** Reads and returns a zero terminted byte string and decreases a stream counter. */ + inline static String ReadCString( SvStream& rStrm, sal_Int32& rnBytesLeft, rtl_TextEncoding eTextEnc ) + { return String( ReadCString( rStrm, rnBytesLeft ), eTextEnc ); } + + /** Appends a zero terminted byte string. */ + static void AppendCString( SvStream& rStrm, ByteString& rString ); + /** Appends a zero terminted byte string. */ + static void AppendCString( SvStream& rStrm, String& rString, rtl_TextEncoding eTextEnc ); + +// *** HTML table names <-> named range names *** ----------------------------- + + /** Returns the built-in range name for an HTML document. */ + static const String& GetHTMLDocName(); + /** Returns the built-in range name for all HTML tables. */ + static const String& GetHTMLTablesName(); + /** Returns the built-in range name for an HTML table, specified by table index. */ + static String GetNameFromHTMLIndex( sal_uInt32 nIndex ); + /** Returns the built-in range name for an HTML table, specified by table name. */ + static String GetNameFromHTMLName( const String& rTabName ); + + /** Returns true, if rSource is the built-in range name for an HTML document. */ + static bool IsHTMLDocName( const String& rSource ); + /** Returns true, if rSource is the built-in range name for all HTML tables. */ + static bool IsHTMLTablesName( const String& rSource ); + /** Converts a built-in range name to an HTML table name. + @param rSource The string to be determined. + @param rName The HTML table name. + @return true, if conversion was successful. */ + static bool GetHTMLNameFromName( const String& rSource, String& rName ); + +private: + /** Returns the prefix for table index names. */ + static const String& GetHTMLIndexPrefix(); + /** Returns the prefix for table names. */ + static const String& GetHTMLNamePrefix(); +}; + +// Containers ================================================================= + +typedef ::std::vector< sal_uInt8 > ScfUInt8Vec; +typedef ::std::vector< sal_Int16 > ScfInt16Vec; +typedef ::std::vector< sal_uInt16 > ScfUInt16Vec; +typedef ::std::vector< sal_Int32 > ScfInt32Vec; +typedef ::std::vector< sal_uInt32 > ScfUInt32Vec; +typedef ::std::vector< sal_Int64 > ScfInt64Vec; +typedef ::std::vector< sal_uInt64 > ScfUInt64Vec; +typedef ::std::vector< String > ScfStringVec; + +// ---------------------------------------------------------------------------- + +/** Template for a list that owns the contained objects. + @descr This list stores pointers to objects and deletes the objects itself + on destruction. The Clear() method deletes all objects too. */ +template< typename Type > class ScfDelList +{ +public: + inline explicit ScfDelList( USHORT nInitSize = 16, USHORT nResize = 16 ) : + maList( nInitSize, nResize ) {} + /** Creates a deep copy of the passed list (copy-constructs all contained objects). */ + inline explicit ScfDelList( const ScfDelList& rSrc ) { *this = rSrc; } + virtual ~ScfDelList(); + + /** Creates a deep copy of the passed list (copy-constructs all contained objects). */ + ScfDelList& operator=( const ScfDelList& rSrc ); + + inline void Insert( Type* pObj, ULONG nIndex ) { if( pObj ) maList.Insert( pObj, nIndex ); } + inline void Append( Type* pObj ) { if( pObj ) maList.Insert( pObj, LIST_APPEND ); } + /** Removes the object without deletion. */ + inline Type* Remove( ULONG nIndex ) { return static_cast< Type* >( maList.Remove( nIndex ) ); } + /** Removes and deletes the object. */ + inline void Delete( ULONG nIndex ) { delete Remove( nIndex ); } + /** Exchanges the contained object with the passed, returns the old. */ + inline Type* Exchange( Type* pObj, ULONG nIndex ) { return static_cast< Type* >( maList.Replace( pObj, nIndex ) ); } + /** Replaces (deletes) the contained object. */ + inline void Replace( Type* pObj, ULONG nIndex ) { delete Exchange( pObj, nIndex ); } + + void Clear(); + inline ULONG Count() const { return maList.Count(); } + inline bool Empty() const { return maList.Count() == 0; } + + inline Type* GetCurObject() const { return static_cast< Type* >( maList.GetCurObject() ); } + inline ULONG GetCurPos() const { return maList.GetCurPos(); } + inline Type* GetObject( sal_uInt32 nIndex ) const { return static_cast< Type* >( maList.GetObject( nIndex ) ); } + + inline Type* First() const { return static_cast< Type* >( maList.First() ); } + inline Type* Last() const { return static_cast< Type* >( maList.Last() ); } + inline Type* Next() const { return static_cast< Type* >( maList.Next() ); } + inline Type* Prev() const { return static_cast< Type* >( maList.Prev() ); } + +private: + mutable List maList; /// The base container object. +}; + +template< typename Type > ScfDelList< Type >& ScfDelList< Type >::operator=( const ScfDelList& rSrc ) +{ + Clear(); + for( const Type* pObj = rSrc.First(); pObj; pObj = rSrc.Next() ) + Append( new Type( *pObj ) ); + return *this; +} + +template< typename Type > ScfDelList< Type >::~ScfDelList() +{ + Clear(); +} + +template< typename Type > void ScfDelList< Type >::Clear() +{ + for( Type* pObj = First(); pObj; pObj = Next() ) + delete pObj; + maList.Clear(); +} + +// ---------------------------------------------------------------------------- + +/** Template for a stack that owns the contained objects. + @descr This stack stores pointers to objects and deletes the objects + itself on destruction. The Clear() method deletes all objects too. + The Pop() method removes the top object from stack without deletion. */ +template< typename Type > +class ScfDelStack : private ScfDelList< Type > +{ +public: + inline ScfDelStack( USHORT nInitSize = 16, USHORT nResize = 16 ) : + ScfDelList< Type >( nInitSize, nResize ) {} + + inline void Push( Type* pObj ) { Append( pObj ); } + /** Removes the top object without deletion. */ + inline Type* Pop() { return Remove( Count() - 1 ); } + + inline Type* Top() const { return GetObject( Count() - 1 ); } + + using ScfDelList< Type >::Clear; + using ScfDelList< Type >::Count; + using ScfDelList< Type >::Empty; +}; + +// ---------------------------------------------------------------------------- +class ScFormatFilterPluginImpl : public ScFormatFilterPlugin { + public: + ScFormatFilterPluginImpl(); + // various import filters + virtual FltError ScImportLotus123( SfxMedium&, ScDocument*, CharSet eSrc = RTL_TEXTENCODING_DONTKNOW ); + virtual FltError ScImportQuattroPro( SfxMedium &rMedium, ScDocument *pDoc ); + virtual FltError ScImportExcel( SfxMedium&, ScDocument*, const EXCIMPFORMAT ); + // eFormat == EIF_AUTO -> passender Filter wird automatisch verwendet + // eFormat == EIF_BIFF5 -> nur Biff5-Stream fuehrt zum Erfolg (auch wenn in einem Excel97-Doc) + // eFormat == EIF_BIFF8 -> nur Biff8-Stream fuehrt zum Erfolg (nur in Excel97-Docs) + // eFormat == EIF_BIFF_LE4 -> nur Nicht-Storage-Dateien _koennen_ zum Erfolg fuehren + virtual FltError ScImportStarCalc10( SvStream&, ScDocument* ); + virtual FltError ScImportDif( SvStream&, ScDocument*, const ScAddress& rInsPos, + const CharSet eSrc = RTL_TEXTENCODING_DONTKNOW, UINT32 nDifOption = SC_DIFOPT_EXCEL ); + virtual FltError ScImportRTF( SvStream&, const String& rBaseURL, ScDocument*, ScRange& rRange ); + virtual FltError ScImportHTML( SvStream&, const String& rBaseURL, ScDocument*, ScRange& rRange, + double nOutputFactor = 1.0, BOOL bCalcWidthHeight = TRUE, + SvNumberFormatter* pFormatter = NULL, bool bConvertDate = true ); + + virtual ScEEAbsImport *CreateRTFImport( ScDocument* pDoc, const ScRange& rRange ); + virtual ScEEAbsImport *CreateHTMLImport( ScDocument* pDocP, const String& rBaseURL, const ScRange& rRange, BOOL bCalcWidthHeight ); + virtual String GetHTMLRangeNameList( ScDocument* pDoc, const String& rOrigName ); + + // various export filters +#if ENABLE_LOTUS123_EXPORT + virtual FltError ScExportLotus123( SvStream&, ScDocument*, ExportFormatLotus, CharSet eDest ); +#endif + virtual FltError ScExportExcel5( SfxMedium&, ScDocument*, ExportFormatExcel eFormat, CharSet eDest ); + virtual FltError ScExportDif( SvStream&, ScDocument*, const ScAddress& rOutPos, const CharSet eDest, + UINT32 nDifOption = SC_DIFOPT_EXCEL ); + virtual FltError ScExportDif( SvStream&, ScDocument*, const ScRange& rRange, const CharSet eDest, + UINT32 nDifOption = SC_DIFOPT_EXCEL ); + virtual FltError ScExportHTML( SvStream&, const String& rBaseURL, ScDocument*, const ScRange& rRange, const CharSet eDest, BOOL bAll, + const String& rStreamPath, String& rNonConvertibleChars ); + virtual FltError ScExportRTF( SvStream&, ScDocument*, const ScRange& rRange, const CharSet eDest ); +}; + +// ============================================================================ + +#endif diff --git a/sc/source/filter/inc/funktion.h b/sc/source/filter/inc/funktion.h new file mode 100644 index 000000000000..ef8ecabc256a --- /dev/null +++ b/sc/source/filter/inc/funktion.h @@ -0,0 +1,50 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_FUNKTION_H +#define SC_FUNKTION_H + +// Bearbeitungsfunktionen +void P0( void ); // 0 Parameter +void P1( void ); // 1 Parameter +void P2( void ); // 2 Parameter +void P3( void ); // 3 Parameter +void P4( void ); // 4 Parameter +void P5( void ); // 5 Parameter +void Pn( void ); // n Parameter +void NI( void ); // nicht implementiert +void ConstFloat( void ); // 0 +void Variable( void ); // 1 +void LotusRange( void ); // 2 +void FormulaReturn( void ); // 3 +void Klammer( void ); // 4 +void ConstInt( void ); // 5 +void ConstString( void ); // 6 +// ACHTUNG: unbekannte Funktionen -> P0() + +#endif + diff --git a/sc/source/filter/inc/htmlexp.hxx b/sc/source/filter/inc/htmlexp.hxx new file mode 100644 index 000000000000..4cdf71b8610d --- /dev/null +++ b/sc/source/filter/inc/htmlexp.hxx @@ -0,0 +1,174 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_HTMLEXP_HXX +#define SC_HTMLEXP_HXX + +#include "global.hxx" +#include <rtl/textenc.h> +#include <tools/gen.hxx> +#include <tools/color.hxx> + +#include "expbase.hxx" + + +class ScDocument; +class SfxItemSet; +class SdrPage; +class Graphic; +class SdrObject; +class OutputDevice; +class ScDrawLayer; +class SvStringsSortDtor; +class ScEditCell; +class SvxBorderLine; + +struct ScHTMLStyle +{ // Defaults aus StyleSheet + Color aBackgroundColor; + String aFontFamilyName; + UINT32 nFontHeight; // Item-Value + USHORT nFontSizeNumber; // HTML value 1-7 + BYTE nDefaultScriptType; // Font values are valid for the default script type + BOOL bInitialized; + + ScHTMLStyle() : nFontHeight(0), nFontSizeNumber(2), nDefaultScriptType(0), + bInitialized(0) {} + + const ScHTMLStyle& operator=( const ScHTMLStyle& r ) + { + aBackgroundColor = r.aBackgroundColor; + aFontFamilyName = r.aFontFamilyName; + nFontHeight = r.nFontHeight; + nFontSizeNumber = r.nFontSizeNumber; + nDefaultScriptType = r.nDefaultScriptType; + bInitialized = r.bInitialized; + return *this; + } +}; + +struct ScHTMLGraphEntry +{ + ScRange aRange; // ueberlagerter Zellbereich + Size aSize; // Groesse in Pixeln + Size aSpace; // Spacing in Pixeln + SdrObject* pObject; + BOOL bInCell; // ob in Zelle ausgegeben wird + BOOL bWritten; + + ScHTMLGraphEntry( SdrObject* pObj, const ScRange& rRange, + const Size& rSize, BOOL bIn, const Size& rSpace ) : + aRange( rRange ), aSize( rSize ), aSpace( rSpace ), + pObject( pObj ), bInCell( bIn ), bWritten( FALSE ) {} +}; + +DECLARE_LIST( ScHTMLGraphList, ScHTMLGraphEntry* ) + +#define SC_HTML_FONTSIZES 7 +const short nIndentMax = 23; + +class ScHTMLExport : public ScExportBase +{ + // default HtmlFontSz[1-7] + static const USHORT nDefaultFontSize[SC_HTML_FONTSIZES]; + // HtmlFontSz[1-7] in s*3.ini [user] + static USHORT nFontSize[SC_HTML_FONTSIZES]; + static const char* pFontSizeCss[SC_HTML_FONTSIZES]; + static const USHORT nCellSpacing; + static const sal_Char __FAR_DATA sIndentSource[]; + + ScHTMLGraphList aGraphList; + ScHTMLStyle aHTMLStyle; + String aBaseURL; + String aStreamPath; + String aCId; // Content-Id fuer Mail-Export + OutputDevice* pAppWin; // fuer Pixelei + SvStringsSortDtor* pSrcArr; // fuer CopyLocalFileToINet + SvStringsSortDtor* pDestArr; + String aNonConvertibleChars; // collect nonconvertible characters + rtl_TextEncoding eDestEnc; + SCTAB nUsedTables; + short nIndent; + sal_Char sIndent[nIndentMax+1]; + BOOL bAll; // ganzes Dokument + BOOL bTabHasGraphics; + BOOL bTabAlignedLeft; + BOOL bCalcAsShown; + BOOL bCopyLocalFileToINet; + BOOL bTableDataWidth; + BOOL bTableDataHeight; + + const SfxItemSet& PageDefaults( SCTAB nTab ); + + void WriteBody(); + void WriteHeader(); + void WriteOverview(); + void WriteTables(); + void WriteCell( SCCOL nCol, SCROW nRow, SCTAB nTab ); + void WriteGraphEntry( ScHTMLGraphEntry* ); + void WriteImage( String& rLinkName, + const Graphic&, const ByteString& rImgOptions, + ULONG nXOutFlags = 0 ); + // nXOutFlags fuer XOutBitmap::WriteGraphic + + // write to stream if and only if URL fields in edit cell + BOOL WriteFieldText( const ScEditCell* pCell ); + + // kopiere ggfs. eine lokale Datei ins Internet + BOOL CopyLocalFileToINet( String& rFileNm, + const String& rTargetNm, BOOL bFileToFile = FALSE ); + BOOL HasCId() { return aCId.Len() > 0; } + void MakeCIdURL( String& rURL ); + + void PrepareGraphics( ScDrawLayer*, SCTAB nTab, + SCCOL nStartCol, SCROW nStartRow, + SCCOL nEndCol, SCROW nEndRow ); + void FillGraphList( const SdrPage*, SCTAB nTab, + SCCOL nStartCol, SCROW nStartRow, + SCCOL nEndCol, SCROW nEndRow ); + + void BorderToStyle( ByteString& rOut, const char* pBorderName, + const SvxBorderLine* pLine, bool& bInsertSemicolon ); + + USHORT GetFontSizeNumber( USHORT nHeight ); + const char* GetFontSizeCss( USHORT nHeight ); + USHORT ToPixel( USHORT nTwips ); + Size MMToPixel( const Size& r100thMMSize ); + void IncIndent( short nVal ); + const sal_Char* GetIndentStr() { return sIndent; } + +public: + ScHTMLExport( SvStream&, const String&, ScDocument*, const ScRange&, + BOOL bAll, const String& aStreamPath ); + virtual ~ScHTMLExport(); + ULONG Write(); + const String& GetNonConvertibleChars() const + { return aNonConvertibleChars; } +}; + +#endif + diff --git a/sc/source/filter/inc/htmlimp.hxx b/sc/source/filter/inc/htmlimp.hxx new file mode 100644 index 000000000000..0376b3cd72f5 --- /dev/null +++ b/sc/source/filter/inc/htmlimp.hxx @@ -0,0 +1,52 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_HTMLIMP_HXX +#define SC_HTMLIMP_HXX + +#include "eeimport.hxx" + +class ScHTMLParser; + +class ScHTMLImport : public ScEEImport +{ +private: + static void InsertRangeName( ScDocument* pDoc, const String& rName, const ScRange& rRange ); + +public: + ScHTMLImport( ScDocument* pDoc, const String& rBaseURL, const ScRange& rRange, BOOL bCalcWidthHeight = TRUE ); + virtual ~ScHTMLImport(); + const ScHTMLParser* GetParser() const { return (ScHTMLParser*)mpParser; } + + virtual void WriteToDocument( BOOL bSizeColsRows = FALSE, double nOutputFactor = 1.0, + SvNumberFormatter* pFormatter = NULL, bool bConvertDate = true ); + + static String GetHTMLRangeNameList( ScDocument* pDoc, const String& rOrigName ); +}; + + +#endif diff --git a/sc/source/filter/inc/htmlpars.hxx b/sc/source/filter/inc/htmlpars.hxx new file mode 100644 index 000000000000..f053a1088ff1 --- /dev/null +++ b/sc/source/filter/inc/htmlpars.hxx @@ -0,0 +1,638 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_HTMLPARS_HXX +#define SC_HTMLPARS_HXX + +#include <tools/stack.hxx> + +#include <memory> +#include <vector> +#include <list> +#include <map> + +#include "rangelst.hxx" +#include "eeparser.hxx" + +const sal_uInt32 SC_HTML_FONTSIZES = 7; // wie Export, HTML-Options + +// Pixel tolerance for SeekOffset and related. +const USHORT SC_HTML_OFFSET_TOLERANCE_SMALL = 1; // single table +const USHORT SC_HTML_OFFSET_TOLERANCE_LARGE = 10; // nested + +// ============================================================================ +// BASE class for HTML parser classes +// ============================================================================ + +class ScHTMLTable; + +/** Base class for HTML parser classes. */ +class ScHTMLParser : public ScEEParser +{ +protected: + sal_uInt32 maFontHeights[ SC_HTML_FONTSIZES ]; + ScDocument* mpDoc; /// The destination document. + +public: + explicit ScHTMLParser( EditEngine* pEditEngine, ScDocument* pDoc ); + virtual ~ScHTMLParser(); + + virtual ULONG Read( SvStream& rStrm, const String& rBaseURL ) = 0; + + /** Returns the "global table" which contains the entire HTML document. */ + virtual const ScHTMLTable* GetGlobalTable() const = 0; +}; + + +// ============================================================================ + +SV_DECL_VARARR_SORT( ScHTMLColOffset, ULONG, 16, 4) + +struct ScHTMLTableStackEntry +{ + ScRangeListRef xLockedList; + ScEEParseEntry* pCellEntry; + ScHTMLColOffset* pLocalColOffset; + ULONG nFirstTableCell; + SCCOL nColCnt; + SCROW nRowCnt; + SCCOL nColCntStart; + SCCOL nMaxCol; + USHORT nTable; + USHORT nTableWidth; + USHORT nColOffset; + USHORT nColOffsetStart; + BOOL bFirstRow; + ScHTMLTableStackEntry( ScEEParseEntry* pE, + const ScRangeListRef& rL, ScHTMLColOffset* pTO, + ULONG nFTC, + SCCOL nCol, SCROW nRow, + SCCOL nStart, SCCOL nMax, USHORT nTab, + USHORT nTW, USHORT nCO, USHORT nCOS, + BOOL bFR ) + : xLockedList( rL ), pCellEntry( pE ), + pLocalColOffset( pTO ), + nFirstTableCell( nFTC ), + nColCnt( nCol ), nRowCnt( nRow ), + nColCntStart( nStart ), nMaxCol( nMax ), + nTable( nTab ), nTableWidth( nTW ), + nColOffset( nCO ), nColOffsetStart( nCOS ), + bFirstRow( bFR ) + {} + ~ScHTMLTableStackEntry() {} +}; +DECLARE_STACK( ScHTMLTableStack, ScHTMLTableStackEntry* ) + +struct ScHTMLAdjustStackEntry +{ + SCCOL nLastCol; + SCROW nNextRow; + SCROW nCurRow; + ScHTMLAdjustStackEntry( SCCOL nLCol, SCROW nNRow, + SCROW nCRow ) + : nLastCol( nLCol ), nNextRow( nNRow ), + nCurRow( nCRow ) + {} +}; +DECLARE_STACK( ScHTMLAdjustStack, ScHTMLAdjustStackEntry* ) + + +// ============================================================================ + +class EditEngine; +class ScDocument; +class HTMLOption; + +class ScHTMLLayoutParser : public ScHTMLParser +{ +private: + Size aPageSize; + String aBaseURL; + ScHTMLTableStack aTableStack; + String aString; + ScRangeListRef xLockedList; // je Table + Table* pTables; + ScHTMLColOffset* pColOffset; + ScHTMLColOffset* pLocalColOffset; // je Table + ULONG nFirstTableCell; // je Table + short nTableLevel; + USHORT nTable; + USHORT nMaxTable; + SCCOL nColCntStart; // erste Col je Table + SCCOL nMaxCol; // je Table + USHORT nTableWidth; // je Table + USHORT nColOffset; // aktuell, Pixel + USHORT nColOffsetStart; // Startwert je Table, in Pixel + USHORT nMetaCnt; // fuer ParseMetaOptions + USHORT nOffsetTolerance; // for use with SeekOffset and related + BOOL bCalcWidthHeight; // TRUE: calculate real column width + // FALSE: 1 html-col = 1 sc-col + BOOL bTabInTabCell; + BOOL bFirstRow; // je Table, ob in erster Zeile + BOOL bInCell; + BOOL bInTitle; + + DECL_LINK( HTMLImportHdl, ImportInfo* ); + void NewActEntry( ScEEParseEntry* ); + void EntryEnd( ScEEParseEntry*, const ESelection& ); + void ProcToken( ImportInfo* ); + void CloseEntry( ImportInfo* ); + void NextRow( ImportInfo* ); + void SkipLocked( ScEEParseEntry*, BOOL bJoin = TRUE ); + static BOOL SeekOffset( ScHTMLColOffset*, USHORT nOffset, + SCCOL* pCol, USHORT nOffsetTol ); + static void MakeCol( ScHTMLColOffset*, USHORT& nOffset, + USHORT& nWidth, USHORT nOffsetTol, + USHORT nWidthTol ); + static void MakeColNoRef( ScHTMLColOffset*, USHORT nOffset, + USHORT nWidth, USHORT nOffsetTol, + USHORT nWidthTol ); + static void ModifyOffset( ScHTMLColOffset*, USHORT& nOldOffset, + USHORT& nNewOffset, USHORT nOffsetTol ); + void Colonize( ScEEParseEntry* ); + USHORT GetWidth( ScEEParseEntry* ); + void SetWidths(); + void Adjust(); + + USHORT GetWidthPixel( const HTMLOption* ); + BOOL IsAtBeginningOfText( ImportInfo* ); + + void TableOn( ImportInfo* ); + void ColOn( ImportInfo* ); + void TableRowOn( ImportInfo* ); + void TableRowOff( ImportInfo* ); + void TableDataOn( ImportInfo* ); + void TableDataOff( ImportInfo* ); + void TableOff( ImportInfo* ); + void Image( ImportInfo* ); + void AnchorOn( ImportInfo* ); + void FontOn( ImportInfo* ); + +public: + ScHTMLLayoutParser( EditEngine*, const String& rBaseURL, const Size& aPageSize, ScDocument* ); + virtual ~ScHTMLLayoutParser(); + virtual ULONG Read( SvStream&, const String& rBaseURL ); + virtual const ScHTMLTable* GetGlobalTable() const; +}; + + + +// ============================================================================ +// HTML DATA QUERY PARSER +// ============================================================================ + +/** Declares the orientation in or for a table: column or row. */ +enum ScHTMLOrient { tdCol = 0 , tdRow = 1 }; + +/** Type for a unique identifier for each table. */ +typedef sal_uInt16 ScHTMLTableId; +/** Identifier of the "global table" (the entire HTML document). */ +const ScHTMLTableId SC_HTML_GLOBAL_TABLE = 0; +/** Used as table index for normal (non-table) entries in ScHTMLEntry structs. */ +const ScHTMLTableId SC_HTML_NO_TABLE = 0; + +// ============================================================================ + +/** A 2D cell position in an HTML table. */ +struct ScHTMLPos +{ + SCCOL mnCol; + SCROW mnRow; + + inline explicit ScHTMLPos() : mnCol( 0 ), mnRow( 0 ) {} + inline explicit ScHTMLPos( SCCOL nCol, SCROW nRow ) : + mnCol( nCol ), mnRow( nRow ) {} + inline explicit ScHTMLPos( const ScAddress& rAddr ) { Set( rAddr ); } + + inline SCCOLROW Get( ScHTMLOrient eOrient ) const + { return (eOrient == tdCol) ? mnCol : mnRow; } + inline void Set( SCCOL nCol, SCROW nRow ) + { mnCol = nCol; mnRow = nRow; } + inline void Set( const ScAddress& rAddr ) + { Set( rAddr.Col(), rAddr.Row() ); } + inline void Move( SCsCOL nColDiff, SCsROW nRowDiff ) + { mnCol = mnCol + nColDiff; mnRow = mnRow + nRowDiff; } + inline ScAddress MakeAddr() const + { return ScAddress( mnCol, mnRow, 0 ); } +}; + +inline bool operator==( const ScHTMLPos& rPos1, const ScHTMLPos& rPos2 ) +{ + return (rPos1.mnRow == rPos2.mnRow) && (rPos1.mnCol == rPos2.mnCol); +} + +inline bool operator<( const ScHTMLPos& rPos1, const ScHTMLPos& rPos2 ) +{ + return (rPos1.mnRow < rPos2.mnRow) || ((rPos1.mnRow == rPos2.mnRow) && (rPos1.mnCol < rPos2.mnCol)); +} + +// ---------------------------------------------------------------------------- + +/** A 2D cell size in an HTML table. */ +struct ScHTMLSize +{ + SCCOL mnCols; + SCROW mnRows; + + inline explicit ScHTMLSize() : mnCols( 0 ), mnRows( 0 ) {} + inline explicit ScHTMLSize( SCCOL nCols, SCROW nRows ) : + mnCols( nCols ), mnRows( nRows ) {} + + inline SCCOLROW Get( ScHTMLOrient eOrient ) const + { return (eOrient == tdCol) ? mnCols : mnRows; } + inline void Set( SCCOL nCols, SCROW nRows ) + { mnCols = nCols; mnRows = nRows; } + inline void Expand( SCsCOL nColDiff, SCsROW nRowDiff ) + { mnCols = mnCols + nColDiff; mnRows = mnRows + nRowDiff; } +}; + +inline bool operator==( const ScHTMLSize& rSize1, const ScHTMLSize& rSize2 ) +{ + return (rSize1.mnRows == rSize2.mnRows) && (rSize1.mnCols == rSize2.mnCols); +} + +// ============================================================================ + +/** A single entry containing a line of text or representing a table. */ +struct ScHTMLEntry : public ScEEParseEntry +{ +public: + explicit ScHTMLEntry( + const SfxItemSet& rItemSet, + ScHTMLTableId nTableId = SC_HTML_NO_TABLE ); + + /** Returns true, if the selection of the entry is empty. */ + inline bool IsEmpty() const { return !aSel.HasRange(); } + /** Returns true, if the entry has any content to be imported. */ + bool HasContents() const; + /** Returns true, if the entry represents a table. */ + inline bool IsTable() const { return nTab != SC_HTML_NO_TABLE; } + /** Returns true, if the entry represents a table. */ + inline ScHTMLTableId GetTableId() const { return nTab; } + + /** Sets or cleares the import always state. */ + inline void SetImportAlways( bool bSet = true ) { mbImportAlways = bSet; } + /** Sets start point of the entry selection to the start of the import info object. */ + void AdjustStart( const ImportInfo& rInfo ); + /** Sets end point of the entry selection to the end of the import info object. */ + void AdjustEnd( const ImportInfo& rInfo ); + /** Deletes leading and trailing empty paragraphs from the entry. */ + void Strip( const EditEngine& rEditEngine ); + + /** Returns read/write access to the item set of this entry. */ + inline SfxItemSet& GetItemSet() { return aItemSet; } + /** Returns read-only access to the item set of this entry. */ + inline const SfxItemSet& GetItemSet() const { return aItemSet; } + +private: + bool mbImportAlways; /// true = Always import this entry. +}; + +// ============================================================================ + +/** This struct handles creation of unique table identifiers. */ +struct ScHTMLTableAutoId +{ + const ScHTMLTableId mnTableId; /// The created unique table identifier. + ScHTMLTableId& mrnUnusedId; /// Reference to global unused identifier variable. + + /** The constructor assigns an unused identifier to member mnTableId. */ + explicit ScHTMLTableAutoId( ScHTMLTableId& rnUnusedId ); +}; + +// ---------------------------------------------------------------------------- + +class ScHTMLTableMap; + +/** Stores data for one table in an HTML document. + + This class does the main work for importing an HTML document. It manages + the correct insertion of parse entries into the correct cells and the + creation of nested tables. Recalculation of resulting document size and + position is done recursively in all nested tables. + */ +class ScHTMLTable +{ +public: + /** Creates a new HTML table without content. + @descr Internally handles a current cell position. This position is + invalid until first calls of RowOn() and DataOn(). + @param rParentTable Reference to the parent table that owns this table. + @param bPreFormText true = Table is based on preformatted text (<pre> tag). */ + explicit ScHTMLTable( + ScHTMLTable& rParentTable, + const ImportInfo& rInfo, + bool bPreFormText ); + + virtual ~ScHTMLTable(); + + /** Returns the name of the table, specified in the TABLE tag. */ + inline const String& GetTableName() const { return maTableName; } + /** Returns the unique identifier of the table. */ + inline ScHTMLTableId GetTableId() const { return maTableId.mnTableId; } + /** Returns the table size. */ + inline const ScHTMLSize& GetSize() const { return maSize; } + /** Returns the cell spanning of the specified cell. */ + ScHTMLSize GetSpan( const ScHTMLPos& rCellPos ) const; + + /** Searches in all nested tables for the specified table. + @param nTableId Unique identifier of the table. */ + ScHTMLTable* FindNestedTable( ScHTMLTableId nTableId ) const; + + /** Puts the item into the item set of the current entry. */ + void PutItem( const SfxPoolItem& rItem ); + /** Inserts a text portion into current entry. */ + void PutText( const ImportInfo& rInfo ); + /** Inserts a new line, if in preformatted text, else does nothing. */ + void InsertPara( const ImportInfo& rInfo ); + + /** Inserts a line break (<br> tag). + @descr Inserts the current entry regardless if it is empty. */ + void BreakOn(); + /** Inserts a heading line (<p> and <h*> tags). */ + void HeadingOn(); + /** Processes a hyperlink (<a> tag). */ + void AnchorOn(); + + /** Starts a *new* table nested in this table (<table> tag). + @return Pointer to the new table. */ + ScHTMLTable* TableOn( const ImportInfo& rInfo ); + /** Closes *this* table (</table> tag). + @return Pointer to the parent table. */ + ScHTMLTable* TableOff( const ImportInfo& rInfo ); + /** Starts a *new* table based on preformatted text (<pre> tag). + @return Pointer to the new table. */ + ScHTMLTable* PreOn( const ImportInfo& rInfo ); + /** Closes *this* table based on preformatted text (</pre> tag). + @return Pointer to the parent table. */ + ScHTMLTable* PreOff( const ImportInfo& rInfo ); + + /** Starts next row (<tr> tag). + @descr Cell address is invalid until first call of DataOn(). */ + void RowOn( const ImportInfo& rInfo ); + /** Closes the current row (<tr> tag). + @descr Cell address is invalid until call of RowOn() and DataOn(). */ + void RowOff( const ImportInfo& rInfo ); + /** Starts the next cell (<td> or <th> tag). */ + void DataOn( const ImportInfo& rInfo ); + /** Closes the current cell (</td> or </th> tag). + @descr Cell address is invalid until next call of DataOn(). */ + void DataOff( const ImportInfo& rInfo ); + + /** Starts the body of the HTML document (<body> tag). */ + void BodyOn( const ImportInfo& rInfo ); + /** Closes the body of the HTML document (</body> tag). */ + void BodyOff( const ImportInfo& rInfo ); + + /** Closes *this* table (</table> tag) or preformatted text (</pre> tag). + @descr Used to close this table object regardless on opening tag type. + @return Pointer to the parent table, or this, if no parent found. */ + ScHTMLTable* CloseTable( const ImportInfo& rInfo ); + + /** Returns the resulting document row/column count of the specified HTML row/column. */ + SCCOLROW GetDocSize( ScHTMLOrient eOrient, SCCOLROW nCellPos ) const; + /** Returns the resulting document row/column count in the half-open range [nCellBegin, nCellEnd). */ + SCCOLROW GetDocSize( ScHTMLOrient eOrient, SCCOLROW nCellBegin, SCCOLROW nCellEnd ) const; + /** Returns the total document row/column count in the specified direction. */ + SCCOLROW GetDocSize( ScHTMLOrient eOrient ) const; + /** Returns the total document row/column count of the specified HTML cell. */ + ScHTMLSize GetDocSize( const ScHTMLPos& rCellPos ) const; + + /** Returns the resulting Calc position of the top left edge of the table. */ + inline const ScHTMLPos& GetDocPos() const { return maDocBasePos; } + /** Calculates the resulting Calc position of the specified HTML column/row. */ + SCCOLROW GetDocPos( ScHTMLOrient eOrient, SCCOLROW nCellPos = 0 ) const; + /** Calculates the resulting Calc position of the specified HTML cell. */ + ScHTMLPos GetDocPos( const ScHTMLPos& rCellPos ) const; + + /** Calculates the current Calc document area of this table. */ + void GetDocRange( ScRange& rRange ) const; + + /** Applies border formatting to the passed document. */ + void ApplyCellBorders( ScDocument* pDoc, const ScAddress& rFirstPos ) const; + +protected: + /** Creates a new HTML table without parent. + @descr This constructor is used to create the "global table". */ + explicit ScHTMLTable( + SfxItemPool& rPool, + EditEngine& rEditEngine, + ScEEParseList& rEEParseList, + ScHTMLTableId& rnUnusedId ); + + /** Fills all empty cells in this and nested tables with dummy parse entries. */ + void FillEmptyCells(); + /** Recalculates the size of all columns/rows in the table, regarding nested tables. */ + void RecalcDocSize(); + /** Recalculates the position of all cell entries and nested tables. + @param rBasePos The origin of the table in the Calc document. */ + void RecalcDocPos( const ScHTMLPos& rBasePos ); + +private: + typedef ::std::auto_ptr< ScHTMLTableMap > ScHTMLTableMapPtr; + typedef ::std::auto_ptr< SfxItemSet > SfxItemSetPtr; + typedef ::std::vector< SCCOLROW > ScSizeVec; + typedef ::std::list< ScHTMLEntry* > ScHTMLEntryList; + typedef ::std::map< ScHTMLPos, ScHTMLEntryList > ScHTMLEntryMap; + typedef ::std::auto_ptr< ScHTMLEntry > ScHTMLEntryPtr; + + /** Returns true, if the current cell does not contain an entry yet. */ + bool IsEmptyCell() const; + /** Returns the item set from cell, row, or table, depending on current state. */ + const SfxItemSet& GetCurrItemSet() const; + + /** Returns true, if import info represents a space character. */ + static bool IsSpaceCharInfo( const ImportInfo& rInfo ); + + /** Creates and returns a new empty flying entry at position (0,0). */ + ScHTMLEntryPtr CreateEntry() const; + /** Creates a new flying entry. + @param rInfo Contains the initial edit engine selection for the entry. */ + void CreateNewEntry( const ImportInfo& rInfo ); + + /** Inserts an empty line in front of the next entry. */ + void InsertLeadingEmptyLine(); + + /** Pushes the passed entry into the list of the current cell. */ + void ImplPushEntryToList( ScHTMLEntryList& rEntryList, ScHTMLEntryPtr& rxEntry ); + /** Tries to insert the entry into the current cell. + @descr If insertion is not possible (i.e., currently no cell open), the + entry will be inserted into the parent table. + @return true = Entry as been pushed into the current cell; false = Entry dropped. */ + bool PushEntry( ScHTMLEntryPtr& rxEntry ); + /** Puts the current entry into the entry list, if it is not empty. + @param rInfo The import info struct containing the end position of the current entry. + @param bLastInCell true = If cell is still empty, put this entry always. + @return true = Entry as been pushed into the current cell; false = Entry dropped. */ + bool PushEntry( const ImportInfo& rInfo, bool bLastInCell = false ); + /** Pushes a new entry into current cell which references a nested table. + @return true = Entry as been pushed into the current cell; false = Entry dropped. */ + bool PushTableEntry( ScHTMLTableId nTableId ); + + /** Tries to find a table from the table container. + @descr Assumes that the table is located in the current container or + that the passed table identifier is 0. + @param nTableId Unique identifier of the table or 0. */ + ScHTMLTable* GetExistingTable( ScHTMLTableId nTableId ) const; + /** Inserts a nested table in the current cell at the specified position. + @param bPreFormText true = New table is based on preformatted text (<pre> tag). */ + ScHTMLTable* InsertNestedTable( const ImportInfo& rInfo, bool bPreFormText ); + + /** Inserts a new cell in an unused position, starting from current cell position. */ + void InsertNewCell( const ScHTMLSize& rSpanSize ); + + /** Set internal states for a new table row. */ + void ImplRowOn(); + /** Set internal states for leaving a table row. */ + void ImplRowOff(); + /** Set internal states for entering a new table cell. */ + void ImplDataOn( const ScHTMLSize& rSpanSize ); + /** Set internal states for leaving a table cell. */ + void ImplDataOff(); + + /** Inserts additional formatting options from import info into the item set. */ + void ProcessFormatOptions( SfxItemSet& rItemSet, const ImportInfo& rInfo ); + + /** Updates the document column/row size of the specified column or row. + @descr Only increases the present count, never decreases. */ + void SetDocSize( ScHTMLOrient eOrient, SCCOLROW nCellPos, SCCOLROW nSize ); + /** Calculates and sets the resulting size the cell needs in the document. + @descr Reduces the needed size in merged cells. + @param nCellPos The first column/row position of the (merged) cell. + @param nCellSpan The cell spanning in the specified orientation. + @param nRealDocSize The raw document size of all entries of the cell. */ + void CalcNeededDocSize( + ScHTMLOrient eOrient, SCCOLROW nCellPos, + SCCOLROW nCellSpan, SCCOLROW nRealDocSize ); + +private: + ScHTMLTable* mpParentTable; /// Pointer to parent table. + ScHTMLTableMapPtr mxNestedTables; /// Table of nested HTML tables. + String maTableName; /// Table name from <table id> option. + ScHTMLTableAutoId maTableId; /// Unique identifier of this table. + SfxItemSet maTableItemSet; /// Items for the entire table. + SfxItemSetPtr mxRowItemSet; /// Items for the current table row. + SfxItemSetPtr mxDataItemSet; /// Items for the current cell. + ScRangeList maHMergedCells; /// List of all horizontally merged cells. + ScRangeList maVMergedCells; /// List of all vertically merged cells. + ScRangeList maUsedCells; /// List of all used cells. + EditEngine& mrEditEngine; /// Edit engine (from ScEEParser). + ScEEParseList& mrEEParseList; /// List that owns the parse entries (from ScEEParser). + ScHTMLEntryMap maEntryMap; /// List of entries for each cell. + ScHTMLEntryList* mpCurrEntryList; /// Current entry list from map for faster access. + ScHTMLEntryPtr mxCurrEntry; /// Working entry, not yet inserted in a list. + ScSizeVec maCumSizes[ 2 ]; /// Cumulated cell counts for each HTML table column/row. + ScHTMLSize maSize; /// Size of the table. + ScHTMLPos maCurrCell; /// Address of current cell to fill. + ScHTMLPos maDocBasePos; /// Resulting base address in a Calc document. + bool mbBorderOn; /// true = Table borders on. + bool mbPreFormText; /// true = Table from preformatted text (<pre> tag). + bool mbRowOn; /// true = Inside of <tr> </tr>. + bool mbDataOn; /// true = Inside of <td> </td> or <th> </th>. + bool mbPushEmptyLine; /// true = Insert empty line before current entry. +}; + +// ---------------------------------------------------------------------------- + +/** The "global table" representing the entire HTML document. */ +class ScHTMLGlobalTable : public ScHTMLTable +{ +public: + explicit ScHTMLGlobalTable( + SfxItemPool& rPool, + EditEngine& rEditEngine, + ScEEParseList& rEEParseList, + ScHTMLTableId& rnUnusedId ); + + virtual ~ScHTMLGlobalTable(); + + /** Recalculates sizes and resulting positions of all document entries. */ + void Recalc(); +}; + +// ============================================================================ + +/** The HTML parser for data queries. Focuses on data import, not on layout. + + Builds the table structure correctly, ignores extended formatting like + pictures or column widths. + */ +class ScHTMLQueryParser : public ScHTMLParser +{ +public: + explicit ScHTMLQueryParser( EditEngine* pEditEngine, ScDocument* pDoc ); + virtual ~ScHTMLQueryParser(); + + virtual ULONG Read( SvStream& rStrm, const String& rBaseURL ); + + /** Returns the "global table" which contains the entire HTML document. */ + virtual const ScHTMLTable* GetGlobalTable() const; + +private: + /** Handles all possible tags in the HTML document. */ + void ProcessToken( const ImportInfo& rInfo ); + /** Inserts a text portion into current entry. */ + void InsertText( const ImportInfo& rInfo ); + /** Processes the <font> tag. */ + void FontOn( const ImportInfo& rInfo ); + + /** Processes the <meta> tag. */ + void MetaOn( const ImportInfo& rInfo ); + /** Opens the title of the HTML document (<title> tag). */ + void TitleOn( const ImportInfo& rInfo ); + /** Closes the title of the HTML document (</title> tag). */ + void TitleOff( const ImportInfo& rInfo ); + + /** Opens a new table at the current position. */ + void TableOn( const ImportInfo& rInfo ); + /** Closes the current table. */ + void TableOff( const ImportInfo& rInfo ); + /** Opens a new table based on preformatted text. */ + void PreOn( const ImportInfo& rInfo ); + /** Closes the current preformatted text table. */ + void PreOff( const ImportInfo& rInfo ); + + /** Closes the current table, regardless on opening tag. */ + void CloseTable( const ImportInfo& rInfo ); + + DECL_LINK( HTMLImportHdl, const ImportInfo* ); + +private: + typedef ::std::auto_ptr< ScHTMLGlobalTable > ScHTMLGlobalTablePtr; + + String maTitle; /// The title of the document. + ScHTMLGlobalTablePtr mxGlobTable; /// Contains the entire imported document. + ScHTMLTable* mpCurrTable; /// Pointer to current table (performance). + ScHTMLTableId mnUnusedId; /// First unused table identifier. + bool mbTitleOn; /// true = Inside of <title> </title>. +}; + + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/imp_op.hxx b/sc/source/filter/inc/imp_op.hxx new file mode 100644 index 000000000000..2df58173a63a --- /dev/null +++ b/sc/source/filter/inc/imp_op.hxx @@ -0,0 +1,205 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_IMP_OP_HXX +#define SC_IMP_OP_HXX + +#include <tools/gen.hxx> +#include "xiroot.hxx" +#include "xistream.hxx" +#include "xistyle.hxx" +#include "flttypes.hxx" +#include "namebuff.hxx" +#include "root.hxx" +#include "otlnbuff.hxx" +#include "colrowst.hxx" +#include "excdefs.hxx" + + +class SfxItemSet; +class SvStream; + +class ScFormulaCell; +class SdrObject; +class ScDocument; +class ScToken; +class _ScRangeListTabs; + +class ExcelToSc; + + +class ImportTyp +{ +protected: + CharSet eQuellChar; // Quell-Zeichensatz + ScDocument* pD; // Dokument + +public: + ImportTyp( ScDocument*, CharSet eSrc ); + virtual ~ImportTyp(); + + virtual FltError Read( void ); +}; + +class XclImpOutlineDataBuffer : protected XclImpRoot +{ +public: + explicit XclImpOutlineDataBuffer( const XclImpRoot& rRoot, SCTAB nScTab ); + virtual ~XclImpOutlineDataBuffer(); + + inline XclImpColRowSettings* GetColRowBuff() const { return mxColRowBuff.get(); } + inline XclImpOutlineBuffer* GetColOutline() const { return mxColOutlineBuff.get(); } + inline XclImpOutlineBuffer* GetRowOutline() const { return mxRowOutlineBuff.get(); } + void Convert(); + +private: + typedef ScfRef< XclImpOutlineBuffer > XclImpOutlineBfrRef; + typedef ScfRef< XclImpColRowSettings > XclImpColRowSettRef; + + XclImpOutlineBfrRef mxColOutlineBuff; + XclImpOutlineBfrRef mxRowOutlineBuff; + XclImpColRowSettRef mxColRowBuff; + SCTAB mnScTab; +}; + +class ImportExcel : public ImportTyp, protected XclImpRoot +{ +protected: + static const double fExcToTwips; // Umrechnung 1/256 Zeichen -> Twips + + RootData* pExcRoot; + + XclImpStream maStrm; // input stream + XclImpStream& aIn; // input stream + + ScfUInt32Vec maSheetOffsets; + ScRange maScOleSize; /// Visible range if embedded. + + NameBuffer* pExtNameBuff; // ... externe Namen (Ind.-Basis=1) + ExcelToSc* pFormConv; // Formel-Konverter + + XclImpOutlineBuffer* pColOutlineBuff; + XclImpOutlineBuffer* pRowOutlineBuff; + XclImpColRowSettings* pColRowBuff; // Col/Row-Einstellungen 1 Tabelle + + typedef ScfDelList< XclImpOutlineDataBuffer > XclImpOutlineListBuffer; + XclImpOutlineListBuffer* pOutlineListBuffer; + + sal_Int16 mnLastRefIdx; + UINT16 nIxfeIndex; // merkt sich Angabe im IXFE-Record + UINT16 nLastXF; // letzter XF in Formula-Record + SCTAB nBdshtTab; // Counter fuer Boundsheet + ScFormulaCell* pLastFormCell; // fuer String-Records + + BOOL bTabTruncated; // wenn Bereichsueberschreitung zum + // Abschneiden von Zellen fuehrt + + // Record-Funktionen + void ReadFileSharing(); + + sal_uInt16 ReadXFIndex( bool bBiff2 ); + + void ReadDimensions(); + void ReadBlank(); + void ReadInteger(); + void ReadNumber(); + void ReadLabel(); + void ReadBoolErr(); + void ReadRk(); + + void Window1(); + void Formula25( void ); // 0x06 -> excform.cxx + void Row25( void ); // 0x08 + void Bof2( void ); // 0x09 + void Eof( void ); // 0x0A + void DocProtect( void ); // 0x12 + void SheetProtect( void ); // 0x12 Sheet Protection + void DocPasssword( void ); // 0x13 document password + void SheetPassword( void ); // 0x13 sheet password + void Externsheet( void ); // 0x17 + void WinProtection( void ); // 0x19 + void Columndefault( void ); // 0x20 + void Array25( void ); // 0x21 + void Rec1904( void ); // 0x22 + void Externname25( void ); // 0x23 + void Colwidth( void ); // 0x24 + void Defrowheight2( void ); // 0x25 +// void Window1( void ); // 0x3D + void Codepage( void ); // 0x42 + void Ixfe( void ); // 0x44 + void DefColWidth( void ); // 0x55 + void Builtinfmtcnt( void ); // 0x56 + void Colinfo( void ); // 0x7D + void Wsbool( void ); // 0x81 + void Boundsheet( void ); // 0x85 + void Country( void ); // 0x8C + void Hideobj( void ); // 0x8D + void Bundleheader( void ); // 0x8F + void Standardwidth( void ); // 0x99 + void Shrfmla( void ); // 0xBC + void Mulrk( void ); // 0xBD + void Mulblank( void ); // 0xBE + void Rstring( void ); // 0xD6 + void Cellmerging( void ); // 0xE5 + void Olesize( void ); // 0xDE + void ReadUsesElfs(); // 0x0160 + void Formula3( void ); // 0x0206 -> excform.cxx + // 0x0207 -> 0x07 + void Row34( void ); // 0x0208 + void Bof3( void ); // 0x0209 + void Array34( void ); // 0x0221 + void Externname34( void ); // 0x0223 + void Defrowheight345( void ); // 0x0225 + void TableOp( void ); // 0x0236 + //void Rk( void ); // 0x027E -> 0x7E + void Formula4( void ); // 0x0406 -> excform.cxx + void Bof4( void ); // 0x0409 + void Bof5( void ); // 0x0809 + + // --------------------------------------------------------------- + void Formula( const XclAddress& rXclPos, + UINT16 nXF, UINT16 nFormLen, double &rCurVal, BOOL bShrFmla ); + // -> excform.cxx + + virtual void EndSheet( void ); + void NeueTabelle( void ); + const ScTokenArray* ErrorToFormula( BYTE bErrOrVal, BYTE nError, + double& rVal ); + + virtual void AdjustRowHeight(); + virtual void PostDocLoad( void ); + +public: + ImportExcel( XclImpRootData& rImpData, SvStream& rStrm ); + + virtual ~ImportExcel( void ); + + virtual FltError Read( void ); +}; + +#endif + diff --git a/sc/source/filter/inc/lotattr.hxx b/sc/source/filter/inc/lotattr.hxx new file mode 100644 index 000000000000..7015136f1be1 --- /dev/null +++ b/sc/source/filter/inc/lotattr.hxx @@ -0,0 +1,153 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_LOTATTR_HXX +#define SC_LOTATTR_HXX + +#include <tools/solar.h> +#include <tools/list.hxx> +#include "patattr.hxx" +#include "scitems.hxx" +#include "address.hxx" + +// ----- forwards -------------------------------------------------------- +class ScDocument; +class ScDocumentPool; +class SvxBorderLine; +class SvxColorItem; +class Color; + +class LotAttrTable; + + +struct LotAttrWK3 +{ + UINT8 nFont; + UINT8 nLineStyle; + UINT8 nFontCol; + UINT8 nBack; + + inline BOOL HasStyles( void ); + inline BOOL IsCentered( void ); +}; + + +inline BOOL LotAttrWK3::HasStyles( void ) +{ + return ( nFont || nLineStyle || nFontCol || ( nBack & 0x7F ) ); + // !! ohne Center-Bit!! +} + + +inline BOOL LotAttrWK3::IsCentered( void ) +{ + return ( nBack & 0x80 ); +} + + +class LotAttrCache : private List +{ +private: + friend class LotAttrTable; + + struct ENTRY + { + ScPatternAttr* pPattAttr; + UINT32 nHash0; + + inline ENTRY( const ScPatternAttr& r ) { pPattAttr = new ScPatternAttr( r ); } + + inline ENTRY( ScPatternAttr* p ) { pPattAttr = p; } + + inline ~ENTRY() { delete pPattAttr; } + + inline BOOL operator ==( const ENTRY& r ) const { return nHash0 == r.nHash0; } + + inline BOOL operator ==( const UINT32& r ) const { return nHash0 == r; } + }; + + ScDocumentPool* pDocPool; + SvxColorItem* ppColorItems[ 6 ]; // 0 und 7 fehlen! + SvxColorItem* pBlack; + SvxColorItem* pWhite; + Color* pColTab; + + inline static void MakeHash( const LotAttrWK3& rAttr, UINT32& rOut ) + { + ( ( UINT8* ) &rOut )[ 0 ] = rAttr.nFont & 0x7F; + ( ( UINT8* ) &rOut )[ 1 ] = rAttr.nLineStyle; + ( ( UINT8* ) &rOut )[ 2 ] = rAttr.nFontCol; + ( ( UINT8* ) &rOut )[ 3 ] = rAttr.nBack; + } + static void LotusToScBorderLine( UINT8 nLine, SvxBorderLine& ); + const SvxColorItem& GetColorItem( const UINT8 nLotIndex ) const; + const Color& GetColor( const UINT8 nLotIndex ) const; +public: + LotAttrCache( void ); + ~LotAttrCache(); + + const ScPatternAttr& GetPattAttr( const LotAttrWK3& ); +}; + + +class LotAttrCol : private List +{ +private: + struct ENTRY + { + const ScPatternAttr* pPattAttr; + SCROW nFirstRow; + SCROW nLastRow; + }; + +public: + ~LotAttrCol( void ); + void SetAttr( const SCROW nRow, const ScPatternAttr& ); + void Apply( const SCCOL nCol, const SCTAB nTab, const BOOL bClear = TRUE ); + void Clear( void ); +}; + + +class LotAttrTable +{ +private: + LotAttrCol pCols[ MAXCOLCOUNT ]; + LotAttrCache aAttrCache; +public: + LotAttrTable( void ); + ~LotAttrTable(); + + void SetAttr( const SCCOL nColFirst, const SCCOL nColLast, const SCROW nRow, const LotAttrWK3& ); + void Apply( const SCTAB nTabNum ); +}; + + + + + +#endif + diff --git a/sc/source/filter/inc/lotfntbf.hxx b/sc/source/filter/inc/lotfntbf.hxx new file mode 100644 index 000000000000..5c8771814206 --- /dev/null +++ b/sc/source/filter/inc/lotfntbf.hxx @@ -0,0 +1,111 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_LOTFNTBF_HXX +#define SC_LOTFNTBF_HXX + +#include <tools/solar.h> + +#include "scitems.hxx" +#include <editeng/fontitem.hxx> +#include <editeng/fhgtitem.hxx> +#include <editeng/colritem.hxx> + +// ---------------------------------------------------- class LotusFontBuffer - + +// Code in fontbuff.cxx (excel) + +class LotusFontBuffer +{ +private: + struct ENTRY + { + String* pTmpName; + SvxFontItem* pFont; + SvxFontHeightItem* pHeight; + SvxColorItem* pColor; + INT32 nType; // < 0 -> undefiniert + inline ENTRY( void ) + { + pTmpName = NULL; + pFont = NULL; + pHeight = NULL; + pColor = NULL; + nType = -1; + } + inline ~ENTRY() + { + if( pTmpName ) + delete pTmpName; + if( pFont ) + delete pFont; + if( pHeight ) + delete pHeight; + if( pColor ) + delete pColor; + } + inline void TmpName( const String &rNew ) + { + if( pTmpName ) + *pTmpName = rNew; + else + pTmpName = new String( rNew ); + } + inline void Font( SvxFontItem& rNew ) + { + if( pFont ) + delete pFont; + pFont = &rNew; + } + inline void Height( SvxFontHeightItem& rNew ) + { + if( pHeight ) + delete pHeight; + pHeight = &rNew; + } + inline void Color( SvxColorItem& rNew ) + { + if( pColor ) + delete pColor; + pColor = &rNew; + } + inline void Type( const UINT16 nNew ) { nType = nNew; } + }; + + ENTRY pData[ 8 ]; + const static UINT16 nSize; + void MakeFont( ENTRY* pEntry ); +public: + void Fill( const UINT8 nIndex, SfxItemSet& rItemSet ); + void SetName( const UINT16 nIndex, const String& rName ); + void SetHeight( const UINT16 nIndex, const UINT16 nHeight ); + void SetType( const UINT16 nIndex, const UINT16 nType ); +}; + + + +#endif diff --git a/sc/source/filter/inc/lotform.hxx b/sc/source/filter/inc/lotform.hxx new file mode 100644 index 000000000000..0a341e29ae51 --- /dev/null +++ b/sc/source/filter/inc/lotform.hxx @@ -0,0 +1,132 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_LOTFORM_HXX +#define SC_LOTFORM_HXX + +#include "formel.hxx" +#include <tools/string.hxx> + + + + +enum FUNC_TYPE +{ + FT_Return = 0, // End Formula + FT_FuncFix0, // Funktion, 0 Parameter + FT_FuncFix1, // Funktion, 0 Parameter + FT_FuncFix2, // Funktion, 0 Parameter + FT_FuncFix3, // Funktion, 0 Parameter + FT_FuncFix4, // Funktion, 0 Parameter + FT_FuncVar, // ~, var. P. + FT_Neg, // Negierung + FT_Op, // Operator + FT_NotImpl, // nicht implementiert + FT_ConstFloat, // Double (8-Byte) + FT_Variable, // Single Ref + FT_Range, // Double Ref + FT_Braces, // Klammmern + FT_ConstInt, // Integer + FT_ConstString, // String + FT_NOP, // nichts + // zusaetzlich ab WK3 + FT_Cref, // Cell Reference + FT_Rref, // Range Reference + FT_Nrref, // Named range reference + FT_Absnref, // Absolut named range + FT_Erref, // Err range reference + FT_Ecref, // Err cell reference + FT_Econstant, // Err constant + FT_Splfunc, // SPLfunction + FT_Const10Float,// Float (10-Byte) + FT_Snum // Const Short Num + // fuer 'Problemfaelle' beim Import +}; + + + + +class LotusToSc : public LotusConverterBase +{ +private: + CharSet eSrcChar; + TokenId nAddToken; // ')+1.0' + TokenId nSubToken; // ~ + TokenId n0Token; // '0.0'; + // --------------------------------------------------------------- + static FUNC_TYPE IndexToType( BYTE ); + static DefTokenId IndexToToken( BYTE ); + static FUNC_TYPE IndexToTypeWK123( BYTE ); + static DefTokenId IndexToTokenWK123( BYTE ); + void DoFunc( DefTokenId eOc, BYTE nAnz, const sal_Char* pExtName ); + void LotusRelToScRel( UINT16 nCol, UINT16 nRow, + ScSingleRefData& rSRD ); + BOOL bWK3; // alternative Codeumsetzung statt fuer < WK1 + BOOL bWK123; // alternative for 123 + // ------------------------------------------------------------------- + void ReadSRD( ScSingleRefData& rSRD, BYTE nFlags ); + inline void ReadCRD( ScComplexRefData& rCRD, BYTE nFlags ); + void IncToken( TokenId &rParam ); + // ACHTUNG: hier wird die aktuelle Token-Kette im Pool + // mit '(<rParam>)+1' fortgeschrieben und mit + // Store() abgeschlossen! + void DecToken( TokenId& rParam ); + // ACHTUNG: ~ + void NegToken( TokenId& rParam ); + // ACHTUNG: wie ~, nur wird '-(<rParam>)' gebildet +public: + LotusToSc( SvStream& aStr, CharSet eSrc, BOOL b ); + virtual ConvErr Convert( const ScTokenArray*& rpErg, INT32& nRest, + const FORMULA_TYPE eFT = FT_CellFormula ); + + void Reset( const ScAddress& rEingPos ); + inline void SetWK3( void ); + +private: + using LotusConverterBase::Reset; +}; + + +inline void LotusToSc::ReadCRD( ScComplexRefData& rCRD, BYTE nRelBit ) +{ + // erster Teil + ReadSRD( rCRD.Ref1, nRelBit ); + + // zweiter Teil + ReadSRD( rCRD.Ref2, nRelBit >> 3 ); +} + + +inline void LotusToSc::SetWK3( void ) +{ + bWK3 = TRUE; +} + + + +#endif + diff --git a/sc/source/filter/inc/lotimpop.hxx b/sc/source/filter/inc/lotimpop.hxx new file mode 100644 index 000000000000..15c0a2931dc4 --- /dev/null +++ b/sc/source/filter/inc/lotimpop.hxx @@ -0,0 +1,169 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_LOTIMPOP_HXX +#define SC_LOTIMPOP_HXX + +#include <tools/string.hxx> + +#include "imp_op.hxx" +#include "flttypes.hxx" +#include "ftools.hxx" +#include "lotform.hxx" +#include "lotattr.hxx" + +class ScFormulaCell; +class LotusFontBuffer; +class SvxBorderLine; + + +class ImportLotus : public ImportTyp +{ +private: + SvStream* pIn; // benoetigt wegen multiplem Read()! + LotusFontBuffer* pFontBuff; + LotusToSc aConv; + UINT16 nTab; // z.Zt. bearbeitete Tabelle + INT32 nExtTab; + // ------------------------------------------------------------------- + // in WK?-Datei + void Bof( void ); // 0x0000 00 + BOOL BofFm3( void ); // 0x0000 00 + void Columnwidth( UINT16 nRecLen ); // 0x0007 07 + void Hiddencolumn( UINT16 nRecLen ); // 0x0008 08 + void Userrange( void ); // 0x0009 09 + void Errcell( void ); // 0x0014 20 + void Nacell( void ); // 0x0015 21 + void Labelcell( void ); // 0x0016 22 + void Numbercell( void ); // 0x0017 23 + void Smallnumcell( void ); // 0x0018 24 + ScFormulaCell* Formulacell( UINT16 nRecLen ); // 0x0019 25 + void Formulastring( ScFormulaCell& ); // 0x001a 26 + // 0x001b 27 special + void NamedSheet( void ); // 14000 + void RowPresentation( UINT16 nRecLen ); // 2007 + + // ------------------------------------------------------------------- + // in FM?-Datei + void Font_Face( void ); // 174 + void Font_Type( void ); // 176 + void Font_Ysize( void ); // 177 + void _Row( const UINT16 nRecLen ); // 197 ? + // ------------------------------------------------------------------- + inline void Read( ScAddress& ); + inline void Read( ScRange& ); + // fuer Addresses/Ranges im Format Row(16)/Tab(8)/Col(8) + inline void Read( sal_Char& ); + inline void Read( BYTE& ); + inline void Read( UINT16& ); + inline void Read( INT16& ); + inline void Read( UINT32& ); + inline void Read( double& ); // 10-Byte-IEEE lesen + inline void Read( LotAttrWK3& ); + void Read( String& ); // 0-terminierten String einlesen + inline void Skip( const UINT16 nNumBytes ); + // ------------------------------------------------------------------- +public: + ImportLotus( SvStream&, ScDocument*, CharSet eSrc ); + + virtual ~ImportLotus(); + + FltError Read(); + FltError Read( SvStream& ); // special for *.fm3-Dateien +}; + + +inline void ImportLotus::Read( ScAddress& rAddr ) +{ + UINT16 nRow; + *pIn >> nRow; + rAddr.SetRow( static_cast<SCROW>(nRow) ); + BYTE nByte; + *pIn >> nByte; + rAddr.SetTab( static_cast<SCTAB>(nByte) ); + *pIn >> nByte; + rAddr.SetCol( static_cast<SCCOL>(nByte) ); +} + + +inline void ImportLotus::Read( ScRange& rRange ) +{ + Read( rRange.aStart ); + Read( rRange.aEnd ); +} + + +inline void ImportLotus::Read( sal_Char& r ) +{ + *pIn >> r; +} + + +inline void ImportLotus::Read( BYTE& r ) +{ + *pIn >> r; +} + + +inline void ImportLotus::Read( UINT16& r ) +{ + *pIn >> r; +} + + +inline void ImportLotus::Read( INT16& r ) +{ + *pIn >> r; +} + + +inline void ImportLotus::Read( UINT32& r ) +{ + *pIn >> r; +} + + +inline void ImportLotus::Read( double& r ) +{ + r = ScfTools::ReadLongDouble( *pIn ); +} + + +inline void ImportLotus::Read( LotAttrWK3& r ) +{ + *pIn >> r.nFont >> r.nFontCol >> r.nBack >> r.nLineStyle; +} + + +inline void ImportLotus::Skip( const UINT16 n ) +{ + pIn->SeekRel( n ); +} + + + +#endif diff --git a/sc/source/filter/inc/lotrange.hxx b/sc/source/filter/inc/lotrange.hxx new file mode 100644 index 000000000000..ab9acf9f476e --- /dev/null +++ b/sc/source/filter/inc/lotrange.hxx @@ -0,0 +1,167 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_LOTRANGE_HXX +#define SC_LOTRANGE_HXX + +#include <tools/solar.h> +#include <compiler.hxx> + +// --------------------------------------------------------- class LotusRange - + +class LotusRangeList; + +typedef UINT16 LR_ID; +#define ID_FAIL 0xFFFF + +class LotusRange +{ + friend class LotusRangeList; +private: + UINT32 nHash; + SCCOL nColStart; + SCROW nRowStart; + SCCOL nColEnd; + SCROW nRowEnd; + LR_ID nId; + void MakeHash( void ); + inline void Copy( const LotusRange& ); + inline void SetId( LR_ID nId ); +public: + LotusRange( SCCOL nCol, SCROW nRow ); + LotusRange( SCCOL nColS, SCROW nRowS, SCCOL nColE, SCROW nRowE ); + LotusRange( const LotusRange& ); + inline LotusRange &operator =( const LotusRange& ); + inline BOOL operator ==( const LotusRange& ) const; + inline BOOL operator !=( const LotusRange& ) const; + inline BOOL IsSingle( void ) const; +}; + + +inline void LotusRange::Copy( const LotusRange& rCpy ) +{ + nColStart = rCpy.nColStart; + nRowStart = rCpy.nRowStart; + nColEnd = rCpy.nColEnd; + nRowEnd = rCpy.nRowEnd; +} + + +inline void LotusRange::SetId( LR_ID nNewId ) +{ + nId = nNewId; +} + + +inline LotusRange &LotusRange::operator =( const LotusRange& rCpy ) +{ + Copy( rCpy ); + return *this; +} + + +inline BOOL LotusRange::operator ==( const LotusRange& rRef ) const +{ + return ( nHash == rRef.nHash && nColStart == rRef.nColStart && + nRowStart == rRef.nRowStart && nColEnd == rRef.nColEnd && + nRowEnd == rRef.nRowEnd ); +} + + +inline BOOL LotusRange::operator !=( const LotusRange& rRef ) const +{ + return ( nHash != rRef.nHash || nColStart != rRef.nColStart || + nRowStart != rRef.nRowStart || nColEnd != rRef.nColEnd || + nRowEnd != rRef.nRowEnd ); +} + + +inline BOOL LotusRange::IsSingle( void ) const +{ + return ( nColStart == nColEnd && nRowStart == nRowEnd ); +} + + + +// ----------------------------------------------------- class LotusRangeList - + +class LotusRangeList : private List +{ +private: + LR_ID nIdCnt; + ScComplexRefData aComplRef; + static SCCOL nEingCol; + static SCROW nEingRow; +public: + LotusRangeList( void ); + ~LotusRangeList( void ); + inline UINT16 GetIndex( SCCOL nCol, SCROW nRow ); + inline UINT16 GetIndex( SCCOL nColS, SCROW nRowS, SCCOL nColE, SCROW nRowE ); + UINT16 GetIndex( const LotusRange& ); + inline void Append( SCCOL nCol, SCROW nRow, const String& ); + inline void Append( SCCOL nColS, SCROW nRowS, SCCOL nColE, SCROW nRowE, const String& ); + void Append( LotusRange* pLR, const String& rName ); + inline static void SetEing( const SCCOL nCol, const SCROW nRow ); +}; + + +inline LR_ID LotusRangeList::GetIndex( SCCOL nCol, SCROW nRow ) +{ + LotusRange aRef( nCol, nRow ); + return GetIndex( aRef ); +} + + +inline LR_ID LotusRangeList::GetIndex( SCCOL nColS, SCROW nRowS, SCCOL nColE, SCROW nRowE ) +{ + LotusRange aRef( nColS, nRowS, nColE, nRowE ); + return GetIndex( aRef ); +} + + +inline void LotusRangeList::Append( SCCOL nCol, SCROW nRow, const String& rName ) +{ + Append( new LotusRange( nCol, nRow ), rName ); +} + + +inline void LotusRangeList::Append( SCCOL nColS, SCROW nRowS, SCCOL nColE, SCROW nRowE, const String& r ) +{ + Append( new LotusRange( nColS, nRowS, nColE, nRowE ), r ); +} + + +inline void LotusRangeList::SetEing( const SCCOL nCol, const SCROW nRow ) +{ + nEingCol = nCol; + nEingRow = nRow; +} + +#endif + + + diff --git a/sc/source/filter/inc/makefile.mk b/sc/source/filter/inc/makefile.mk new file mode 100644 index 000000000000..1b35ca49549d --- /dev/null +++ b/sc/source/filter/inc/makefile.mk @@ -0,0 +1,26 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* diff --git a/sc/source/filter/inc/namebuff.hxx b/sc/source/filter/inc/namebuff.hxx new file mode 100644 index 000000000000..c8182e8c0c17 --- /dev/null +++ b/sc/source/filter/inc/namebuff.hxx @@ -0,0 +1,356 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_NAMEBUFF_HXX +#define SC_NAMEBUFF_HXX + +#include <tools/debug.hxx> +#include <tools/string.hxx> +#include "compiler.hxx" +#include "root.hxx" +#include "xiroot.hxx" + +#include "rangenam.hxx" +#include <hash_map> +#include <list> + +class ScDocument; +class ScTokenArray; +class NameBuffer; + + + + +class StringHashEntry +{ +private: + friend class NameBuffer; + String aString; + UINT32 nHash; + + static UINT32 MakeHashCode( const String& ); +public: + inline StringHashEntry( const String& ); + inline StringHashEntry( void ); + inline void operator =( const sal_Char* ); + inline void operator =( const String& ); + inline void operator =( const StringHashEntry& ); + inline BOOL operator ==( const StringHashEntry& ) const; +}; + + +inline StringHashEntry::StringHashEntry( void ) +{ +} + + +inline StringHashEntry::StringHashEntry( const String& r ) : aString( r ) +{ + nHash = MakeHashCode( r ); +} + + +inline void StringHashEntry::operator =( const sal_Char* p ) +{ + aString.AssignAscii( p ); + nHash = MakeHashCode( aString ); +} + + +inline void StringHashEntry::operator =( const String& r ) +{ + aString = r; + nHash = MakeHashCode( r ); +} + + +inline void StringHashEntry::operator =( const StringHashEntry& r ) +{ + nHash = r.nHash; + aString = r.aString; +} + + +inline BOOL StringHashEntry::operator ==( const StringHashEntry& r ) const +{ + return ( nHash == r.nHash && aString == r.aString ); +} + + + +class NameBuffer : private List, public ExcRoot +{ +private: + UINT16 nBase; // Index-Basis +public: +// inline NameBuffer( void ); //#94039# prevent empty rootdata + inline NameBuffer( RootData* ); + inline NameBuffer( RootData*, UINT16 nNewBase ); + + virtual ~NameBuffer(); + inline const String* Get( UINT16 nIndex ); + inline UINT16 GetLastIndex( void ); + inline void SetBase( UINT16 nNewBase = 0 ); + void operator <<( const String& rNewString ); +}; + +//#94039# prevent empty rootdata +//inline NameBuffer::NameBuffer( void ) +//{ +// nBase = 0; +//} + + +inline NameBuffer::NameBuffer( RootData* p ) : ExcRoot( p ) +{ + nBase = 0; +} + + +inline NameBuffer::NameBuffer( RootData* p, UINT16 nNewBase ) : ExcRoot( p ) +{ + nBase = nNewBase; +} + + +inline const String* NameBuffer::Get( UINT16 n ) +{ + if( n < nBase ) + return NULL; + else + { + StringHashEntry* pObj = ( StringHashEntry* ) List::GetObject( n ); + + if( pObj ) + return &pObj->aString; + else + return NULL; + } +} + + +inline UINT16 NameBuffer::GetLastIndex( void ) +{ + DBG_ASSERT( Count() + nBase <= 0xFFFF, "*NameBuffer::GetLastIndex(): Ich hab' die Nase voll!" ); + + return ( UINT16 ) ( Count() + nBase ); +} + + +inline void NameBuffer::SetBase( UINT16 nNewBase ) +{ + nBase = nNewBase; +} + + + + +class ShrfmlaBuffer : public ExcRoot +{ + struct ScAddressHashFunc : public std::unary_function< const ScAddress &, size_t > + { + size_t operator() (const ScAddress &addr) const; + }; + typedef std::hash_map <ScAddress, USHORT, ScAddressHashFunc> ShrfmlaHash; + typedef std::list <ScRange> ShrfmlaList; + + ShrfmlaHash index_hash; + ShrfmlaList index_list; + size_t mnCurrIdx; + +public: + ShrfmlaBuffer( RootData* pRD ); + virtual ~ShrfmlaBuffer(); + void Clear(); + void Store( const ScRange& rRange, const ScTokenArray& ); + USHORT Find (const ScAddress & rAddress ) const; + + static String CreateName( const ScRange& ); + }; + + + + +class RangeNameBufferWK3 : private List +{ +private: + struct ENTRY + { + StringHashEntry aStrHashEntry; + ScComplexRefData aScComplexRefDataRel; + String aScAbsName; + UINT16 nAbsInd; // == 0 -> noch keine Abs-Name! + UINT16 nRelInd; + BOOL bSingleRef; + ENTRY( const String& rName, const String& rScName, const ScComplexRefData& rCRD ) : + aStrHashEntry( rName ), + aScComplexRefDataRel( rCRD ), + aScAbsName( rScName ) + { + nAbsInd = 0; + aScAbsName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "_ABS" ) ); + } + }; + + ScTokenArray* pScTokenArray; + UINT16 nIntCount; +public: + RangeNameBufferWK3( void ); + virtual ~RangeNameBufferWK3(); + void Add( const String& rName, const ScComplexRefData& rCRD ); + inline void Add( const String& rName, const ScRange& aScRange ); + BOOL FindRel( const String& rRef, UINT16& rIndex ); + BOOL FindAbs( const String& rRef, UINT16& rIndex ); +}; + + +inline void RangeNameBufferWK3::Add( const String& rName, const ScRange& aScRange ) +{ + ScComplexRefData aCRD; + ScSingleRefData* pSRD; + const ScAddress* pScAddr; + + pSRD = &aCRD.Ref1; + pScAddr = &aScRange.aStart; + pSRD->SetFlag3D( TRUE ); + pSRD->nCol = pScAddr->Col(); + pSRD->nRow = pScAddr->Row(); + pSRD->nTab = pScAddr->Tab(); + + // zunaechst ALLE Refs nur absolut + pSRD->SetColRel( FALSE ); + pSRD->SetRowRel( FALSE ); + pSRD->SetTabRel( FALSE ); + + pSRD = &aCRD.Ref2; + pScAddr = &aScRange.aEnd; + pSRD->SetFlag3D( TRUE ); + pSRD->nCol = pScAddr->Col(); + pSRD->nRow = pScAddr->Row(); + pSRD->nTab = pScAddr->Tab(); + + // zunaechst ALLE Refs nur absolut + pSRD->SetColRel( FALSE ); + pSRD->SetRowRel( FALSE ); + pSRD->SetTabRel( FALSE ); + + Add( rName, aCRD ); +} + + + + +class ExtSheetBuffer : private List, public ExcRoot +{ +private: + struct Cont + { + String aFile; + String aTab; + UINT16 nTabNum; // 0xFFFF -> noch nicht angelegt + // 0xFFFE -> versucht anzulegen, ging aber schief + // 0xFFFD -> soll im selben Workbook sein, findet's aber nicht + BOOL bSWB; + BOOL bLink; + Cont( const String& rFilePathAndName, const String& rTabName ) : + aFile( rFilePathAndName ), + aTab( rTabName ) + { + nTabNum = 0xFFFF; // -> Tabelle noch nicht erzeugt + bSWB = bLink = FALSE; + } + Cont( const String& rFilePathAndName, const String& rTabName, + const BOOL bSameWB ) : + aFile( rFilePathAndName ), + aTab( rTabName ) + { + nTabNum = 0xFFFF; // -> Tabelle noch nicht erzeugt + bSWB = bSameWB; + bLink = FALSE; + } + }; +public: + inline ExtSheetBuffer( RootData* ); + virtual ~ExtSheetBuffer(); + + sal_Int16 Add( const String& rFilePathAndName, + const String& rTabName, const BOOL bSameWorkbook = FALSE ); + + BOOL GetScTabIndex( UINT16 nExcSheetIndex, UINT16& rIn_LastTab_Out_ScIndex ); + BOOL IsLink( const UINT16 nExcSheetIndex ) const; + BOOL GetLink( const UINT16 nExcSheetIndex, String &rAppl, String &rDoc ) const; + + void Reset( void ); +}; + + +inline ExtSheetBuffer::ExtSheetBuffer( RootData* p ) : ExcRoot( p ) +{ +} + + + + +struct ExtName +{ + String aName; + UINT32 nStorageId; + UINT16 nFlags; + + inline ExtName( const String& r, sal_uInt16 n ) : aName( r ), nStorageId( 0 ), nFlags( n ) {} + + BOOL IsDDE( void ) const; + BOOL IsOLE( void ) const; +}; + + + + +class ExtNameBuff : protected XclImpRoot +{ +public: + explicit ExtNameBuff( const XclImpRoot& rRoot ); + + void AddDDE( const String& rName, sal_Int16 nRefIdx ); + void AddOLE( const String& rName, sal_Int16 nRefIdx, UINT32 nStorageId ); + void AddName( const String& rName, sal_Int16 nRefIdx ); + + const ExtName* GetNameByIndex( sal_Int16 nRefIdx, sal_uInt16 nNameIdx ) const; + + void Reset(); + +private: + typedef ::std::vector< ExtName > ExtNameVec; + typedef ::std::map< sal_Int16, ExtNameVec > ExtNameMap; + + ExtNameMap maExtNames; +}; + + +#endif + + diff --git a/sc/source/filter/inc/op.h b/sc/source/filter/inc/op.h new file mode 100644 index 000000000000..2548bdfa34c3 --- /dev/null +++ b/sc/source/filter/inc/op.h @@ -0,0 +1,70 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_OP_H +#define SC_OP_H + +#include <tools/solar.h> +#include <patattr.hxx> + +// OP-Code-Funktionen +class SvStream; +void NI( SvStream &aStream, USHORT nLaenge ); +void OP_BOF( SvStream &aStream, USHORT nLaenge ); +void OP_EOF( SvStream &aStream, USHORT nLaenge ); +void OP_Integer( SvStream &aStream, USHORT nLaenge ); +void OP_Number( SvStream &aStream, USHORT nLaenge ); +void OP_Label( SvStream &aStream, USHORT nLaenge ); +//UNUSED2009-05 void OP_Text( SvStream &aStream, USHORT nLaenge ); // WK3 +void OP_Integer3( SvStream &aStream, USHORT nLaenge ); // WK3 +void OP_Number3( SvStream &aStream, USHORT nLaenge ); // WK3 +void OP_Formula( SvStream &aStream, USHORT nLaenge ); +void OP_Formula3( SvStream &aStream, USHORT nLaenge ); // WK3 +void OP_ColumnWidth( SvStream &aStream, USHORT nLaenge ); +void OP_NamedRange( SvStream &aStream, USHORT nLaenge ); +void OP_SymphNamedRange( SvStream &aStream, USHORT nLaenge ); +void OP_Footer( SvStream &aStream, USHORT nLaenge ); +void OP_Header( SvStream &aStream, USHORT nLaenge ); +void OP_Margins( SvStream &aStream, USHORT nLaenge ); +void OP_HiddenCols( SvStream &aStream, USHORT nLaenge ); +void OP_Window1( SvStream &aStream, USHORT nLaenge ); +void OP_Blank( SvStream &aStream, USHORT nLaenge ); +// Lotus 123 bits. +void OP_BOF123( SvStream &aStream, USHORT nLaenge ); +void OP_EOF123( SvStream &aStream, USHORT nLaenge ); +void OP_Number123( SvStream &aStream, USHORT nLaenge ); +void OP_Label123( SvStream &aStream, USHORT nLaenge ); +void OP_Formula123( SvStream &aStream, USHORT nLaenge ); +void OP_IEEENumber123(SvStream& r, UINT16 n); +void OP_Note123(SvStream &aStream, USHORT nLaenge); +void OP_CreatePattern123(SvStream &aStream, USHORT nLaenge); +void OP_SheetName123( SvStream &rStream, USHORT nLength ); +void OP_HorAlign123(BYTE nAlignPattern, SfxItemSet& rPattern /* const ScPatternAttr& rPattern*/ ); +void OP_VerAlign123(BYTE nAlignPattern, SfxItemSet& rPattern /* const ScPatternAttr& rPattern*/ ); +void OP_ApplyPatternArea123(SvStream& r); + +#endif diff --git a/sc/source/filter/inc/optab.h b/sc/source/filter/inc/optab.h new file mode 100644 index 000000000000..d70eb1f29bb0 --- /dev/null +++ b/sc/source/filter/inc/optab.h @@ -0,0 +1,52 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_OPTAB_H +#define SC_OPTAB_H + +typedef void ( *OPCODE_FKT )( SvStream &aStream, USHORT nLaenge ); + +#define FKT_LIMIT 101 + +#define FKT_LIMIT123 101 + +#define LOTUS_EOF 0x01 + +#define LOTUS_FILEPASSWD 0x4b + +#define LOTUS_PATTERN 0x284 + +#define LOTUS_FORMAT_INDEX 0x800 + +#define LOTUS_FORMAT_INFO 0x801 + +#define ROW_FORMAT_MARKER 0x106 + +#define COL_FORMAT_MARKER 0x107 + +#endif + diff --git a/sc/source/filter/inc/otlnbuff.hxx b/sc/source/filter/inc/otlnbuff.hxx new file mode 100644 index 000000000000..6ccca361345b --- /dev/null +++ b/sc/source/filter/inc/otlnbuff.hxx @@ -0,0 +1,78 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_OTLNBUFF_HXX +#define SC_OTLNBUFF_HXX + +#include <tools/solar.h> + +class ScOutlineArray; + +class XclImpOutlineBuffer +{ + // -> exctools.cxx + private: + BYTE* pLevel; + BOOL* pOuted; + BOOL* pHidden; + SCSIZE nSize; + SCSIZE nLast; + BYTE nMaxLevel; + ScOutlineArray* pOutlineArray; + BOOL bButtonNormal; // TRUE -> right / under + public: + XclImpOutlineBuffer( SCSIZE nNewSize ); + ~XclImpOutlineBuffer(); + void SetLevel( SCSIZE nIndex, BYTE nVal, BOOL bOuted, BOOL bHidden ); + void SetOutlineArray( ScOutlineArray* pOArray ); + void Reset( void ); + void MakeScOutline( void ); + void SetLevelRange( SCSIZE nF, SCSIZE nL, BYTE nVal, + BOOL bOuted, BOOL bHidden ); + + inline BOOL HasOutline( void ) const; + + inline void SetButtonMode( const BOOL bRightOrUnder ); +}; + + + + +inline BOOL XclImpOutlineBuffer::HasOutline( void ) const +{ + return nMaxLevel > 0; +} + + +inline void XclImpOutlineBuffer::SetButtonMode( const BOOL b ) +{ + bButtonNormal = b; +} + + +#endif + diff --git a/sc/source/filter/inc/qpro.hxx b/sc/source/filter/inc/qpro.hxx new file mode 100644 index 000000000000..f631da120373 --- /dev/null +++ b/sc/source/filter/inc/qpro.hxx @@ -0,0 +1,59 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_QPRO_HXX +#define SC_QPRO_HXX + +#include <sal/config.h> +#include "filter.hxx" +#include "document.hxx" +#include "cell.hxx" +#include <tools/string.hxx> + +#include <tools/color.hxx> +#include "flttypes.hxx" +#include "ftools.hxx" +#include "qprostyle.hxx" +#include "biff.hxx" + +// Stream wrapper class +class ScQProReader : public ScBiffReader +{ + public: + bool recordsLeft(); + void SetEof( bool bValue ){ mbEndOfFile = bValue; } + bool nextRecord(); + sal_uInt16 getId() { return mnId; } + sal_uInt16 getLength() { return mnLength; } + void readString( String &rString, sal_uInt16 nLength ); + ScQProReader( SfxMedium &rMedium ); + ~ScQProReader(){ }; + FltError import( ScDocument *pDoc ); + FltError readSheet( SCTAB nTab, ScDocument* pDoc, ScQProStyle *pStyle ); +}; +#endif + diff --git a/sc/source/filter/inc/qproform.hxx b/sc/source/filter/inc/qproform.hxx new file mode 100644 index 000000000000..18327cd141df --- /dev/null +++ b/sc/source/filter/inc/qproform.hxx @@ -0,0 +1,86 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#ifndef SC_QPROFORM_HXX +#define SC_QPROFORM_HXX + +#include <sal/config.h> +#include "formel.hxx" +#include <tools/string.hxx> +#include "qpro.hxx" + +#include <compiler.hxx> +typedef OpCode DefTokenId; + +enum FUNC_TYPE +{ + FT_Return, + FT_FuncFix0, + FT_FuncFix1, + FT_FuncFix2, + FT_FuncFix3, + FT_FuncFix4, + FT_FuncFix5, + FT_FuncFix6, + FT_FuncVar, + FT_DLL, + FT_Neg, + FT_Op, + FT_NotImpl, + FT_ConstFloat, + FT_Range, + FT_Braces, + FT_ConstInt, + FT_ConstString, + FT_NOP, + FT_Cref +}; + +class QProToSc : public ConverterBase +{ + private: + TokenId mnAddToken; + TokenId mnSubToken; + TokenId mn0Token; + SvStream& maIn; + + public: + static const size_t nBufSize = 256; + QProToSc( SvStream &aStr, const ScAddress& rRefPos ); + ~QProToSc(){ }; + ConvErr Convert( const ScTokenArray*& pArray, sal_uInt16 nLen, + const FORMULA_TYPE eFT = FT_CellFormula ); + void DoFunc( DefTokenId eOc, sal_uInt16 nArgs, const sal_Char* pExtString ); + void ReadSRD( ScSingleRefData& rR, sal_Int8 nPage, sal_Int8 nCol, sal_uInt16 rRel ); + void IncToken( TokenId &aParam ); + DefTokenId IndexToToken( sal_uInt16 nToken ); + FUNC_TYPE IndexToType( sal_uInt8 nToken ); + DefTokenId IndexToDLLId( sal_uInt16 nIndex ); + const sal_Char* getString( sal_uInt8 nIndex ); +}; +#endif diff --git a/sc/source/filter/inc/qprostyle.hxx b/sc/source/filter/inc/qprostyle.hxx new file mode 100644 index 000000000000..ffce2630b310 --- /dev/null +++ b/sc/source/filter/inc/qprostyle.hxx @@ -0,0 +1,69 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#ifndef SC_QPROSTYLE_HXX +#define SC_QPROSTYLE_HXX + +#include <sal/config.h> +#include "filter.hxx" +#include "document.hxx" +#include "cell.hxx" +#include <tools/string.hxx> + +#include <tools/color.hxx> +#include "flttypes.hxx" +#include "ftools.hxx" + +class ScQProStyle +{ + enum limits { maxsize = 256 }; + sal_uInt8 maAlign[ maxsize ]; + sal_uInt8 maFont[ maxsize ]; + sal_uInt16 maFontRecord[ maxsize ]; + sal_uInt16 maFontHeight[ maxsize ]; + String maFontType[ maxsize ]; + + public: + ScQProStyle(); + void SetFormat( ScDocument *pDoc, sal_uInt8 nCol, sal_uInt16 nRow, SCTAB nTab, sal_uInt16 nStyle ); + void setFontRecord(sal_uInt16 nIndex, sal_uInt16 nData, sal_uInt16 nPtSize) + { + if (nIndex < maxsize) + { + maFontRecord[ nIndex ] = nData; + maFontHeight[ nIndex ] = nPtSize; + } + } + void setFontType( sal_uInt16 nIndex, String &aLabel ) + { if (nIndex < maxsize) maFontType[ nIndex ] = aLabel; } + void setAlign( sal_uInt16 nIndex, sal_uInt8 nData ) + { if (nIndex < maxsize) maAlign[ nIndex ] = nData; } + void setFont( sal_uInt16 nIndex, sal_uInt8 nData ) + { if (nIndex < maxsize) maFont[ nIndex ] = nData; } +}; +#endif diff --git a/sc/source/filter/inc/root.hxx b/sc/source/filter/inc/root.hxx new file mode 100644 index 000000000000..facc8b1b2fa0 --- /dev/null +++ b/sc/source/filter/inc/root.hxx @@ -0,0 +1,119 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_ROOT_HXX +#define SC_ROOT_HXX + +#include <tools/solar.h> +#include "global.hxx" +#include "address.hxx" +#include "flttypes.hxx" +#include "filter.hxx" +#include "excdefs.hxx" + +class ScRangeName; + +class NameBuffer; +class RangeNameBufferWK3; +class ShrfmlaBuffer; +class ExtNameBuff; +class ExtSheetBuffer; +class ExcelToSc; + +class XclImpColRowSettings; +class XclImpAutoFilterBuffer; +class XclImpPivotCacheList; +class _ScRangeListTabs; + +class XclExpChTrTabId; +class XclExpUserBViewList; + +class XclImpRoot; +class XclExpRoot; + +// ---------------------------------------------------------- Excel Imp~/Exp~ - + +struct RootData // -> Inkarnation jeweils im ImportExcel-Objekt! +{ + BiffTyp eDateiTyp; // feine Differenzierung + ExtSheetBuffer* pExtSheetBuff; + ShrfmlaBuffer* pShrfmlaBuff; + ExtNameBuff* pExtNameBuff; + ExcelToSc* pFmlaConverter; + XclImpColRowSettings* pColRowBuff; // Col/Row-Einstellungen 1 Tabelle + + // Biff8 + XclImpAutoFilterBuffer* pAutoFilterBuffer; // ranges for autofilter and advanced filter + _ScRangeListTabs* pPrintRanges; + _ScRangeListTabs* pPrintTitles; + + // Erweiterungen fuer Export + XclExpChTrTabId* pTabId; // pointer to rec list, do not destroy + XclExpUserBViewList* pUserBViewList; // pointer to rec list, do not destroy + + XclImpRoot* pIR; + XclExpRoot* pER; + + RootData( void ); // -> exctools.cxx + ~RootData(); // -> exctools.cxx +}; + +class ExcRoot +{ +protected: + RootData* pExcRoot; + inline ExcRoot( RootData* pNexExcRoot ) : pExcRoot( pNexExcRoot ) {} + inline ExcRoot( const ExcRoot& rCopy ) : pExcRoot( rCopy.pExcRoot ) {} +}; + +// ---------------------------------------------------------- Lotus Imp~/Exp~ - + +class LotusRangeList; +class LotusFontBuffer; +class LotAttrTable; + + +struct LOTUS_ROOT +{ + ScDocument* pDoc; + LotusRangeList* pRangeNames; + ScRangeName* pScRangeName; + CharSet eCharsetQ; + Lotus123Typ eFirstType; + Lotus123Typ eActType; + ScRange aActRange; + RangeNameBufferWK3* pRngNmBffWK3; + LotusFontBuffer* pFontBuff; + LotAttrTable* pAttrTable; +}; + +extern LOTUS_ROOT* pLotusRoot; // -> Inkarn. in filter.cxx + +// ---------------------------------------------------------------------------- + +#endif + diff --git a/sc/source/filter/inc/rtfexp.hxx b/sc/source/filter/inc/rtfexp.hxx new file mode 100644 index 000000000000..4733d243d1a5 --- /dev/null +++ b/sc/source/filter/inc/rtfexp.hxx @@ -0,0 +1,52 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_RTFEXP_HXX +#define SC_RTFEXP_HXX + +#include "expbase.hxx" + + +class ScRTFExport : public ScExportBase +{ + ULONG* pCellX; // kumulierte Zellbreiten einer Tabelle + + void WriteTab( SCTAB nTab ); + void WriteRow( SCTAB nTab, SCROW nRow ); + void WriteCell( SCTAB nTab, SCROW nRow, SCCOL nCol ); + +public: + + ScRTFExport( SvStream&, ScDocument*, const ScRange& ); + virtual ~ScRTFExport(); + + ULONG Write(); +}; + + +#endif // SC_RTFEXP_HXX + diff --git a/sc/source/filter/inc/rtfimp.hxx b/sc/source/filter/inc/rtfimp.hxx new file mode 100644 index 000000000000..13ade86b7cd5 --- /dev/null +++ b/sc/source/filter/inc/rtfimp.hxx @@ -0,0 +1,41 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_RTFIMP_HXX +#define SC_RTFIMP_HXX + +#include "eeimport.hxx" + +class ScRTFImport : public ScEEImport +{ +public: + ScRTFImport( ScDocument* pDoc, const ScRange& rRange ); + ~ScRTFImport(); +}; + + +#endif diff --git a/sc/source/filter/inc/rtfparse.hxx b/sc/source/filter/inc/rtfparse.hxx new file mode 100644 index 000000000000..135e11e572ae --- /dev/null +++ b/sc/source/filter/inc/rtfparse.hxx @@ -0,0 +1,89 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_RTFPARSE_HXX +#define SC_RTFPARSE_HXX + +#include "eeparser.hxx" + +#ifdef SC_RTFPARSE_CXX + +struct ScRTFCellDefault +{ + SfxItemSet aItemSet; + SCCOL nCol; + USHORT nTwips; // rechter Rand der Zelle + SCCOL nColOverlap; // MergeCell wenn >1, merged cells wenn 0 + + ScRTFCellDefault( SfxItemPool* pPool ) : + aItemSet( *pPool ), nColOverlap(1) {} +}; + +DECLARE_LIST( ScRTFDefaultList, ScRTFCellDefault* ) +// Remove: (const unsigned short &) not sufficiently different from (unsigned short) +// deswegen ULONG, typedef bringt's auch nicht :-( +SV_DECL_VARARR_SORT( ScRTFColTwips, ULONG, 16, 4) + +#else // SC_RTFPARSE_CXX + +struct ScRTFCellDefault; +class ScRTFDefaultList; +class ScRTFColTwips; + +#endif // SC_RTFPARSE_CXX + + +class EditEngine; + +class ScRTFParser : public ScEEParser +{ +private: + ScRTFDefaultList* pDefaultList; + ScRTFColTwips* pColTwips; + ScRTFCellDefault* pInsDefault; + ScRTFCellDefault* pActDefault; + ScRTFCellDefault* pDefMerge; + ULONG nStartAdjust; + USHORT nLastWidth; + BOOL bNewDef; + + DECL_LINK( RTFImportHdl, ImportInfo* ); + inline void NextRow(); + void EntryEnd( ScEEParseEntry*, const ESelection& ); + void ProcToken( ImportInfo* ); + void ColAdjust(); + BOOL SeekTwips( USHORT nTwips, SCCOL* pCol ); + void NewCellRow( ImportInfo* ); + +public: + ScRTFParser( EditEngine* ); + virtual ~ScRTFParser(); + virtual ULONG Read( SvStream&, const String& rBaseURL ); +}; + + +#endif diff --git a/sc/source/filter/inc/scflt.hxx b/sc/source/filter/inc/scflt.hxx new file mode 100644 index 000000000000..995de274b28b --- /dev/null +++ b/sc/source/filter/inc/scflt.hxx @@ -0,0 +1,764 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_SCFLT_HXX +#define SC_SCFLT_HXX + +#include "viewopti.hxx" +#include "collect.hxx" +#include <tools/solar.h> + +// FehlerNummern +#define errUnknownFormat 1 +#define errUnknownID 2 +#define errOutOfMemory 3 + +// Identifiers im FileFormat +#define ColWidthID 1 +#define ColAttrID 2 +#define RowHeightID 3 +#define RowAttrID 4 +#define FontID 5 +#define NameID 6 +#define TableID 7 +#define ObjectID 8 +#define PatternID 9 +#define DataBaseID 10 + +// Zeilen/Spalten Flags +#define crfSoftBreak 1 +#define crfHardBreak 2 +#define crfHidden 4 + +// Zelltypen +#define ctValue 1 +#define ctString 2 +#define ctFormula 3 +#define ctNote 4 + +// FontStyles +#define ffDontCare 0x00 +#define ffRoman 0x10 +#define ffSwiss 0x20 +#define ffModern 0x30 +#define ffScript 0x40 +#define ffDecorative 0x50 + +// FontWeight +#define fwNormal 400 + +// FontAttribute +#define atNone 0 +#define atBold 1 +#define atItalic 2 +#define atUnderline 4 +#define atStrikeOut 8 + +// Horizontale Ausrichtung +#define hjNone 0 +#define hjLeft 1 +#define hjCenter 2 +#define hjRight 3 + +// Vertikale Ausrichtung +#define vjNone 0 +#define vjTop 1 +#define vjCenter 2 +#define vjBottom 3 + +// AusrichtungsFlags +#define ojWordBreak 0x01 +#define ojBottomTop 0x02 +#define ojTopBottom 0x04 + +// ZellRaster +#define raNone 0 +#define raGray12 1 +#define raGray25 2 +#define raGray50 3 +#define raGray75 4 +#define raGray100 5 + +// Zellschutz +#define paProtect 1 +#define paHideFormula 2 +#define paHideAll 4 +#define paHidePrint 8 + +// ZahlenFormatFlags +#define vfStandard 0 +#define vfMoney 1 +#define vfThousend 2 +#define vfPercent 3 +#define vfExponent 4 +#define vfZerro 5 +#define vfDate 6 +#define vfTime 7 +#define vfBoolean 8 +#define vfStandardRed 9 +#define vfMoneyRed 10 +#define vfThousendRed 11 +#define vfPercentRed 12 +#define vfExponentRed 13 +#define vfFormula 14 +#define vfString 15 +#define vfNone 16 + +// DatumsFormatFlags +#define df_NDMY_Long 0 +#define df_DMY_Long 1 +#define df_MY_Long 2 +#define df_NDM_Long 3 +#define df_DM_Long 4 +#define df_M_Long 5 +#define df_NDMY_Short 6 +#define df_DMY_Short 7 +#define df_MY_Short 8 +#define df_NDM_Short 9 +#define df_DM_Short 10 +#define df_M_Short 11 +#define df_Q_Long 12 +#define df_Q_Short 13 + +// ZeitFormatFlags +#define tf_HMS_Long 0 +#define tf_HM_Long 1 +#define tf_HMS_Short 2 +#define tf_HM_Short 3 + +// Attribute fuer FormatVorlage +#define pfValue 0x01 +#define pfFont 0x02 +#define pfJustify 0x04 +#define pfFrame 0x08 +#define pfRaster 0x10 +#define pfProtection 0x20 + +// Displayflags fuer die Tabelle +#define dfFormula 0x0001 // Formeln +#define dfZerro 0x0002 // Nullwerte +#define dfGrid 0x0004 // Gitternetz +#define dfPageBreak 0x0008 // Seitenumbruch +#define dfColRowBar 0x0010 // Zeilen/Spalten Koepfe (Dummy) +#define dfSyntax 0x0020 // Syntax Highlighting +#define dfPrintPage 0x0040 // Druckbildansicht (Dummy) +#define dfObjectAll 0x0080 // Objekte anzeigen +#define dfObjectFrame 0x0100 // Objekte als Platzhalter +#define dfObjectNone 0x0200 // Objekte nicht anzeigen +#define dfNoteMark 0x0400 // Notizanzeiger +#define dfProtectMark 0x0800 // Schutzanzeiger + +// Objekt Typen +#define otNone 0 // s.u. +#define otOle 1 +#define otImage 2 +#define otChart 3 + +// Grafik Typen +#define gtNone 0 // Kann nicht vorkommen +#define gtOle 1 // Ole 1.0 Objekt +#define gtImage 2 // Image (Bitmap oder Metafile) +#define gtChart 3 // Chart + +// Datum/Uhrzeit +struct Sc10DateTime +{ + USHORT Year; + USHORT Month; + USHORT Day; + USHORT Hour; + USHORT Min; + USHORT Sec; +}; + +// ZahlenFormate +struct Sc10ValueFormat +{ + BYTE Format; // Zahl, Waehrung, Prozent etc. + BYTE Info; // Anzahl Nachkommastellen, Anzahl Stellen, bzw. Datums/Zeitformat +}; + +// Fontbeschreibung +struct Sc10LogFont +{ + INT16 lfHeight; + INT16 lfWidth; + INT16 lfEscapement; + INT16 lfOrientation; + INT16 lfWeight; + BYTE lfItalic; + BYTE lfUnderline; + BYTE lfStrikeOut; + BYTE lfCharSet; + BYTE lfOutPrecision; + BYTE lfClipPrecision; + BYTE lfQuality; + BYTE lfPitchAndFamily; + sal_Char lfFaceName[32]; + + int operator==( const Sc10LogFont& rData ) const; +}; + +// RGB-Frabwerte +struct Sc10Color +{ + BYTE Dummy; + BYTE Blue; + BYTE Green; + BYTE Red; + int operator==( const Sc10Color& rColor ) const; +}; + +// Blockbeschreibung +struct Sc10BlockRect +{ + INT16 x1; + INT16 y1; + INT16 x2; + INT16 y2; +}; + +// Datenbank-Bereich +struct Sc10DataBaseRec +{ + sal_Char Name[32]; + INT16 Tab; + Sc10BlockRect Block; + BYTE RowHeader; + INT16 SortField0; + BYTE SortUpOrder0; + INT16 SortField1; + BYTE SortUpOrder1; + INT16 SortField2; + BYTE SortUpOrder2; + BYTE IncludeFormat; + INT16 QueryField0; + INT16 QueryOp0; + BYTE QueryByString0; + sal_Char QueryString0[64]; + double QueryValue0; + INT16 QueryConnect1; + INT16 QueryField1; + INT16 QueryOp1; + BYTE QueryByString1; + sal_Char QueryString1[64]; + double QueryValue1; + INT16 QueryConnect2; + INT16 QueryField2; + INT16 QueryOp2; + BYTE QueryByString2; + sal_Char QueryString2[64]; + double QueryValue2; +}; + +// Kopf/Fusszeilen-Beschreibung +struct Sc10HeadFootLine +{ + sal_Char Title[128]; + Sc10LogFont LogFont; + BYTE HorJustify; + BYTE VerJustify; + USHORT Raster; + USHORT Frame; + Sc10Color TextColor; + Sc10Color BackColor; + Sc10Color RasterColor; + USHORT FrameColor; // Nibble Codierte Farben link oben rechts unten + USHORT Reserved; + + int operator==( const Sc10HeadFootLine& rData ) const; +}; + +// Seitenformat +struct Sc10PageFormat +{ + Sc10HeadFootLine HeadLine; + Sc10HeadFootLine FootLine; + INT16 Orientation; + INT16 Width; + INT16 Height; + INT16 NonPrintableX; + INT16 NonPrintableY; + INT16 Left; + INT16 Top; + INT16 Right; + INT16 Bottom; + INT16 Head; + INT16 Foot; + BYTE HorCenter; + BYTE VerCenter; + BYTE PrintGrid; + BYTE PrintColRow; + BYTE PrintNote; + BYTE TopBottomDir; + sal_Char PrintAreaName[32]; + Sc10BlockRect PrintArea; + sal_Char PrnZoom[6]; // Pascal 6 Byte Realzahl + USHORT FirstPageNo; + INT16 RowRepeatStart; + INT16 RowRepeatEnd; + INT16 ColRepeatStart; + INT16 ColRepeatEnd; + sal_Char Reserved[26]; + + int operator==( const Sc10PageFormat& rData ) const; +}; + +// Tabellenschutz +struct Sc10TableProtect +{ + sal_Char PassWord[16]; + USHORT Flags; + BYTE Protect; +}; + +// Documentschutz +struct Sc10SheetProtect +{ + sal_Char PassWord[16]; + USHORT Flags; + BYTE Protect; +}; + +// Dateikopf StarCalc 1.0 Datei +struct Sc10FileHeader +{ + sal_Char CopyRight[30]; + USHORT Version; + sal_Char Reserved[32]; +}; + +// Benutzer-Definierte Datei-Beschreibung +struct Sc10FileInfo +{ + sal_Char Title[64]; + sal_Char Thema[64]; + sal_Char Keys[64]; + sal_Char Note[256]; + sal_Char InfoLabel0[16]; + sal_Char InfoLabel1[16]; + sal_Char InfoLabel2[16]; + sal_Char InfoLabel3[16]; + sal_Char Info0[32]; + sal_Char Info1[32]; + sal_Char Info2[32]; + sal_Char Info3[32]; + sal_Char CreateAuthor[64]; + sal_Char ChangeAuthor[64]; + sal_Char PrintAuthor[64]; + Sc10DateTime CreateDate; + Sc10DateTime ChangeDate; + Sc10DateTime PrintDate; + sal_uInt32 PageCount; + sal_uInt32 ChartCount; + sal_uInt32 PictureCount; + sal_uInt32 GraphCount; + sal_uInt32 OleCount; + sal_uInt32 NoteCount; + sal_uInt32 TextCellCount; + sal_uInt32 ValueCellCount; + sal_uInt32 FormulaCellCount; + sal_uInt32 CellCount; + sal_Char Reserved[52]; +}; + +// Letze Cursorposition +struct Sc10EditStateInfo +{ + // Cursor Position + USHORT CarretX; + USHORT CarretY; + USHORT CarretZ; + // Linke obere Ecke der Tabelle im Fenster + USHORT DeltaX; + USHORT DeltaY; + USHORT DeltaZ; + // Ueberfluessig in StarCalc 3.0 + BYTE DataBaseMode; + sal_Char Reserved[51]; +}; + +// Attribut-Eintrag +struct Sc10ColData +{ + USHORT Row; + USHORT Value; +}; + +// ZellAttribut-Beschreibung +struct Sc10ColAttr +{ + USHORT Count; + Sc10ColData* pData; + + Sc10ColAttr() : pData(NULL) {} +}; + +// GraphHeader +struct Sc10GraphHeader +{ + BYTE Typ; // Typ der Grafik (Ole-Objekt, Image (Bitmap oder MetaFile), Chart-Object) + INT16 CarretX; // ZellPosition der Grafik + INT16 CarretY; + INT16 CarretZ; + INT32 x; // x,y Abstand zum Zellrand in Pixel (Pixel weil ich Grafiken in Fenstern ablege) + INT32 y; + INT32 w; // w,h Breite und Hoehe in Pixel + INT32 h; + BYTE IsRelPos; // Ist die Position relativ zur Zelle oder absolute in der Tabelle + BYTE DoPrint; // Soll die Grafik ausgedruckt werden + USHORT FrameType; // Art der Umrandung um die Grafik (Keine, Einfach, Doppelt, Einfach Dick, Doppelt Dick) + BYTE IsTransparent; // Soll der Hintergrund gezeichnet werden + Sc10Color FrameColor; // Umrandungsfarbe als RGB-Wert + Sc10Color BackColor; // Hintergrundfarbe als RGB-Wert + sal_Char Reserved[32]; // Na was wohl +}; + +// ImageHeader +struct Sc10ImageHeader +{ + sal_Char FileName[128]; // Dateiname des urspruenglich eingefuegten Bildes + INT16 Typ; // Typ der Grafik (Bitmap oder Metafile) + BYTE Linked; // Kann nicht vorkommen + INT16 x1; // Urspruengliche Groesse der Grafik (nur fuer Metafiles) + INT16 y1; + INT16 x2; + INT16 y2; + sal_uInt32 Size; // Groesse der Grafik in BYTES +}; + +// ChartHeader +struct Sc10ChartHeader +{ + INT16 MM; // Meatfile Struktur MapMode, Breite, Hoehe + INT16 xExt; + INT16 yExt; + sal_uInt32 Size; // Groesse der Grafik in BYTES +}; + +// ChartSheetData +struct Sc10ChartSheetData +{ + BYTE HasTitle; // Hat das Chart Daten aus der Tabell fuer einen Titel + INT16 TitleX; // Zellposition des Titels + INT16 TitleY; + BYTE HasSubTitle; // Hat das Chart Daten aus der Tabell fuer einen Untertitel + INT16 SubTitleX; // Zellposition des Untertitels + INT16 SubTitleY; + BYTE HasLeftTitle; // Hat das Chart Daten aus der Tabelle fuer einen Linken-Titel + INT16 LeftTitleX; // Zellposition des Linken-Titels + INT16 LeftTitleY; + BYTE HasLegend; // Hat das Chart Daten aus der Tabelle fuer eine Legende + INT16 LegendX1; // Zellen der Legende + INT16 LegendY1; + INT16 LegendX2; + INT16 LegendY2; + BYTE HasLabel; // Hat das Chart Daten aus der Tabelle fuer die Achsbeschriftung + INT16 LabelX1; // Zellen der Achsbeschriftung + INT16 LabelY1; + INT16 LabelX2; + INT16 LabelY2; + INT16 DataX1; // Zellen der Daten + INT16 DataY1; + INT16 DataX2; + INT16 DataY2; + sal_Char Reserved[64]; +}; + +#define AGPie2D 1 // Pie Chart 2D +#define AGPie3D 2 // Pie Chart 3D +#define AGBar2D 3 // Bar Chart 2D +#define AGBar3D 4 // Bar Chart 3D +#define AGGantt 5 // Gantt Diagramm +#define AGLine 6 // Line Chart +#define AGLogLine 7 // Logarythmic-Coordinate Chart +#define AGArea 8 // Area Chart +#define AGHLC 11 // High-Low-Close Chart +#define AGPolar 10 // Polar-Coordinate Chart + +typedef sal_Char Sc10ChartText[30]; + +struct Sc10ChartTypeData +{ + INT16 NumSets; + INT16 NumPoints; + INT16 DrawMode; + INT16 GraphType; + INT16 GraphStyle; + sal_Char GraphTitle[80]; + sal_Char BottomTitle[80]; + INT16 SymbolData[256]; + INT16 ColorData[256]; + INT16 ThickLines[256]; + INT16 PatternData[256]; + INT16 LinePatternData[256]; + INT16 NumGraphStyles[11]; + INT16 ShowLegend; + Sc10ChartText LegendText[256]; + INT16 ExplodePie; + INT16 FontUse; + INT16 FontFamily[5]; + INT16 FontStyle[5]; + INT16 FontSize[5]; + INT16 GridStyle; + INT16 Labels; + INT16 LabelEvery; + Sc10ChartText LabelText[50]; + sal_Char LeftTitle[80]; + sal_Char Reserved[4646]; +}; + + +// FontAttribut +class Sc10FontData : public ScDataObject +{ +public: + INT16 Height; + BYTE CharSet; + BYTE PitchAndFamily; + sal_Char FaceName[32]; + + Sc10FontData( const Sc10FontData& rData ) : + ScDataObject( rData ), + Height( rData.Height ), + CharSet( rData.CharSet ), + PitchAndFamily( rData.PitchAndFamily ) + { + strncpy( FaceName, rData.FaceName, sizeof(FaceName) ); + FaceName[sizeof(FaceName)-1] = 0; + } + Sc10FontData( SvStream& rStream ); + virtual ScDataObject* Clone() const { return new Sc10FontData(*this); } +}; + + +// Font-Collection +class Sc10FontCollection : public ScCollection +{ +protected: + ULONG nError; +public: + Sc10FontCollection( SvStream& rStream ); + ULONG GetError() { return nError; } + Sc10FontData* At(USHORT nIndex) { return (Sc10FontData*)ScCollection::At(nIndex); } +private: + using ScCollection::At; +}; + + +//BereichsDaten +class Sc10NameData : public ScDataObject +{ +public : + sal_Char Name[32]; + sal_Char Reference[64]; + sal_Char Reserved[12]; + + Sc10NameData(const Sc10NameData& rData) : + ScDataObject( rData ) + { + strncpy(Name, rData.Name, sizeof(Name)); + Name[sizeof(Name)-1] = 0; + strncpy(Reference, rData.Reference, sizeof(Reference)); + Reference[sizeof(Reference)-1] = 0; + memcpy(Reserved, rData.Reserved, sizeof(Reserved)); + } + Sc10NameData(SvStream& rStream); + virtual ScDataObject* Clone() const { return new Sc10NameData(*this); } +}; + + +// Bereichs-Collection +class Sc10NameCollection : public ScCollection +{ +protected: + ULONG nError; +public: + Sc10NameCollection(SvStream& rStream); +ULONG GetError() { return nError; } +Sc10NameData* At(USHORT nIndex) { return (Sc10NameData*)ScCollection::At(nIndex); } +private: + using ScCollection::At; +}; + + +// Vorlage-Daten +class Sc10PatternData : public ScDataObject +{ +public: + sal_Char Name[32]; + Sc10ValueFormat ValueFormat; + Sc10LogFont LogFont; + USHORT Attr; + USHORT Justify; + USHORT Frame; + USHORT Raster; + USHORT nColor; + USHORT FrameColor; + USHORT Flags; + USHORT FormatFlags; + sal_Char Reserved[8]; + + Sc10PatternData(const Sc10PatternData& rData) : + ScDataObject( rData ) + { + strncpy(Name, rData.Name, sizeof(Name)); + Name[sizeof(Name)-1] = 0; + memcpy(&ValueFormat, &rData.ValueFormat, sizeof(ValueFormat)); + memcpy(&LogFont, &rData.LogFont, sizeof(LogFont)); + Attr = rData.Attr; + Justify = rData.Justify; + Frame = rData.Frame; + Raster = rData.Raster; + nColor = rData.nColor; + FrameColor = rData.FrameColor; + Flags = rData.Flags; + FormatFlags = rData.FormatFlags; + memcpy(Reserved, rData.Reserved, sizeof(Reserved)); + } + Sc10PatternData(SvStream& rStream); +virtual ScDataObject* Clone() const { return new Sc10PatternData(*this); } +}; + + +// Vorlage-Collection +class Sc10PatternCollection : public ScCollection +{ +protected: + ULONG nError; +public: + Sc10PatternCollection(SvStream& rStream); + ULONG GetError() { return nError; } + Sc10PatternData* At(USHORT nIndex) { return (Sc10PatternData*)ScCollection::At(nIndex); } +private: + using ScCollection::At; +}; + + +// DatenBank-Daten +class Sc10DataBaseData : public ScDataObject +{ +public: + Sc10DataBaseRec DataBaseRec; + + Sc10DataBaseData(const Sc10DataBaseData& rData) : + ScDataObject( rData ) + { + memcpy(&DataBaseRec, &rData.DataBaseRec, sizeof(DataBaseRec)); + } + Sc10DataBaseData(SvStream& rStream); +virtual ScDataObject* Clone() const { return new Sc10DataBaseData(*this); } +}; + + +// DatenBank-Collection +class Sc10DataBaseCollection : public ScCollection +{ +protected: + ULONG nError; + sal_Char ActName[32]; +public: + Sc10DataBaseCollection(SvStream& rStream); + ULONG GetError() { return nError; } + Sc10DataBaseData* At(USHORT nIndex) { return (Sc10DataBaseData*)ScCollection::At(nIndex); } +private: + using ScCollection::At; +}; + + +class Sc10PageData : public ScDataObject +{ +public: + Sc10PageFormat aPageFormat; + Sc10PageData( const Sc10PageFormat& rFormat ) : aPageFormat(rFormat) {} + int operator==( const Sc10PageData& rData ) const + { return aPageFormat == rData.aPageFormat; } + virtual ScDataObject* Clone() const; +}; + +// Seitenformat-Collection +class Sc10PageCollection : public ScCollection +{ +public: + Sc10PageCollection() : ScCollection(1,1) {}; + Sc10PageData* At(USHORT nIndex) { return (Sc10PageData*)ScCollection::At(nIndex); } + USHORT InsertFormat( const Sc10PageFormat& rData ); + void PutToDoc( ScDocument* pDoc ); +private: + using ScCollection::At; +}; + + +class ScfStreamProgressBar; + +// Import-Klasse +class Sc10Import +{ + SvStream& rStream; + ScDocument* pDoc; + Sc10Color TextPalette[16]; + Sc10Color BackPalette[16]; + Sc10Color RasterPalette[16]; + Sc10Color FramePalette[16]; + Sc10SheetProtect SheetProtect; + Sc10FontCollection* pFontCollection; + Sc10NameCollection* pNameCollection; + Sc10PatternCollection* pPatternCollection; + Sc10DataBaseCollection* pDataBaseCollection; + ULONG nError; + INT16 TabCount; + SCTAB nShowTab; + ScViewOptions aSc30ViewOpt; + ScfStreamProgressBar* pPrgrsBar; + +public: + Sc10Import( SvStream& rStr, ScDocument* pDocument ); + ~Sc10Import(); + + ULONG Import(); + void LoadFileHeader(); + void LoadFileInfo(); + void LoadEditStateInfo(); + void LoadProtect(); + void LoadViewColRowBar(); + void LoadScrZoom(); + void LoadPalette(); + void LoadFontCollection(); + void LoadNameCollection(); + void ImportNameCollection(); + void LoadPatternCollection(); + void LoadDataBaseCollection(); + void LoadTables(); + void LoadCol(SCCOL Col, SCTAB Tab); + void LoadColAttr(SCCOL Col, SCTAB Tab); + void LoadAttr(Sc10ColAttr& rAttr); + void ChangeFormat(USHORT nFormat, USHORT nInfo, ULONG& nKey); + void LoadObjects(); +}; + +#endif + diff --git a/sc/source/filter/inc/scfobj.hxx b/sc/source/filter/inc/scfobj.hxx new file mode 100644 index 000000000000..4ed1784f4354 --- /dev/null +++ b/sc/source/filter/inc/scfobj.hxx @@ -0,0 +1,45 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_SCFOBJ_HXX +#define SC_SCFOBJ_HXX + +#include <tools/solar.h> + +class ScDocument; +class Rectangle; + +class Sc10InsertObject +{ +public: + static void InsertChart( ScDocument* pDoc, SCTAB nDestTab, const Rectangle& rRect, + SCTAB nSrcTab, USHORT nX1, USHORT nY1, USHORT nX2, USHORT nY2 ); +}; + + +#endif + diff --git a/sc/source/filter/inc/scmem.h b/sc/source/filter/inc/scmem.h new file mode 100644 index 000000000000..03e30c1e9fc6 --- /dev/null +++ b/sc/source/filter/inc/scmem.h @@ -0,0 +1,37 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_SCMEM_H +#define SC_SCMEM_H + +#include <tools/solar.h> + +BOOL MemNew( void ); +void MemDelete( void ); + +#endif + diff --git a/sc/source/filter/inc/tokstack.hxx b/sc/source/filter/inc/tokstack.hxx new file mode 100644 index 000000000000..06a37639be89 --- /dev/null +++ b/sc/source/filter/inc/tokstack.hxx @@ -0,0 +1,408 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_TOKSTACK_HXX +#define SC_TOKSTACK_HXX + +#include <string.h> +#include <tools/debug.hxx> +#include "compiler.hxx" +#include "tokenarray.hxx" + +#include <vector> + +typedef OpCode DefTokenId; +// in PRODUCT version: ambiguity between OpCode (being USHORT) and UINT16 +// Unfortunately a typedef is just a dumb alias and not a real type ... +//typedef UINT16 TokenId; +struct TokenId +{ + UINT16 nId; + + TokenId() : nId( 0 ) {} + TokenId( UINT16 n ) : nId( n ) {} + TokenId( const TokenId& r ) : nId( r.nId ) {} + inline TokenId& operator =( const TokenId& r ) { nId = r.nId; return *this; } + inline TokenId& operator =( UINT16 n ) { nId = n; return *this; } + inline operator UINT16&() { return nId; } + inline operator const UINT16&() const { return nId; } + inline BOOL operator <( UINT16 n ) const { return nId < n; } + inline BOOL operator >( UINT16 n ) const { return nId > n; } + inline BOOL operator <=( UINT16 n ) const { return nId <= n; } + inline BOOL operator >=( UINT16 n ) const { return nId >= n; } + inline BOOL operator ==( UINT16 n ) const { return nId == n; } + inline BOOL operator !=( UINT16 n ) const { return nId != n; } +}; + + +//------------------------------------------------------------------------ +struct ScComplexRefData; +class TokenStack; +class ScToken; + + +enum E_TYPE +{ + T_Id, // Id-Folge + T_Str, // String + T_D, // Double + T_Err, // Error code + T_RefC, // Cell Reference + T_RefA, // Area Reference + T_RN, // Range Name + T_Ext, // irgendwas Unbekanntes mit Funktionsnamen + T_Nlf, // token for natural language formula + T_Matrix, // token for inline arrays + T_ExtName, // token for external names + T_ExtRefC, + T_ExtRefA, + T_Error // fuer Abfrage im Fehlerfall +}; + + + + +class TokenPool +{ + // !ACHTUNG!: externe Id-Basis ist 1, interne 0! + // Ausgabe Id = 0 -> Fehlerfall + private: + String** ppP_Str; // Pool fuer Strings + UINT16 nP_Str; // ...mit Groesse + UINT16 nP_StrAkt; // ...und Schreibmarke + + double* pP_Dbl; // Pool fuer Doubles + UINT16 nP_Dbl; + UINT16 nP_DblAkt; + + USHORT* pP_Err; // Pool for error codes + UINT16 nP_Err; + UINT16 nP_ErrAkt; + + ScSingleRefData** ppP_RefTr; // Pool fuer Referenzen + UINT16 nP_RefTr; + UINT16 nP_RefTrAkt; + + UINT16* pP_Id; // Pool fuer Id-Folgen + UINT16 nP_Id; + UINT16 nP_IdAkt; + UINT16 nP_IdLast; // letzter Folgen-Beginn + + struct EXTCONT + { + DefTokenId eId; + String aText; + EXTCONT( const DefTokenId e, const String& r ) : + eId( e ), aText( r ){} + }; + EXTCONT** ppP_Ext; + UINT16 nP_Ext; + UINT16 nP_ExtAkt; + + struct NLFCONT + { + ScSingleRefData aRef; + NLFCONT( const ScSingleRefData& r ) : aRef( r ) {} + }; + NLFCONT** ppP_Nlf; + UINT16 nP_Nlf; + UINT16 nP_NlfAkt; + + ScMatrix** ppP_Matrix; // Pool fuer Matricies + UINT16 nP_Matrix; + UINT16 nP_MatrixAkt; + + /** for storage of external names */ + struct ExtName + { + sal_uInt16 mnFileId; + String maName; + }; + ::std::vector<ExtName> maExtNames; + + /** for storage of external cell references */ + struct ExtCellRef + { + sal_uInt16 mnFileId; + String maTabName; + ScSingleRefData maRef; + }; + ::std::vector<ExtCellRef> maExtCellRefs; + + /** for storage of external area references */ + struct ExtAreaRef + { + sal_uInt16 mnFileId; + String maTabName; + ScComplexRefData maRef; + }; + ::std::vector<ExtAreaRef> maExtAreaRefs; + + UINT16* pElement; // Array mit Indizes fuer Elemente + E_TYPE* pType; // ...mit Typ-Info + UINT16* pSize; // ...mit Laengenangabe (Anz. UINT16) + UINT16 nElement; + UINT16 nElementAkt; + + static const UINT16 nScTokenOff;// Offset fuer SC-Token +#ifdef DBG_UTIL + UINT16 nRek; // Rekursionszaehler +#endif + ScTokenArray* pScToken; // Tokenbastler + + void GrowString( void ); + void GrowDouble( void ); +//UNUSED2009-05 void GrowError( void ); + void GrowTripel( void ); + void GrowId( void ); + void GrowElement( void ); + void GrowExt( void ); + void GrowNlf( void ); + void GrowMatrix( void ); + void GetElement( const UINT16 nId ); + void GetElementRek( const UINT16 nId ); + public: + TokenPool( void ); + ~TokenPool(); + inline TokenPool& operator <<( const TokenId nId ); + inline TokenPool& operator <<( const DefTokenId eId ); + inline TokenPool& operator <<( TokenStack& rStack ); + void operator >>( TokenId& rId ); + inline void operator >>( TokenStack& rStack ); + inline const TokenId Store( void ); + const TokenId Store( const double& rDouble ); +//UNUSED2008-05 const TokenId StoreError( USHORT nError ); + + // nur fuer Range-Names + const TokenId Store( const UINT16 nIndex ); + inline const TokenId Store( const INT16 nWert ); + const TokenId Store( const String& rString ); + const TokenId Store( const ScSingleRefData& rTr ); + const TokenId Store( const ScComplexRefData& rTr ); + + const TokenId Store( const DefTokenId eId, const String& rName ); + // 4 externals (e.g. AddIns, Makros...) + const TokenId StoreNlf( const ScSingleRefData& rTr ); + const TokenId StoreMatrix(); + const TokenId StoreExtName( sal_uInt16 nFileId, const String& rName ); + const TokenId StoreExtRef( sal_uInt16 nFileId, const String& rTabName, const ScSingleRefData& rRef ); + const TokenId StoreExtRef( sal_uInt16 nFileId, const String& rTabName, const ScComplexRefData& rRef ); + + inline const TokenId LastId( void ) const; + inline const ScTokenArray* operator []( const TokenId nId ); + void Reset( void ); + inline E_TYPE GetType( const TokenId& nId ) const; + BOOL IsSingleOp( const TokenId& nId, const DefTokenId eId ) const; + const String* GetExternal( const TokenId& nId ) const; +//UNUSED2008-05 const String* GetString( const TokenId& nId ) const; + ScMatrix* GetMatrix( unsigned int n ) const; +}; + + + + +class TokenStack + // Stack fuer Token-Ids: Id 0 sollte reserviert bleiben als + // fehlerhafte Id, da z.B. Get() im Fehlerfall 0 liefert +{ + private: + TokenId* pStack; // Stack als Array + UINT16 nPos; // Schreibmarke + UINT16 nSize; // Erster Index ausserhalb des Stacks + public: + TokenStack( UINT16 nNewSize = 1024 ); + ~TokenStack(); + inline TokenStack& operator <<( const TokenId nNewId ); + inline void operator >>( TokenId &rId ); + + inline void Reset( void ); + + inline bool HasMoreTokens() const { return nPos > 0; } + inline const TokenId Get( void ); +}; + + + + +inline const TokenId TokenStack::Get( void ) +{ + DBG_ASSERT( nPos > 0, + "*TokenStack::Get(): Leer ist leer, ist leer, ist leer, ist..." ); + + TokenId nRet; + + if( nPos == 0 ) + nRet = 0; + else + { + nPos--; + nRet = pStack[ nPos ]; + } + + return nRet; +} + + +inline TokenStack &TokenStack::operator <<( const TokenId nNewId ) +{// Element auf Stack + DBG_ASSERT( nPos < nSize, "*TokenStack::<<(): Stackueberlauf" ); + if( nPos < nSize ) + { + pStack[ nPos ] = nNewId; + nPos++; + } + + return *this; +} + + +inline void TokenStack::operator >>( TokenId& rId ) +{// Element von Stack + DBG_ASSERT( nPos > 0, + "*TokenStack::>>(): Leer ist leer, ist leer, ist leer, ..." ); + if( nPos > 0 ) + { + nPos--; + rId = pStack[ nPos ]; + } +} + + +inline void TokenStack::Reset( void ) +{ + nPos = 0; +} + + + + +inline TokenPool& TokenPool::operator <<( const TokenId nId ) +{ + // POST: nId's werden hintereinander im Pool unter einer neuen Id + // abgelegt. Vorgang wird mit >> oder Store() abgeschlossen + // nId -> ( UINT16 ) nId - 1; + DBG_ASSERT( ( UINT16 ) nId < nScTokenOff, + "-TokenPool::operator <<: TokenId im DefToken-Bereich!" ); + + if( nP_IdAkt >= nP_Id ) + GrowId(); + + pP_Id[ nP_IdAkt ] = ( ( UINT16 ) nId ) - 1; + nP_IdAkt++; + + return *this; +} + + +inline TokenPool& TokenPool::operator <<( const DefTokenId eId ) +{ + DBG_ASSERT( ( UINT32 ) eId + nScTokenOff < 0xFFFF, + "-TokenPool::operator<<: enmum zu gross!" ); + + if( nP_IdAkt >= nP_Id ) + GrowId(); + + pP_Id[ nP_IdAkt ] = ( ( UINT16 ) eId ) + nScTokenOff; + nP_IdAkt++; + + return *this; +} + + +inline TokenPool& TokenPool::operator <<( TokenStack& rStack ) +{ + if( nP_IdAkt >= nP_Id ) + GrowId(); + + pP_Id[ nP_IdAkt ] = ( ( UINT16 ) rStack.Get() ) - 1; + nP_IdAkt++; + + return *this; +} + + +inline void TokenPool::operator >>( TokenStack& rStack ) +{ + TokenId nId; + *this >> nId; + rStack << nId; +} + + +inline const TokenId TokenPool::Store( void ) +{ + TokenId nId; + *this >> nId; + return nId; +} + + +inline const TokenId TokenPool::Store( const INT16 nWert ) +{ + return Store( ( double ) nWert ); +} + + +inline const TokenId TokenPool::LastId( void ) const +{ + return ( TokenId ) nElementAkt; // stimmt, da Ausgabe mit Offset 1! +} + + +const inline ScTokenArray* TokenPool::operator []( const TokenId nId ) +{ + pScToken->Clear(); + + if( nId ) + {//...nur wenn nId > 0! +#ifdef DBG_UTIL + nRek = 0; +#endif + GetElement( ( UINT16 ) nId - 1 ); + } + + return pScToken; +} + + +inline E_TYPE TokenPool::GetType( const TokenId& rId ) const +{ + E_TYPE nRet; + + UINT16 nId = (UINT16) rId - 1; + + if( nId < nElementAkt ) + nRet = pType[ nId ] ; + else + nRet = T_Error; + + return nRet; +} + + +#endif + diff --git a/sc/source/filter/inc/tool.h b/sc/source/filter/inc/tool.h new file mode 100644 index 000000000000..93cc074d89f6 --- /dev/null +++ b/sc/source/filter/inc/tool.h @@ -0,0 +1,164 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_TOOL_H +#define SC_TOOL_H + +#include <attrib.hxx> //!!! noch noetig????? +#include <document.hxx> + +// Defaultwerte +const BYTE nDezStd = 0; // Dezimalstellen fuer Standard-Zellen +const BYTE nDezFloat = 2; // " " Float-Zellen + +void PutFormString( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_Char *pString ); + +void SetFormat( SCCOL nCol, SCROW nRow, SCTAB nTab, BYTE nFormat, BYTE nSt ); + +void InitPage( void ); + +String DosToSystem( sal_Char *pSource ); + +double SnumToDouble( INT16 nVal ); + +double Snum32ToDouble( UINT32 nValue ); + +typedef UINT16 StampTyp; + +#define MAKE_STAMP(nF,nS) ((nS&0x0F)+((nF&0x7F)*16)) + // Bit 0...3 = Bit 0...3 von Stellenzahl + // Bit 4...10 = Bit 0...6 von Formatbyte + +class FormIdent +{ +private: + StampTyp nStamp; // Identifikations-Schluessel + SfxUInt32Item* pAttr; // zugehoeriges Attribut +public: + FormIdent( void ) + { + nStamp = 0; + pAttr = NULL; + } + + FormIdent( BYTE nFormat, BYTE nSt, SfxUInt32Item& rAttr ) + { + nStamp = MAKE_STAMP( nFormat, nSt ); + pAttr = &rAttr; + } + + FormIdent( BYTE nFormat, BYTE nSt ) + { + nStamp = MAKE_STAMP( nFormat, nSt ); + pAttr = NULL; + } + + BOOL operator ==( const FormIdent& rComp ) const + { + return ( nStamp == rComp.nStamp ); + } + + BOOL operator ==( const StampTyp& rStamp ) const + { + return ( nStamp == rStamp ); + } + + StampTyp GetStamp( void ) const + { + return nStamp; + } + + SfxUInt32Item* GetAttr( void ) + { + return pAttr; + } + + void SetStamp( BYTE nFormat, BYTE nSt ) + { + nStamp = MAKE_STAMP( nFormat, nSt ); + } +}; + + +#define __nSize 2048 + + + + +class FormCache +{ +private: + FormIdent aIdents[ __nSize ]; //gepufferte Formate + BOOL bValid[ __nSize ]; + FormIdent aCompareIdent; // zum Vergleichen + BYTE nDefaultFormat; // Defaultformat der Datei + SvNumberFormatter* pFormTable; // Value-Format-Table-Anker + StampTyp nIndex; + LanguageType eLanguage; // Systemsprache + + SfxUInt32Item* NewAttr( BYTE nFormat, BYTE nSt ); +public: + FormCache( ScDocument*, BYTE nNewDefaultFormat = 0xFF ); + ~FormCache(); + + inline const SfxUInt32Item* GetAttr( BYTE nFormat, BYTE nSt ); + void SetDefaultFormat( BYTE nD = 0xFF ) + { + nDefaultFormat = nD; + } +}; + + +inline const SfxUInt32Item* FormCache::GetAttr( BYTE nFormat, BYTE nSt ) +{ + // PREC: nFormat = Lotus-Format-Byte + // nSt = Stellenzahl + // POST: return = zu nFormat und nSt passendes SC-Format + SfxUInt32Item* pAttr; + SfxUInt32Item* pRet; + + aCompareIdent.SetStamp( nFormat, nSt ); + nIndex = aCompareIdent.GetStamp(); + DBG_ASSERT( nIndex < __nSize, "FormCache::GetAttr(): Uuuuuuups... so nicht!" ); + if( bValid[ nIndex ] ) + pRet = aIdents[ nIndex ].GetAttr(); + else + { + // neues Attribut anlegen + pAttr = NewAttr( nFormat, nSt ); + DBG_ASSERT( pAttr, "FormCache::GetAttr(): Nix Speicherus" ); + + aIdents[ nIndex ] = FormIdent( nFormat, nSt, *pAttr ); + bValid[ nIndex ] = TRUE; + + pRet = pAttr; + } + return pRet; +} + +#endif + diff --git a/sc/source/filter/inc/xcl97dum.hxx b/sc/source/filter/inc/xcl97dum.hxx new file mode 100644 index 000000000000..a76a93321557 --- /dev/null +++ b/sc/source/filter/inc/xcl97dum.hxx @@ -0,0 +1,90 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XCL97DUM_HXX +#define SC_XCL97DUM_HXX + +#include "excrecds.hxx" + +// --- class ExcDummy8_xx -------------------------------------------- + +class ExcDummy8_00a : public ExcDummyRec +{ +private: + static const BYTE pMyData[]; + static const sal_Size nMyLen; +public: + virtual sal_Size GetLen() const; + virtual const BYTE* GetData() const; +}; + + +class ExcDummy8_00b : public ExcDummyRec +{ +private: + static const BYTE pMyData[]; + static const sal_Size nMyLen; +public: + virtual sal_Size GetLen() const; + virtual const BYTE* GetData() const; +}; + + +class ExcDummy8_040 : public ExcDummyRec +{ +private: + static const BYTE pMyData[]; + static const sal_Size nMyLen; +public: + virtual sal_Size GetLen() const; + virtual const BYTE* GetData() const; +}; + + +class ExcDummy8_041 : public ExcDummyRec +{ +private: + static const BYTE pMyData[]; + static const sal_Size nMyLen; +public: + virtual sal_Size GetLen() const; + virtual const BYTE* GetData() const; +}; + + +class ExcDummy8_02 : public ExcDummyRec +{ +private: + static const BYTE pMyData[]; + static const sal_Size nMyLen; +public: + virtual sal_Size GetLen() const; + virtual const BYTE* GetData() const; +}; + + +#endif // _XCL97DUM_HXX diff --git a/sc/source/filter/inc/xcl97esc.hxx b/sc/source/filter/inc/xcl97esc.hxx new file mode 100644 index 000000000000..fde03337cc0f --- /dev/null +++ b/sc/source/filter/inc/xcl97esc.hxx @@ -0,0 +1,201 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XCL97ESC_HXX +#define SC_XCL97ESC_HXX + +#include <memory> +#include <tools/table.hxx> +#include <tools/stack.hxx> +#include <filter/msfilter/escherex.hxx> +#include "xlescher.hxx" +#include "xeroot.hxx" + +// 0 = Export TBX form controls, 1 = Export OCX form controls. +#define EXC_EXP_OCX_CTRL 0 + +namespace utl { class TempFile; } + +// ============================================================================ + +class SvStream; + +class XclEscherExGlobal : public EscherExGlobal, protected XclExpRoot +{ +public: + explicit XclEscherExGlobal( const XclExpRoot& rRoot ); + +private: + /** Overloaded to create a new temporary file and return its stream. */ + virtual SvStream* ImplQueryPictureStream(); + +private: + ::std::auto_ptr< ::utl::TempFile > mxPicTempFile; + ::std::auto_ptr< SvStream > mxPicStrm; +}; + +// ============================================================================ + +class XclObj; +class XclExpDffAnchorBase; +class XclEscherHostAppData; +class XclEscherClientData; +class XclEscherClientTextbox; +#if EXC_EXP_OCX_CTRL +class XclExpOcxControlObj; +#else +class XclExpTbxControlObj; +#endif + +class XclEscherEx : public EscherEx, protected XclExpRoot +{ +public: + explicit XclEscherEx( + const XclExpRoot& rRoot, + XclExpObjectManager& rObjMgr, + SvStream& rStrm, + const XclEscherEx* pParent = 0 ); + virtual ~XclEscherEx(); + + /** Called by MSODRAWING record constructors to initialize the DFF stream + fragment they will own. returns the DFF fragment identifier. */ + sal_uInt32 InitNextDffFragment(); + /** Called after some data has been written to the DFF stream, to update + the end position of the DFF fragment owned by an MSODRAWING record. */ + void UpdateDffFragmentEnd(); + + /** Returns the position of the specified DFF stream fragment. */ + sal_uInt32 GetDffFragmentPos( sal_uInt32 nFragmentKey ); + /** Returns the size of the specified DFF stream fragment. */ + sal_uInt32 GetDffFragmentSize( sal_uInt32 nFragmentKey ); + /** Returns true, if there is more data left in the DFF stream than owned + by the last MSODRAWING record. */ + bool HasPendingDffData(); + + /** Creates a new DFF client anchor object and calculates the anchor + position of the passed object. Caller takes ownership! */ + XclExpDffAnchorBase* CreateDffAnchor( const SdrObject& rSdrObj ) const; + + virtual EscherExHostAppData* StartShape( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape>& rxShape, + const Rectangle* pChildAnchor ); + virtual void EndShape( UINT16 nShapeType, UINT32 nShapeID ); + virtual EscherExHostAppData* EnterAdditionalTextGroup(); + + /// Flush and merge PicStream into EscherStream + void EndDocument(); + +#if EXC_EXP_OCX_CTRL + /** Creates an OCX form control OBJ record from the passed form control. + @descr Writes the form control data to the 'Ctls' stream. */ + XclExpOcxControlObj* CreateCtrlObj( + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor ); + +private: + SotStorageStreamRef mxCtlsStrm; /// The 'Ctls' stream. +#else + /** Creates a TBX form control OBJ record from the passed form control. */ + XclExpTbxControlObj* CreateCtrlObj( + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor ); + +private: + /** Tries to get the name of a Basic macro from a control. */ + void ConvertTbxMacro( + XclExpTbxControlObj& rTbxCtrlObj, + ::com::sun::star::uno::Reference< + ::com::sun::star::awt::XControlModel > xCtrlModel ); +#endif + + void DeleteCurrAppData(); + +private: + XclExpObjectManager& mrObjMgr; + Stack aStack; + XclObj* pCurrXclObj; + XclEscherHostAppData* pCurrAppData; + XclEscherClientData* pTheClientData; // always the same + XclEscherClientTextbox* pAdditionalText; + USHORT nAdditionalText; + sal_uInt32 mnNextKey; + bool mbIsRootDff; +}; + +// --- class XclEscherHostAppData ------------------------------------ + +class XclEscherHostAppData : public EscherExHostAppData +{ +private: + BOOL bStackedGroup; + +public: + XclEscherHostAppData() : bStackedGroup( FALSE ) + {} + inline void SetStackedGroup( BOOL b ) { bStackedGroup = b; } + inline BOOL IsStackedGroup() const { return bStackedGroup; } +}; + + + +// ============================================================================ + +// --- class XclEscherClientData ------------------------------------- + +class XclEscherClientData : public EscherExClientRecord_Base +{ +public: + XclEscherClientData() {} + virtual void WriteData( EscherEx& rEx ) const; +}; + + +// --- class XclEscherClientTextbox ---------------------------------- + +class SdrTextObj; + +class XclEscherClientTextbox : public EscherExClientRecord_Base, protected XclExpRoot +{ +private: + const SdrTextObj& rTextObj; + XclObj* pXclObj; + +public: + XclEscherClientTextbox( + const XclExpRoot& rRoot, + const SdrTextObj& rObj, + XclObj* pObj ); + + //! ONLY for the AdditionalText mimic + inline void SetXclObj( XclObj* p ) { pXclObj = p; } + + virtual void WriteData( EscherEx& rEx ) const; +}; + + + +#endif // _XCL97ESC_HXX diff --git a/sc/source/filter/inc/xcl97rec.hxx b/sc/source/filter/inc/xcl97rec.hxx new file mode 100644 index 000000000000..201562fa752c --- /dev/null +++ b/sc/source/filter/inc/xcl97rec.hxx @@ -0,0 +1,592 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XCL97REC_HXX +#define SC_XCL97REC_HXX + +#include "excrecds.hxx" +#include "xcl97esc.hxx" +#include "xlstyle.hxx" + +// ============================================================================ + +class XclObj; +class XclExpMsoDrawing; + +class XclExpObjList : public List, public ExcEmptyRec, protected XclExpRoot +{ +public: + explicit XclExpObjList( const XclExpRoot& rRoot, XclEscherEx& rEscherEx ); + virtual ~XclExpObjList(); + + XclObj* First() { return (XclObj*) List::First(); } + XclObj* Next() { return (XclObj*) List::Next(); } + + /// return: 1-based ObjId + ///! count>=0xFFFF: Obj will be deleted, return 0 + UINT16 Add( XclObj* ); + + inline XclExpMsoDrawing* GetMsodrawingPerSheet() { return pMsodrawingPerSheet; } + + /// close groups and DgContainer opened in ctor + void EndSheet(); + + virtual void Save( XclExpStream& rStrm ); + +private: + XclEscherEx& mrEscherEx; + XclExpMsoDrawing* pMsodrawingPerSheet; + XclExpMsoDrawing* pSolverContainer; +}; + + +// --- class XclObj -------------------------------------------------- + +class XclTxo; +class SdrTextObj; + +class XclObj : public XclExpRecord +{ +protected: + XclEscherEx& mrEscherEx; + XclExpMsoDrawing* pMsodrawing; + XclExpMsoDrawing* pClientTextbox; + XclTxo* pTxo; + sal_uInt16 mnObjType; + UINT16 nObjId; + UINT16 nGrbit; + BOOL bFirstOnSheet; + + bool mbOwnEscher; /// true = Escher part created on the fly. + + /** @param bOwnEscher If set to true, this object will create its escher data. + See SetOwnEscher() for details. */ + explicit XclObj( XclExpObjectManager& rObjMgr, sal_uInt16 nObjType, bool bOwnEscher = false ); + + void ImplWriteAnchor( const XclExpRoot& rRoot, const SdrObject* pSdrObj, const Rectangle* pChildAnchor ); + + // overwritten for writing MSODRAWING record + virtual void WriteBody( XclExpStream& rStrm ); + virtual void WriteSubRecs( XclExpStream& rStrm ); + void SaveTextRecs( XclExpStream& rStrm ); + +public: + virtual ~XclObj(); + + inline sal_uInt16 GetObjType() const { return mnObjType; } + + inline void SetId( UINT16 nId ) { nObjId = nId; } + + inline void SetLocked( BOOL b ) + { b ? nGrbit |= 0x0001 : nGrbit &= ~0x0001; } + inline void SetPrintable( BOOL b ) + { b ? nGrbit |= 0x0010 : nGrbit &= ~0x0010; } + inline void SetAutoFill( BOOL b ) + { b ? nGrbit |= 0x2000 : nGrbit &= ~0x2000; } + inline void SetAutoLine( BOOL b ) + { b ? nGrbit |= 0x4000 : nGrbit &= ~0x4000; } + + // set corresponding Excel object type in OBJ/ftCmo + void SetEscherShapeType( UINT16 nType ); + inline void SetEscherShapeTypeGroup() { mnObjType = EXC_OBJTYPE_GROUP; } + + /** If set to true, this object has created its own escher data. + @descr This causes the function EscherEx::EndShape() to not post process + this object. This is used i.e. for form controls. They are not handled in + the svx base code, so the XclExpEscherOcxCtrl c'tor creates the escher data + itself. The svx base code does not receive the correct shape ID after the + EscherEx::StartShape() call, which would result in deleting the object in + EscherEx::EndShape(). */ + inline void SetOwnEscher( bool bOwnEscher = true ) { mbOwnEscher = bOwnEscher; } + /** Returns true, if the object has created the escher data itself. + @descr See SetOwnEscher() for details. */ + inline bool IsOwnEscher() const { return mbOwnEscher; } + + //! actually writes ESCHER_ClientTextbox + void SetText( const XclExpRoot& rRoot, const SdrTextObj& rObj ); + + virtual void Save( XclExpStream& rStrm ); +}; + +// --- class XclObjComment ------------------------------------------- + +class XclObjComment : public XclObj +{ +public: + XclObjComment( XclExpObjectManager& rObjMgr, + const Rectangle& rRect, const EditTextObject& rEditObj, SdrObject* pCaption, bool bVisible ); + virtual ~XclObjComment(); + + /** c'tor process for formatted text objects above . + @descr used to construct the MSODRAWING Escher object properties. */ + void ProcessEscherObj( const XclExpRoot& rRoot, + const Rectangle& rRect, SdrObject* pCaption, bool bVisible ); + + + virtual void Save( XclExpStream& rStrm ); +}; + + +// --- class XclObjDropDown ------------------------------------------ + +class XclObjDropDown : public XclObj +{ +private: + BOOL bIsFiltered; + + virtual void WriteSubRecs( XclExpStream& rStrm ); + +protected: +public: + XclObjDropDown( XclExpObjectManager& rObjMgr, const ScAddress& rPos, BOOL bFilt ); + virtual ~XclObjDropDown(); +}; + + +// --- class XclTxo -------------------------------------------------- + +class SdrTextObj; + +class XclTxo : public ExcRecord +{ +public: + XclTxo( const String& rString, sal_uInt16 nFontIx = EXC_FONT_APP ); + XclTxo( const XclExpRoot& rRoot, const SdrTextObj& rEditObj ); + XclTxo( const XclExpRoot& rRoot, const EditTextObject& rEditObj, SdrObject* pCaption ); + + inline void SetHorAlign( sal_uInt8 nHorAlign ) { mnHorAlign = nHorAlign; } + inline void SetVerAlign( sal_uInt8 nVerAlign ) { mnVerAlign = nVerAlign; } + + virtual void Save( XclExpStream& rStrm ); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; + +private: + virtual void SaveCont( XclExpStream& rStrm ); + +private: + XclExpStringRef mpString; /// Text and formatting data. + sal_uInt16 mnRotation; /// Text rotation. + sal_uInt8 mnHorAlign; /// Horizontal alignment. + sal_uInt8 mnVerAlign; /// Vertical alignment. +}; + + +// --- class XclObjOle ----------------------------------------------- + +class XclObjOle : public XclObj +{ +private: + + const SdrObject& rOleObj; + SotStorage* pRootStorage; + + virtual void WriteSubRecs( XclExpStream& rStrm ); + +public: + XclObjOle( XclExpObjectManager& rObjMgr, const SdrObject& rObj ); + virtual ~XclObjOle(); + + virtual void Save( XclExpStream& rStrm ); +}; + + +// --- class XclObjAny ----------------------------------------------- + +class XclObjAny : public XclObj +{ +private: + virtual void WriteSubRecs( XclExpStream& rStrm ); + +public: + XclObjAny( XclExpObjectManager& rObjMgr ); + virtual ~XclObjAny(); + + virtual void Save( XclExpStream& rStrm ); +}; + + +// --- class ExcBof8_Base -------------------------------------------- + +class ExcBof8_Base : public ExcBof_Base +{ +protected: + UINT32 nFileHistory; // bfh + UINT32 nLowestBiffVer; // sfo + + virtual void SaveCont( XclExpStream& rStrm ); + +public: + ExcBof8_Base(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + + +// --- class ExcBofW8 ------------------------------------------------ +// Header Record fuer WORKBOOKS + +class ExcBofW8 : public ExcBof8_Base +{ +public: + ExcBofW8(); +}; + + +// --- class ExcBof8 ------------------------------------------------- +// Header Record fuer WORKSHEETS + +class ExcBof8 : public ExcBof8_Base +{ +public: + ExcBof8(); +}; + + +// --- class ExcBundlesheet8 ----------------------------------------- + +class ExcBundlesheet8 : public ExcBundlesheetBase +{ +private: + String sUnicodeName; + XclExpString GetName() const; + + virtual void SaveCont( XclExpStream& rStrm ); + +public: + ExcBundlesheet8( RootData& rRootData, SCTAB nTab ); + ExcBundlesheet8( const String& rString ); + + virtual sal_Size GetLen() const; + + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + + +// --- class XclObproj ----------------------------------------------- + +class XclObproj : public ExcRecord +{ +public: + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + + +// ---- class XclCodename -------------------------------------------- + +class XclCodename : public ExcRecord +{ +private: + XclExpString aName; + virtual void SaveCont( XclExpStream& rStrm ); +public: + XclCodename( const String& ); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + + +// ---- Scenarios ---------------------------------------------------- +// - ExcEScenarioCell a cell of a scenario range +// - ExcEScenario all ranges of a scenario table +// - ExcEScenarioManager list of scenario tables + +class ExcEScenarioCell +{ +private: + UINT16 nCol; + UINT16 nRow; + XclExpString sText; + +protected: +public: + ExcEScenarioCell( UINT16 nC, UINT16 nR, const String& rTxt ); + + inline sal_Size GetStringBytes() + { return sText.GetSize(); } + + void WriteAddress( XclExpStream& rStrm ); + void WriteText( XclExpStream& rStrm ); + + void SaveXml( XclExpXmlStream& rStrm ); +}; + + + +class ExcEScenario : public ExcRecord, private List +{ +private: + sal_Size nRecLen; + XclExpString sName; + XclExpString sComment; + XclExpString sUserName; + UINT8 nProtected; + + inline ExcEScenarioCell* _First() { return (ExcEScenarioCell*) List::First(); } + inline ExcEScenarioCell* _Next() { return (ExcEScenarioCell*) List::Next(); } + + BOOL Append( UINT16 nCol, UINT16 nRow, const String& rTxt ); + + virtual void SaveCont( XclExpStream& rStrm ); + +protected: +public: + ExcEScenario( const XclExpRoot& rRoot, SCTAB nTab ); + virtual ~ExcEScenario(); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; + + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + + + +class ExcEScenarioManager : public ExcRecord, private List +{ +private: + UINT16 nActive; + + inline ExcEScenario* _First() { return (ExcEScenario*) List::First(); } + inline ExcEScenario* _Next() { return (ExcEScenario*) List::Next(); } + + inline void Append( ExcEScenario* pScen ) + { List::Insert( pScen, LIST_APPEND ); } + + virtual void SaveCont( XclExpStream& rStrm ); + +protected: +public: + ExcEScenarioManager( const XclExpRoot& rRoot, SCTAB nTab ); + virtual ~ExcEScenarioManager(); + + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; +}; + +// ============================================================================ + +/** Represents a SHEETPROTECTION record that stores sheet protection + options. Note that a sheet still needs to save its sheet protection + options even when it's not protected. */ +class XclExpSheetProtectOptions : public XclExpRecord +{ +public: + explicit XclExpSheetProtectOptions( const XclExpRoot& rRoot, SCTAB nTab ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + sal_uInt16 mnOptions; /// Encoded sheet protection options. +}; + +// ============================================================================ + +class XclCalccount : public ExcRecord +{ +private: + UINT16 nCount; +protected: + virtual void SaveCont( XclExpStream& rStrm ); +public: + XclCalccount( const ScDocument& ); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; + + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + + + + +class XclIteration : public ExcRecord +{ +private: + UINT16 nIter; +protected: + virtual void SaveCont( XclExpStream& rStrm ); +public: + XclIteration( const ScDocument& ); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; + + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + + + + +class XclDelta : public ExcRecord +{ +private: + double fDelta; +protected: + virtual void SaveCont( XclExpStream& rStrm ); +public: + XclDelta( const ScDocument& ); + + virtual UINT16 GetNum() const; + virtual sal_Size GetLen() const; + + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + + + + +class XclRefmode : public XclExpBoolRecord +{ +public: + XclRefmode( const ScDocument& ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + +// ============================================================================ + +class XclExpFilePass : public XclExpRecord +{ +public: + explicit XclExpFilePass( const XclExpRoot& rRoot ); + virtual ~XclExpFilePass(); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + const XclExpRoot& mrRoot; +}; + +// ============================================================================ + +/** Beginning of User Interface Records */ +class XclExpInterfaceHdr : public XclExpUInt16Record +{ +public: + explicit XclExpInterfaceHdr( sal_uInt16 nCodePage ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); +}; + +// ============================================================================ + +/** End of User Interface Records */ +class XclExpInterfaceEnd : public XclExpRecord +{ +public: + explicit XclExpInterfaceEnd(); + virtual ~XclExpInterfaceEnd(); + +private: + virtual void WriteBody( XclExpStream& rStrm ); +}; + +// ============================================================================ + +/** Write Access User Name - This record contains the user name, which is + the name you type when you install Excel. */ +class XclExpWriteAccess : public XclExpRecord +{ +public: + explicit XclExpWriteAccess(); + virtual ~XclExpWriteAccess(); + +private: + virtual void WriteBody( XclExpStream& rStrm ); +}; + +// ============================================================================ + +class XclExpFileSharing : public XclExpRecord +{ +public: + explicit XclExpFileSharing( const XclExpRoot& rRoot, sal_uInt16 nPasswordHash, bool bRecommendReadOnly ); + + virtual void Save( XclExpStream& rStrm ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclExpString maUserName; + sal_uInt16 mnPasswordHash; + bool mbRecommendReadOnly; +}; + +// ============================================================================ + +class XclExpProt4Rev : public XclExpRecord +{ +public: + explicit XclExpProt4Rev(); + virtual ~XclExpProt4Rev(); + +private: + virtual void WriteBody( XclExpStream& rStrm ); +}; + +// ============================================================================ + +class XclExpProt4RevPass : public XclExpRecord +{ +public: + explicit XclExpProt4RevPass(); + virtual ~XclExpProt4RevPass(); + +private: + virtual void WriteBody( XclExpStream& rStrm ); +}; + +// ============================================================================ + +class XclExpRecalcId : public XclExpDummyRecord +{ +public: + explicit XclExpRecalcId(); +}; + +// ============================================================================ + +class XclExpBookExt : public XclExpDummyRecord +{ +public: + explicit XclExpBookExt(); +}; + + +#endif // _XCL97REC_HXX diff --git a/sc/source/filter/inc/xechart.hxx b/sc/source/filter/inc/xechart.hxx new file mode 100644 index 000000000000..5bb75e029210 --- /dev/null +++ b/sc/source/filter/inc/xechart.hxx @@ -0,0 +1,1275 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XECHART_HXX +#define SC_XECHART_HXX + +#include <tools/gen.hxx> +#include "xerecord.hxx" +#include "xlchart.hxx" +#include "xlformula.hxx" +#include "xlstyle.hxx" +#include "xeroot.hxx" +#include "xestring.hxx" + +class Size; + +namespace com { namespace sun { namespace star { + namespace awt + { + struct Rectangle; + } + namespace frame + { + class XModel; + } + namespace chart2 + { + struct ScaleData; + class XChartDocument; + class XDiagram; + class XCoordinateSystem; + class XChartType; + class XDataSeries; + class XAxis; + class XTitle; + class XFormattedString; + class XRegressionCurve; + namespace data + { + class XDataSequence; + class XLabeledDataSequence; + } + } +} } } + +// Common ===================================================================== + +struct XclExpChRootData; +class XclExpChChart; + +/** Base class for complex chart classes, provides access to other components + of the chart. + + Keeps also track of future record levels and writes the needed future + records on demand. + */ +class XclExpChRoot : public XclExpRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > XChartDocRef; + +public: + explicit XclExpChRoot( const XclExpRoot& rRoot, XclExpChChart& rChartData ); + virtual ~XclExpChRoot(); + + /** Returns this root instance - for code readability in derived classes. */ + inline const XclExpChRoot& GetChRoot() const { return *this; } + /** Returns the API Chart document model. */ + XChartDocRef GetChartDocument() const; + /** Returns a reference to the parent chart data object. */ + XclExpChChart& GetChartData() const; + /** Returns chart type info for a unique chart type identifier. */ + const XclChTypeInfo& GetChartTypeInfo( XclChTypeId eType ) const; + /** Returns the first fitting chart type info for the passed service name. */ + const XclChTypeInfo& GetChartTypeInfo( const ::rtl::OUString& rServiceName ) const; + + /** Returns an info struct about auto formatting for the passed object type. */ + const XclChFormatInfo& GetFormatInfo( XclChObjectType eObjType ) const; + + /** Starts the API chart document conversion. Must be called once before all API conversion. */ + void InitConversion( XChartDocRef xChartDoc, const Rectangle& rChartRect ) const; + /** Finishes the API chart document conversion. Must be called once after all API conversion. */ + void FinishConversion() const; + + /** Returns true, if the passed color equals to the specified system color. */ + bool IsSystemColor( const Color& rColor, sal_uInt16 nSysColorIdx ) const; + /** Sets a system color and the respective color identifier. */ + void SetSystemColor( Color& rColor, sal_uInt32& rnColorId, sal_uInt16 nSysColorIdx ) const; + + /** Converts the passed horizontal coordinate from 1/100 mm to Excel chart units. */ + sal_Int32 CalcChartXFromHmm( sal_Int32 nPosX ) const; + /** Converts the passed vertical coordinate from 1/100 mm to Excel chart units. */ + sal_Int32 CalcChartYFromHmm( sal_Int32 nPosY ) const; + /** Converts the passed rectangle from 1/100 mm to Excel chart units. */ + XclChRectangle CalcChartRectFromHmm( const ::com::sun::star::awt::Rectangle& rRect ) const; + + /** Converts the passed horizontal coordinate from a relative position to Excel chart units. */ + sal_Int32 CalcChartXFromRelative( double fPosX ) const; + /** Converts the passed vertical coordinate from a relative position to Excel chart units. */ + sal_Int32 CalcChartYFromRelative( double fPosY ) const; + + /** Reads all line properties from the passed property set. */ + void ConvertLineFormat( + XclChLineFormat& rLineFmt, + const ScfPropertySet& rPropSet, + XclChPropertyMode ePropMode ) const; + /** Reads solid area properties from the passed property set. + @return true = object contains complex fill properties. */ + bool ConvertAreaFormat( + XclChAreaFormat& rAreaFmt, + const ScfPropertySet& rPropSet, + XclChPropertyMode ePropMode ) const; + /** Reads gradient or bitmap area properties from the passed property set. */ + void ConvertEscherFormat( + XclChEscherFormat& rEscherFmt, + XclChPicFormat& rPicFmt, + const ScfPropertySet& rPropSet, + XclChPropertyMode ePropMode ) const; + /** Reads font properties from the passed property set. */ + sal_uInt16 ConvertFont( + const ScfPropertySet& rPropSet, + sal_Int16 nScript ) const; + + /** Reads the pie rotation property and returns the converted angle. */ + static sal_uInt16 ConvertPieRotation( const ScfPropertySet& rPropSet ); + +protected: + /** Called from XclExpChGroupBase::Save, registers a new future record level. */ + void RegisterFutureRecBlock( const XclChFrBlock& rFrBlock ); + /** Called from XclExpChFutureRecordBase::Save, Initializes the current future record level. */ + void InitializeFutureRecBlock( XclExpStream& rStrm ); + /** Called from XclExpChGroupBase::Save, finalizes the current future record level. */ + void FinalizeFutureRecBlock( XclExpStream& rStrm ); + +private: + typedef ScfRef< XclExpChRootData > XclExpChRootDataRef; + XclExpChRootDataRef mxChData; /// Reference to the root data object. +}; + +// ---------------------------------------------------------------------------- + +/** Base class for chart record groups. Provides helper functions to write sub records. + + A chart record group consists of a header record, followed by a CHBEGIN + record, followed by group sub records, and finished with a CHEND record. + */ +class XclExpChGroupBase : public XclExpRecord, protected XclExpChRoot +{ +public: + explicit XclExpChGroupBase( + const XclExpChRoot& rRoot, sal_uInt16 nFrType, + sal_uInt16 nRecId, sal_Size nRecSize = 0 ); + virtual ~XclExpChGroupBase(); + + /** Saves the header record. Calls WriteSubRecords() to let derived classes write sub records. */ + virtual void Save( XclExpStream& rStrm ); + /** Derived classes return whether there are any records embedded in this group. */ + virtual bool HasSubRecords() const; + /** Derived classes implement writing any records embedded in this group. */ + virtual void WriteSubRecords( XclExpStream& rStrm ) = 0; + +protected: + /** Sets context information for future record blocks. */ + void SetFutureRecordContext( sal_uInt16 nFrContext, + sal_uInt16 nFrValue1 = 0, sal_uInt16 nFrValue2 = 0 ); + +private: + XclChFrBlock maFrBlock; /// Future records block settings. +}; + +// ---------------------------------------------------------------------------- + +/** Base class for chart future records. On saving, the record writes missing + CHFRBLOCKBEGIN records automatically. + */ +class XclExpChFutureRecordBase : public XclExpFutureRecord, protected XclExpChRoot +{ +public: + explicit XclExpChFutureRecordBase( const XclExpChRoot& rRoot, + XclFutureRecType eRecType, sal_uInt16 nRecId, sal_Size nRecSize = 0 ); + + /** Writes missing CHFRBLOCKBEGIN records and this record. */ + virtual void Save( XclExpStream& rStrm ); +}; + +// Frame formatting =========================================================== + +class XclExpChFramePos : public XclExpRecord +{ +public: + explicit XclExpChFramePos( sal_uInt16 nTLMode, sal_uInt16 nBRMode ); + + /** Returns read/write access to the frame position data. */ + inline XclChFramePos& GetFramePosData() { return maData; } + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChFramePos maData; /// Position of the frame. +}; + +typedef ScfRef< XclExpChFramePos > XclExpChFramePosRef; + +// ---------------------------------------------------------------------------- + +class XclExpChLineFormat : public XclExpRecord +{ +public: + explicit XclExpChLineFormat( const XclExpChRoot& rRoot ); + + /** Converts line formatting properties from the passed property set. */ + void Convert( const XclExpChRoot& rRoot, + const ScfPropertySet& rPropSet, XclChObjectType eObjType ); + /** Sets or clears the automatic flag. */ + inline void SetAuto( bool bAuto ) { ::set_flag( maData.mnFlags, EXC_CHLINEFORMAT_AUTO, bAuto ); } + /** Sets flag to show or hide an axis. */ + inline void SetShowAxis( bool bShowAxis ) + { ::set_flag( maData.mnFlags, EXC_CHLINEFORMAT_SHOWAXIS, bShowAxis ); } + /** Sets the line format to the specified default type. */ + void SetDefault( XclChFrameType eDefFrameType ); + + /** Returns true, if the line format is set to automatic. */ + inline bool IsAuto() const { return ::get_flag( maData.mnFlags, EXC_CHLINEFORMAT_AUTO ); } + /** Returns true, if the line style is set to something visible. */ + inline bool HasLine() const { return maData.mnPattern != EXC_CHLINEFORMAT_NONE; } + /** Returns true, if the line contains default formatting according to the passed frame type. */ + bool IsDefault( XclChFrameType eDefFrameType ) const; + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChLineFormat maData; /// Contents of the CHLINEFORMAT record. + sal_uInt32 mnColorId; /// Line color identifier. +}; + +typedef ScfRef< XclExpChLineFormat > XclExpChLineFormatRef; + +// ---------------------------------------------------------------------------- + +class XclExpChAreaFormat : public XclExpRecord +{ +public: + explicit XclExpChAreaFormat( const XclExpChRoot& rRoot ); + + /** Converts area formatting properties from the passed property set. + @return true = object contains complex fill properties. */ + bool Convert( const XclExpChRoot& rRoot, + const ScfPropertySet& rPropSet, XclChObjectType eObjType ); + /** Sets or clears the automatic flag. */ + inline void SetAuto( bool bAuto ) { ::set_flag( maData.mnFlags, EXC_CHAREAFORMAT_AUTO, bAuto ); } + /** Sets the area format to the specified default type. */ + void SetDefault( XclChFrameType eDefFrameType ); + + /** Returns true, if the area format is set to automatic. */ + inline bool IsAuto() const { return ::get_flag( maData.mnFlags, EXC_CHAREAFORMAT_AUTO ); } + /** Returns true, if the area style is set to something visible. */ + inline bool HasArea() const { return maData.mnPattern != EXC_PATT_NONE; } + /** Returns true, if the area contains default formatting according to the passed frame type. */ + bool IsDefault( XclChFrameType eDefFrameType ) const; + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChAreaFormat maData; /// Contents of the CHAREAFORMAT record. + sal_uInt32 mnPattColorId; /// Pattern color identifier. + sal_uInt32 mnBackColorId; /// Pattern background color identifier. +}; + +typedef ScfRef< XclExpChAreaFormat > XclExpChAreaFormatRef; + +// ---------------------------------------------------------------------------- + +class XclExpChEscherFormat : public XclExpChGroupBase +{ +public: + explicit XclExpChEscherFormat( const XclExpChRoot& rRoot ); + + /** Converts complex area formatting from the passed property set. */ + void Convert( const ScfPropertySet& rPropSet, XclChObjectType eObjType ); + + /** Returns true, if the object contains valid formatting data. */ + bool IsValid() const; + + /** Writes the CHESCHERFORMAT record group to the stream, if complex formatting is extant. */ + virtual void Save( XclExpStream& rStrm ); + /** Returns true, if this record group contains a CHPICFORMAT record. */ + virtual bool HasSubRecords() const; + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + /** Inserts a color from the contained Escher property set into the color palette. */ + sal_uInt32 RegisterColor( sal_uInt16 nPropId ); + + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChEscherFormat maData; /// Fill properties for complex areas (CHESCHERFORMAT record). + XclChPicFormat maPicFmt; /// Image options, e.g. stretched, stacked (CHPICFORMAT record). + sal_uInt32 mnColor1Id; /// First fill color identifier. + sal_uInt32 mnColor2Id; /// Second fill color identifier. +}; + +typedef ScfRef< XclExpChEscherFormat > XclExpChEscherFormatRef; + +// ---------------------------------------------------------------------------- + +/** Base class for record groups containing frame formatting. + + Frame formatting can be part of several record groups, e.g. CHFRAME, + CHDATAFORMAT, CHDROPBAR. It consists of CHLINEFORMAT, CHAREAFORMAT, and + CHESCHERFORMAT group. + */ +class XclExpChFrameBase +{ +public: + explicit XclExpChFrameBase(); + virtual ~XclExpChFrameBase(); + +protected: + /** Converts frame formatting properties from the passed property set. */ + void ConvertFrameBase( const XclExpChRoot& rRoot, + const ScfPropertySet& rPropSet, XclChObjectType eObjType ); + /** Sets the frame formatting to the specified default type. */ + void SetDefaultFrameBase( const XclExpChRoot& rRoot, + XclChFrameType eDefFrameType, bool bIsFrame ); + + /** Returns true, if the frame contains default formatting (as if the frame is missing). */ + bool IsDefaultFrameBase( XclChFrameType eDefFrameType ) const; + + /** Writes all contained frame records to the passed stream. */ + void WriteFrameRecords( XclExpStream& rStrm ); + +private: + XclExpChLineFormatRef mxLineFmt; /// Line format (CHLINEFORMAT record). + XclExpChAreaFormatRef mxAreaFmt; /// Area format (CHAREAFORMAT record). + XclExpChEscherFormatRef mxEscherFmt; /// Complex area format (CHESCHERFORMAT record). +}; + +// ---------------------------------------------------------------------------- + +/** Represents the CHFRAME record group containing object frame properties. + + The CHFRAME group consists of: CHFRAME, CHBEGIN, CHLINEFORMAT, + CHAREAFORMAT, CHESCHERFORMAT group, CHEND. + */ +class XclExpChFrame : public XclExpChGroupBase, public XclExpChFrameBase +{ +public: + explicit XclExpChFrame( const XclExpChRoot& rRoot, XclChObjectType eObjType ); + + /** Converts frame formatting properties from the passed property set. */ + void Convert( const ScfPropertySet& rPropSet ); + + /** Returns true, if the frame object contains default formats. */ + bool IsDefault() const; + /** Returns true, if the frame object can be deleted because it contains default formats. */ + bool IsDeleteable() const; + + /** Writes the entire record group. */ + virtual void Save( XclExpStream& rStrm ); + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChFrame maData; /// Contents of the CHFRAME record. + XclChObjectType meObjType; /// Type of the represented object. +}; + +typedef ScfRef< XclExpChFrame > XclExpChFrameRef; + +// Source links =============================================================== + +class XclExpChSourceLink : public XclExpRecord, protected XclExpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > XDataSequenceRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XFormattedString > XFormattedStringRef; + typedef ::com::sun::star::uno::Sequence< XFormattedStringRef > XFormattedStringSeq; + +public: + explicit XclExpChSourceLink( const XclExpChRoot& rRoot, sal_uInt8 nDestType ); + + /** Converts the passed source link, returns the number of linked values. */ + sal_uInt16 ConvertDataSequence( XDataSequenceRef xDataSeq, bool bSplitToColumns, sal_uInt16 nDefCount = 0 ); + /** Converts the passed sequence of formatted string objects, returns leading font index. */ + sal_uInt16 ConvertStringSequence( const XFormattedStringSeq& rStringSeq ); + /** Converts the number format from the passed property set. */ + void ConvertNumFmt( const ScfPropertySet& rPropSet, bool bPercent ); + + /** Returns true, if this source link contains explicit string data. */ + inline bool HasString() const { return mxString.is() && !mxString->IsEmpty(); } + + /** Writes the CHSOURCELINK record and optionally a CHSTRING record with explicit string data. */ + virtual void Save( XclExpStream& rStrm ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChSourceLink maData; /// Contents of the CHSOURCELINK record. + XclTokenArrayRef mxLinkFmla; /// Formula with link to source data. + XclExpStringRef mxString; /// Text data (CHSTRING record). +}; + +typedef ScfRef< XclExpChSourceLink > XclExpChSourceLinkRef; + +// Text ======================================================================= + +/** The CHFONT record containing a font index for text objects. */ +class XclExpChFont : public XclExpUInt16Record +{ +public: + explicit XclExpChFont( sal_uInt16 nFontIdx ); +}; + +typedef ScfRef< XclExpChFont > XclExpChFontRef; + +// ---------------------------------------------------------------------------- + +/** The CHOBJECTLINK record linking a text object to a specific chart object. */ +class XclExpChObjectLink : public XclExpRecord +{ +public: + explicit XclExpChObjectLink( sal_uInt16 nLinkTarget, const XclChDataPointPos& rPointPos ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChObjectLink maData; /// Contents of the CHOBJECTLINK record. +}; + +typedef ScfRef< XclExpChObjectLink > XclExpChObjectLinkRef; + +// ---------------------------------------------------------------------------- + +/** Additional data label settings in the future record CHFRLABELPROPS. */ +class XclExpChFrLabelProps : public XclExpChFutureRecordBase +{ +public: + explicit XclExpChFrLabelProps( const XclExpChRoot& rRoot ); + + /** Converts separator and the passed data label flags. */ + void Convert( + const ScfPropertySet& rPropSet, bool bShowSeries, + bool bShowCateg, bool bShowValue, + bool bShowPercent, bool bShowBubble ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChFrLabelProps maData; /// Contents of the CHFRLABELPROPS record. +}; + +typedef ScfRef< XclExpChFrLabelProps > XclExpChFrLabelPropsRef; + +// ---------------------------------------------------------------------------- + +/** Base class for objects with font settings. Provides font conversion helper functions. */ +class XclExpChFontBase +{ +public: + virtual ~XclExpChFontBase(); + + /** Derived classes set font color and color identifier to internal data structures. */ + virtual void SetFont( XclExpChFontRef xFont, const Color& rColor, sal_uInt32 nColorId ) = 0; + /** Derived classes set text rotation to internal data structures. */ + virtual void SetRotation( sal_uInt16 nRotation ) = 0; + + /** Creates a CHFONT record from the passed font index, calls virtual function SetFont(). */ + void ConvertFontBase( const XclExpChRoot& rRoot, sal_uInt16 nFontIdx ); + /** Creates a CHFONT record from the passed font index, calls virtual function SetFont(). */ + void ConvertFontBase( const XclExpChRoot& rRoot, const ScfPropertySet& rPropSet ); + /** Converts rotation settings, calls virtual function SetRotation(). */ + void ConvertRotationBase( const XclExpChRoot& rRoot, const ScfPropertySet& rPropSet, bool bSupportsStacked ); +}; + +// ---------------------------------------------------------------------------- + +/** Represents the CHTEXT record group containing text object properties. + + The CHTEXT group consists of: CHTEXT, CHBEGIN, CHFRAMEPOS, CHFONT, + CHFORMATRUNS, CHSOURCELINK, CHSTRING, CHFRAME group, CHOBJECTLINK, and CHEND. + */ +class XclExpChText : public XclExpChGroupBase, public XclExpChFontBase +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XTitle > XTitleRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XRegressionCurve > XRegressionCurveRef; + +public: + explicit XclExpChText( const XclExpChRoot& rRoot ); + + /** Sets font color and color identifier to internal data structures. */ + virtual void SetFont( XclExpChFontRef xFont, const Color& rColor, sal_uInt32 nColorId ); + /** Sets text rotation to internal data structures. */ + virtual void SetRotation( sal_uInt16 nRotation ); + + /** Converts all text settings of the passed title text object. */ + void ConvertTitle( XTitleRef xTitle, sal_uInt16 nTarget ); + /** Converts all text settings of the passed legend. */ + void ConvertLegend( const ScfPropertySet& rPropSet ); + /** Converts all settings of the passed data point caption text object. */ + bool ConvertDataLabel( const ScfPropertySet& rPropSet, + const XclChTypeInfo& rTypeInfo, const XclChDataPointPos& rPointPos ); + /** Converts all settings of the passed trend line equation box. */ + void ConvertTrendLineEquation( const ScfPropertySet& rPropSet, const XclChDataPointPos& rPointPos ); + + /** Returns true, if the string object does not contain any text data. */ + inline bool HasString() const { return mxSrcLink.is() && mxSrcLink->HasString(); } + /** Returns the flags needed for the CHATTACHEDLABEL record. */ + sal_uInt16 GetAttLabelFlags() const; + + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChText maData; /// Contents of the CHTEXT record. + XclExpChFramePosRef mxFramePos; /// Relative text frame position (CHFRAMEPOS record). + XclExpChSourceLinkRef mxSrcLink; /// Linked data (CHSOURCELINK with CHSTRING record). + XclExpChFrameRef mxFrame; /// Text object frame properties (CHFRAME group). + XclExpChFontRef mxFont; /// Index into font buffer (CHFONT record). + XclExpChObjectLinkRef mxObjLink; /// Link target for this text object. + XclExpChFrLabelPropsRef mxLabelProps; /// Extended data label properties (CHFRLABELPROPS record). + sal_uInt32 mnTextColorId; /// Text color identifier. +}; + +typedef ScfRef< XclExpChText > XclExpChTextRef; + +// Data series ================================================================ + +/** The CHMARKERFORMAT record containing data point marker formatting data. */ +class XclExpChMarkerFormat : public XclExpRecord +{ +public: + explicit XclExpChMarkerFormat( const XclExpChRoot& rRoot ); + + /** Converts symbol properties from the passed property set. */ + void Convert( const XclExpChRoot& rRoot, + const ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx ); + /** Converts symbol properties for stock charts from the passed property set. */ + void ConvertStockSymbol( const XclExpChRoot& rRoot, + const ScfPropertySet& rPropSet, bool bCloseSymbol ); + + /** Returns true, if markers are enabled. */ + inline bool HasMarker() const { return maData.mnMarkerType != EXC_CHMARKERFORMAT_NOSYMBOL; } + /** Returns true, if border line of markers is visible. */ + inline bool HasLineColor() const { return !::get_flag( maData.mnFlags, EXC_CHMARKERFORMAT_NOLINE ); } + /** Returns true, if fill area of markers is visible. */ + inline bool HasFillColor() const { return !::get_flag( maData.mnFlags, EXC_CHMARKERFORMAT_NOFILL ); } + +private: + /** Registers marker colors in palette and stores color identifiers. */ + void RegisterColors( const XclExpChRoot& rRoot ); + + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChMarkerFormat maData; /// Contents of the CHMARKERFORMAT record. + sal_uInt32 mnLineColorId; /// Border line color identifier. + sal_uInt32 mnFillColorId; /// Fill color identifier. +}; + +typedef ScfRef< XclExpChMarkerFormat > XclExpChMarkerFormatRef; + +// ---------------------------------------------------------------------------- + +/** The CHPIEFORMAT record containing data point formatting data for pie segments. */ +class XclExpChPieFormat : public XclExpUInt16Record +{ +public: + explicit XclExpChPieFormat(); + + /** Sets pie segment properties from the passed property set. */ + void Convert( const ScfPropertySet& rPropSet ); +}; + +typedef ScfRef< XclExpChPieFormat > XclExpChPieFormatRef; + +// ---------------------------------------------------------------------------- + +/** The CH3DDATAFORMAT record containing the bar type in 3D bar charts. */ +class XclExpCh3dDataFormat : public XclExpRecord +{ +public: + explicit XclExpCh3dDataFormat(); + + /** Sets 3d bar properties from the passed property set. */ + void Convert( const ScfPropertySet& rPropSet ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclCh3dDataFormat maData; /// Contents of the CH3DDATAFORMAT record. +}; + +typedef ScfRef< XclExpCh3dDataFormat > XclExpCh3dDataFormatRef; + +// ---------------------------------------------------------------------------- + +/** The CHATTACHEDLABEL record that contains the type of a data point label. */ +class XclExpChAttachedLabel : public XclExpUInt16Record +{ +public: + explicit XclExpChAttachedLabel( sal_uInt16 nFlags ); +}; + +typedef ScfRef< XclExpChAttachedLabel > XclExpChAttLabelRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHDATAFORMAT record group containing data point properties. + + The CHDATAFORMAT group consists of: CHDATAFORMAT, CHBEGIN, CHFRAME group, + CHMARKERFORMAT, CHPIEFORMAT, CH3DDATAFORMAT, CHSERIESFORMAT, + CHATTACHEDLABEL, CHEND. + */ +class XclExpChDataFormat : public XclExpChGroupBase, public XclExpChFrameBase +{ +public: + explicit XclExpChDataFormat( const XclExpChRoot& rRoot, + const XclChDataPointPos& rPointPos, sal_uInt16 nFormatIdx ); + + /** Converts the passed data series or data point formatting. */ + void ConvertDataSeries( const ScfPropertySet& rPropSet, const XclChExtTypeInfo& rTypeInfo ); + /** Sets default formatting for a series in a stock chart. */ + void ConvertStockSeries( const ScfPropertySet& rPropSet, bool bCloseSymbol ); + /** Converts line formatting for the specified object (e.g. trend lines, error bars). */ + void ConvertLine( const ScfPropertySet& rPropSet, XclChObjectType eObjType ); + + /** Returns true, if this objects describes the formatting of an entire series. */ + inline bool IsSeriesFormat() const { return maData.maPointPos.mnPointIdx == EXC_CHDATAFORMAT_ALLPOINTS; } + + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChDataFormat maData; /// Contents of the CHDATAFORMAT record. + XclExpChMarkerFormatRef mxMarkerFmt; /// Data point marker (CHMARKERFORMAT record). + XclExpChPieFormatRef mxPieFmt; /// Pie segment format (CHPIEFORMAT record). + XclExpRecordRef mxSeriesFmt; /// Series properties (CHSERIESFORMAT record). + XclExpCh3dDataFormatRef mx3dDataFmt; /// 3D bar format (CH3DDATAFORMAT record). + XclExpChAttLabelRef mxAttLabel; /// Data point label type (CHATTACHEDLABEL record). +}; + +typedef ScfRef< XclExpChDataFormat > XclExpChDataFormatRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHSERTRENDLINE record containing settings for a trend line. */ +class XclExpChSerTrendLine : public XclExpRecord, protected XclExpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XRegressionCurve > XRegressionCurveRef; + +public: + explicit XclExpChSerTrendLine( const XclExpChRoot& rRoot ); + + /** Converts the passed trend line, returns true if trend line type is supported. */ + bool Convert( XRegressionCurveRef xRegCurve, sal_uInt16 nSeriesIdx ); + + /** Returns formatting information of the trend line, created in Convert(). */ + inline XclExpChDataFormatRef GetDataFormat() const { return mxDataFmt; } + /** Returns formatting of the equation text box, created in Convert(). */ + inline XclExpChTextRef GetDataLabel() const { return mxLabel; } + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChSerTrendLine maData; /// Contents of the CHSERTRENDLINE record. + XclExpChDataFormatRef mxDataFmt; /// Formatting settings of the trend line. + XclExpChTextRef mxLabel; /// Formatting of the equation text box. +}; + +typedef ScfRef< XclExpChSerTrendLine > XclExpChSerTrendLineRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHSERERRORBAR record containing settings for error bars. */ +class XclExpChSerErrorBar : public XclExpRecord, protected XclExpChRoot +{ +public: + explicit XclExpChSerErrorBar( const XclExpChRoot& rRoot, sal_uInt8 nBarType ); + + /** Converts the passed error bar settings, returns true if error bar type is supported. */ + bool Convert( XclExpChSourceLink& rValueLink, sal_uInt16& rnValueCount, const ScfPropertySet& rPropSet ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChSerErrorBar maData; /// Contents of the CHSERERRORBAR record. +}; + +typedef ScfRef< XclExpChSerErrorBar > XclExpChSerErrorBarRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHSERIES record group describing a data series in a chart. + + The CHSERIES group consists of: CHSERIES, CHBEGIN, CHSOURCELINK groups, + CHDATAFORMAT groups, CHSERGROUP, CHSERPARENT, CHSERERRORBAR, + CHSERTRENDLINE, CHEND. + */ +class XclExpChSeries : public XclExpChGroupBase +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > XDiagramRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > XDataSeriesRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > XLabeledDataSeqRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XRegressionCurve > XRegressionCurveRef; + +public: + explicit XclExpChSeries( const XclExpChRoot& rRoot, sal_uInt16 nSeriesIdx ); + + /** Converts the passed data series (source links and formatting). */ + bool ConvertDataSeries( + XDiagramRef xDiagram, XDataSeriesRef xDataSeries, + const XclChExtTypeInfo& rTypeInfo, + sal_uInt16 nGroupIdx, sal_uInt16 nFormatIdx ); + /** Converts the passed data series for stock charts. */ + bool ConvertStockSeries( + XDataSeriesRef xDataSeries, + const ::rtl::OUString& rValueRole, + sal_uInt16 nGroupIdx, sal_uInt16 nFormatIdx, bool bCloseSymbol ); + /** Converts the passed error bar settings (called at trend line child series). */ + bool ConvertTrendLine( const XclExpChSeries& rParent, XRegressionCurveRef xRegCurve ); + /** Converts the passed error bar settings (called at error bar child series). */ + bool ConvertErrorBar( const XclExpChSeries& rParent, const ScfPropertySet& rPropSet, sal_uInt8 nBarId ); + /** Converts and inserts category ranges for all inserted series. */ + void ConvertCategSequence( XLabeledDataSeqRef xCategSeq ); + + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + /** Initializes members of this series to represent a child of the passed series. */ + void InitFromParent( const XclExpChSeries& rParent ); + /** Tries to create trend line series objects (called at parent series). */ + void CreateTrendLines( XDataSeriesRef xDataSeries ); + /** Tries to create positive and negative error bar series objects (called at parent series). */ + void CreateErrorBars( const ScfPropertySet& rPropSet, + const ::rtl::OUString& rBarPropName, + sal_uInt8 nPosBarId, sal_uInt8 nNegBarId ); + /** Tries to create an error bar series object (called at parent series). */ + void CreateErrorBar( const ScfPropertySet& rPropSet, + const ::rtl::OUString& rShowPropName, sal_uInt8 nBarId ); + + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpChDataFormat > XclExpChDataFormatList; + +private: + XclChSeries maData; /// Contents of the CHSERIES record. + XclExpChSourceLinkRef mxTitleLink; /// Link data for series title. + XclExpChSourceLinkRef mxValueLink; /// Link data for series values. + XclExpChSourceLinkRef mxCategLink; /// Link data for series category names. + XclExpChSourceLinkRef mxBubbleLink; /// Link data for series bubble sizes. + XclExpChDataFormatRef mxSeriesFmt; /// CHDATAFORMAT group for series format. + XclExpChDataFormatList maPointFmts; /// CHDATAFORMAT groups for data point formats. + XclExpChSerTrendLineRef mxTrendLine; /// Trend line settings (CHSERTRENDLINE record). + XclExpChSerErrorBarRef mxErrorBar; /// Error bar settings (CHSERERRORBAR record). + sal_uInt16 mnGroupIdx; /// Chart type group (CHTYPEGROUP group) this series is assigned to. + sal_uInt16 mnSeriesIdx; /// 0-based series index. + sal_uInt16 mnParentIdx; /// 0-based index of parent series (trend lines and error bars). +}; + +typedef ScfRef< XclExpChSeries > XclExpChSeriesRef; + +// Chart type groups ========================================================== + +/** Represents the chart type record for all supported chart types. */ +class XclExpChType : public XclExpRecord, protected XclExpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > XDiagramRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType > XChartTypeRef; + +public: + explicit XclExpChType( const XclExpChRoot& rRoot ); + + /** Converts the passed chart type and the contained data series. */ + void Convert( XDiagramRef xDiagram, XChartTypeRef xChartType, + sal_Int32 nApiAxesSetIdx, bool bSwappedAxesSet, bool bHasXLabels ); + /** Sets stacking mode (standard or percent) for the series in this chart type group. */ + void SetStacked( bool bPercent ); + + /** Returns true, if this is object represents a valid chart type. */ + inline bool IsValidType() const { return maTypeInfo.meTypeId != EXC_CHTYPEID_UNKNOWN; } + /** Returns the chart type info struct for the contained chart type. */ + inline const XclChTypeInfo& GetTypeInfo() const { return maTypeInfo; } + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChType maData; /// Contents of the chart type record. + XclChTypeInfo maTypeInfo; /// Chart type info for the contained type. +}; + +// ---------------------------------------------------------------------------- + +/** Represents the CHCHART3D record that contains 3D view settings. */ +class XclExpChChart3d : public XclExpRecord +{ +public: + explicit XclExpChChart3d(); + + /** Converts 3d settings for the passed chart type. */ + void Convert( const ScfPropertySet& rPropSet, bool b3dWallChart ); + /** Sets flag that the data points are clustered on the X axis. */ + inline void SetClustered() { ::set_flag( maData.mnFlags, EXC_CHCHART3D_CLUSTER ); } + + /** Returns true, if the data points are clustered on the X axis. */ + inline bool IsClustered() const { return ::get_flag( maData.mnFlags, EXC_CHCHART3D_CLUSTER ); } + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChChart3d maData; /// Contents of the CHCHART3D record. +}; + +typedef ScfRef< XclExpChChart3d > XclExpChChart3dRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHLEGEND record group describing the chart legend. + + The CHLEGEND group consists of: CHLEGEND, CHBEGIN, CHFRAMEPOS, CHFRAME + group, CHTEXT group, CHEND. + */ +class XclExpChLegend : public XclExpChGroupBase +{ +public: + explicit XclExpChLegend( const XclExpChRoot& rRoot ); + + /** Converts all legend settings from the passed property set. */ + void Convert( const ScfPropertySet& rPropSet ); + + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChLegend maData; /// Contents of the CHLEGEND record. + XclExpChFramePosRef mxFramePos; /// Legend frame position (CHFRAMEPOS record). + XclExpChTextRef mxText; /// Legend text format (CHTEXT group). + XclExpChFrameRef mxFrame; /// Legend frame format (CHFRAME group). +}; + +typedef ScfRef< XclExpChLegend > XclExpChLegendRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHDROPBAR record group describing pos/neg bars in line charts. + + The CHDROPBAR group consists of: CHDROPBAR, CHBEGIN, CHLINEFORMAT, + CHAREAFORMAT, CHESCHERFORMAT group, CHEND. + */ +class XclExpChDropBar : public XclExpChGroupBase, public XclExpChFrameBase +{ +public: + explicit XclExpChDropBar( const XclExpChRoot& rRoot, XclChObjectType eObjType ); + + /** Converts and writes the contained frame data to the passed property set. */ + void Convert( const ScfPropertySet& rPropSet ); + + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChObjectType meObjType; /// Type of the dropbar. + sal_uInt16 mnBarDist; /// Distance between bars (CHDROPBAR record). +}; + +typedef ScfRef< XclExpChDropBar > XclExpChDropBarRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHTYPEGROUP record group describing a group of series. + + The CHTYPEGROUP group consists of: CHTYPEGROUP, CHBEGIN, a chart type + record (e.g. CHBAR, CHLINE, CHAREA, CHPIE, ...), CHCHART3D, CHLEGEND group, + CHDROPBAR groups, CHCHARTLINE groups (CHCHARTLINE with CHLINEFORMAT), + CHDATAFORMAT group, CHEND. + */ +class XclExpChTypeGroup : public XclExpChGroupBase +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > XDiagramRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType > XChartTypeRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > XDataSeriesRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > XLabeledDataSeqRef; + +public: + explicit XclExpChTypeGroup( const XclExpChRoot& rRoot, sal_uInt16 nGroupIdx ); + + /** Converts the passed chart type to Excel type settings. */ + void ConvertType( XDiagramRef xDiagram, XChartTypeRef xChartType, + sal_Int32 nApiAxesSetIdx, bool b3dChart, bool bSwappedAxesSet, bool bHasXLabels ); + /** Converts and inserts all series from the passed chart type. */ + void ConvertSeries( XDiagramRef xDiagram, XChartTypeRef xChartType, + sal_Int32 nGroupAxesSetIdx, bool bPercent, bool bConnectorLines ); + /** Converts and inserts category ranges for all inserted series. */ + void ConvertCategSequence( XLabeledDataSeqRef xCategSeq ); + /** Creates a legend object and converts all legend settings. */ + void ConvertLegend( const ScfPropertySet& rPropSet ); + + /** Returns true, if this chart type group contains at least one valid series. */ + inline bool IsValidGroup() const { return !maSeries.IsEmpty() && maType.IsValidType(); } + /** Returns the index of this chart type group format. */ + inline sal_uInt16 GetGroupIdx() const { return maData.mnGroupIdx; } + /** Returns the chart type info struct for the contained chart type. */ + inline const XclChExtTypeInfo& GetTypeInfo() const { return maTypeInfo; } + /** Returns true, if the chart is three-dimensional. */ + inline bool Is3dChart() const { return maTypeInfo.mb3dChart; } + /** Returns true, if chart type supports wall and floor format. */ + inline bool Is3dWallChart() const { return Is3dChart() && (maTypeInfo.meTypeCateg != EXC_CHTYPECATEG_PIE); } + /** Returns true, if the series in this chart type group are ordered on the Z axis. */ + inline bool Is3dDeepChart() const { return Is3dWallChart() && mxChart3d.is() && !mxChart3d->IsClustered(); } + /** Returns true, if this chart type can be combined with other types. */ + inline bool IsCombinable2d() const { return !Is3dChart() && maTypeInfo.mbCombinable2d; } + + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + /** Returns an unused format index to be used for the next created series. */ + sal_uInt16 GetFreeFormatIdx() const; + /** Creates all data series of any chart type except stock charts. */ + void CreateDataSeries( XDiagramRef xDiagram, + XDataSeriesRef xDataSeries ); + /** Creates all data series of a stock chart. */ + void CreateAllStockSeries( XChartTypeRef xChartType, + XDataSeriesRef xDataSeries ); + /** Creates a single data series of a stock chart. */ + bool CreateStockSeries( XDataSeriesRef xDataSeries, + const ::rtl::OUString& rValueRole, bool bCloseSymbol ); + + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpChSeries > XclExpChSeriesList; + typedef ScfRefMap< sal_uInt16, XclExpChLineFormat > XclExpChLineFormatMap; + + XclChTypeGroup maData; /// Contents of the CHTYPEGROUP record. + XclExpChType maType; /// Chart type (e.g. CHBAR, CHLINE, ...). + XclChExtTypeInfo maTypeInfo; /// Extended chart type info. + XclExpChSeriesList maSeries; /// List of series data (CHSERIES groups). + XclExpChChart3dRef mxChart3d; /// 3D settings (CHCHART3D record). + XclExpChLegendRef mxLegend; /// Chart legend (CHLEGEND group). + XclExpChDropBarRef mxUpBar; /// White dropbars (CHDROPBAR group). + XclExpChDropBarRef mxDownBar; /// Black dropbars (CHDROPBAR group). + XclExpChLineFormatMap maChartLines; /// Global line formats (CHCHARTLINE group). +}; + +typedef ScfRef< XclExpChTypeGroup > XclExpChTypeGroupRef; + +// Axes ======================================================================= + +class XclExpChLabelRange : public XclExpRecord, protected XclExpChRoot +{ +public: + explicit XclExpChLabelRange( const XclExpChRoot& rRoot ); + + /** Converts category axis scaling settings. */ + void Convert( const ::com::sun::star::chart2::ScaleData& rScaleData, bool bMirrorOrient ); + /** Converts position settings of a crossing axis at this axis. */ + void ConvertAxisPosition( const ScfPropertySet& rPropSet ); + /** Sets flag for tickmark position between categories or on categories. */ + inline void SetTicksBetweenCateg( bool bTicksBetween ) + { ::set_flag( maData.mnFlags, EXC_CHLABELRANGE_BETWEEN, bTicksBetween ); } + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChLabelRange maData; /// Contents of the CHLABELRANGE record. +}; + +typedef ScfRef< XclExpChLabelRange > XclExpChLabelRangeRef; + +// ---------------------------------------------------------------------------- + +class XclExpChValueRange : public XclExpRecord, protected XclExpChRoot +{ +public: + explicit XclExpChValueRange( const XclExpChRoot& rRoot ); + + /** Converts value axis scaling settings. */ + void Convert( const ::com::sun::star::chart2::ScaleData& rScaleData ); + /** Converts position settings of a crossing axis at this axis. */ + void ConvertAxisPosition( const ScfPropertySet& rPropSet ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChValueRange maData; /// Contents of the CHVALUERANGE record. +}; + +typedef ScfRef< XclExpChValueRange > XclExpChValueRangeRef; + +// ---------------------------------------------------------------------------- + +class XclExpChTick : public XclExpRecord, protected XclExpChRoot +{ +public: + explicit XclExpChTick( const XclExpChRoot& rRoot ); + + /** Converts axis tick mark settings. */ + void Convert( const ScfPropertySet& rPropSet, const XclChExtTypeInfo& rTypeInfo, sal_uInt16 nAxisType ); + /** Sets font color and color identifier to internal data structures. */ + void SetFontColor( const Color& rColor, sal_uInt32 nColorId ); + /** Sets text rotation to internal data structures. */ + void SetRotation( sal_uInt16 nRotation ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChTick maData; /// Contents of the CHTICK record. + sal_uInt32 mnTextColorId; /// Axis labels text color identifier. +}; + +typedef ScfRef< XclExpChTick > XclExpChTickRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHAXIS record group describing an entire chart axis. + + The CHAXIS group consists of: CHAXIS, CHBEGIN, CHLABELRANGE, CHEXTRANGE, + CHVALUERANGE, CHFORMAT, CHTICK, CHFONT, CHAXISLINE groups (CHAXISLINE with + CHLINEFORMAT, CHAREAFORMAT, and CHESCHERFORMAT group), CHEND. + */ +class XclExpChAxis : public XclExpChGroupBase, public XclExpChFontBase +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > XDiagramRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XAxis > XAxisRef; + +public: + explicit XclExpChAxis( const XclExpChRoot& rRoot, sal_uInt16 nAxisType ); + + /** Sets font color and color identifier to internal data structures. */ + virtual void SetFont( XclExpChFontRef xFont, const Color& rColor, sal_uInt32 nColorId ); + /** Sets text rotation to internal data structures. */ + virtual void SetRotation( sal_uInt16 nRotation ); + + /** Converts formatting and scaling settings from the passed axis. */ + void Convert( XAxisRef xAxis, XAxisRef xCrossingAxis, const XclChExtTypeInfo& rTypeInfo ); + /** Converts and writes 3D wall/floor properties from the passed diagram. */ + void ConvertWall( XDiagramRef xDiagram ); + + /** Returns the type of this axis. */ + inline sal_uInt16 GetAxisType() const { return maData.mnType; } + /** Returns the axis dimension index used by the chart API. */ + inline sal_Int32 GetApiAxisDimension() const { return maData.GetApiAxisDimension(); } + + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclChAxis maData; /// Contents of the CHAXIS record. + XclExpChLabelRangeRef mxLabelRange; /// Category scaling (CHLABELRANGE record). + XclExpChValueRangeRef mxValueRange; /// Value scaling (CHVALUERANGE record). + XclExpChTickRef mxTick; /// Axis ticks (CHTICK record). + XclExpChFontRef mxFont; /// Index into font buffer (CHFONT record). + XclExpChLineFormatRef mxAxisLine; /// Axis line format (CHLINEFORMAT record). + XclExpChLineFormatRef mxMajorGrid; /// Major grid line format (CHLINEFORMAT record). + XclExpChLineFormatRef mxMinorGrid; /// Minor grid line format (CHLINEFORMAT record). + XclExpChFrameRef mxWallFrame; /// Wall/floor format (sub records of CHFRAME group). + sal_uInt16 mnNumFmtIdx; /// Index into number format buffer (CHFORMAT record). +}; + +typedef ScfRef< XclExpChAxis > XclExpChAxisRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHAXESSET record group describing an axes set (X/Y/Z axes). + + The CHAXESSET group consists of: CHAXESSET, CHBEGIN, CHFRAMEPOS, CHAXIS + groups, CHTEXT groups, CHPLOTFRAME group (CHPLOTFRAME with CHFRAME group), + CHTYPEGROUP group, CHEND. + */ +class XclExpChAxesSet : public XclExpChGroupBase +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > XDiagramRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem > XCoordSystemRef; + +public: + explicit XclExpChAxesSet( const XclExpChRoot& rRoot, sal_uInt16 nAxesSetId ); + + /** Converts the passed diagram to chart record data. + @return First unused chart type group index. */ + sal_uInt16 Convert( XDiagramRef xDiagram, sal_uInt16 nFirstGroupIdx ); + + /** Returns true, if this axes set exists (returns false if this is a dummy object). */ + inline bool IsValidAxesSet() const { return !maTypeGroups.IsEmpty(); } + /** Returns the index of the axes set (primary/secondary). */ + inline sal_uInt16 GetAxesSetId() const { return maData.mnAxesSetId; } + /** Returns the axes set index used by the chart API. */ + inline sal_Int32 GetApiAxesSetIndex() const { return maData.GetApiAxesSetIndex(); } + /** Returns true, if the chart is three-dimensional. */ + bool Is3dChart() const; + + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + /** Returns first inserted chart type group. */ + XclExpChTypeGroupRef GetFirstTypeGroup() const; + /** Returns last inserted chart type group. */ + XclExpChTypeGroupRef GetLastTypeGroup() const; + + /** Converts a complete axis object including axis title. */ + void ConvertAxis( XclExpChAxisRef& rxChAxis, sal_uInt16 nAxisType, + XclExpChTextRef& rxChAxisTitle, sal_uInt16 nTitleTarget, + XCoordSystemRef xCoordSystem, const XclChExtTypeInfo& rTypeInfo, + sal_Int32 nCrossingAxisDim ); + + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpChTypeGroup > XclExpChTypeGroupList; + + XclChAxesSet maData; /// Contents of the CHAXESSET record. + XclExpChFramePosRef mxFramePos; /// Outer plot area position (CHFRAMEPOS record). + XclExpChAxisRef mxXAxis; /// The X axis (CHAXIS group). + XclExpChAxisRef mxYAxis; /// The Y axis (CHAXIS group). + XclExpChAxisRef mxZAxis; /// The Z axis (CHAXIS group). + XclExpChTextRef mxXAxisTitle; /// The X axis title (CHTEXT group). + XclExpChTextRef mxYAxisTitle; /// The Y axis title (CHTEXT group). + XclExpChTextRef mxZAxisTitle; /// The Z axis title (CHTEXT group). + XclExpChFrameRef mxPlotFrame; /// Plot area (CHPLOTFRAME group). + XclExpChTypeGroupList maTypeGroups; /// Chart type groups (CHTYPEGROUP group). +}; + +typedef ScfRef< XclExpChAxesSet > XclExpChAxesSetRef; + +// The chart object =========================================================== + +/** Represents the CHCHART record group describing the chart contents. + + The CHCHART group consists of: CHCHART, CHBEGIN, SCL, CHPLOTGROWTH, CHFRAME + group, CHSERIES groups, CHPROPERTIES, CHDEFAULTTEXT groups (CHDEFAULTTEXT + with CHTEXT groups), CHUSEDAXESSETS, CHAXESSET groups, CHTEXT groups, CHEND. + */ +class XclExpChChart : public XclExpChGroupBase +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > XChartDocRef; + +public: + explicit XclExpChChart( const XclExpRoot& rRoot, + XChartDocRef xChartDoc, const Rectangle& rChartRect ); + + /** Creates, registers and returns a new data series object. */ + XclExpChSeriesRef CreateSeries(); + /** Removes the last created data series object from the series list. */ + void RemoveLastSeries(); + /** Stores a CHTEXT group that describes a data point label. */ + void SetDataLabel( XclExpChTextRef xText ); + /** Sets the plot area position and size to manual mode. */ + void SetManualPlotArea(); + + /** Writes all embedded records. */ + virtual void WriteSubRecords( XclExpStream& rStrm ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpChSeries > XclExpChSeriesList; + typedef XclExpRecordList< XclExpChText > XclExpChTextList; + + XclChRectangle maRect; /// Position of the chart on the sheet (CHCHART record). + XclExpChSeriesList maSeries; /// List of series data (CHSERIES groups). + XclExpChFrameRef mxFrame; /// Chart frame format (CHFRAME group). + XclChProperties maProps; /// Chart properties (CHPROPERTIES record). + XclExpChAxesSetRef mxPrimAxesSet; /// Primary axes set (CHAXESSET group). + XclExpChAxesSetRef mxSecnAxesSet; /// Secondary axes set (CHAXESSET group). + XclExpChTextRef mxTitle; /// Chart title (CHTEXT group). + XclExpChTextList maLabels; /// Data point labels (CHTEXT groups). +}; + +// ---------------------------------------------------------------------------- + +/** Represents the group of DFF and OBJ records containing all drawing shapes + embedded in the chart object. + */ +class XclExpChartDrawing : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpChartDrawing( + const XclExpRoot& rRoot, + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& rxModel, + const Size& rChartSize ); + virtual ~XclExpChartDrawing(); + + virtual void Save( XclExpStream& rStrm ); + +private: + ScfRef< XclExpObjectManager > mxObjMgr; + ScfRef< XclExpRecordBase > mxObjRecs; +}; + +// ---------------------------------------------------------------------------- + +/** Represents the entire chart substream (all records in BOF/EOF block). */ +class XclExpChart : public XclExpSubStream, protected XclExpRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > XModelRef; + +public: + explicit XclExpChart( const XclExpRoot& rRoot, + XModelRef xModel, const Rectangle& rChartRect ); +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xecontent.hxx b/sc/source/filter/inc/xecontent.hxx new file mode 100644 index 000000000000..50c9466d2801 --- /dev/null +++ b/sc/source/filter/inc/xecontent.hxx @@ -0,0 +1,352 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XECONTENT_HXX +#define SC_XECONTENT_HXX + +#include "rangelst.hxx" +#include "xlcontent.hxx" +#include "xladdress.hxx" +#include "xerecord.hxx" +#include "xeroot.hxx" +#include "xestring.hxx" +#include "xeformula.hxx" + +/* ============================================================================ +Classes to export the big Excel document contents (related to several cells or +globals for the sheet or document). +- Shared string table +- Merged cells +- Hyperlinks +- Label ranges +- Conditional formatting +- Data validation +- Web Queries +============================================================================ */ + +// Shared string table ======================================================== + +class XclExpSstImpl; + +/** Provides export of the SST (shared string table) record. + @descr Contains all strings in the document and writes the SST. */ +class XclExpSst : public XclExpRecordBase +{ +public: + explicit XclExpSst(); + virtual ~XclExpSst(); + + /** Inserts a new string into the table. + @return The index of the string in the SST, used in other records. */ + sal_uInt32 Insert( XclExpStringRef xString ); + + /** Writes the complete SST and EXTSST records. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + typedef ::std::auto_ptr< XclExpSstImpl > XclExpSstImplPtr; + XclExpSstImplPtr mxImpl; +}; + +// Merged cells =============================================================== + +/** Represents a MERGEDCELLS record containing all merged cell ranges in a sheet. */ +class XclExpMergedcells : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpMergedcells( const XclExpRoot& rRoot ); + + /** Appends a new range to the list of merged cell ranges. */ + void AppendRange( const ScRange& rRange, sal_uInt32 nBaseXFId ); + /** Returns the XF identifier of the top-left cell in a merged range. */ + sal_uInt32 GetBaseXFId( const ScAddress& rPos ) const; + + /** Writes the record, if it contains at least one merged cell range. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + ScRangeList maMergedRanges; /// All merged cell ranges of the sheet. + ScfUInt32Vec maBaseXFIds; /// The XF identifiers of the top-left cells. +}; + +// Hyperlinks ================================================================= + +class SvxURLField; +class INetURLObject; + +/** Provides export of hyperlink data. */ +class XclExpHyperlink : public XclExpRecord +{ +public: + /** Constructs the HLINK record from an URL text field. */ + explicit XclExpHyperlink( const XclExpRoot& rRoot, + const SvxURLField& rUrlField, const ScAddress& rScPos ); + virtual ~XclExpHyperlink(); + + /** Returns the cell representation text or 0, if not available. */ + inline const String* GetRepr() const { return mxRepr.get(); } + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + /** Builds file name from the passed file URL. Tries to convert to relative file name. + @param rnLevel (out-param) The parent directory level. + @param rbRel (out-param) true = path is relative. */ + String BuildFileName( + sal_uInt16& rnLevel, bool& rbRel, + const String& rUrl, const XclExpRoot& rRoot ) const; + + /** Writes the body of the HLINK record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef ::std::auto_ptr< String > StringPtr; + typedef ::std::auto_ptr< SvStream > SvStreamPtr; + + ScAddress maScPos; /// Position of the hyperlink. + StringPtr mxRepr; /// Cell representation text. + SvStreamPtr mxVarData; /// Buffer stream with variable data. + sal_uInt32 mnFlags; /// Option flags. + XclExpStringRef mxTextMark; /// Location within mxRepr + ::rtl::OUString msTarget; /// Target URL +}; + +typedef XclExpRecordList< XclExpHyperlink > XclExpHyperlinkList; + +// Label ranges =============================================================== + +/** Provides export of the row/column label range list of a sheet. */ +class XclExpLabelranges : public XclExpRecordBase, protected XclExpRoot +{ +public: + /** Fills the cell range lists with all ranges of the current sheet. */ + explicit XclExpLabelranges( const XclExpRoot& rRoot ); + + /** Writes the LABELRANGES record if it contains at least one range. */ + virtual void Save( XclExpStream& rStrm ); + +private: + /** Fills the specified range list with all label headers of the current sheet. + @param rRanges The cell range list to fill. + @param xLabelRangesRef The core range list with all ranges. + @param nScTab The current Calc sheet index. */ + void FillRangeList( ScRangeList& rScRanges, + ScRangePairListRef xLabelRangesRef, SCTAB nScTab ); + +private: + ScRangeList maRowRanges; /// Cell range list for row labels. + ScRangeList maColRanges; /// Cell range list for column labels. +}; + +// Conditional formatting ===================================================== + +class ScCondFormatEntry; +class XclExpCFImpl; + +/** Represents a CF record that contains one condition of a conditional format. */ +class XclExpCF : public XclExpRecord, protected XclExpRoot +{ +public: + explicit XclExpCF( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry ); + virtual ~XclExpCF(); + +private: + /** Writes the body of the CF record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef ::std::auto_ptr< XclExpCFImpl > XclExpCFImplPtr; + XclExpCFImplPtr mxImpl; +}; + +// ---------------------------------------------------------------------------- + +class ScConditionalFormat; + +/** Represents a CONDFMT record that contains all conditions of a conditional format. + @descr Contains the conditions which are stored in CF records. */ +class XclExpCondfmt : public XclExpRecord, protected XclExpRoot +{ +public: + explicit XclExpCondfmt( const XclExpRoot& rRoot, const ScConditionalFormat& rCondFormat ); + virtual ~XclExpCondfmt(); + + /** Returns true, if this conditional format contains at least one cell range and CF record. */ + bool IsValid() const; + + /** Writes the CONDFMT record with following CF records, if there is valid data. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the body of the CONDFMT record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpCF > XclExpCFList; + + XclExpCFList maCFList; /// List of CF records. + XclRangeList maXclRanges; /// Cell ranges for this conditional format. + String msSeqRef; /// OOXML Sequence of References +}; + +// ---------------------------------------------------------------------------- + +/** Contains all conditional formats of a specific sheet. */ +class XclExpCondFormatBuffer : public XclExpRecordBase, protected XclExpRoot +{ +public: + /** Constructs CONDFMT and CF records containing the conditional formats of the current sheet. */ + explicit XclExpCondFormatBuffer( const XclExpRoot& rRoot ); + + /** Writes all contained CONDFMT records with their CF records. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpCondfmt > XclExpCondfmtList; + XclExpCondfmtList maCondfmtList; /// List of CONDFMT records. +}; + +// Data Validation ============================================================ + +class ScValidationData; + +/** Provides export of the data of a DV record. + @descr This record contains the settings for a data validation. In detail + this is a pointer to the core validation data and a cell range list with all + affected cells. The handle index is used to optimize list search algorithm. */ +class XclExpDV : public XclExpRecord, protected XclExpRoot +{ +public: + explicit XclExpDV( const XclExpRoot& rRoot, ULONG nScHandle ); + virtual ~XclExpDV(); + + /** Returns the core handle of the validation data. */ + inline ULONG GetScHandle() const { return mnScHandle; } + + /** Inserts a new cell range into the cell range list. */ + void InsertCellRange( const ScRange& rPos ); + /** Converts the Calc range list to the Excel range list. + @return false = Resulting range list empty - do not write this record. */ + bool Finalize(); + + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the body of the DV record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + ScRangeList maScRanges; /// Calc range list with all affected cells. + XclRangeList maXclRanges; /// Excel range list with all affected cells. + XclExpString maPromptTitle; /// The prompt title. + XclExpString maPromptText; /// The prompt text. + XclExpString maErrorTitle; /// The error title. + XclExpString maErrorText; /// The error text. + XclExpStringRef mxString1; /// String for first condition formula. + XclTokenArrayRef mxTokArr1; /// Formula for first condition. + ::rtl::OUString msFormula1; /// OOXML Formula for first condition. + XclTokenArrayRef mxTokArr2; /// Formula for second condition. + ::rtl::OUString msFormula2; /// OOXML Formula for second condition. + sal_uInt32 mnFlags; /// Miscellaneous flags. + ULONG mnScHandle; /// The core handle for quick list search. +}; + +// ---------------------------------------------------------------------------- + +/** This class contains the DV record list following the DVAL record. */ +class XclExpDval : public XclExpRecord, protected XclExpRoot +{ +public: + explicit XclExpDval( const XclExpRoot& rRoot ); + virtual ~XclExpDval(); + + /** Inserts the cell range into the range list of the DV record with the specified handle. */ + void InsertCellRange( const ScRange& rRange, ULONG nScHandle ); + + /** Writes the DVAL record and the DV record list. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Searches for or creates a XclExpDV record object with the specified handle. */ + XclExpDV& SearchOrCreateDv( ULONG nScHandle ); + + /** Writes the body of the DVAL record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpDV > XclExpDVList; + typedef XclExpDVList::RecordRefType XclExpDVRef; + + XclExpDVList maDVList; /// List of DV records + XclExpDVRef mxLastFoundDV; /// For search optimization. +}; + +// Web Queries ================================================================ + +/** Contains all records for a web query (linked tables in an HTML document). + @descr mode 1 (entire document): mpQryTables==0, mbEntireDoc==true; + mode 2 (all tables): mpQryTables==0, mbEntireDoc==false; + mode 3 (custom range list): mpQryTables!=0, mbEntireDoc==false. */ +class XclExpWebQuery : public XclExpRecordBase +{ +public: + /** Constructs a web query record container with settings from Calc. */ + explicit XclExpWebQuery( + const String& rRangeName, + const String& rUrl, + const String& rSource, + sal_Int32 nRefrSecs ); + virtual ~XclExpWebQuery(); + + /** Writes all needed records for this web query. */ + virtual void Save( XclExpStream& rStrm ); + +private: + XclExpString maDestRange; /// Destination range. + XclExpString maUrl; /// Source document URL. + XclExpStringRef mxQryTables; /// List of source range names. + sal_Int16 mnRefresh; /// Refresh time in minutes. + bool mbEntireDoc; /// true = entire document. +}; + +// ---------------------------------------------------------------------------- + +/** Contains all web query records for this document. */ +class XclExpWebQueryBuffer : public XclExpRecordList< XclExpWebQuery > +{ +public: + explicit XclExpWebQueryBuffer( const XclExpRoot& rRoot ); +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xeescher.hxx b/sc/source/filter/inc/xeescher.hxx new file mode 100644 index 000000000000..d227db184f1a --- /dev/null +++ b/sc/source/filter/inc/xeescher.hxx @@ -0,0 +1,435 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XEESCHER_HXX +#define SC_XEESCHER_HXX + +#include <vcl/graph.hxx> +#include <filter/msfilter/escherex.hxx> +#include "xcl97rec.hxx" +#include "xlescher.hxx" + +namespace com { namespace sun { namespace star { + namespace script { struct ScriptEventDescriptor; } +} } } + +// DFF client anchor ========================================================== + +/** Base class for DFF client anchor atoms used in spreadsheets. */ +class XclExpDffAnchorBase : public EscherExClientAnchor_Base, protected XclExpRoot +{ +public: + /** Constructs a dummy client anchor. */ + explicit XclExpDffAnchorBase( const XclExpRoot& rRoot, sal_uInt16 nFlags = 0 ); + + /** Sets the flags according to the passed SdrObject. */ + void SetFlags( const SdrObject& rSdrObj ); + /** Sets the anchor position and flags according to the passed SdrObject. */ + void SetSdrObject( const SdrObject& rSdrObj ); + + /** Writes the DFF client anchor structure with the current anchor position. */ + void WriteDffData( EscherEx& rEscherEx ) const; + + /** Called from SVX DFF converter. + @param rRect The object anchor rectangle to be exported (in twips). */ + virtual void WriteData( EscherEx& rEscherEx, const Rectangle& rRect ); + +private: + virtual void ImplSetFlags( const SdrObject& rSdrObj ); + virtual void ImplCalcAnchorRect( const Rectangle& rRect, MapUnit eMapUnit ); + +protected: // for access in derived classes + XclObjAnchor maAnchor; /// The client anchor data. + sal_uInt16 mnFlags; /// Flags for DFF stream export. +}; + +// ---------------------------------------------------------------------------- + +/** Represents the position (anchor) of an object in a Calc sheet. */ +class XclExpDffSheetAnchor : public XclExpDffAnchorBase +{ +public: + explicit XclExpDffSheetAnchor( const XclExpRoot& rRoot ); + +private: + virtual void ImplSetFlags( const SdrObject& rSdrObj ); + virtual void ImplCalcAnchorRect( const Rectangle& rRect, MapUnit eMapUnit ); + +private: + SCTAB mnScTab; /// Calc sheet index. +}; + +// ---------------------------------------------------------------------------- + +/** Represents the position (anchor) of a shape in an embedded draw page. */ +class XclExpDffEmbeddedAnchor : public XclExpDffAnchorBase +{ +public: + explicit XclExpDffEmbeddedAnchor( const XclExpRoot& rRoot, + const Size& rPageSize, sal_Int32 nScaleX, sal_Int32 nScaleY ); + +private: + virtual void ImplSetFlags( const SdrObject& rSdrObj ); + virtual void ImplCalcAnchorRect( const Rectangle& rRect, MapUnit eMapUnit ); + +private: + Size maPageSize; + sal_Int32 mnScaleX; + sal_Int32 mnScaleY; +}; + +// ---------------------------------------------------------------------------- + +/** Represents the position (anchor) of a note object. */ +class XclExpDffNoteAnchor : public XclExpDffAnchorBase +{ +public: + explicit XclExpDffNoteAnchor( const XclExpRoot& rRoot, const Rectangle& rRect ); +}; + +// ---------------------------------------------------------------------------- + +/** Represents the position (anchor) of a cell dropdown object. */ +class XclExpDffDropDownAnchor : public XclExpDffAnchorBase +{ +public: + explicit XclExpDffDropDownAnchor( const XclExpRoot& rRoot, const ScAddress& rScPos ); +}; + +// MSODRAWING* records ======================================================== + +/** Base class for records holding DFF stream fragments. */ +class XclExpMsoDrawingBase : public XclExpRecord +{ +public: + explicit XclExpMsoDrawingBase( XclEscherEx& rEscherEx, sal_uInt16 nRecId ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +protected: + XclEscherEx& mrEscherEx; /// Reference to the DFF converter containing the DFF stream. + sal_uInt32 mnFragmentKey; /// The key of the DFF stream fragment to be written by this record. +}; + +// ---------------------------------------------------------------------------- + +/** The MSODRAWINGGROUP record contains the DGGCONTAINER with global DFF data + such as the picture container. + */ +class XclExpMsoDrawingGroup : public XclExpMsoDrawingBase +{ +public: + explicit XclExpMsoDrawingGroup( XclEscherEx& rEscherEx ); +}; + +// ---------------------------------------------------------------------------- + +/** One or more MSODRAWING records contain the DFF stream data for a drawing + shape. + */ +class XclExpMsoDrawing : public XclExpMsoDrawingBase +{ +public: + explicit XclExpMsoDrawing( XclEscherEx& rEscherEx ); +}; + +// ============================================================================ + +/** Provides export of bitmap data to an IMGDATA record. */ +class XclExpImgData : public XclExpRecordBase +{ +public: + explicit XclExpImgData( const Graphic& rGraphic, sal_uInt16 nRecId ); + + /** Writes the BITMAP record. */ + virtual void Save( XclExpStream& rStrm ); + +private: + Graphic maGraphic; /// The VCL graphic. + sal_uInt16 mnRecId; /// Record identifier for the IMGDATA record. +}; + +// ============================================================================ + +/** Helper class for form controils to manage spreadsheet links . */ +class XclExpControlHelper : protected XclExpRoot +{ +public: + explicit XclExpControlHelper( const XclExpRoot& rRoot ); + virtual ~XclExpControlHelper(); + +protected: + /** Tries to get spreadsheet cell link and source range link from the passed shape. */ + void ConvertSheetLinks( + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + + + /** Returns the Excel token array of the cell link, or 0, if no link present. */ + inline const XclTokenArray* GetCellLinkTokArr() const { return mxCellLink.get(); } + /** Returns the Excel token array of the source range, or 0, if no link present. */ + inline const XclTokenArray* GetSourceRangeTokArr() const { return mxSrcRange.get(); } + /** Returns the number of entries in the source range, or 0, if no source set. */ + inline sal_uInt16 GetSourceEntryCount() const { return mnEntryCount; } + + /** Writes a formula with special style only valid in OBJ records. */ + void WriteFormula( XclExpStream& rStrm, const XclTokenArray& rTokArr ) const; + /** Writes a formula subrecord with special style only valid in OBJ records. */ + void WriteFormulaSubRec( XclExpStream& rStrm, sal_uInt16 nSubRecId, const XclTokenArray& rTokArr ) const; + +private: + XclTokenArrayRef mxCellLink; /// Formula for linked cell. + XclTokenArrayRef mxSrcRange; /// Formula for source data range. + sal_uInt16 mnEntryCount; /// Number of entries in source range. +}; + +// ---------------------------------------------------------------------------- + +#if EXC_EXP_OCX_CTRL + +/** Represents an OBJ record for an OCX form control. */ +class XclExpOcxControlObj : public XclObj, public XclExpControlHelper +{ +public: + explicit XclExpOcxControlObj( + XclExpObjectManager& rObjMgr, + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor, + const String& rClassName, + sal_uInt32 nStrmStart, sal_uInt32 nStrmSize ); + +private: + virtual void WriteSubRecs( XclExpStream& rStrm ); + +private: + String maClassName; /// Class name of the control. + sal_uInt32 mnStrmStart; /// Start position in 'Ctls' stream. + sal_uInt32 mnStrmSize; /// Size in 'Ctls' stream. +}; + +#else + +/** Represents an OBJ record for an TBX form control. */ +class XclExpTbxControlObj : public XclObj, public XclExpControlHelper +{ +public: + explicit XclExpTbxControlObj( + XclExpObjectManager& rObjMgr, + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor ); + + /** Sets the name of a macro attached to this control. + @return true = The passed event descriptor was valid, macro name has been found. */ + bool SetMacroLink( const ::com::sun::star::script::ScriptEventDescriptor& rEvent ); + +private: + virtual void WriteSubRecs( XclExpStream& rStrm ); + + /** Writes an ftMacro subrecord containing a macro link, or nothing, if no macro present. */ + void WriteMacroSubRec( XclExpStream& rStrm ); + /** Writes a subrecord containing a cell link, or nothing, if no link present. */ + void WriteCellLinkSubRec( XclExpStream& rStrm, sal_uInt16 nSubRecId ); + /** Writes the ftSbs sub structure containing scrollbar data. */ + void WriteSbs( XclExpStream& rStrm ); + +private: + ScfInt16Vec maMultiSel; /// Indexes of all selected entries in a multi selection. + XclTokenArrayRef mxMacroLink; /// Token array containing a link to an attached macro. + XclTbxEventType meEventType; /// Type of supported macro event. + sal_Int32 mnHeight; /// Height of the control. + sal_uInt16 mnState; /// Checked/unchecked state. + sal_Int16 mnLineCount; /// Combobox dropdown line count. + sal_Int16 mnSelEntry; /// Selected entry in combobox (1-based). + sal_uInt16 mnScrollValue; /// Scrollbar: Current value. + sal_uInt16 mnScrollMin; /// Scrollbar: Minimum value. + sal_uInt16 mnScrollMax; /// Scrollbar: Maximum value. + sal_uInt16 mnScrollStep; /// Scrollbar: Single step. + sal_uInt16 mnScrollPage; /// Scrollbar: Page step. + bool mbFlatButton; /// False = 3D button style; True = Flat button style. + bool mbFlatBorder; /// False = 3D border style; True = Flat border style. + bool mbMultiSel; /// true = Multi selection in listbox. + bool mbScrollHor; /// Scrollbar: true = horizontal. +}; + +#endif + +// ---------------------------------------------------------------------------- + +class XclExpChart; + +/** A chart object. This is the drawing object wrapper for the chart data. */ +class XclExpChartObj : public XclObj, protected XclExpRoot +{ +public: + explicit XclExpChartObj( + XclExpObjectManager& rObjMgr, + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor ); + virtual ~XclExpChartObj(); + + /** Writes the OBJ record and the entire chart substream. */ + virtual void Save( XclExpStream& rStrm ); + +private: + typedef ScfRef< XclExpChart > XclExpChartRef; + XclExpChartRef mxChart; /// The chart itself (BOF/EOF substream data). +}; + +// ============================================================================ + +/** Represents a NOTE record containing the relevant data of a cell note. + + NOTE records differ significantly in various BIFF versions. This class + encapsulates all needed actions for each supported BIFF version. + BIFF5/BIFF7: Stores the note text and generates a single or multiple NOTE + records on saving. + BIFF8: Creates the Escher object containing the drawing information and the + note text. + */ +class XclExpNote : public XclExpRecord +{ +public: + /** Constructs a NOTE record from the passed note object and/or the text. + @descr The additional text will be separated from the note text with + an empty line. + @param rScPos The Calc cell address of the note. + @param pScNote The Calc note object. May be 0 to create a note from rAddText only. + @param rAddText Additional text appended to the note text. */ + explicit XclExpNote( + const XclExpRoot& rRoot, + const ScAddress& rScPos, + const ScPostIt* pScNote, + const String& rAddText ); + + /** Writes the NOTE record, if the respective Escher object is present. */ + virtual void Save( XclExpStream& rStrm ); + + void WriteXml( sal_Int32 nAuthorId, XclExpXmlStream& rStrm ); + + const XclExpString& GetAuthor() const { return maAuthor; } +private: + /** Writes the body of the NOTE record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclExpString maAuthor; /// Name of the author. + String maOrigNoteText; /// Original main text of the note. + ByteString maNoteText; /// Main text of the note (<=BIFF7). + ScAddress maScPos; /// Calc cell address of the note. + sal_uInt16 mnObjId; /// Escher object ID (BIFF8). + bool mbVisible; /// true = permanently visible. +}; + +// ============================================================================ + +class XclExpComments : public XclExpRecord +{ +public: + typedef XclExpRecordList< XclExpNote > + XclExpNoteList; + + XclExpComments( SCTAB nTab, XclExpNoteList& rNotes ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + SCTAB mnTab; + XclExpNoteList& mrNotes; +}; + +// object manager ============================================================= + +class XclExpObjectManager : public XclExpRoot +{ +public: + explicit XclExpObjectManager( const XclExpRoot& rRoot ); + virtual ~XclExpObjectManager(); + + /** Creates a new DFF client anchor object. Caller takes ownership! May be + overwritten in derived classes. */ + virtual XclExpDffAnchorBase* CreateDffAnchor() const; + + /** Creates and returns the MSODRAWINGGROUP record containing global DFF + data in the DGGCONTAINER. */ + ScfRef< XclExpRecordBase > CreateDrawingGroup(); + + /** Initializes the object manager for a new sheet. */ + void StartSheet(); + + /** Processes a drawing page and returns the record block containing all + related records (MSODRAWING, OBJ, TXO, charts, etc.). */ + ScfRef< XclExpRecordBase > ProcessDrawing( SdrPage* pSdrPage ); + /** Processes a collection of UNO shapes and returns the record block + containing all related records (MSODRAWING, OBJ, TXO, charts, etc.). */ + ScfRef< XclExpRecordBase > ProcessDrawing( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes ); + + /** Finalizes the object manager after conversion of all sheets. */ + void EndDocument(); + + inline XclEscherEx& GetEscherEx() { return *mxEscherEx; } + XclExpMsoDrawing* GetMsodrawingPerSheet(); + bool HasObj() const; + sal_uInt16 AddObj( XclObj* pObjRec ); + XclObj* RemoveLastObj(); + +protected: + explicit XclExpObjectManager( const XclExpObjectManager& rParent ); + +private: + void InitStream( bool bTempFile ); + +private: + ScfRef< ::utl::TempFile > mxTempFile; + ScfRef< SvStream > mxDffStrm; + ScfRef< XclEscherEx > mxEscherEx; + ScfRef< XclExpObjList > mxObjList; +}; + +// ---------------------------------------------------------------------------- + +class XclExpEmbeddedObjectManager : public XclExpObjectManager +{ +public: + explicit XclExpEmbeddedObjectManager( + const XclExpObjectManager& rParent, + const Size& rPageSize, + sal_Int32 nScaleX, sal_Int32 nScaleY ); + + /** Creates a new DFF client anchor object for embedded objects according + to the scaling data passed to the constructor. Caller takes ownership! */ + virtual XclExpDffAnchorBase* CreateDffAnchor() const; + +private: + Size maPageSize; + sal_Int32 mnScaleX; + sal_Int32 mnScaleY; +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xeformula.hxx b/sc/source/filter/inc/xeformula.hxx new file mode 100644 index 000000000000..258070f0791e --- /dev/null +++ b/sc/source/filter/inc/xeformula.hxx @@ -0,0 +1,97 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XEFORMULA_HXX +#define SC_XEFORMULA_HXX + +#include "xlformula.hxx" +#include "xeroot.hxx" + +// External reference log ===================================================== + +/** Log entry for external references in a formula, used i.e. in change tracking. */ +struct XclExpRefLogEntry +{ + const XclExpString* mpUrl; /// URL of the document containing the first sheet. + const XclExpString* mpFirstTab; /// Name of the first sheet. + const XclExpString* mpLastTab; /// Name of the last sheet. + sal_uInt16 mnFirstXclTab; /// Calc index of the first sheet. + sal_uInt16 mnLastXclTab; /// Calc index of the last sheet. + + explicit XclExpRefLogEntry(); +}; + +/** Vector containing a log for all external references in a formula, used i.e. in change tracking. */ +typedef ::std::vector< XclExpRefLogEntry > XclExpRefLog; + +// Formula compiler =========================================================== + +class ScRangeList; +class XclExpFmlaCompImpl; + +/** The formula compiler to create Excel token arrays from Calc token arrays. */ +class XclExpFormulaCompiler : protected XclExpRoot +{ +public: + explicit XclExpFormulaCompiler( const XclExpRoot& rRoot ); + virtual ~XclExpFormulaCompiler(); + + /** Creates and returns the token array of a formula. */ + XclTokenArrayRef CreateFormula( + XclFormulaType eType, const ScTokenArray& rScTokArr, + const ScAddress* pScBasePos = 0, XclExpRefLog* pRefLog = 0 ); + + /** Creates and returns a token array containing a single cell address. */ + XclTokenArrayRef CreateFormula( XclFormulaType eType, const ScAddress& rScPos ); + + /** Creates and returns a token array containing a single cell range address. */ + XclTokenArrayRef CreateFormula( XclFormulaType eType, const ScRange& rScRange ); + + /** Creates and returns the token array for a cell range list. */ + XclTokenArrayRef CreateFormula( XclFormulaType eType, const ScRangeList& rScRanges ); + + /** Creates a single error token containing the passed error code. */ + XclTokenArrayRef CreateErrorFormula( sal_uInt8 nErrCode ); + + /** Creates a single token for a special cell reference. + @descr This is used for array formulas and shared formulas (token tExp), + and multiple operation tables (token tTbl). */ + XclTokenArrayRef CreateSpecialRefFormula( sal_uInt8 nTokenId, const XclAddress& rXclPos ); + + /** Creates a single tNameXR token for a reference to an external name. + @descr This is used i.e. for linked macros in push buttons. */ + XclTokenArrayRef CreateNameXFormula( sal_uInt16 nExtSheet, sal_uInt16 nExtName ); + +private: + typedef ScfRef< XclExpFmlaCompImpl > XclExpFmlaCompImplRef; + XclExpFmlaCompImplRef mxImpl; +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xehelper.hxx b/sc/source/filter/inc/xehelper.hxx new file mode 100644 index 000000000000..606ce51c889b --- /dev/null +++ b/sc/source/filter/inc/xehelper.hxx @@ -0,0 +1,451 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XEHELPER_HXX +#define SC_XEHELPER_HXX + +#include "xladdress.hxx" +#include "xeroot.hxx" +#include "xestring.hxx" + +// Export progress bar ======================================================== + +class ScfProgressBar; + +/** The main progress bar for the export filter. + + This class encapsulates creation and initialization of sub progress + segments. The Activate***Segment() functions activate a specific segement + of the main progress bar. The implementation of these functions contain the + calculation of the needed size of the segment. Following calls of the + Progress() function increase the currently activated sub segment. + */ +class XclExpProgressBar : protected XclExpRoot +{ +public: + explicit XclExpProgressBar( const XclExpRoot& rRoot ); + virtual ~XclExpProgressBar(); + + /** Initializes all segments and sub progress bars. */ + void Initialize(); + + /** Increases the number of existing ROW records by 1. */ + void IncRowRecordCount(); + + /** Activates the progress segment to create ROW records. */ + void ActivateCreateRowsSegment(); + /** Activates the progress segment to finalize ROW records. */ + void ActivateFinalRowsSegment(); + + /** Increases the currently activated (sub) progress bar by 1 step. */ + void Progress(); + +private: + typedef ::std::auto_ptr< ScfProgressBar > ScfProgressBarPtr; + + ScfProgressBarPtr mxProgress; /// Progress bar implementation. + ScfProgressBar* mpSubProgress; /// Current sub progress bar. + + ScfProgressBar* mpSubRowCreate; /// Sub progress bar for creating table rows. + ScfInt32Vec maSubSegRowCreate; /// Segment ID's for all sheets in sub progress bar. + + ScfProgressBar* mpSubRowFinal; /// Sub progress bar for finalizing ROW records. + sal_Int32 mnSegRowFinal; /// Progress segment for finalizing ROW records. + + sal_Size mnRowCount; /// Number of created ROW records. +}; + +// Calc->Excel cell address/range conversion ================================== + +/** Provides functions to convert Calc cell addresses to Excel cell addresses. */ +class XclExpAddressConverter : public XclAddressConverterBase +{ +public: + explicit XclExpAddressConverter( const XclExpRoot& rRoot ); + + // cell address ----------------------------------------------------------- + + /** Checks if the passed Calc cell address is valid. + @param rScPos The Calc cell address to check. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell address is not valid. + @return true = Cell address in rScPos is valid. */ + bool CheckAddress( const ScAddress& rScPos, bool bWarn ); + + /** Converts the passed Calc cell address to an Excel cell address. + @param rXclPos (Out) The converted Excel cell address, if valid. + @param rScPos The Calc cell address to convert. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell address is not valid. + @return true = Cell address returned in rXclPos is valid. */ + bool ConvertAddress( XclAddress& rXclPos, + const ScAddress& rScPos, bool bWarn ); + + /** Returns a valid cell address by moving it into allowed dimensions. + @param rScPos The Calc cell address to convert. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell address is invalid. + @return The converted Excel cell address. */ + XclAddress CreateValidAddress( const ScAddress& rScPos, bool bWarn ); + + // cell range ------------------------------------------------------------- + + /** Checks if the passed cell range is valid (checks start and end position). + @param rScRange The Calc cell range to check. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell range is not valid. + @return true = Cell range in rScRange is valid. */ + bool CheckRange( const ScRange& rScRange, bool bWarn ); + + /** Checks and eventually crops the cell range to valid dimensions. + @descr The start position of the range will not be modified. + @param rScRange (In/out) The cell range to validate. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell range contains invalid + cells. If the range is partly valid, this function sets the warning + flag, corrects the range and returns true. + @return true = Cell range in rScRange is valid (original or cropped). */ + bool ValidateRange( ScRange& rScRange, bool bWarn ); + + /** Converts the passed Calc cell range to an Excel cell range. + @param rXclRange (Out) The converted Excel cell range, if valid. + @param rScRange The Calc cell range to convert. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell range contains invalid cells. + @return true = Cell range returned in rXclRange is valid (original or cropped). */ + bool ConvertRange( XclRange& rXclRange, const ScRange& rScRange, bool bWarn ); + +//UNUSED2008-05 /** Returns a valid cell range by moving it into allowed dimensions. +//UNUSED2008-05 @descr The start and/or end position of the range may be modified. +//UNUSED2008-05 @param rScRange The Calc cell range to convert. +//UNUSED2008-05 @param bWarn true = Sets the internal flag that produces a warning box +//UNUSED2008-05 after loading/saving the file, if the cell range contains invalid cells. +//UNUSED2008-05 @return The converted Excel cell range. */ +//UNUSED2008-05 XclRange CreateValidRange( const ScRange& rScRange, bool bWarn ); + + // cell range list -------------------------------------------------------- + +//UNUSED2008-05 /** Checks if the passed cell range list is valid. +//UNUSED2008-05 @param rScRanges The Calc cell range list to check. +//UNUSED2008-05 @param bWarn true = Sets the internal flag that produces a warning box +//UNUSED2008-05 after loading/saving the file, if the cell range list contains at +//UNUSED2008-05 least one invalid range. +//UNUSED2008-05 @return true = Cell range list in rScRanges is completly valid. */ +//UNUSED2008-05 bool CheckRangeList( const ScRangeList& rScRanges, bool bWarn ); + + /** Checks and eventually crops the cell ranges to valid dimensions. + @descr The start position of the ranges will not be modified. Cell + ranges that fit partly into valid dimensions are cropped + accordingly. Cell ranges that do not fit at all, are removed from + the cell range list. + @param rScRanges (In/out) The cell range list to check. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if at least one of the cell ranges + contains invalid cells. */ + void ValidateRangeList( ScRangeList& rScRanges, bool bWarn ); + + /** Converts the passed Calc cell range list to an Excel cell range list. + @descr The start position of the ranges will not be modified. Cell + ranges that fit partly into valid dimensions are cropped + accordingly. Cell ranges that do not fit at all, are not inserted + into the Excel cell range list. + @param rXclRanges (Out) The converted Excel cell range list. + @param rScRanges The Calc cell range list to convert. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if at least one of the cell ranges + contains invalid cells. */ + void ConvertRangeList( XclRangeList& rXclRanges, + const ScRangeList& rScRanges, bool bWarn ); +}; + +// EditEngine->String conversion ============================================== + +class SvxURLField; +class XclExpHyperlink; + +/** Helper to create HLINK records during creation of formatted cell strings. + + In Excel it is not possible to have more than one hyperlink in a cell. This + helper detects multiple occurences of hyperlinks and fills a string which + is used to create a cell note containing all URLs. Only cells containing + one hyperlink are exported as hyperlink cells. + */ +class XclExpHyperlinkHelper : protected XclExpRoot +{ +public: + typedef ScfRef< XclExpHyperlink > XclExpHyperlinkRef; + + explicit XclExpHyperlinkHelper( const XclExpRoot& rRoot, const ScAddress& rScPos ); + ~XclExpHyperlinkHelper(); + + /** Processes the passed URL field (tries to create a HLINK record). + @return The representation string of the URL field. */ + String ProcessUrlField( const SvxURLField& rUrlField ); + + /** Returns true, if a single HLINK record has been created. */ + bool HasLinkRecord() const; + /** Returns the craeted single HLINk record, or an empty reference. */ + XclExpHyperlinkRef GetLinkRecord(); + + /** Returns true, if multiple URLs have been processed. */ + inline bool HasMultipleUrls() const { return mbMultipleUrls; } + /** Returns a string containing all processed URLs. */ + inline const String& GetUrlList() { return maUrlList; } + +private: + XclExpHyperlinkRef mxLinkRec; /// Created HLINK record. + ScAddress maScPos; /// Cell position to set at the HLINK record. + String maUrlList; /// List with all processed URLs. + bool mbMultipleUrls; /// true = Multiple URL fields processed. +}; + +// ---------------------------------------------------------------------------- + +class EditEngine; +class SdrTextObj; +class ScStringCell; +class ScEditCell; +class ScPatternAttr; + +/** This class provides methods to create an XclExpString. + @descr The string can be created from an edit engine text object or + directly from a Calc edit cell. */ +class XclExpStringHelper : ScfNoInstance +{ +public: + /** Creates a new unformatted string from the passed string. + @descr Creates a Unicode string or a byte string, depending on the + current BIFF version contained in the passed XclExpRoot object. + @param rString The source string. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. + @return The new string object (shared pointer). */ + static XclExpStringRef CreateString( + const XclExpRoot& rRoot, + const String& rString, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + /** Creates a new unformatted string from the passed character. + @descr Creates a Unicode string or a byte string, depending on the + current BIFF version contained in the passed XclExpRoot object. + @param cChar The source character. The NUL character is explicitly allowed. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. + @return The new string object (shared pointer). */ + static XclExpStringRef CreateString( + const XclExpRoot& rRoot, + sal_Unicode cChar, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + /** Appends an unformatted string to an Excel string object. + @descr Selects the correct Append() function depending on the current + BIFF version contained in the passed XclExpRoot object. + @param rXclString The Excel string object. + @param rString The source string. */ + static void AppendString( + XclExpString& rXclString, + const XclExpRoot& rRoot, + const String& rString ); + + /** Appends a character to an Excel string object. + @descr Selects the correct Append() function depending on the current + BIFF version contained in the passed XclExpRoot object. + @param rXclString The Excel string object. + @param rString The source string. */ + static void AppendChar( + XclExpString& rXclString, + const XclExpRoot& rRoot, + sal_Unicode cChar ); + + /** Creates a new formatted string from a Calc string cell. + @descr Creates a Unicode string or a byte string, depending on the + current BIFF version contained in the passed XclExpRoot object. + May create a formatted string object, if the cell text contains + different script types. + @param rStringCell The Calc string cell object. + @param pCellAttr The set item containing the cell formatting. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. + @return The new string object (shared pointer). */ + static XclExpStringRef CreateCellString( + const XclExpRoot& rRoot, + const ScStringCell& rStringCell, + const ScPatternAttr* pCellAttr, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + /** Creates a new formatted string from a Calc edit cell. + @descr Creates a Unicode string or a byte string, depending on the + current BIFF version contained in the passed XclExpRoot object. + @param rEditCell The Calc edit cell object. + @param pCellAttr The set item containing the cell formatting. + @param rLinkHelper Helper object for hyperlink conversion. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. + @return The new string object (shared pointer). */ + static XclExpStringRef CreateCellString( + const XclExpRoot& rRoot, + const ScEditCell& rEditCell, + const ScPatternAttr* pCellAttr, + XclExpHyperlinkHelper& rLinkHelper, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + /** Creates a new formatted string from a drawing text box. + @descr Creates a Unicode string or a byte string, depending on the + current BIFF version contained in the passed XclExpRoot object. + @param rTextObj The text box object. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. + @return The new string object (shared pointer). */ + static XclExpStringRef CreateString( + const XclExpRoot& rRoot, + const SdrTextObj& rTextObj, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + /** Creates a new formatted string from a edit text string. + @param rEditObj The edittext object. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. + @return The new string object. */ + static XclExpStringRef CreateString( + const XclExpRoot& rRoot, + const EditTextObject& rEditObj, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + /** Returns the script type first text portion different to WEAK, or the system + default script type, if there is only weak script in the passed string. */ + static sal_Int16 GetLeadingScriptType( const XclExpRoot& rRoot, const String& rString ); +}; + +// Header/footer conversion =================================================== + +class EditEngine; + +/** Converts edit engine text objects to an Excel header/footer string. + @descr Header/footer content is divided into three parts: Left, center and + right portion. All formatting information will be encoded in the Excel string + using special character seuences. A control sequence starts with the ampersand + character. + + Supported control sequences: + &L start of left portion + &C start of center portion + &R start of right portion + &P current page number + &N page count + &D current date + &T current time + &A table name + &F file name without path + &Z file path without file name + &Z&F file path and name + &U underlining on/off + &E double underlining on/off + &S strikeout characters on/off + &X superscript on/off + &Y subscript on/off + &"fontname,fontstyle" use font with name 'fontname' and style 'fontstyle' + &fontheight set font height in points ('fontheight' is a decimal value) + + Known but unsupported control sequences: + &G picture + */ +class XclExpHFConverter : protected XclExpRoot, ScfNoCopy +{ +public: + explicit XclExpHFConverter( const XclExpRoot& rRoot ); + + /** Generates the header/footer string from the passed edit engine text objects. */ + void GenerateString( + const EditTextObject* pLeftObj, + const EditTextObject* pCenterObj, + const EditTextObject* pRightObj ); + + /** Returns the last generated header/footer string. */ + inline const String& GetHFString() const { return maHFString; } + /** Returns the total height of the last generated header/footer in twips. */ + inline sal_Int32 GetTotalHeight() const { return mnTotalHeight; } + +private: + /** Converts the text object contents and stores it in the passed string. */ + void AppendPortion( + const EditTextObject* pTextObj, + sal_Unicode cPortionCode ); + +private: + EditEngine& mrEE; /// The header/footer edit engine. + String maHFString; /// The last generated header/footer string. + sal_Int32 mnTotalHeight; /// Total height of the last header/footer (twips). +}; + +// URL conversion ============================================================= + +/** This class contains static methods to encode a file URL. + @descr Excel stores URLs in a format that contains special control characters, + i.e. for directory separators or volume names. */ +class XclExpUrlHelper : ScfNoInstance +{ +public: + /** Encodes and returns the URL passed in rAbsUrl to an Excel like URL. + @param pTableName Optional pointer to a table name to be encoded in this URL. */ + static String EncodeUrl( const XclExpRoot& rRoot, const String& rAbsUrl, const String* pTableName = 0 ); + /** Encodes and returns the passed DDE link to an Excel like DDE link. */ + static String EncodeDde( const String& rApplic, const String rTopic ); +}; + +// ---------------------------------------------------------------------------- +class ScDocument; +class ScMatrix; + +/** Contains cached values in a 2-dimensional array. */ +class XclExpCachedMatrix +{ + void GetDimensions( SCSIZE & nCols, SCSIZE & nRows ) const; +public: + /** Constructs and fills a new matrix. + @param rMatrix The Calc value matrix. */ + explicit XclExpCachedMatrix( const ScMatrix& rMatrix ); + ~XclExpCachedMatrix(); + + /** Returns the byte count of all contained data. */ + sal_Size GetSize() const; + /** Writes the complete matrix to stream. */ + void Save( XclExpStream& rStrm ) const; + +private: + const ScMatrix& mrMatrix; +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xelink.hxx b/sc/source/filter/inc/xelink.hxx new file mode 100644 index 000000000000..c70e496400a4 --- /dev/null +++ b/sc/source/filter/inc/xelink.hxx @@ -0,0 +1,221 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 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 + diff --git a/sc/source/filter/inc/xename.hxx b/sc/source/filter/inc/xename.hxx new file mode 100644 index 000000000000..f0740735ea28 --- /dev/null +++ b/sc/source/filter/inc/xename.hxx @@ -0,0 +1,91 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XENAME_HXX +#define SC_XENAME_HXX + +#include "xerecord.hxx" +#include "xlname.hxx" +#include "xlformula.hxx" +#include "xeroot.hxx" + +// ============================================================================ + +class ScRangeList; +class XclExpNameManagerImpl; + +/** Manager that stores all internal defined names (NAME records) of the document. */ +class XclExpNameManager : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpNameManager( const XclExpRoot& rRoot ); + virtual ~XclExpNameManager(); + + /** Creates NAME records for built-in and user defined names. */ + void Initialize(); + + /** Inserts the Calc name with the passed index and returns the Excel NAME index. */ + sal_uInt16 InsertName( USHORT nScNameIdx ); + /** Inserts the Calc database range with the passed index and returns the Excel NAME index. */ + sal_uInt16 InsertDBRange( USHORT nScDBRangeIdx ); + +//UNUSED2009-05 /** Inserts a new built-in defined name. */ +//UNUSED2009-05 sal_uInt16 InsertBuiltInName( sal_Unicode cBuiltIn, XclTokenArrayRef xTokArr, SCTAB nScTab ); + /** Inserts a new built-in defined name, referring to the passed sheet range. */ + sal_uInt16 InsertBuiltInName( sal_Unicode cBuiltIn, const ScRange& rRange ); + /** Inserts a new built-in defined name, referring to the passed sheet range list. */ + sal_uInt16 InsertBuiltInName( sal_Unicode cBuiltIn, const ScRangeList& rRangeList ); + + /** Inserts a new defined name. Sets another unused name, if rName already exists. */ + sal_uInt16 InsertUniqueName( const String& rName, XclTokenArrayRef xTokArr, SCTAB nScTab ); + /** Returns index of an existing name, or creates a name without definition. */ + sal_uInt16 InsertRawName( const String& rName ); + /** Searches or inserts a defined name describing a macro name. + @param bVBasic true = Visual Basic macro, false = Sheet macro. + @param bFunc true = Macro function; false = Macro procedure. */ + sal_uInt16 InsertMacroCall( const String& rMacroName, bool bVBasic, bool bFunc, bool bHidden = false ); + + /** Returns the Calc sheet of a local defined name, or SCTAB_GLOBAL for global defined names. */ + const String& GetOrigName( sal_uInt16 nNameIdx ) const; + /** Returns the Calc sheet of a local defined name, or SCTAB_GLOBAL for global defined names. */ + SCTAB GetScTab( sal_uInt16 nNameIdx ) const; + /** Returns true, if the specified defined name is volatile. */ + bool IsVolatile( sal_uInt16 nNameIdx ) const; + + /** Writes the entire list of NAME records. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + typedef ScfRef< XclExpNameManagerImpl > XclExpNameMgrImplRef; + XclExpNameMgrImplRef mxImpl; +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xepage.hxx b/sc/source/filter/inc/xepage.hxx new file mode 100644 index 000000000000..b9454a3cdb3c --- /dev/null +++ b/sc/source/filter/inc/xepage.hxx @@ -0,0 +1,137 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XEPAGE_HXX +#define SC_XEPAGE_HXX + +#include "xerecord.hxx" +#include "xlpage.hxx" +#include "xeroot.hxx" + +// Page settings records ====================================================== + +// Header/footer -------------------------------------------------------------- + +/** Represents a HEADER or FOOTER record. */ +class XclExpHeaderFooter : public XclExpRecord +{ +public: + explicit XclExpHeaderFooter( sal_uInt16 nRecId, const String& rHdrString ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + /** Writes the header or footer string. Writes an empty record, if no header/footer present. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + String maHdrString; /// Header or footer contents. +}; + +// General page settings ------------------------------------------------------ + +/** Represents a SETUP record that contains common page settings. */ +class XclExpSetup : public XclExpRecord +{ +public: + explicit XclExpSetup( const XclPageData& rPageData ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + /** Writes the contents of the SETUP record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + const XclPageData& mrData; /// Page settings data of current sheet. +}; + +// Manual page breaks --------------------------------------------------------- + +/** Stores an array of manual page breaks for columns or rows. */ +class XclExpPageBreaks : public XclExpRecord +{ +public: + explicit XclExpPageBreaks( + sal_uInt16 nRecId, + const ScfUInt16Vec& rPageBreaks, + sal_uInt16 nMaxPos ); + + /** Writes the record, if the list is not empty. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the page break list. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + const ScfUInt16Vec& mrPageBreaks; /// Page settings data of current sheet. + sal_uInt16 mnMaxPos; /// Maximum row/column for BIFF8 page breaks. +}; + +// Page settings ============================================================== + +/** Contains all page (print) settings records for a single sheet. */ +class XclExpPageSettings : public XclExpRecordBase, protected XclExpRoot +{ +public: + /** Creates all records containing the current page settings. */ + explicit XclExpPageSettings( const XclExpRoot& rRoot ); + + /** Returns read-only access to the page data. */ + inline const XclPageData& GetPageData() const { return maData; } + + /** Writes all page settings records to the stream. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + XclPageData maData; /// Page settings data. +}; + +// ---------------------------------------------------------------------------- + +/** Contains all page (print) settings records for a chart object. */ +class XclExpChartPageSettings : public XclExpRecordBase, protected XclExpRoot +{ +public: + /** Creates all records containing the current page settings. */ + explicit XclExpChartPageSettings( const XclExpRoot& rRoot ); + + /** Returns read-only access to the page data. */ + inline const XclPageData& GetPageData() const { return maData; } + + /** Writes all page settings records to the stream. */ + virtual void Save( XclExpStream& rStrm ); + +private: + XclPageData maData; /// Page settings data. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xepivot.hxx b/sc/source/filter/inc/xepivot.hxx new file mode 100644 index 000000000000..0c730952e69e --- /dev/null +++ b/sc/source/filter/inc/xepivot.hxx @@ -0,0 +1,486 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XEPIVOT_HXX +#define SC_XEPIVOT_HXX + +#include <map> +#include "xerecord.hxx" +#include "xlpivot.hxx" +#include "xeroot.hxx" + +class ScDPObject; +class ScDPSaveData; +class ScDPSaveDimension; +class ScDPSaveMember; +class ScDPDimensionSaveData; +class ScDPSaveGroupDimension; +class ScDPSaveNumGroupDimension; +struct ScDPNumGroupInfo; + +// ============================================================================ +// Pivot cache +// ============================================================================ + +/** Represents a data item in a pivot cache containing data of any type. */ +class XclExpPCItem : public XclExpRecord, public XclPCItem +{ +public: + explicit XclExpPCItem( const String& rText ); + explicit XclExpPCItem( double fValue ); + explicit XclExpPCItem( const DateTime& rDateTime ); + explicit XclExpPCItem( sal_Int16 nValue ); + explicit XclExpPCItem( bool bValue ); + + inline sal_uInt16 GetTypeFlag() const { return mnTypeFlag; } + + bool EqualsText( const String& rText ) const; + bool EqualsDouble( double fValue ) const; + bool EqualsDateTime( const DateTime& rDateTime ) const; + bool EqualsBool( bool bValue ) const; + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + sal_uInt16 mnTypeFlag; /// Data type flag. +}; + +// ============================================================================ + +class XclExpPivotCache; + +class XclExpPCField : public XclExpRecord, public XclPCField, protected XclExpRoot +{ +public: + /** Creates a standard pivot cache field, filled from sheet source data. */ + explicit XclExpPCField( const XclExpRoot& rRoot, + const XclExpPivotCache& rPCache, sal_uInt16 nFieldIdx, + const ScDPObject& rDPObj, const ScRange& rRange ); + /** Creates a child grouping pivot cache field, filled from the passed grouping info. */ + explicit XclExpPCField( const XclExpRoot& rRoot, + const XclExpPivotCache& rPCache, sal_uInt16 nFieldIdx, + const ScDPObject& rDPObj, const ScDPSaveGroupDimension& rGroupDim, + const XclExpPCField& rBaseField ); + virtual ~XclExpPCField(); + + /** Sets the passed field as direct grouping child field of this field. */ + void SetGroupChildField( const XclExpPCField& rChildField ); + /** Converts this standard field into a numeric grouping field. */ + void ConvertToNumGroup( const ScDPObject& rDPObj, const ScDPSaveNumGroupDimension& rNumGroupDim ); + + /** Returns the name of this cache field. */ + inline const String& GetFieldName() const { return maFieldInfo.maName; } + + /** Returns the number of visible items of this field. */ + sal_uInt16 GetItemCount() const; + /** Returns the specified pivot cache item (returns visible items in groupings). */ + const XclExpPCItem* GetItem( sal_uInt16 nItemIdx ) const; + /** Returns the index of a pivot cache item, or EXC_PC_NOITEM on error. */ + sal_uInt16 GetItemIndex( const String& rItemName ) const; + + /** Returns the size an item index needs to write out. */ + sal_Size GetIndexSize() const; + /** Writes the item index at the passed source row position as part of the SXINDEXLIST record. */ + void WriteIndex( XclExpStream& rStrm, sal_uInt32 nSrcRow ) const; + + /** Writes the pivot cache field and all items and other related records. */ + virtual void Save( XclExpStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpPCItem > XclExpPCItemList; + + /** Returns the item list that contains the visible items. + @descr Visible items are equal to source items in standard fields, + but are generated items in grouping and calculated fields. */ + const XclExpPCItemList& GetVisItemList() const; + + /** Initializes a standard field. Inserts all original source items. */ + void InitStandardField( const ScRange& rRange ); + /** Initializes a standard grouping field. Inserts all visible grouping items. */ + void InitStdGroupField( const XclExpPCField& rBaseField, const ScDPSaveGroupDimension& rGroupDim ); + /** Initializes a numeric grouping field. Inserts all visible grouping items and the limit settings. */ + void InitNumGroupField( const ScDPObject& rDPObj, const ScDPNumGroupInfo& rNumInfo ); + /** Initializes a date grouping field. Inserts all visible grouping items and the limit settings. */ + void InitDateGroupField( const ScDPObject& rDPObj, const ScDPNumGroupInfo& rDateInfo, sal_Int32 nDatePart ); + + /** Inserts the passed index into the item index array of original items. */ + void InsertItemArrayIndex( size_t nListPos ); + /** Inserts an original source item. Updates item index array. */ + void InsertOrigItem( XclExpPCItem* pNewItem ); + /** Inserts an original text item, if it is not contained already. */ + void InsertOrigTextItem( const String& rText ); + /** Inserts an original value item, if it is not contained already. */ + void InsertOrigDoubleItem( double fValue ); + /** Inserts an original date/time item, if it is not contained already. */ + void InsertOrigDateTimeItem( const DateTime& rDateTime ); + /** Inserts an original boolean item, if it is not contained already. */ + void InsertOrigBoolItem( bool bValue ); + + /** Inserts an item into the grouping item list. Does not change anything else. + @return The list index of the new item. */ + sal_uInt16 InsertGroupItem( XclExpPCItem* pNewItem ); + /** Generates and inserts all visible items for numeric or date grouping. */ + void InsertNumDateGroupItems( const ScDPObject& rDPObj, const ScDPNumGroupInfo& rNumInfo, sal_Int32 nDatePart = 0 ); + + /** Inserts the SXDOUBLE items that specify the limits for a numeric grouping. */ + void SetNumGroupLimit( const ScDPNumGroupInfo& rNumInfo ); + /** Inserts the SXDATETIME/SXINTEGER items that specify the limits for a date grouping. + @param bUseStep true = Insert the passed step value; false = always insert 1. */ + void SetDateGroupLimit( const ScDPNumGroupInfo& rDateInfo, bool bUseStep ); + + /** Initializes flags and item count fields. */ + void Finalize(); + + /** Writes an SXNUMGROUP record and the additional items for a numeric grouping field. */ + void WriteSxnumgroup( XclExpStream& rStrm ); + /** Writes an SXGROUPINFO record describing the item order in grouping fields. */ + void WriteSxgroupinfo( XclExpStream& rStrm ); + + /** Writes the contents of the SXFIELD record for this field. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + const XclExpPivotCache& mrPCache; /// Parent pivot cache containing this field. + XclExpPCItemList maOrigItemList; /// List with original items. + XclExpPCItemList maGroupItemList; /// List with grouping items. + ScfUInt16Vec maIndexVec; /// Indexes into maItemList. + XclExpPCItemList maNumGroupLimits; /// List with limit values for numeric grouping. + sal_uInt16 mnTypeFlags; /// Collected item data type flags. +}; + +// ============================================================================ + +class XclExpPivotCache : protected XclExpRoot +{ +public: + explicit XclExpPivotCache( const XclExpRoot& rRoot, + const ScDPObject& rDPObj, sal_uInt16 nListIdx ); + + /** Returns true, if the cache has been constructed successfully. */ + inline bool IsValid() const { return mbValid; } + /** Returns true, if the item index list will be written. */ + bool HasItemIndexList() const; + + /** Returns the stream identifier used to create the cache stream. */ + inline sal_uInt16 GetStreamId() const { return maPCInfo.mnStrmId; } + /** Returns the list index of the cache used in pivot table records. */ + inline sal_uInt16 GetCacheIndex() const { return mnListIdx; } + + /** Returns the number of pivot cache fields. */ + sal_uInt16 GetFieldCount() const; + /** Returns the specified pivot cache field. */ + const XclExpPCField* GetField( sal_uInt16 nFieldIdx ) const; +//UNUSED2009-05 /** Returns a pivot cache field by its name. */ +//UNUSED2009-05 const XclExpPCField* GetField( const String& rFieldName ) const; + /** Returns true, if this pivot cache contains non-standard fields (e.g. grouping fields). */ + bool HasAddFields() const; + + /** Returns true, if the passed DP object has the same data source as this cache. */ + bool HasEqualDataSource( const ScDPObject& rDPObj ) const; + + /** Writes related records into Workbook stream and creates the pivot cache storage stream. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Returns read/write access to a pivot cache field. */ + XclExpPCField* GetFieldAcc( sal_uInt16 nFieldIdx ); + /** Returns read/write access to a pivot cache field. */ + XclExpPCField* GetFieldAcc( const String& rFieldName ); + + /** Adds all pivot cache fields. */ + void AddFields( const ScDPObject& rDPObj ); + + /** Adds all standard pivot cache fields based on source data. */ + void AddStdFields( const ScDPObject& rDPObj ); + /** Adds all grouping pivot cache fields. */ + void AddGroupFields( const ScDPObject& rDPObj ); + /** Adds all calculated pivot cache fields. */ + void AddCalcFields( const ScDPObject& rDPObj ); + + /** Writes the DCONREF record containing the source range. */ + void WriteDconref( XclExpStream& rStrm ) const; + + /** Creates the pivot cache storage stream and writes the cache. */ + void WriteCacheStream(); + /** Writes the SXDB record. */ + void WriteSxdb( XclExpStream& rStrm ) const; + /** Writes the SXDBEX record. */ + void WriteSxdbex( XclExpStream& rStrm ) const; + /** Writes the SXINDEXLIST record list containing the item index table. */ + void WriteSxindexlistList( XclExpStream& rStrm ) const; + +private: + typedef XclExpRecordList< XclExpPCField > XclExpPCFieldList; + typedef XclExpPCFieldList::RecordRefType XclExpPCFieldRef; + + XclPCInfo maPCInfo; /// Pivot cache settings (SXDB record). + XclExpPCFieldList maFieldList; /// List of all pivot cache fields. + String maTabName; /// Name of source data sheet. + ScRange maOrigSrcRange; /// The original sheet source range. + ScRange maExpSrcRange; /// The exported sheet source range. + ScRange maDocSrcRange; /// The range used to build the cache fields and items. + sal_uInt16 mnListIdx; /// List index in pivot cache buffer. + bool mbValid; /// true = The cache is valid for export. +}; + +// ============================================================================ +// Pivot table +// ============================================================================ + +class XclExpPivotTable; + +/** Data field position specifying the pivot table field index (first) and data info index (second). */ +typedef ::std::pair< sal_uInt16, sal_uInt16 > XclPTDataFieldPos; + +// ============================================================================ + +class XclExpPTItem : public XclExpRecord +{ +public: + explicit XclExpPTItem( const XclExpPCField& rCacheField, sal_uInt16 nCacheIdx ); + explicit XclExpPTItem( sal_uInt16 nItemType, sal_uInt16 nCacheIdx, bool bUseCache ); + + /** Returns the internal name of this item. */ + const String& GetItemName() const; + + /** Fills this item with properties from the passed save member. */ + void SetPropertiesFromMember( const ScDPSaveMember& rSaveMem ); + +private: + /** Writes the SXVI record body describing the pivot table item. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + const XclExpPCItem* mpCacheItem; /// The referred pivot cache item. + XclPTItemInfo maItemInfo; /// General data for this item. +}; + +// ============================================================================ + +class XclExpPTField : public XclExpRecordBase +{ +public: + explicit XclExpPTField( const XclExpPivotTable& rPTable, sal_uInt16 nCacheIdx ); + + // data access ------------------------------------------------------------ + + /** Returns the name of this field. */ + const String& GetFieldName() const; + /** Returns the pivot table field list index of this field. */ + sal_uInt16 GetFieldIndex() const; + + /** Returns the index of the last inserted data info struct. */ + sal_uInt16 GetLastDataInfoIndex() const; + +//UNUSED2009-05 /** Returns an item by its name. */ +//UNUSED2009-05 const XclExpPTItem* GetItem( const String& rName ) const; + /** Returns the list index of an item by its name. + @param nDefaultIdx This value will be returned, if the item could not be found. */ + sal_uInt16 GetItemIndex( const String& rName, sal_uInt16 nDefaultIdx ) const; + + // fill data -------------------------------------------------------------- + + /** Fills this field with row/column/page properties from the passed save dimension. */ + void SetPropertiesFromDim( const ScDPSaveDimension& rSaveDim ); + /** Fills this field with data field properties from the passed save dimension. */ + void SetDataPropertiesFromDim( const ScDPSaveDimension& rSaveDim ); + + /** Appends special items describing the field subtotal entries. */ + void AppendSubtotalItems(); + + // records ---------------------------------------------------------------- + + /** Writes an entry for an SXPI record containing own page field info. */ + void WriteSxpiEntry( XclExpStream& rStrm ) const; + /** Writes an SXDI records containing info about a data field. */ + void WriteSxdi( XclExpStream& rStrm, sal_uInt16 nDataInfoIdx ) const; + + /** Writes the entire pivot table field. */ + virtual void Save( XclExpStream& rStrm ); + + // ------------------------------------------------------------------------ +private: + /** Returns an item by its name. */ + XclExpPTItem* GetItemAcc( const String& rName ); + + /** Appends a special item describing a field subtotal entry. */ + void AppendSubtotalItem( sal_uInt16 nItemType ); + + /** Writes the SXVD record introducing the field. */ + void WriteSxvd( XclExpStream& rStrm ) const; + /** Writes the SXVDEX record containing additional settings. */ + void WriteSxvdex( XclExpStream& rStrm ) const; + +private: + typedef ::std::vector< XclPTDataFieldInfo > XclPTDataFieldInfoVec; + typedef XclExpRecordList< XclExpPTItem > XclExpPTItemList; + + const XclExpPivotTable& mrPTable; /// Parent pivot table containing this field. + const XclExpPCField* mpCacheField; /// The referred pivot cache field. + XclPTFieldInfo maFieldInfo; /// General field info (SXVD record). + XclPTFieldExtInfo maFieldExtInfo; /// Extended field info (SXVDEX record). + XclPTPageFieldInfo maPageInfo; /// Page field info (entry in SXPI record). + XclPTDataFieldInfoVec maDataInfoVec; /// List of extended data field info (SXDI records). + XclExpPTItemList maItemList; /// List of all items of this field. +}; + +// ============================================================================ + +class XclExpPivotTable : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpPivotTable( const XclExpRoot& rRoot, + const ScDPObject& rDPObj, const XclExpPivotCache& rPCache ); + + /** Returns a pivot cache field. */ + const XclExpPCField* GetCacheField( sal_uInt16 nCacheIdx ) const; + + /** Returns the output range of the pivot table. */ + inline SCTAB GetScTab() const { return mnOutScTab; } + + /** Returns a pivot table field by its name. */ + const XclExpPTField* GetField( sal_uInt16 nFieldIdx ) const; + /** Returns a pivot table field by its name. */ + const XclExpPTField* GetField( const String& rName ) const; + + /** Returns the data-field-only index of the first data field with the passed name. + @param nDefaultIdx This value will be returned, if the field could not be found. */ + sal_uInt16 GetDataFieldIndex( const String& rName, sal_uInt16 nDefaultIdx ) const; + + /** Writes the entire pivot table. */ + virtual void Save( XclExpStream& rStrm ); + + // ------------------------------------------------------------------------ +private: + /** Returns a pivot table field by its name. */ + XclExpPTField* GetFieldAcc( const String& rName ); + /** Returns a pivot table field corresponding to the passed save dimension. */ + XclExpPTField* GetFieldAcc( const ScDPSaveDimension& rSaveDim ); + + // fill data -------------------------------------------------------------- + + /** Fills internal members with all properties from the passed save data. */ + void SetPropertiesFromDP( const ScDPSaveData& rSaveData ); + /** Fills a pivot table field with all properties from the passed save dimension. */ + void SetFieldPropertiesFromDim( const ScDPSaveDimension& rSaveDim ); + /** Fills a pivot table data field with all properties from the passed save dimension. */ + void SetDataFieldPropertiesFromDim( const ScDPSaveDimension& rSaveDim ); + + /** Initializes any data after processing the entire source DataPilot. */ + void Finalize(); + + // records ---------------------------------------------------------------- + + /** Writes the SXVIEW record starting the pivot table. */ + void WriteSxview( XclExpStream& rStrm ) const; + /** Writes an SXIVD record for row field or column field order. */ + void WriteSxivd( XclExpStream& rStrm, const ScfUInt16Vec& rFields ) const; + /** Writes the SXPI record containing page field info. */ + void WriteSxpi( XclExpStream& rStrm ) const; + /** Writes all SXDI records containing info about the data fields. */ + void WriteSxdiList( XclExpStream& rStrm ) const; + /** Writes a dummy SXLI records containing item layout info. */ + void WriteSxli( XclExpStream& rStrm, sal_uInt16 nLineCount, sal_uInt16 nIndexCount ) const; + /** Writes the SXEX records containing additional pivot table info. */ + void WriteSxex( XclExpStream& rStrm ) const; + + void WriteQsiSxTag( XclExpStream& rStrm ) const; + /** Writes the SX_AUTOFORMAT records with the autoformat id and header layout */ + void WriteSxViewEx9( XclExpStream& rStrm ) const; + + // ------------------------------------------------------------------------ +private: + typedef XclExpRecordList< XclExpPTField > XclExpPTFieldList; + typedef XclExpPTFieldList::RecordRefType XclExpPTFieldRef; + typedef ::std::vector< XclPTDataFieldPos > XclPTDataFieldPosVec; + + const XclExpPivotCache& mrPCache; /// The pivot cache this pivot table bases on. + XclPTInfo maPTInfo; /// Info about the pivot table (SXVIEW record). + XclPTExtInfo maPTExtInfo; /// Extended info about the pivot table (SXEX record). + XclPTViewEx9Info maPTViewEx9Info; /// The selected autoformat (SXVIEWEX9) + XclExpPTFieldList maFieldList; /// All fields in pivot cache order. + ScfUInt16Vec maRowFields; /// Row field indexes. + ScfUInt16Vec maColFields; /// Column field indexes. + ScfUInt16Vec maPageFields; /// Page field indexes. + XclPTDataFieldPosVec maDataFields; /// Data field indexes. + XclExpPTField maDataOrientField; /// Special data field orientation field. + SCTAB mnOutScTab; /// Sheet index of the output range. + bool mbValid; /// true = The pivot table is valid for export. + bool mbFilterBtn; /// true = DataPilot has filter button. +}; + +// ============================================================================ + +/** The main class for pivot table export. + + This class contains all pivot caches and pivot tables in a Calc document. + It creates the pivot cache streams and pivot table records in the main + workbook stream. It supports sharing of pivot caches between multiple pivot + tables to decrease file size. + */ +class XclExpPivotTableManager : protected XclExpRoot +{ +public: + explicit XclExpPivotTableManager( const XclExpRoot& rRoot ); + + /** Creates all pivot tables and caches from the Calc DataPilot objects. */ + void CreatePivotTables(); + + /** Creates a record wrapper for exporting all pivot caches. */ + XclExpRecordRef CreatePivotCachesRecord(); + /** Creates a record wrapper for exporting all pivot tables of the specified sheet. */ + XclExpRecordRef CreatePivotTablesRecord( SCTAB nScTab ); + + /** Writes all pivot caches (all Workbook records and cache streams). */ + void WritePivotCaches( XclExpStream& rStrm ); + void WritePivotCachesXml( XclExpXmlStream& rStrm ); + /** Writes all pivot tables of the specified Calc sheet. */ + void WritePivotTables( XclExpStream& rStrm, SCTAB nScTab ); + void WritePivotTablesXml( XclExpXmlStream& rStrm, SCTAB nScTab ); + +private: + /** Finds an existing (if enabled in mbShareCaches) or creates a new pivot cache. + @return Pointer to the pivot cache or 0, if the passed source range was invalid. */ + const XclExpPivotCache* CreatePivotCache( const ScDPObject& rDPObj ); + +private: + typedef XclExpRecordList< XclExpPivotCache > XclExpPivotCacheList; + typedef XclExpPivotCacheList::RecordRefType XclExpPivotCacheRef; + typedef XclExpRecordList< XclExpPivotTable > XclExpPivotTableList; + typedef XclExpPivotTableList::RecordRefType XclExpPivotTableRef; + + XclExpPivotCacheList maPCacheList; /// List of all pivot caches. + XclExpPivotTableList maPTableList; /// List of all pivot tables. + bool mbShareCaches; /// true = Tries to share caches between tables. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xerecord.hxx b/sc/source/filter/inc/xerecord.hxx new file mode 100644 index 000000000000..a191cd9b1c20 --- /dev/null +++ b/sc/source/filter/inc/xerecord.hxx @@ -0,0 +1,419 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XERECORD_HXX +#define SC_XERECORD_HXX + +#include "xlconst.hxx" +#include "xestream.hxx" + +// Base classes to export Excel records ======================================= + +/** Base class for all Excel records. + + Derive from this class to implement any functionality performed during + saving the records - except really writing a record (i.e. write a list of + records contained in the class). Derive from XclExpRecord (instead from + this class) to write common records. + */ +class XclExpRecordBase +{ +public: + virtual ~XclExpRecordBase(); + + /** Overwrite this method to do any operation while saving the record. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +class XclExpDelegatingRecord : public XclExpRecordBase +{ +public: + XclExpDelegatingRecord( XclExpRecordBase* pRecord ); + ~XclExpDelegatingRecord(); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + XclExpRecordBase* mpRecord; +}; + +// ---------------------------------------------------------------------------- + +class XclExpXmlElementRecord : public XclExpRecordBase +{ +public: + XclExpXmlElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) = NULL ); + virtual ~XclExpXmlElementRecord(); + +protected: + sal_Int32 mnElement; + void (*mpAttributes)( XclExpXmlStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +class XclExpXmlStartElementRecord : public XclExpXmlElementRecord +{ +public: + XclExpXmlStartElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) = NULL ); + virtual ~XclExpXmlStartElementRecord(); + + /** Starts the element nElement */ + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +class XclExpXmlEndElementRecord : public XclExpXmlElementRecord +{ +public: + XclExpXmlEndElementRecord( sal_Int32 nElement ); + virtual ~XclExpXmlEndElementRecord(); + + /** Ends the element nElement */ + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +class XclExpXmlStartSingleElementRecord : public XclExpXmlElementRecord +{ +public: + XclExpXmlStartSingleElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) = NULL ); + virtual ~XclExpXmlStartSingleElementRecord(); + + /** Starts the single element nElement */ + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +class XclExpXmlEndSingleElementRecord : public XclExpRecordBase +{ +public: + XclExpXmlEndSingleElementRecord(); + virtual ~XclExpXmlEndSingleElementRecord(); + + /** Ends the single element nElement */ + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +/** Base class for single records with any content. + + This class handles writing the record header. Derived classes only have to + write the record body. Calculating the record size before saving optimizes + the write process (the stream does not have to seek back and update the + written record size). But it is not required to calculate a valid size + (maybe it would be too complex or just impossible until the record is + really written). + */ +class XclExpRecord : public XclExpRecordBase +{ +public: + /** @param nRecId The record ID of this record. May be set later with SetRecId(). + @param nRecSize The predicted record size. May be set later with SetRecSize(). */ + explicit XclExpRecord( + sal_uInt16 nRecId = EXC_ID_UNKNOWN, + sal_Size nRecSize = 0 ); + + virtual ~XclExpRecord(); + + /** Returns the current record ID. */ + inline sal_uInt16 GetRecId() const { return mnRecId; } + /** Returns the current record size prediction. */ + inline sal_Size GetRecSize() const { return mnRecSize; } + + /** Sets a new record ID. */ + inline void SetRecId( sal_uInt16 nRecId ) { mnRecId = nRecId; } + /** Sets a new record size prediction. */ + inline void SetRecSize( sal_Size nRecSize ) { mnRecSize = nRecSize; } + /** Adds a size value to the record size prediction. */ + inline void AddRecSize( sal_Size nRecSize ) { mnRecSize += nRecSize; } + /** Sets record ID and size with one call. */ + void SetRecHeader( sal_uInt16 nRecId, sal_Size nRecSize ); + + /** Writes the record header and calls WriteBody(). */ + virtual void Save( XclExpStream& rStrm ); + +protected: + /** Writes the body of the record (without record header). + @descr Usually this method will be overwritten by derived classes. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + sal_Size mnRecSize; /// The predicted record size. + sal_uInt16 mnRecId; /// The record ID. +}; + +// ---------------------------------------------------------------------------- + +/** A record without body. Only the record ID and the size 0 will be written. */ +class XclExpEmptyRecord : public XclExpRecord +{ +public: + /** @param nRecId The record ID of this record. */ + inline explicit XclExpEmptyRecord( sal_uInt16 nRecId ); +}; + +inline XclExpEmptyRecord::XclExpEmptyRecord( sal_uInt16 nRecId ) : + XclExpRecord( nRecId, 0 ) +{ +} + +// ============================================================================ + +/** A record with a single value of type Type. + @descr Requires operator<<( XclExpStream&, const Type& ). */ +template< typename Type > +class XclExpValueRecord : public XclExpRecord +{ +public: + /** @param nRecId The record ID of this record. + @param rValue The value for the record body. + @param nSize Record size. Uses sizeof( Type ), if this parameter is omitted. */ + inline explicit XclExpValueRecord( sal_uInt16 nRecId, const Type& rValue, sal_Size nSize = sizeof( Type ) ) : + XclExpRecord( nRecId, nSize ), maValue( rValue ), mnAttribute( -1 ) {} + + /** Returns the value of the record. */ + inline const Type& GetValue() const { return maValue; } + /** Sets a new record value. */ + inline void SetValue( const Type& rValue ) { maValue = rValue; } + + /** Sets the OOXML attribute this record corresponds to */ + XclExpValueRecord* SetAttribute( sal_Int32 nId ); + + /** Write the OOXML attribute and its value */ + void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the body of the record. */ + inline virtual void WriteBody( XclExpStream& rStrm ) { rStrm << maValue; } + // inlining prevents warning in wntmsci10 + +private: + Type maValue; /// The record data. + sal_Int32 mnAttribute; /// The OOXML attribute Id +}; + +template< typename Type > +void XclExpValueRecord< Type >::SaveXml( XclExpXmlStream& rStrm ) +{ + if( mnAttribute == -1 ) + return; + rStrm.WriteAttributes( + mnAttribute, rtl::OString::valueOf( (sal_Int32) maValue ).getStr(), + FSEND ); +} + +template<> +void XclExpValueRecord<double>::SaveXml( XclExpXmlStream& rStrm ); + +template< typename Type > +XclExpValueRecord< Type >* XclExpValueRecord< Type >::SetAttribute( sal_Int32 nId ) +{ + mnAttribute = nId; + return this; +} + +// ---------------------------------------------------------------------------- + +/** A record containing an unsigned 16-bit value. */ +typedef XclExpValueRecord< sal_uInt16 > XclExpUInt16Record; + +/** A record containing an unsigned 32-bit value. */ +typedef XclExpValueRecord< sal_uInt32 > XclExpUInt32Record; + +/** A record containing a double value. */ +typedef XclExpValueRecord< double > XclExpDoubleRecord; + +// ---------------------------------------------------------------------------- + +/** Record which contains a Boolean value. + @descr The value is stored as 16-bit value: 0x0000 = FALSE, 0x0001 = TRUE. */ +class XclExpBoolRecord : public XclExpRecord +{ +public: + /** @param nRecId The record ID of this record. + @param nValue The value for the record body. */ + inline explicit XclExpBoolRecord( sal_uInt16 nRecId, bool bValue, sal_Int32 nAttribute = -1 ) : + XclExpRecord( nRecId, 2 ), mbValue( bValue ), mnAttribute( nAttribute ) {} + + /** Returns the Boolean value of the record. */ + inline bool GetBool() const { return mbValue; } + /** Sets a new Boolean record value. */ + inline void SetBool( bool bValue ) { mbValue = bValue; } + + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the body of the record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + bool mbValue; /// The record data. + sal_Int32 mnAttribute; /// The attribute to generate within SaveXml() +}; + +// ---------------------------------------------------------------------------- + +/** Record which exports a memory data array. */ +class XclExpDummyRecord : public XclExpRecord +{ +public: + /** @param nRecId The record ID of this record. + @param pRecData Pointer to the data array representing the record body. + @param nRecSize Size of the data array. */ + explicit XclExpDummyRecord( + sal_uInt16 nRecId, const void* pRecData, sal_Size nRecSize ); + + /** Sets a data array. */ + void SetData( const void* pRecData, sal_Size nRecSize ); + +private: + /** Writes the body of the record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + const void* mpData; /// The record data. +}; + +// Future records ============================================================= + +class XclExpFutureRecord : public XclExpRecord +{ +public: + explicit XclExpFutureRecord( XclFutureRecType eRecType, + sal_uInt16 nRecId, sal_Size nRecSize = 0 ); + + /** Writes the extended record header and calls WriteBody(). */ + virtual void Save( XclExpStream& rStrm ); + +private: + XclFutureRecType meRecType; +}; + +// List of records ============================================================ + +/** A list of Excel record objects. + + Provides saving the compete list. This class is derived from + XclExpRecordBase, so it can be used as record in another record list. + Requires RecType::Save( XclExpStream& ). + */ +template< typename RecType = XclExpRecordBase > +class XclExpRecordList : public XclExpRecordBase +{ +public: + typedef ScfRef< RecType > RecordRefType; + + /** Returns pointer to an existing record or 0 on error. */ + inline bool IsEmpty() const { return maRecs.empty(); } + /** Returns pointer to an existing record or 0 on error. */ + inline size_t GetSize() const { return maRecs.size(); } + + /** Returns true, if the passed index points to an exiting record. */ + inline bool HasRecord( size_t nPos ) const + { return nPos < maRecs.size(); } + /** Returns reference to an existing record or empty reference on error. */ + inline RecordRefType GetRecord( size_t nPos ) const + { return (nPos < maRecs.size()) ? maRecs[ nPos ] : RecordRefType(); } + /** Returns reference to the first existing record or empty reference, if list is empty. */ + inline RecordRefType GetFirstRecord() const + { return maRecs.empty() ? RecordRefType() : maRecs.front(); } + /** Returns reference to the last existing record or empty reference, if list is empty. */ + inline RecordRefType GetLastRecord() const + { return maRecs.empty() ? RecordRefType() : maRecs.back(); } + + /** Inserts a record at the specified position into the list. */ + inline void InsertRecord( RecordRefType xRec, size_t nPos ) + { if( xRec.get() ) maRecs.insert( maRecs.begin() + ::std::min( nPos, maRecs.size() ), xRec ); } + /** Appends a record to the list. */ + inline void AppendRecord( RecordRefType xRec ) + { if( xRec.get() ) maRecs.push_back( xRec ); } + /** Replaces the record at the specified position from the list with the passed record. */ + inline void ReplaceRecord( RecordRefType xRec, size_t nPos ) + { RemoveRecord( nPos ); InsertRecord( xRec, nPos ); } + + /** Inserts a newly created record at the specified position into the list. */ + inline void InsertNewRecord( RecType* pRec, size_t nPos ) + { if( pRec ) InsertRecord( RecordRefType( pRec ), nPos ); } + /** Appends a newly created record to the list. */ + inline void AppendNewRecord( RecType* pRec ) + { if( pRec ) AppendRecord( RecordRefType( pRec ) ); } + /** Replaces the record at the specified position from the list with the passed newly created record. */ + inline void ReplaceNewRecord( RecType* pRec, size_t nPos ) + { RemoveRecord( nPos ); InsertNewRecord( pRec, nPos ); } + + /** Removes the record at the specified position from the list. */ + inline void RemoveRecord( size_t nPos ) + { if( nPos < maRecs.size() ) maRecs.erase( maRecs.begin() + nPos ); } + /** Removes all records from the list. */ + inline void RemoveAllRecords() { maRecs.clear(); } + + /** Writes the complete record list. */ + inline virtual void Save( XclExpStream& rStrm ) + { + // inlining prevents warning in wntmsci10 + for( typename RecordVec::iterator aIt = maRecs.begin(), aEnd = maRecs.end(); aIt != aEnd; ++aIt ) + (*aIt)->Save( rStrm ); + } + + inline virtual void SaveXml( XclExpXmlStream& rStrm ) + { + // inlining prevents warning in wntmsci10 + for( typename RecordVec::iterator aIt = maRecs.begin(), aEnd = maRecs.end(); aIt != aEnd; ++aIt ) + (*aIt)->SaveXml( rStrm ); + } + +private: + typedef ::std::vector< RecordRefType > RecordVec; + RecordVec maRecs; +}; + +// ============================================================================ + +/** Represents a complete substream of records enclosed into a pair of BOF/EOF records. */ +class XclExpSubStream : public XclExpRecordList<> +{ +public: + explicit XclExpSubStream( sal_uInt16 nSubStrmType ); + + /** Writes the complete substream, including leading BOF and trailing EOF. */ + virtual void Save( XclExpStream& rStrm ); + +private: + sal_uInt16 mnSubStrmType; /// Substream type, stored in leading BOF record. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xeroot.hxx b/sc/source/filter/inc/xeroot.hxx new file mode 100644 index 000000000000..980590f9d4ff --- /dev/null +++ b/sc/source/filter/inc/xeroot.hxx @@ -0,0 +1,175 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XEROOT_HXX +#define SC_XEROOT_HXX + +#include "xlroot.hxx" + +// Forward declarations of objects in public use ============================== + +class XclExpStream; +class XclExpRecordBase; +class XclExpString; + +typedef ScfRef< XclExpRecordBase > XclExpRecordRef; +typedef ScfRef< XclExpString > XclExpStringRef; + +// Global data ================================================================ + +class XclExpTabInfo; +class XclExpAddressConverter; +class XclExpFormulaCompiler; +class XclExpProgressBar; +class XclExpSst; +class XclExpPalette; +class XclExpFontBuffer; +class XclExpNumFmtBuffer; +class XclExpXFBuffer; +class XclExpLinkManager; +class XclExpNameManager; +class XclExpObjectManager; +class XclExpFilterManager; +class XclExpPivotTableManager; + +/** Stores global buffers and data needed for Excel export filter. */ +struct XclExpRootData : public XclRootData +{ + typedef ScfRef< XclExpTabInfo > XclExpTabInfoRef; + typedef ScfRef< XclExpAddressConverter > XclExpAddrConvRef; + typedef ScfRef< XclExpFormulaCompiler > XclExpFmlaCompRef; + typedef ScfRef< XclExpProgressBar > XclExpProgressRef; + + typedef ScfRef< XclExpSst > XclExpSstRef; + typedef ScfRef< XclExpPalette > XclExpPaletteRef; + typedef ScfRef< XclExpFontBuffer > XclExpFontBfrRef; + typedef ScfRef< XclExpNumFmtBuffer > XclExpNumFmtBfrRef; + typedef ScfRef< XclExpXFBuffer > XclExpXFBfrRef; + typedef ScfRef< XclExpNameManager > XclExpNameMgrRef; + typedef ScfRef< XclExpLinkManager > XclExpLinkMgrRef; + typedef ScfRef< XclExpObjectManager > XclExpObjectMgrRef; + typedef ScfRef< XclExpFilterManager > XclExpFilterMgrRef; + typedef ScfRef< XclExpPivotTableManager > XclExpPTableMgrRef; + + XclExpTabInfoRef mxTabInfo; /// Calc->Excel sheet index conversion. + XclExpAddrConvRef mxAddrConv; /// The address converter. + XclExpFmlaCompRef mxFmlaComp; /// The formula compiler. + XclExpProgressRef mxProgress; /// The export progress bar. + + XclExpSstRef mxSst; /// The shared string table. + XclExpPaletteRef mxPalette; /// The color buffer. + XclExpFontBfrRef mxFontBfr; /// All fonts in the file. + XclExpNumFmtBfrRef mxNumFmtBfr; /// All number formats in the file. + XclExpXFBfrRef mxXFBfr; /// All XF records in the file. + XclExpNameMgrRef mxNameMgr; /// Internal defined names. + XclExpLinkMgrRef mxGlobLinkMgr; /// Global link manager for defined names. + XclExpLinkMgrRef mxLocLinkMgr; /// Local link manager for a sheet. + XclExpObjectMgrRef mxObjMgr; /// All drawing objects. + XclExpFilterMgrRef mxFilterMgr; /// Manager for filtered areas in all sheets. + XclExpPTableMgrRef mxPTableMgr; /// All pivot tables and pivot caches. + + bool mbRelUrl; /// true = Store URLs relative. + + explicit XclExpRootData( XclBiff eBiff, SfxMedium& rMedium, + SotStorageRef xRootStrg, ScDocument& rDoc, rtl_TextEncoding eTextEnc ); + virtual ~XclExpRootData(); +}; + +// ---------------------------------------------------------------------------- + +/** Access to global data from other classes. */ +class XclExpRoot : public XclRoot +{ +public: + explicit XclExpRoot( XclExpRootData& rExpRootData ); + + /** Returns this root instance - for code readability in derived classes. */ + inline const XclExpRoot& GetRoot() const { return *this; } + /** Returns true, if URLs should be stored relative to the document location. */ + inline bool IsRelUrl() const { return mrExpData.mbRelUrl; } + + /** Returns the buffer for Calc->Excel sheet index conversion. */ + XclExpTabInfo& GetTabInfo() const; + /** Returns the address converter. */ + XclExpAddressConverter& GetAddressConverter() const; + /** Returns the formula compiler to produce formula token arrays. */ + XclExpFormulaCompiler& GetFormulaCompiler() const; + /** Returns the export progress bar. */ + XclExpProgressBar& GetProgressBar() const; + + /** Returns the shared string table. */ + XclExpSst& GetSst() const; + /** Returns the color buffer. */ + XclExpPalette& GetPalette() const; + /** Returns the font buffer. */ + XclExpFontBuffer& GetFontBuffer() const; + /** Returns the number format buffer. */ + XclExpNumFmtBuffer& GetNumFmtBuffer() const; + /** Returns the cell formatting attributes buffer. */ + XclExpXFBuffer& GetXFBuffer() const; + /** Returns the global link manager for defined names. */ + XclExpLinkManager& GetGlobalLinkManager() const; + /** Returns the local link manager for the current sheet. */ + XclExpLinkManager& GetLocalLinkManager() const; + /** Returns the buffer that contains internal defined names. */ + XclExpNameManager& GetNameManager() const; + /** Returns the drawing object manager. */ + XclExpObjectManager& GetObjectManager() const; + /** Returns the filter manager. */ + XclExpFilterManager& GetFilterManager() const; + /** Returns the pivot table manager. */ + XclExpPivotTableManager& GetPivotTableManager() const; + + /** Is called when export filter starts to create the Excel document (all BIFF versions). */ + void InitializeConvert(); + /** Is called when export filter starts to create the workbook global data (>=BIFF5). */ + void InitializeGlobals(); + /** Is called when export filter starts to create data for a single sheet (all BIFF versions). */ + void InitializeTable( SCTAB nScTab ); + /** Is called before export filter starts to write the records to the stream. */ + void InitializeSave(); + /** Returns the reference to a record (or record list) representing a root object. + @param nRecId Identifier that specifies which record is returned. */ + XclExpRecordRef CreateRecord( sal_uInt16 nRecId ) const; + + bool IsDocumentEncrypted() const; + + String GetPassword() const; + +private: + + /** Returns the local or global link manager, depending on current context. */ + XclExpRootData::XclExpLinkMgrRef GetLocalLinkMgrRef() const; + +private: + mutable XclExpRootData& mrExpData; /// Reference to the global export data struct. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xestream.hxx b/sc/source/filter/inc/xestream.hxx new file mode 100644 index 000000000000..3308827441dd --- /dev/null +++ b/sc/source/filter/inc/xestream.hxx @@ -0,0 +1,355 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// ============================================================================ + +#ifndef SC_XESTREAM_HXX +#define SC_XESTREAM_HXX + +#include <map> +#include <stack> +#include <string> + +#include <oox/core/xmlfilterbase.hxx> +#include <sax/fshelper.hxx> + +#include "xlstream.hxx" +#include "xestring.hxx" + +#include <filter/msfilter/mscodec.hxx> +#include <vector> + +/* ============================================================================ +Output stream class for Excel export +- CONTINUE record handling +- ByteString and UniString support +============================================================================ */ + +class XclExpRoot; +class XclExpBiff8Encrypter; +typedef ScfRef< XclExpBiff8Encrypter > XclExpEncrypterRef; + +/** This class is used to export Excel record streams. + @descr An instance is constructed with an SvStream and the maximum size of Excel + record contents (in BIFF5: 2080 bytes, in BIFF8: 8224 bytes). + + To start writing a record call StartRecord(). Parameters are the record identifier + and any calculated record size. This is for optimizing the write process: if the real + written data has the same size as the calculated, the stream will not seek back and + update the record size field. But it is not mandatory to calculate a size. Each + record must be closed by calling EndRecord(). This will check (and update) the record + size field. + + If some data exceeds the record size limit, a CONTINUE record is started automatically + and the new data will be written to this record. + + If specific data pieces must not be splitted, use SetSliceLen(). For instance: + To write a sequence of 16-bit values, where 4 values form a unit and cannot be + split, call SetSliceLen( 8 ) first (4*2 bytes == 8). + + To write unicode character arrays, call WriteUnicodeBuffer(). It creates CONTINUE + records and repeats the unicode string flag byte automatically. This function is used + for instance from the class XclExpString which can write complete unicode strings. +*/ +class XclExpStream +{ +public: + /** Constructs the Excel record export stream. + @param rOutStrm The system output stream to write to. + @param nMaxRecSize The maximum allowed size of record content (depending on BIFF type). + If 0 is passed, the record size will be set automatically, depending on the current BIFF type. */ + XclExpStream( + SvStream& rOutStrm, + const XclExpRoot& rRoot, + sal_uInt16 nMaxRecSize = 0 ); + + ~XclExpStream(); + + /** Returns the filter root data. */ + inline const XclExpRoot& GetRoot() const { return mrRoot; } + + /** Starts a new record: writes header data, stores calculated record size. */ + void StartRecord( sal_uInt16 nRecId, sal_Size nRecSize ); + /** Checks and corrects real record length. Must be called everytime a record is finished. */ + void EndRecord(); + + /** Returns the position inside of current record (starts by 0 in every CONTINUE). */ + inline sal_uInt16 GetRawRecPos() const { return mnCurrSize; } + + /** Returns the maximum size of a record. */ + inline sal_uInt16 GetMaxRecSize() const { return mnMaxRecSize; } + /** Sets maximum record size (valid only for current record). */ + inline void SetMaxRecSize( sal_uInt16 nMax ) { mnCurrMaxSize = nMax; } + /** Sets maximum size of CONTINUE records (valid only for current record). */ + inline void SetMaxContSize( sal_uInt16 nMax ) { mnMaxContSize = nMax; } + + /** Sets data slice length. 0 = no slices. */ + void SetSliceSize( sal_uInt16 nSize ); + + XclExpStream& operator<<( sal_Int8 nValue ); + XclExpStream& operator<<( sal_uInt8 nValue ); + XclExpStream& operator<<( sal_Int16 nValue ); + XclExpStream& operator<<( sal_uInt16 nValue ); + XclExpStream& operator<<( sal_Int32 nValue ); + XclExpStream& operator<<( sal_uInt32 nValue ); + XclExpStream& operator<<( float fValue ); + XclExpStream& operator<<( double fValue ); + + /** Writes nBytes bytes from memory. */ + sal_Size Write( const void* pData, sal_Size nBytes ); + /** Writes a sequence of nBytes zero bytes (respects slice setting). */ + void WriteZeroBytes( sal_Size nBytes ); + + void WriteZeroBytesToRecord( sal_Size nBytes ); + + /** Copies nBytes bytes from current position of the stream rInStrm. + @descr Omitting the second parameter means: read to end of stream. */ + sal_Size CopyFromStream( SvStream& rInStrm, sal_Size nBytes = STREAM_SEEK_TO_END ); + + // *** unicode string export is realized with helper class XclExpString *** + // (slice length setting has no effect here -> disabled automatically) + +//UNUSED2008-05 /** Writes Unicode buffer as 8/16 bit, repeats nFlags at start of a CONTINUE record. */ +//UNUSED2008-05 void WriteUnicodeBuffer( const sal_uInt16* pBuffer, sal_Size nChars, sal_uInt8 nFlags ); + + /** Writes Unicode buffer as 8/16 bit, repeats nFlags at start of a CONTINUE record. */ + void WriteUnicodeBuffer( const ScfUInt16Vec& rBuffer, sal_uInt8 nFlags ); + + // *** write 8-bit-strings *** + // (slice length setting has no effect here -> disabled automatically) + +//UNUSED2008-05 /** Writes ByteString buffer (without string length field). */ +//UNUSED2008-05 void WriteByteStringBuffer( +//UNUSED2008-05 const ByteString& rString, +//UNUSED2008-05 sal_uInt16 nMaxLen = 0x00FF ); + + /** Writes string length field and ByteString buffer. */ + void WriteByteString( + const ByteString& rString, + sal_uInt16 nMaxLen = 0x00FF, + bool b16BitCount = false ); + + /** Writes 8-bit character buffer. */ + void WriteCharBuffer( const ScfUInt8Vec& rBuffer ); + + // *** SvStream access *** + + /** Sets position of system stream (only allowed outside of records). */ + sal_Size SetSvStreamPos( sal_Size nPos ); + /** Returns the absolute position of the system stream. */ + inline sal_Size GetSvStreamPos() const { return mrStrm.Tell(); } + + void SetEncrypter( XclExpEncrypterRef xEncrypter ); + + bool HasValidEncrypter() const; + + void EnableEncryption( bool bEnable = true ); + + void DisableEncryption(); + +private: + /** Writes header data, internal setup. */ + void InitRecord( sal_uInt16 nRecId ); + /** Rewrites correct record length, if different from calculated. */ + void UpdateRecSize(); + /** Recalculates mnCurrSize and mnSliceSize. */ + void UpdateSizeVars( sal_Size nSize ); + /** Writes CONTINUE header, internal setup. */ + void StartContinue(); + /** Refreshes counter vars, creates CONTINUE records. */ + void PrepareWrite( sal_uInt16 nSize ); + /** Creates CONTINUE record at end of record. + @return Maximum data block size remaining. */ + sal_uInt16 PrepareWrite(); + + /** Writes a raw sequence of zero bytes. */ + void WriteRawZeroBytes( sal_Size nBytes ); + +private: + SvStream& mrStrm; /// Reference to the system output stream. + const XclExpRoot& mrRoot; /// Filter root data. + + bool mbUseEncrypter; + XclExpEncrypterRef mxEncrypter; + + // length data + sal_uInt16 mnMaxRecSize; /// Maximum size of record content. + sal_uInt16 mnMaxContSize; /// Maximum size of CONTINUE content. + sal_uInt16 mnCurrMaxSize; /// Current maximum, either mnMaxRecSize or mnMaxContSize. + sal_uInt16 mnMaxSliceSize; /// Maximum size of data slices (parts that cannot be split). + sal_uInt16 mnHeaderSize; /// Record size written in last record header. + sal_uInt16 mnCurrSize; /// Count of bytes already written in current record. + sal_uInt16 mnSliceSize; /// Count of bytes already written in current slice. + sal_Size mnPredictSize; /// Predicted size received from calling function. + + // stream position data + sal_Size mnLastSizePos; /// Stream position of size field in current header. + bool mbInRec; /// true = currently writing inside of a record. +}; + +// ============================================================================ + +class XclExpBiff8Encrypter +{ +public: + explicit XclExpBiff8Encrypter( const XclExpRoot& rRoot, const sal_uInt8 nDocId[16], + const sal_uInt8 nSalt[16] ); + ~XclExpBiff8Encrypter(); + + bool IsValid() const; + + void GetSaltDigest( sal_uInt8 nSaltDigest[16] ) const; + + void Encrypt( SvStream& rStrm, sal_uInt8 nData ); + void Encrypt( SvStream& rStrm, sal_uInt16 nData ); + void Encrypt( SvStream& rStrm, sal_uInt32 nData ); + + void Encrypt( SvStream& rStrm, sal_Int8 nData ); + void Encrypt( SvStream& rStrm, sal_Int16 nData ); + void Encrypt( SvStream& rStrm, sal_Int32 nData ); + + void Encrypt( SvStream& rStrm, float fValue ); + void Encrypt( SvStream& rStrm, double fValue ); + + void EncryptBytes( SvStream& rStrm, ::std::vector<sal_uInt8>& aBytes ); + +private: + void Init( const String& aPass, const sal_uInt8 nDocId[16], + const sal_uInt8 nSalt[16] ); + + sal_uInt32 GetBlockPos( sal_Size nStrmPos ) const; + sal_uInt16 GetOffsetInBlock( sal_Size nStrmPos ) const; + +private: + ::msfilter::MSCodec_Std97 maCodec; /// Crypto algorithm implementation. + sal_uInt16 mnPassw[16]; /// Cached password data for copy construction. + sal_uInt8 mnDocId[16]; /// Cached document ID for copy construction. + sal_uInt8 mnSaltDigest[16]; + + const XclExpRoot& mrRoot; + sal_Size mnOldPos; /// Last known stream position + bool mbValid; +}; + +// ---------------------------------------------------------------------------- + + +// ============================================================================ + +// `s.GetChar(0) != 0` needed because some strings on export only contain NULL. +#define XESTRING_TO_PSZ(s) \ + (s.Len() && s.GetChar( 0 ) != 0 ? XclXmlUtils::ToOString( s ).getStr() : NULL) + +class ScAddress; +class ScDocument; +class ScRange; +class ScRangeList; +class ScTokenArray; +struct XclAddress; +struct XclFontData; +class XclRangeList; + +class XclXmlUtils +{ + XclXmlUtils(); + ~XclXmlUtils(); + XclXmlUtils(const XclXmlUtils&); + XclXmlUtils& operator=(const XclXmlUtils&); +public: + static ::rtl::OUString GetStreamName( const char* sStreamDir, const char* sStream, sal_Int32 nId ); + + static ::rtl::OString ToOString( const Color& rColor ); + static ::rtl::OString ToOString( const ::rtl::OUString& s ); + static ::rtl::OString ToOString( const ScfUInt16Vec& rBuffer ); + static ::rtl::OString ToOString( const String& s ); + static ::rtl::OString ToOString( const ScAddress& rRange ); + static ::rtl::OString ToOString( const ScRange& rRange ); + static ::rtl::OString ToOString( const ScRangeList& rRangeList ); + static ::rtl::OString ToOString( const XclAddress& rAddress ); + static ::rtl::OString ToOString( const XclExpString& s ); + static ::rtl::OString ToOString( const XclRangeList& rRangeList ); + + static ::rtl::OUString ToOUString( const char* s ); + static ::rtl::OUString ToOUString( const ScfUInt16Vec& rBuffer, sal_Int32 nStart = 0, sal_Int32 nLength = -1 ); + static ::rtl::OUString ToOUString( const String& s ); + static ::rtl::OUString ToOUString( ScDocument& rDocument, const ScAddress& rAddress, ScTokenArray* pTokenArray ); + static ::rtl::OUString ToOUString( const XclExpString& s ); + static const char* ToPsz( bool b ); +}; + +class XclExpXmlStream : public oox::core::XmlFilterBase +{ +public: + XclExpXmlStream( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rSMgr, SvStream& rStrm, const XclExpRoot& rRoot ); + virtual ~XclExpXmlStream(); + + /** Returns the filter root data. */ + inline const XclExpRoot& GetRoot() const { return mrRoot; } + + sax_fastparser::FSHelperPtr& GetCurrentStream(); + void PushStream( sax_fastparser::FSHelperPtr aStream ); + void PopStream(); + + ::rtl::OUString GetIdForPath( const ::rtl::OUString& rPath ); + sax_fastparser::FSHelperPtr GetStreamForPath( const ::rtl::OUString& rPath ); + + sax_fastparser::FSHelperPtr& WriteAttributes( sal_Int32 nAttribute, ... ); + sax_fastparser::FSHelperPtr& WriteFontData( const XclFontData& rFontData, sal_Int32 nNameId ); + + sax_fastparser::FSHelperPtr CreateOutputStream ( + const ::rtl::OUString& sFullStream, + const ::rtl::OUString& sRelativeStream, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream >& xParentRelation, + const char* sContentType, + const char* sRelationshipType, + ::rtl::OUString* pRelationshipId = NULL ); + + // ignore + virtual bool exportDocument() throw(); + + // only needed for import; ignore + virtual bool importDocument() throw(); + virtual oox::vml::Drawing* getVmlDrawing(); + virtual const oox::drawingml::Theme* getCurrentTheme() const; + virtual const oox::drawingml::table::TableStyleListPtr getTableStyles(); + virtual oox::drawingml::chart::ChartConverter& getChartConverter(); + + void Trace( const char* format, ...); +private: + virtual ::rtl::OUString implGetImplementationName() const; + + typedef std::map< ::rtl::OUString, + std::pair< ::rtl::OUString, + sax_fastparser::FSHelperPtr > > XclExpXmlPathToStateMap; + + const XclExpRoot& mrRoot; /// Filter root data. + std::stack< sax_fastparser::FSHelperPtr > maStreams; + XclExpXmlPathToStateMap maOpenedStreamMap; +}; + +#endif + diff --git a/sc/source/filter/inc/xestring.hxx b/sc/source/filter/inc/xestring.hxx new file mode 100644 index 000000000000..b468696cb3ff --- /dev/null +++ b/sc/source/filter/inc/xestring.hxx @@ -0,0 +1,350 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XESTRING_HXX +#define SC_XESTRING_HXX + +#include "xlstring.hxx" + +// ============================================================================ + +class ScEditCell; +class ScPatternAttr; +class EditTextObject; +class XclExpStream; +class XclExpXmlStream; + +/** This class stores an unformatted or formatted string for Excel export. + + The class supports two completely different types of Excel strings: + 1) BIFF2-BIFF7 byte strings: The text is encoded as a 8-bit character + array. The strings cannot contain any character formatting. + 2) BIFF8 Unicode strings: The text may be stored as UCS-2 character array, + or compressed to an 8-bit array, if all characters are less than + U+0100. Unicode strings may contain a formatting array, that specifies + the used FONT record for different ranges of characters. + + The class provides full support for NUL characters in strings. On + construction or assignment the passed flags specify the behaviour of the + string while it is written to a stream (the 'Write' functions and + 'operator<<'). + */ +class XclExpString +{ +public: + // constructors ----------------------------------------------------------- + + /** Constructs an empty BIFF8 Unicode string. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. */ + explicit XclExpString( + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + /** Constructs an unformatted BIFF8 Unicode string. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. */ + explicit XclExpString( + const String& rString, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + /** Constructs an unformatted BIFF8 Unicode string. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. */ + explicit XclExpString( + const ::rtl::OUString& rString, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); +//UNUSED2008-05 /** Constructs a formatted BIFF8 Unicode string. +//UNUSED2008-05 @param rFormats The formatting runs. +//UNUSED2008-05 @param nFlags Modifiers for string export. +//UNUSED2008-05 @param nMaxLen The maximum number of characters to store in this string. */ +//UNUSED2008-05 explicit XclExpString( +//UNUSED2008-05 const String& rString, +//UNUSED2008-05 const XclFormatRunVec& rFormats, +//UNUSED2008-05 XclStrFlags nFlags = EXC_STR_DEFAULT, +//UNUSED2008-05 sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); +//UNUSED2008-05 +//UNUSED2008-05 /** Constructs a formatted BIFF8 Unicode string. +//UNUSED2008-05 @param rFormats The formatting runs. +//UNUSED2008-05 @param nFlags Modifiers for string export. +//UNUSED2008-05 @param nMaxLen The maximum number of characters to store in this string. */ +//UNUSED2008-05 explicit XclExpString( +//UNUSED2008-05 const ::rtl::OUString& rString, +//UNUSED2008-05 const XclFormatRunVec& rFormats, +//UNUSED2008-05 XclStrFlags nFlags = EXC_STR_DEFAULT, +//UNUSED2008-05 sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + // assign ----------------------------------------------------------------- + + /** Assigns an unformatted string, converts this object to a BIFF8 Unicode string. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. */ + void Assign( + const String& rString, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + /** Assigns a formatted string, converts this object to a BIFF8 Unicode string. + @param rFormats The formatting runs. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. */ + void Assign( + const String& rString, + const XclFormatRunVec& rFormats, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + /** Assigns an unformatted string, converts this object to a BIFF8 Unicode string. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. */ + void Assign( + const ::rtl::OUString& rString, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + /** Assigns a formatted string, converts this object to a BIFF8 Unicode string. + @param rFormats The formatting runs. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. */ + void Assign( + const ::rtl::OUString& rString, + const XclFormatRunVec& rFormats, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + /** Assigns a Unicode character, converts this object to a BIFF8 Unicode string. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string (for appending). */ + void Assign( + sal_Unicode cChar, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + /** Assigns an unformatted string, converts this object to a BIFF2-BIFF7 byte string. + @param nFlags Modifiers for string export. + @param nMaxLen The maximum number of characters to store in this string. */ + void AssignByte( + const String& rString, + rtl_TextEncoding eTextEnc, + XclStrFlags nFlags = EXC_STR_DEFAULT, + sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + +//UNUSED2008-05 /** Assigns a character, converts this object to a BIFF2-BIFF7 byte string. +//UNUSED2008-05 @param nFlags Modifiers for string export. +//UNUSED2008-05 @param nMaxLen The maximum number of characters to store in this string (for appending). */ +//UNUSED2008-05 void AssignByte( +//UNUSED2008-05 sal_Unicode cChar, +//UNUSED2008-05 rtl_TextEncoding eTextEnc, +//UNUSED2008-05 XclStrFlags nFlags = EXC_STR_DEFAULT, +//UNUSED2008-05 sal_uInt16 nMaxLen = EXC_STR_MAXLEN ); + + // append ----------------------------------------------------------------- + + /** Appends a string. Uses the string flags used in constructor or last Assign(). + @descr This object must be a BIFF8 Unicode string. */ + void Append( const String& rString ); + +//UNUSED2008-05 /** Appends a string. Uses the string flags used in constructor or last Assign(). +//UNUSED2008-05 @descr This object must be a BIFF8 Unicode string. */ +//UNUSED2008-05 void Append( const ::rtl::OUString& rString ); +//UNUSED2008-05 /** Appends a character. Uses the string flags used in constructor or last Assign(). +//UNUSED2008-05 @descr This object must be a BIFF8 Unicode string. */ +//UNUSED2008-05 void Append( sal_Unicode cChar ); + + /** Appends a string. Uses the string flags used in constructor or last Assign(). + @descr This object must be a BIFF2-BIFF7 byte string. */ + void AppendByte( const String& rString, rtl_TextEncoding eTextEnc ); + /** Appends a character. Uses the string flags used in constructor or last Assign(). + @descr This object must be a BIFF2-BIFF7 byte string. */ + void AppendByte( sal_Unicode cChar, rtl_TextEncoding eTextEnc ); + + // formatting runs -------------------------------------------------------- + + /** Sets new formatting runs for the current text. */ + void SetFormats( const XclFormatRunVec& rFormats ); + /** Appends a formatting run. nChar must be greater than last contained character index. */ + void AppendFormat( sal_uInt16 nChar, sal_uInt16 nFontIdx, bool bDropDuplicate = true ); + /** Appends a trailing formatting run with the passed font index. */ + void AppendTrailingFormat( sal_uInt16 nFontIdx ); + /** Removes formatting runs at the end, if the string contains too much. */ + void LimitFormatCount( sal_uInt16 nMaxCount ); + /** Removes and returns the font index for the first char from the formatting runs, otherwise EXC_FONT_NOTFOUND. */ + sal_uInt16 RemoveLeadingFont(); + + // get data --------------------------------------------------------------- + + /** Returns the character count of the string. */ + inline sal_uInt16 Len() const { return mnLen; } + /** Returns true, if the string is empty. */ + inline bool IsEmpty() const { return mnLen == 0; } + /** Returns true, if the string contains line breaks. */ + inline bool IsWrapped() const { return mbWrapped; } + /** Returns true, if this string is equal to the passed string. */ + bool IsEqual( const XclExpString& rCmp ) const; + /** Returns true, if this string is less than the passed string. */ + bool IsLessThan( const XclExpString& rCmp ) const; + + /** Returns true, if the string contains formatting information. */ + inline bool IsRich() const { return !maFormats.empty(); } + /** Returns the current count of formatting runs for rich strings. */ + sal_uInt16 GetFormatsCount() const; + /** Returns the vector with all formatting runs. */ + inline const XclFormatRunVec& GetFormats() const { return maFormats; } + + /** Returns the current string flags field to export. */ + sal_uInt8 GetFlagField() const; + /** Returns the byte count the header will take on export. */ + sal_uInt16 GetHeaderSize() const; + /** Returns the byte count the character buffer will take on export. */ + sal_Size GetBufferSize() const; + /** Returns the byte count the whole string will take on export. */ + sal_Size GetSize() const; + + /** Returns the specified character from the (already encoded) string. */ + sal_uInt16 GetChar( sal_uInt16 nCharIdx ) const; + /** Returns a hash value for the string. */ + sal_uInt16 GetHash() const; + + const ScfUInt16Vec& GetUnicodeBuffer() const { return maUniBuffer; } + + // streaming -------------------------------------------------------------- + + /** Writes the string length field (1 byte or 2 bytes). */ + void WriteLenField( XclExpStream& rStrm ) const; + /** Writes the string flags field (1 byte). */ + void WriteFlagField( XclExpStream& rStrm ) const; + /** Writes 8-bit or 16-bit length field and string flags field. */ + void WriteHeader( XclExpStream& rStrm ) const; + /** Writes the raw character buffer. */ + void WriteBuffer( XclExpStream& rStrm ) const; + /** Writes the raw formatting run buffer. */ + void WriteFormats( XclExpStream& rStrm, bool bWriteSize = false ) const; + /** Writes the complete Unicode string. */ + void Write( XclExpStream& rStrm ) const; + + /** Writes the string header to memory. */ + void WriteHeaderToMem( sal_uInt8* pnMem ) const; + /** Writes the raw character buffer to memory (8-bit or 16-bit little-endian). */ + void WriteBufferToMem( sal_uInt8* pnMem ) const; + /** Writes the entire string to memory. */ + void WriteToMem( sal_uInt8* pnMem ) const; + + void WriteXml( XclExpXmlStream& rStrm ) const; + + // ------------------------------------------------------------------------ +private: + /** Returns true, if the flag field should be written. */ + bool IsWriteFlags() const; + /** Returns true, if the formatting run vector should be written. */ + bool IsWriteFormats() const; + + /** Sets the string length but regards the limit given in mnMaxLen. */ + void SetStrLen( sal_Int32 nNewLen ); + /** Inserts the passed character array into the internal character buffer. + @param nBegin First index in internal buffer to fill. + @param nLen Number of characters to insert. */ + void CharsToBuffer( const sal_Unicode* pcSource, sal_Int32 nBegin, sal_Int32 nLen ); + /** Inserts the passed character array into the internal character buffer. + @param nBegin First index in internal buffer to fill. + @param nLen Number of characters to insert. */ + void CharsToBuffer( const sal_Char* pcSource, sal_Int32 nBegin, sal_Int32 nLen ); + + /** Initializes flags, string length, and resizes character buffer. + @param nFlags Modifiers for string export. + @param nCurrLen The requested number of characters for the string. + @param nMaxLen The maximum length allowed of the resulting string. + @param bBiff8 true = BIFF8 Unicode string; false = BIFF2-BIFF7 byte string. */ + void Init( sal_Int32 nCurrLen, XclStrFlags nFlags, sal_uInt16 nMaxLen, bool bBiff8 ); + /** Creates the character buffer from the given Unicode array. + @param pcSource The source character buffer. Trailing NUL character is not necessary. + @param nFlags Modifiers for string export. + @param nCurrLen The real count of characters contained in the passed buffer. + @param nMaxLen The maximum length allowed of the resulting string. */ + void Build( + const sal_Unicode* pcSource, sal_Int32 nCurrLen, + XclStrFlags nFlags, sal_uInt16 nMaxLen ); + /** Creates the character buffer from the given character array. + @param pcSource The source character buffer. Trailing NUL character is not necessary. + @param nFlags Modifiers for string export. + @param nCurrLen The real count of characters contained in the passed buffer. + @param nMaxLen The maximum length allowed of the resulting string. */ + void Build( + const sal_Char* pcSource, sal_Int32 nCurrLen, + XclStrFlags nFlags, sal_uInt16 nMaxLen ); + + /** Initializes string length and resizes character buffers for appending operation. + @param nAddLen The number of characters to be appended. */ + void InitAppend( sal_Int32 nAddLen ); + /** Appends the given Unicode array to the character buffer. + @param pcSource The source character buffer. Trailing NUL character is not necessary. + @param nAddLen The real count of characters contained in the passed buffer. */ + void BuildAppend( const sal_Unicode* pcSource, sal_Int32 nAddLen ); + /** Appends the given character array to the character buffer. + @param pcSource The source character buffer. Trailing NUL character is not necessary. + @param nAddLen The real count of characters contained in the passed buffer. */ + void BuildAppend( const sal_Char* pcSource, sal_Int32 nAddLen ); + + /** Initializes write process on stream. */ + void PrepareWrite( XclExpStream& rStrm, sal_uInt16 nBytes ) const; + +private: + ScfUInt16Vec maUniBuffer; /// The Unicode character buffer. + ScfUInt8Vec maCharBuffer; /// The byte character buffer. + XclFormatRunVec maFormats; /// All formatting runs. + sal_uInt16 mnLen; /// Character count to export. + sal_uInt16 mnMaxLen; /// Maximum allowed number of characters. + bool mbIsBiff8; /// true = BIFF8 Unicode string, false = BIFF2-7 bytestring. + bool mbIsUnicode; /// true, if at least one character is >0xFF. + bool mb8BitLen; /// true = write 8-bit string length; false = 16-bit. + bool mbSmartFlags; /// true = omit flags on empty string; false = always write flags. + bool mbSkipFormats; /// true = skip formats on export; false = write complete formatted string. + bool mbWrapped; /// true = text contains several paragraphs. + bool mbSkipHeader; /// ture = skip length and flags when writing string bytes. +}; + +inline bool operator==( const XclExpString& rLeft, const XclExpString& rRight ) +{ + return rLeft.IsEqual( rRight ); +} + +inline bool operator!=( const XclExpString& rLeft, const XclExpString& rRight ) +{ + return !(rLeft == rRight); +} + +inline bool operator<( const XclExpString& rLeft, const XclExpString& rRight ) +{ + return rLeft.IsLessThan( rRight ); +} + +inline XclExpStream& operator<<( XclExpStream& rStrm, const XclExpString& rString ) +{ + rString.Write( rStrm ); + return rStrm; +} + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xestyle.hxx b/sc/source/filter/inc/xestyle.hxx new file mode 100644 index 000000000000..fd7303509688 --- /dev/null +++ b/sc/source/filter/inc/xestyle.hxx @@ -0,0 +1,781 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XESTYLE_HXX +#define SC_XESTYLE_HXX + +#include <map> +#include <tools/mempool.hxx> +#include <tools/string.hxx> +#include <svl/zforlist.hxx> +#include <svl/nfkeytab.hxx> +#include <editeng/svxfont.hxx> +#include "xerecord.hxx" +#include "xlstyle.hxx" +#include "xeroot.hxx" + +/* ============================================================================ +- Buffers for style records (PALETTE, FONT, FORMAT, XF, STYLE). +============================================================================ */ + +const sal_uInt16 EXC_ID_FONTLIST = 0x8031; /// For internal use only. +const sal_uInt16 EXC_ID_FORMATLIST = 0x801E; /// For internal use only. +const sal_uInt16 EXC_ID_XFLIST = 0x8043; /// For internal use only. + +// PALETTE record - color information ========================================= + +/** Different types of colors in a document. */ +enum XclExpColorType +{ + EXC_COLOR_CELLTEXT, /// Text in a cell. + EXC_COLOR_CELLBORDER, /// Border of a cell. + EXC_COLOR_CELLAREA, /// Background area of a cell. + EXC_COLOR_CHARTTEXT, /// Text color in a chart. + EXC_COLOR_CHARTLINE, /// Line in a chart. + EXC_COLOR_CHARTAREA, /// Area in a chart. + EXC_COLOR_CTRLTEXT, /// Text color in a form control. + EXC_COLOR_GRID, /// Spreadsheet grid color. + EXC_COLOR_TABBG /// Spreadsheet tab bg color. +}; + +// ---------------------------------------------------------------------------- + +class XclExpPaletteImpl; + +/** Stores all used colors in the document. + + Supports color reduction to the maximum count of the current BIFF version. + An instance of this class collects all colors in the conversion phase of + the export, using the InsertColor() function. It returns a unique + identidier for each passed color. + + After the entire document is converted, the Finalize() function will reduce + the palette to the number of colors supported by the current BIFF version. + + Then, in the streaming phase, the functions GetColorIndex() and + GetMixedColors() return the real Excel palette index for all color + identifiers. + */ +class XclExpPalette : public XclDefaultPalette, public XclExpRecord +{ +public: + explicit XclExpPalette( const XclExpRoot& rRoot ); + virtual ~XclExpPalette(); + + /** Inserts the color into the list and updates weighting. + @param nAutoDefault The Excel palette index for automatic color. + @return A unique ID for this color. */ + sal_uInt32 InsertColor( const Color& rColor, XclExpColorType eType, sal_uInt16 nAutoDefault = 0 ); + /** Returns the color ID representing a fixed Excel palette index (i.e. for auto colors). */ + static sal_uInt32 GetColorIdFromIndex( sal_uInt16 nIndex ); + + /** Reduces the color list to the maximum count of the current BIFF version. */ + void Finalize(); + + /** Returns the Excel palette index of the color with passed color ID. */ + sal_uInt16 GetColorIndex( sal_uInt32 nColorId ) const; + + /** Returns a foreground and background color for the two passed color IDs. + @descr If rnXclPattern contains a solid pattern, this function tries to find + the two best fitting colors and a mix pattern (25%, 50% or 75%) for nForeColorId. + This will result in a better approximation to the passed foreground color. */ + void GetMixedColors( + sal_uInt16& rnXclForeIx, sal_uInt16& rnXclBackIx, sal_uInt8& rnXclPattern, + sal_uInt32 nForeColorId, sal_uInt32 nBackColorId ) const; + + /** Returns the RGB color data for a (non-zero-based) Excel palette entry. + @return The color from current or default palette or COL_AUTO, if nothing else found. */ + ColorData GetColorData( sal_uInt16 nXclIndex ) const; + /** Returns the color for a (non-zero-based) Excel palette entry. + @return The color from current or default palette or COL_AUTO, if nothing else found. */ + inline Color GetColor( sal_uInt16 nXclIndex ) const + { return Color( GetColorData( nXclIndex ) ); } + + /** Saves the PALETTE record, if it differs from the default palette. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the contents of the PALETTE record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef ScfRef< XclExpPaletteImpl > XclExpPaletteImplRef; + XclExpPaletteImplRef mxImpl; +}; + +// FONT record - font information ============================================= + +class Font; +class SvxFont; + +const size_t EXC_FONTLIST_NOTFOUND = static_cast< size_t >( -1 ); + +// ---------------------------------------------------------------------------- + +/** Static helper functions for font export. */ +class XclExpFontHelper +{ +public: + /** Returns the script type of the first font item found in the item set and its parents. */ + static sal_Int16 GetFirstUsedScript( + const XclExpRoot& rRoot, + const SfxItemSet& rItemSet ); + + /** Returns a VCL font object filled from the passed item set. */ + static Font GetFontFromItemSet( + const XclExpRoot& rRoot, + const SfxItemSet& rItemSet, + sal_Int16 nScript ); + + /** Returns true, if at least one font related item is set in the passed item set. + @param bDeep true = Searches in parent item sets too. */ + static bool CheckItems( + const XclExpRoot& rRoot, + const SfxItemSet& rItemSet, + sal_Int16 nScript, + bool bDeep ); + +private: + XclExpFontHelper(); + ~XclExpFontHelper(); +}; + +// ---------------------------------------------------------------------------- + +/** Stores all data of an Excel font and provides export of FONT records. */ +class XclExpFont : public XclExpRecord, protected XclExpRoot +{ +public: + explicit XclExpFont( const XclExpRoot& rRoot, + const XclFontData& rFontData, XclExpColorType eColorType ); + + /** Returns read-only access to font data. */ + inline const XclFontData& GetFontData() const { return maData; } + /** Returns the font color identifier. */ + inline sal_uInt32 GetFontColorId() const { return mnColorId; } + /** Compares this font with the passed font data. + @param nHash The hash value calculated from the font data. */ + virtual bool Equals( const XclFontData& rFontData, sal_uInt32 nHash ) const; + + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the contents of the FONT record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclFontData maData; /// All font attributes. + sal_uInt32 mnColorId; /// Unique color ID for text color. + sal_uInt32 mnHash; /// Hash value for fast comparison. +}; + +// ---------------------------------------------------------------------------- + +/** Used as placeholder for font index 4, which is not used in Excel. */ +class XclExpBlindFont : public XclExpFont +{ +public: + explicit XclExpBlindFont( const XclExpRoot& rRoot ); + + /** Returns always false to never find this font while searching the font list. */ + virtual bool Equals( const XclFontData& rFontData, sal_uInt32 nHash ) const; + + /** Skips writing this record. */ + virtual void Save( XclExpStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +class ScPatternAttr; + +/** Stores the data of all fonts used in the document. */ +class XclExpFontBuffer : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpFontBuffer( const XclExpRoot& rRoot ); + + /** Returns the specified font from font list. */ + const XclExpFont* GetFont( sal_uInt16 nXclFont ) const; + /** Returns the application font data of this file, needed e.g. for column width. */ + const XclFontData& GetAppFontData() const; + + /** Inserts a new font with the passed font data into the buffer if not present. + @param bAppFont true = Sets the application font; false = Inserts a new font. + @return The resulting Excel font index. */ + sal_uInt16 Insert( const XclFontData& rFontData, + XclExpColorType eColorType, bool bAppFont = false ); + /** Inserts the font into the buffer if not present. + @param bAppFont true = Sets the application font; false = Inserts a new font. + @return The resulting Excel font index. */ + sal_uInt16 Insert( const Font& rFont, + XclExpColorType eColorType, bool bAppFont = false ); + /** Inserts the SvxFont into the buffer if not present, e.g. where escapements are used. + @param bAppFont true = Sets the application font; false = Inserts a new font. + @return The resulting Excel font index. */ + sal_uInt16 Insert( const SvxFont& rFont, + XclExpColorType eColorType, bool bAppFont = false ); + /** Inserts the font contained in the passed item set into the buffer, if not present. + @param nScript The script type of the font properties to be used. + @param bAppFont true = Sets the application font; false = Inserts a new font. + @return The resulting Excel font index. */ + sal_uInt16 Insert( const SfxItemSet& rItemSet, sal_Int16 nScript, + XclExpColorType eColorType, bool bAppFont = false ); + /** Inserts the font contained in rPattern into the buffer if not present. + @param nScript The script type of the font properties to be used. + @param bAppFont true = Sets the application font; false = Inserts a new font. + @return The resulting Excel font index. */ + sal_uInt16 Insert( const ScPatternAttr& rPattern, sal_Int16 nScript, + XclExpColorType eColorType, bool bAppFont = false ); + + /** Writes all FONT records contained in this buffer. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Initializes the default fonts for the current BIFF version. */ + void InitDefaultFonts(); + /** Tries to find the passed font and returns the current list index. */ + size_t Find( const XclFontData& rFontData ); + +private: + typedef XclExpRecordList< XclExpFont > XclExpFontList; + typedef XclExpFontList::RecordRefType XclExpFontRef; + + XclExpFontList maFontList; /// List of all FONT records. + size_t mnXclMaxSize; /// Maximum number of fonts. +}; + +// FORMAT record - number formats ============================================= + +/** Stores a core number format index with corresponding Excel format index. */ +struct XclExpNumFmt +{ + ULONG mnScNumFmt; /// Core index of the number format. + sal_uInt16 mnXclNumFmt; /// Resulting Excel format index. + + inline explicit XclExpNumFmt( ULONG nScNumFmt, sal_uInt16 nXclNumFmt ) : + mnScNumFmt( nScNumFmt ), mnXclNumFmt( nXclNumFmt ) {} +}; + +// ---------------------------------------------------------------------------- + +class SvNumberFormatter; + +/** Stores all number formats used in the document. */ +class XclExpNumFmtBuffer : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpNumFmtBuffer( const XclExpRoot& rRoot ); + virtual ~XclExpNumFmtBuffer(); + + /** Returns the core index of the current standard number format. */ + inline ULONG GetStandardFormat() const { return mnStdFmt; } + + /** Inserts a number format into the format buffer. + @param nScNumFmt The core index of the number format. + @return The resulting Excel format index. */ + sal_uInt16 Insert( ULONG nScNumFmt ); + + /** Writes all FORMAT records contained in this buffer. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the FORMAT record with index nXclIx and format string rFormatStr. */ + void WriteFormatRecord( XclExpStream& rStrm, sal_uInt16 nXclNumFmt, const String& rFormatStr ); + /** Writes the FORMAT record represented by rFormat. */ + void WriteFormatRecord( XclExpStream& rStrm, const XclExpNumFmt& rFormat ); + + String GetFormatCode ( const XclExpNumFmt& rFormat ); + +private: + typedef ::std::auto_ptr< SvNumberFormatter > SvNumberFormatterPtr; + typedef ::std::vector< XclExpNumFmt > XclExpNumFmtVec; + typedef NfKeywordTable* NfKeywordTablePtr; + + SvNumberFormatterPtr mxFormatter; /// Special number formatter for conversion. + XclExpNumFmtVec maFormatMap; /// Maps core formats to Excel indexes. + NfKeywordTablePtr mpKeywordTable; /// Replacement table. + ULONG mnStdFmt; /// Key for standard number format. + sal_uInt16 mnXclOffset; /// Offset to first user defined format. +}; + +// XF, STYLE record - Cell formatting ========================================= + +/** Extends the XclCellProt struct for export. + @descr Provides functions to fill from item sets and to fill to Excel record data. */ +struct XclExpCellProt : public XclCellProt +{ + /** Fills the protection attributes from the passed item set. + @return true = At least one protection item is set. */ + bool FillFromItemSet( const SfxItemSet& rItemSet, bool bStyle = false ); + +#if 0 + /** Fills the data to the passed fields of a BIFF2 XF record. */ + void FillToXF2( sal_uInt8& rnNumFmt ) const; +#endif + /** Fills the data to the passed fields of a BIFF3-BIFF8 XF record. */ + void FillToXF3( sal_uInt16& rnProt ) const; + + void SaveXml( XclExpXmlStream& rStrm ) const; +}; + +// ---------------------------------------------------------------------------- + +/** Extends the XclCellAlign struct for export. + @descr Provides functions to fill from item sets and to fill to Excel record data. */ +struct XclExpCellAlign : public XclCellAlign +{ + /** Fills the alignment attributes from the passed item set. + @descr Fills only the attributes exported in the passed BIFF version. + @param bForceLineBreak true = Set line break flag unconditionally. + @return true = At least one alignment item is set. */ + bool FillFromItemSet( const SfxItemSet& rItemSet, + bool bForceLineBreak, XclBiff eBiff, bool bStyle = false ); + +#if 0 + /** Fills the data to the passed fields of a BIFF2 XF record. */ + void FillToXF2( sal_uInt8& rnFlags ) const; + /** Fills the data to the passed fields of a BIFF3 XF record. */ + void FillToXF3( sal_uInt16& rnAlign ) const; + /** Fills the data to the passed fields of a BIFF4 XF record. */ + void FillToXF4( sal_uInt16& rnAlign ) const; +#endif + /** Fills the data to the passed fields of a BIFF5/BIFF7 XF record. */ + void FillToXF5( sal_uInt16& rnAlign ) const; + /** Fills the data to the passed fields of a BIFF8 XF record. */ + void FillToXF8( sal_uInt16& rnAlign, sal_uInt16& rnMiscAttrib ) const; + + void SaveXml( XclExpXmlStream& rStrm ) const; +}; + +// ---------------------------------------------------------------------------- + +/** Extends the XclCellBorder struct for export. + @descr Provides functions to fill from item sets and to fill to Excel record data. */ +struct XclExpCellBorder : public XclCellBorder +{ + sal_uInt32 mnLeftColorId; /// Color ID for left line. + sal_uInt32 mnRightColorId; /// Color ID for right line. + sal_uInt32 mnTopColorId; /// Color ID for top line. + sal_uInt32 mnBottomColorId; /// Color ID for bottom line. + sal_uInt32 mnDiagColorId; /// Color ID for diagonal line(s). + + explicit XclExpCellBorder(); + + /** Fills the border attributes from the passed item set. + @descr Fills only the attributes exported in the passed BIFF version. + @return true = At least one border item is set. */ + bool FillFromItemSet( const SfxItemSet& rItemSet, + XclExpPalette& rPalette, XclBiff eBiff, bool bStyle = false ); + /** Fills the mn***Color base members from the mn***ColorId members. */ + void SetFinalColors( const XclExpPalette& rPalette ); + +#if 0 + /** Fills the data to the passed fields of a BIFF2 XF record. */ + void FillToXF2( sal_uInt8& rnFlags ) const; + /** Fills the data to the passed fields of a BIFF3/BIFF4 XF record. */ + void FillToXF3( sal_uInt32& rnBorder ) const; +#endif + /** Fills the data to the passed fields of a BIFF5/BIFF7 XF record. */ + void FillToXF5( sal_uInt32& rnBorder, sal_uInt32& rnArea ) const; + /** Fills the data to the passed fields of a BIFF8 XF record. */ + void FillToXF8( sal_uInt32& rnBorder1, sal_uInt32& rnBorder2 ) const; + + /** Fills the data to the passed fields of a BIFF8 CF (conditional format) record. */ + void FillToCF8( sal_uInt16& rnLine, sal_uInt32& rnColor ) const; + + void SaveXml( XclExpXmlStream& rStrm ) const; +}; + +// ---------------------------------------------------------------------------- + +/** Extends the XclCellArea struct for export. + @descr Provides functions to fill from item sets and to fill to Excel record data. */ +struct XclExpCellArea : public XclCellArea +{ + sal_uInt32 mnForeColorId; /// Foreground color ID. + sal_uInt32 mnBackColorId; /// Background color ID. + + explicit XclExpCellArea(); + + /** Fills the area attributes from the passed item set. + @return true = At least one area item is set. */ + bool FillFromItemSet( + const SfxItemSet& rItemSet, XclExpPalette& rPalette, + bool bStyle = false ); + /** Fills the mn***Color base members from the mn***ColorId members. */ + void SetFinalColors( const XclExpPalette& rPalette ); + +#if 0 + /** Fills the data to the passed fields of a BIFF2 XF record. */ + void FillToXF2( sal_uInt8& rnFlags ) const; + /** Fills the data to the passed fields of a BIFF3/BIFF4 XF record. */ + void FillToXF3( sal_uInt16& rnArea ) const; +#endif + /** Fills the data to the passed fields of a BIFF5/BIFF7 XF record. */ + void FillToXF5( sal_uInt32& rnArea ) const; + /** Fills the data to the passed fields of a BIFF8 XF record. */ + void FillToXF8( sal_uInt32& rnBorder2, sal_uInt16& rnArea ) const; + + /** Fills the data to the passed fields of a BIFF8 CF (conditional format) record. */ + void FillToCF8( sal_uInt16& rnPattern, sal_uInt16& rnColor ) const; + + void SaveXml( XclExpXmlStream& rStrm ) const; +}; + +// ---------------------------------------------------------------------------- + +/** A combination of unique XF identifier with real Excel XF index. */ +struct XclExpXFId +{ + sal_uInt32 mnXFId; /// Temporary XF identifier. + sal_uInt16 mnXFIndex; /// Real Excel XF index. + + explicit XclExpXFId(); + explicit XclExpXFId( sal_uInt32 nXFId ); + + /** Converts the XF identifier in mnXFId to an Excel XF index and stores it in mnXFIndex. */ + void ConvertXFIndex( const XclExpRoot& rRoot ); +}; + +// ---------------------------------------------------------------------------- + +class SfxStyleSheetBase; + +/** Represents an XF record which contains all formatting data of a cell or cell style. */ +class XclExpXF : public XclXFBase, public XclExpRecord, protected XclExpRoot +{ +public: + /** Constructs a cell XF record from the passed Calc cell formatting. */ + explicit XclExpXF( + const XclExpRoot& rRoot, + const ScPatternAttr& rPattern, + sal_Int16 nScript, + ULONG nScForceNumFmt = NUMBERFORMAT_ENTRY_NOT_FOUND, + sal_uInt16 nForceXclFont = EXC_FONT_NOTFOUND, + bool bForceLineBreak = false ); + /** Constructs a style XF record from the passed cell style sheet. */ + explicit XclExpXF( + const XclExpRoot& rRoot, + const SfxStyleSheetBase& rStyleSheet ); + + /** Returns the cell protection settings of this XF. */ + const XclExpCellProt& GetProtectionData() const { return maProtection; } + /** Returns the alignment settings of this XF. */ + const XclExpCellAlign& GetAlignmentData() const { return maAlignment; } + /** Returns the cell border settings of this XF. */ + const XclExpCellBorder& GetBorderData() const { return maBorder; } + /** Returns the cell fill settings of this XF. */ + const XclExpCellArea& GetAreaData() const { return maArea; } + + /** Returns true, if this XF record represents the passed cell formatting. + @descr Searches for cell XFs only. */ + bool Equals( + const ScPatternAttr& rPattern, + ULONG nScForceNumFmt, + sal_uInt16 nForceXclFont, + bool bForceLineBreak ) const; + + /** Returns true, if this XF record represents the passed style. + @descr Searches for style XFs only. */ + bool Equals( const SfxStyleSheetBase& rStyleSheet ) const; + + /** Sets the resulting Excel palette index from all used color IDs (border and area). */ + void SetFinalColors(); + + /** Returns true, if this XF record is completely equal to the passed. */ + bool Equals( const XclExpXF& rCmpXF ) const; + + void SetXmlIds( sal_uInt32 nBorderId, sal_uInt32 nFillId ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); + +protected: + explicit XclExpXF( const XclExpRoot& rRoot, bool bCellXF ); + +protected: // access for XclExpDefaultXF + const SfxItemSet* mpItemSet; /// Pointer to the item set (we do not own it). + + XclExpCellProt maProtection; /// Cell protection flags. + XclExpCellAlign maAlignment; /// All alignment attributes. + XclExpCellBorder maBorder; /// Border line style. + XclExpCellArea maArea; /// Background area style. + sal_uInt32 mnParentXFId; /// XF ID of parent XF record. + ULONG mnScNumFmt; /// Calc number format index. + sal_uInt16 mnXclFont; /// Excel font index. + sal_uInt16 mnXclNumFmt; /// Excel number format index. + sal_Int32 mnBorderId; /// OOXML Border Index + sal_Int32 mnFillId; /// OOXML Fill Index + +private: + using XclXFBase::Equals; + + /** Initializes with default values. */ + void InitDefault(); + /** Fills all members from the passed item set. + @param bDefStyle true = This is the "Default"/"Normal" style - needs special handling. */ + void Init( + const SfxItemSet& rItemSet, + sal_Int16 nScript, + ULONG nForceScNumFmt, + sal_uInt16 nForceXclFont, + bool bForceLineBreak, + bool bDefStyle ); + + /** Returns the bits specifying the used attributes. + @descr In cell XFs a set bit means a used attribute, in style XF a cleared + bit means a used attribute. This method regards the cell/style state. + @return The mask based on bit 0 (not yet bit-shifted as needed for export). */ + sal_uInt8 GetUsedFlags() const; + + void WriteBody5( XclExpStream& rStrm ); + void WriteBody8( XclExpStream& rStrm ); + + /** Writes the contents of the XF record. */ + virtual void WriteBody( XclExpStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +/** Represents a default XF record. Supports methods to set attributes directly. */ +class XclExpDefaultXF : public XclExpXF +{ +public: + explicit XclExpDefaultXF( const XclExpRoot& rRoot, bool bCellXF ); + +//UNUSED2008-05 /** Sets the parent XF ID. Only allowed for cell XFs. */ +//UNUSED2008-05 void SetParent( sal_uInt32 nParentXFId ); +//UNUSED2008-05 +//UNUSED2008-05 /** Sets all "attribute used" flags explicitely. +//UNUSED2008-05 @descr The following Set***() functions set the appropriate flag too. */ +//UNUSED2008-05 void SetUsedFlags( +//UNUSED2008-05 bool bProtUsed, bool bFontUsed, bool bFmtUsed, +//UNUSED2008-05 bool bAlignUsed, bool bBorderUsed, bool bAreaUsed ); +//UNUSED2008-05 /** Sets the cell protection flags. */ +//UNUSED2008-05 void SetProtection( const XclExpCellProt& rProtection ); +//UNUSED2008-05 /** Sets cell alignment attributes. */ +//UNUSED2008-05 void SetAlignment( const XclExpCellAlign& rAlignment ); +//UNUSED2008-05 /** Sets a cell border style. */ +//UNUSED2008-05 void SetBorder( const XclExpCellBorder& rBorder ); +//UNUSED2008-05 /** Sets a cell area style. */ +//UNUSED2008-05 void SetArea( const XclExpCellArea& rArea ); + + /** Sets the Excel font index. */ + void SetFont( sal_uInt16 nXclFont ); + /** Sets the Excel number format index. */ + void SetNumFmt( sal_uInt16 nXclNumFmt ); +}; + +// ---------------------------------------------------------------------------- + +/** Represents a STYLE record containing the data of a cell style. + @descr The calss is able to store built-in and user-defined styles. */ +class XclExpStyle : public XclExpRecord +{ +public: + explicit XclExpStyle( sal_uInt32 nXFId, const String& rStyleName ); + explicit XclExpStyle( sal_uInt32 nXFId, sal_uInt8 nStyleId, sal_uInt8 nLevel = EXC_STYLE_NOLEVEL ); + + /** Returns true, if this record represents an Excel built-in style. */ + inline bool IsBuiltIn() const { return mnStyleId != EXC_STYLE_USERDEF; } + + inline const String& GetName() const { return maName; } + + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the contents of the STYLE record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + String maName; /// Name of the cell style. + XclExpXFId maXFId; /// XF identifier for style formatting. + sal_uInt8 mnStyleId; /// Built-in style identifier. + sal_uInt8 mnLevel; /// Outline level for RowLevel and ColLevel styles. +}; + +// ---------------------------------------------------------------------------- + +/** Stores all XF records (cell formats and cell styles) in the document. + + Stores also the names of user defined cell styles (STYLE records). Supports + reduction to the maximum count of XF records of the current BIFF version. + + An instance of this class collects all XF records in the conversion phase + of the export, using the Insert() and InsertStyle() functions. It returns a + unique identidier for each XF record. + + After the entire document is converted, the Finalize() function will reduce + the list to the number of XF records supported by the current BIFF version. + + Then, in the streaming phase, the function GetXFIndex() returns the real + Excel XF index for all XF identifiers. + */ +class XclExpXFBuffer : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpXFBuffer( const XclExpRoot& rRoot ); + + /** Inserts predefined built-in styles and user-defined styles. */ + void Initialize(); + + /** Finds or creates a cell XF record for the passed item set. + @return A unique XF record ID. */ + sal_uInt32 Insert( const ScPatternAttr* pPattern, sal_Int16 nScript ); + /** Finds or creates a cell XF record for the passed item set. + @param nForceXclFont The font to be exported. If not equal to EXC_FONT_NOTFOUND, + this font index will be used unconditionally and the cell font will be ignored. + @param bForceLineBreak true = Set line break flag unconditionally. + This is required for cells that contain multi-line text. + @return A unique XF record ID. */ + sal_uInt32 InsertWithFont( + const ScPatternAttr* pPattern, sal_Int16 nScript, + sal_uInt16 nForceXclFont, + bool bForceLineBreak ); + /** Finds or creates a cell XF record for the passed item set, with custom number format. + @param nXFFlags Additional flags allowing to control the creation of an XF. + @param nForceScNumFmt The number format to be exported, e.g. formula + result type. This format will always overwrite the cell's number format. + @param bForceLineBreak true = Set line break flag unconditionally. + This is required for cells that contain multi-line text. + @return A unique XF record ID. */ + sal_uInt32 InsertWithNumFmt( + const ScPatternAttr* pPattern, sal_Int16 nScript, + ULONG nForceScNumFmt, + bool bForceLineBreak ); + /** Inserts the passed cell style. Creates a style XF record and a STYLE record. + @return A unique XF record ID. */ + sal_uInt32 InsertStyle( const SfxStyleSheetBase* pStyleSheet ); + /** Returns the XF identifier representing a fixed Excel XF index (e.g. for built-in XFs). */ + static sal_uInt32 GetXFIdFromIndex( sal_uInt16 nXFIndex ); + /** Returns the XF identifier representing the default cell XF. */ + static sal_uInt32 GetDefCellXFId(); + + /** Returns an XF record by its unique identifier. */ + const XclExpXF* GetXFById( sal_uInt32 nXFId ) const; + + /** Reduces the XF record list to the maximum allowed number of records. */ + void Finalize(); + + /** Returns the Excel XF index of the XF record with passed XF ID. */ + sal_uInt16 GetXFIndex( sal_uInt32 nXFId ) const; + + sal_Int32 GetXmlStyleIndex( sal_uInt32 nXFId ) const; + sal_Int32 GetXmlCellIndex( sal_uInt32 nXFId ) const; + + /** Writes all XF records contained in this buffer. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpXF > XclExpXFList; + typedef XclExpXFList::RecordRefType XclExpXFRef; + typedef XclExpRecordList< XclExpStyle > XclExpStyleList; + +private: + /** Returns the XF ID of the cell XF containing the passed format. */ + sal_uInt32 FindXF( const ScPatternAttr& rPattern, ULONG nForceScNumFmt, + sal_uInt16 nForceXclFont, bool bForceLineBreak ) const; + /** Returns the XF ID of the style XF containing the passed style. */ + sal_uInt32 FindXF( const SfxStyleSheetBase& rStyleSheet ) const; + + /** Returns the XF ID of a built-in style XF, searches by style identifier. */ + sal_uInt32 FindBuiltInXF( sal_uInt8 nStyleId, sal_uInt8 nLevel = EXC_STYLE_NOLEVEL ) const; + + /** Tries to find the XF record containing the passed format or inserts a new record. + @return The XF record ID. */ + sal_uInt32 InsertCellXF( const ScPatternAttr* pPattern, sal_Int16 nScript, + ULONG nForceScNumFmt, + sal_uInt16 nForceXclFont, bool bForceLineBreak ); + /** Inserts the passed cell style. Creates a style XF record and a STYLE record. + @return The XF record ID. */ + sal_uInt32 InsertStyleXF( const SfxStyleSheetBase& rStyleSheet ); + + /** Inserts an XF and a STYLE record for all user defined style sheets. */ + void InsertUserStyles(); + + /** Inserts a built-in XF record without a STYLE record and returns the XF ID. + @param bCreateStyleRec true = Creates the related STYLE record. */ + sal_uInt32 AppendBuiltInXF( XclExpXFRef xXF, + sal_uInt8 nStyleId, sal_uInt8 nLevel = EXC_STYLE_NOLEVEL ); + /** Inserts a built-in XF and STYLE record and returns the XF ID. + @param bCreateStyleRec true = Creates the related STYLE record. */ + sal_uInt32 AppendBuiltInXFWithStyle( XclExpXFRef xXF, + sal_uInt8 nStyleId, sal_uInt8 nLevel = EXC_STYLE_NOLEVEL ); + + /** Inserts all default XF and STYLE records. */ + void InsertDefaultRecords(); + + /** Appends a XF index to the internal ID<->index maps. */ + void AppendXFIndex( sal_uInt32 nXFId ); + + void AddBorderAndFill( const XclExpXF& rXF ); + void SaveXFXml( XclExpXmlStream& rStrm, XclExpXF& rXF ); + +private: + /** Extended info about a built-in XF. */ + struct XclExpBuiltInInfo + { + sal_uInt8 mnStyleId; /// Built-in style identifier. + sal_uInt8 mnLevel; /// Level for RowLevel/ColLevel styles. + bool mbPredefined; /// true = XF still predefined. + bool mbHasStyleRec; /// true = STYLE record created. + explicit XclExpBuiltInInfo(); + }; + typedef ::std::map< sal_uInt32, XclExpBuiltInInfo > XclExpBuiltInMap; + typedef ::std::vector< XclExpCellBorder > XclExpBorderList; + typedef ::std::vector< XclExpCellArea > XclExpFillList; + + XclExpXFList maXFList; /// List of all XF records. + XclExpStyleList maStyleList; /// List of all STYLE records. + XclExpBuiltInMap maBuiltInMap; /// Contained elements describe built-in XFs. + ScfUInt16Vec maXFIndexVec; /// Maps XF IDs to XF indexes. + ScfUInt16Vec maStyleIndexes; /// Maps XF IDs to OOXML Style indexes + ScfUInt16Vec maCellIndexes; /// Maps XF IDs to OOXML Cell indexes + XclExpXFList maSortedXFList; /// List of XF records in XF index order. + XclExpBorderList maBorders; /// List of borders used by XF records + XclExpFillList maFills; /// List of fills used by XF records + +}; + +// ============================================================================ + +class XclExpXmlStyleSheet : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpXmlStyleSheet( const XclExpRoot& rRoot ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xetable.hxx b/sc/source/filter/inc/xetable.hxx new file mode 100644 index 000000000000..723f9dde09e0 --- /dev/null +++ b/sc/source/filter/inc/xetable.hxx @@ -0,0 +1,1089 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XETABLE_HXX +#define SC_XETABLE_HXX + +#include "xltable.hxx" + +#include <deque> +#include <tools/mempool.hxx> +#include "xladdress.hxx" +#include "xerecord.hxx" +#include "xestring.hxx" +#include "xeformula.hxx" +#include "xestyle.hxx" + +/* ============================================================================ +Export of cell tables including row and column description. +- Managing all used and formatted cells in a sheet. +- Row and column properties, i.e. width/height, visibility. +- Find default row formatting and default column formatting. +- Merged cell ranges. +============================================================================ */ + +// ============================================================================ +// Helper records for cell records +// ============================================================================ + +/** Represents a STRING record that contains the result of a string formula. */ +class XclExpStringRec : public XclExpRecord +{ +public: + explicit XclExpStringRec( const XclExpRoot& rRoot, const String& rResult ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclExpStringRef mxResult; +}; + +// Additional records for special formula ranges ============================== + +/** Base record for additional range formula records (i.e. ARRAY, SHRFMLA). */ +class XclExpRangeFmlaBase : public XclExpRecord +{ +public: + /** Returns true, if the passed cell position is equal to own base position. */ + bool IsBasePos( sal_uInt16 nXclCol, sal_uInt16 nXclRow ) const; + + /** Derived classes create the token array for a corresponding FORMULA cell record. */ + virtual XclTokenArrayRef CreateCellTokenArray( const XclExpRoot& rRoot ) const = 0; + /** Derived classes return true, if the own formula contains volatile functions. */ + virtual bool IsVolatile() const = 0; + +protected: + /** Constructs the record with a single cell. */ + explicit XclExpRangeFmlaBase( + sal_uInt16 nRecId, sal_uInt32 nRecSize, const ScAddress& rScPos ); + /** Constructs the record with a cell range. */ + explicit XclExpRangeFmlaBase( + sal_uInt16 nRecId, sal_uInt32 nRecSize, const ScRange& rScRange ); + + /** Extends the cell range to include the passed cell address. */ + void Extend( const ScAddress& rScPos ); + + /** Writes the range address covered by this record. */ + void WriteRangeAddress( XclExpStream& rStrm ) const; + +protected: + XclRange maXclRange; /// Range described by this record. + XclAddress maBaseXclPos; /// Address of base cell (first FORMULA record). +}; + +typedef ScfRef< XclExpRangeFmlaBase > XclExpRangeFmlaRef; + +// Array formulas ============================================================= + +class ScTokenArray; + +/** Represents an ARRAY record that contains the token array of a matrix formula. + + An ARRAY record is stored following the first FORMULA record that is part + of a matrix formula. All FORMULA records of a matrix formula contain a + reference to the ARRAY record, while the ARRAY record contains the formula + token array used by all formulas. + */ +class XclExpArray : public XclExpRangeFmlaBase +{ +public: + explicit XclExpArray( XclTokenArrayRef xTokArr, const ScRange& rScRange ); + + /** Creates and returns the token array for a corresponding FORMULA cell record. */ + virtual XclTokenArrayRef CreateCellTokenArray( const XclExpRoot& rRoot ) const; + /** Returns true, if the array formula contains volatile functions. */ + virtual bool IsVolatile() const; + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclTokenArrayRef mxTokArr; /// The token array of a matrix formula. +}; + +typedef ScfRef< XclExpArray > XclExpArrayRef; + +// ---------------------------------------------------------------------------- + +/** Caches all ARRAY records. */ +class XclExpArrayBuffer : protected XclExpRoot +{ +public: + explicit XclExpArrayBuffer( const XclExpRoot& rRoot ); + + /** Inserts a new ARRAY record into the buffer and returns it. */ + XclExpArrayRef CreateArray( const ScTokenArray& rScTokArr, const ScRange& rScRange ); + /** Tries to find an ARRAY record that corresponds to an ocMatRef token. */ + XclExpArrayRef FindArray( const ScTokenArray& rScTokArr ) const; + +private: + typedef ::std::map< ScAddress, XclExpArrayRef > XclExpArrayMap; + XclExpArrayMap maRecMap; /// Map containing the ARRAY records. +}; + +// Shared formulas ============================================================ + +/** Represents a SHRFMLA record that contains the token array of a shared formula. + + A SHRFMLA record is stored following the first FORMULA record that is part + of a shared formula. All FORMULA records of a shared formula contain a + reference to the SHRFMLA record, while the SHRFMLA record contains the + formula token array used by all formulas. + */ +class XclExpShrfmla : public XclExpRangeFmlaBase +{ +public: + /** Creates a SHRFMLA record that consists of the passed cell address only. */ + explicit XclExpShrfmla( XclTokenArrayRef xTokArr, const ScAddress& rScPos ); + + /** Extends the cell range to include the passed cell address. */ + void ExtendRange( const ScAddress& rScPos ); + + /** Creates and returns the token array for a corresponding FORMULA cell record. */ + virtual XclTokenArrayRef CreateCellTokenArray( const XclExpRoot& rRoot ) const; + /** Returns true, if the shared formula contains volatile functions. */ + virtual bool IsVolatile() const; + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclTokenArrayRef mxTokArr; /// The token array of a shared formula. + sal_uInt8 mnUsedCount; /// Number of FORMULA records referring to this record. +}; + +typedef ScfRef< XclExpShrfmla > XclExpShrfmlaRef; + +// ---------------------------------------------------------------------------- + +/** Caches all SHRFMLA records and provides functions to update their ranges. */ +class XclExpShrfmlaBuffer : protected XclExpRoot +{ +public: + explicit XclExpShrfmlaBuffer( const XclExpRoot& rRoot ); + + /** Tries to create a new or to update an existing SHRFMLA record. + @return An empty reference, if the passed token array does not contain + a shared formula. If the token array is a shared formula, this + function updates its cell range to include the passed cell position, + if there is a SHRFMLA record for the passed token array; otherwise + this function creates and returns a new SHRFMLA record. */ + XclExpShrfmlaRef CreateOrExtendShrfmla( + const ScTokenArray& rScTokArr, const ScAddress& rScPos ); + +private: + typedef ::std::map< const ScTokenArray*, XclExpShrfmlaRef > XclExpShrfmlaMap; + XclExpShrfmlaMap maRecMap; /// Map containing the SHRFMLA records. +}; + +// Multiple operations ======================================================== + +struct XclMultipleOpRefs; + +/** Represents a TABLEOP record for a multiple operations range. */ +class XclExpTableop : public XclExpRangeFmlaBase +{ +public: + explicit XclExpTableop( const ScAddress& rScPos, + const XclMultipleOpRefs& rRefs, sal_uInt8 nScMode ); + + /** Returns true, if the cell range has been extended to the passed position. + @descr All references passed in rRefs must fit the ranges passed in the constructor. */ + bool TryExtend( const ScAddress& rScPos, const XclMultipleOpRefs& rRefs ); + + /** Finalizes the record. Tests on valid cell range and reference addresses. */ + void Finalize(); + + /** Creates and returns the token array for a corresponding FORMULA cell record. */ + virtual XclTokenArrayRef CreateCellTokenArray( const XclExpRoot& rRoot ) const; + /** Returns true, if the multiple operations range is volatile. */ + virtual bool IsVolatile() const; + /** Writes the record if it is valid. */ + virtual void Save( XclExpStream& rStrm ); + +private: + /** Returns true, if the passed cell position can be appended to this record. */ + bool IsAppendable( sal_uInt16 nXclCol, sal_uInt16 nXclRow ) const; + + /** Writes the contents of the TABLEOP record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + SCTAB mnScTab; /// Sheet index of this record. + sal_uInt16 mnLastAppXclCol;/// Column index of last appended cell. + sal_uInt16 mnColInpXclCol; /// Column index of column input cell. + sal_uInt16 mnColInpXclRow; /// Row index of column input cell. + sal_uInt16 mnRowInpXclCol; /// Column index of row input cell. + sal_uInt16 mnRowInpXclRow; /// Row index of row input cell. + sal_uInt8 mnScMode; /// Type of the multiple operation (Calc constant). + bool mbValid; /// true = Contains valid references. +}; + +typedef ScfRef< XclExpTableop > XclExpTableopRef; + +// ---------------------------------------------------------------------------- + +/** Contains all created TABLEOP records and supports creating or updating them. */ +class XclExpTableopBuffer : protected XclExpRoot +{ +public: + explicit XclExpTableopBuffer( const XclExpRoot& rRoot ); + + /** Tries to update an existing or to create a new TABLEOP record. + @return Reference to the TABLEOP record for this cell (existing or new), + or an empty reference, if rScTokArr does not contain a multiple + operations formula. */ + XclExpTableopRef CreateOrExtendTableop( + const ScTokenArray& rScTokArr, const ScAddress& rScPos ); + + /** Finalizes all contained TABLEOP records. */ + void Finalize(); + +private: + /** Tries to create a new TABLEOP record, if rRefs contains valid references. */ + XclExpTableopRef TryCreate( const ScAddress& rScPos, const XclMultipleOpRefs& rRefs ); + +private: + typedef XclExpRecordList< XclExpTableop > XclExpTableopList; + XclExpTableopList maTableopList; /// List of all TABLEOP records. +}; + +// ============================================================================ +// Cell records +// ============================================================================ + +/** The base class of all cell records. */ +class XclExpCellBase : public XclExpRecord +{ +public: + /** Returns the (first) address of the cell(s). */ + inline const XclAddress& GetXclPos() const { return maXclPos; } + /** Returns the (first) Excel column index of the cell(s). */ + inline sal_uInt16 GetXclCol() const { return maXclPos.mnCol; } + /** Returns the Excel row index of the cell. */ + inline sal_uInt16 GetXclRow() const { return maXclPos.mnRow; } + + /** Derived classes return the column index of the last contained cell. */ + virtual sal_uInt16 GetLastXclCol() const = 0; + /** Derived classes return the XF identifier of the first contained cell. */ + virtual sal_uInt32 GetFirstXFId() const = 0; + /** Derived classes return true, if this record does not contain at least one valid cell. */ + virtual bool IsEmpty() const = 0; + /** Derived classes return whether the cell contains multi-line text. */ + virtual bool IsMultiLineText() const; + + /** Derived classes try to merge the contents of the passed cell to own data. */ + virtual bool TryMerge( const XclExpCellBase& rCell ); + /** Derived classes convert the XF identifier(s) into the Excel XF index(es). + @param rXFIndexes The converted XF index(es) are inserted here. */ + virtual void ConvertXFIndexes( const XclExpRoot& rRoot ) = 0; + /** Derived classes for blank cells insert the Excel XF index(es) into the passed vector. */ + virtual void GetBlankXFIndexes( ScfUInt16Vec& rXFIndexes ) const; + /** Derived classes for blank cells remove unused Excel XF index(es). */ + virtual void RemoveUnusedBlankCells( const ScfUInt16Vec& rXFIndexes ); + +protected: + explicit XclExpCellBase( + sal_uInt16 nRecId, sal_Size nContSize, const XclAddress& rXclPos ); + + /** Sets this record to a new column position. */ + inline void SetXclCol( sal_uInt16 nXclCol ) { maXclPos.mnCol = nXclCol; } + /** Sets this record to a new row position. */ + inline void SetXclRow( sal_uInt16 nXclRow ) { maXclPos.mnRow = nXclRow; } + +private: + XclAddress maXclPos; /// Address of the cell. +}; + +typedef ScfRef< XclExpCellBase > XclExpCellRef; + +// Single cell records ======================================================== + +/** Base class for all cell records not supporting multiple contents. */ +class XclExpSingleCellBase : public XclExpCellBase +{ +public: + /** Returns the last column, which is equal to the first column for single cells. */ + virtual sal_uInt16 GetLastXclCol() const; + /** Return the XF identifier of the cell. */ + virtual sal_uInt32 GetFirstXFId() const; + /** Returns true, if this record does not contain at least one valid cell. */ + virtual bool IsEmpty() const; + /** Converts the XF identifier into the Excel XF index. */ + virtual void ConvertXFIndexes( const XclExpRoot& rRoot ); + /** Writes cell address, XF index, and calls WriteContents() for each cell. */ + virtual void Save( XclExpStream& rStrm ); + +protected: + explicit XclExpSingleCellBase( sal_uInt16 nRecId, sal_Size nContSize, + const XclAddress& rXclPos, sal_uInt32 nXFId ); + + explicit XclExpSingleCellBase( const XclExpRoot& rRoot, + sal_uInt16 nRecId, sal_Size nContSize, const XclAddress& rXclPos, + const ScPatternAttr* pPattern, sal_Int16 nScript, sal_uInt32 nForcedXFId ); + + inline void SetContSize( sal_Size nContSize ) { mnContSize = nContSize; } + inline sal_Size GetContSize() const { return mnContSize; } + + inline void SetXFId( sal_uInt32 nXFId ) { maXFId.mnXFId = nXFId; } + inline sal_uInt32 GetXFId() const { return maXFId.mnXFId; } + +private: + /** Writes cell address, XF index, and calls WriteContents() for each cell. */ + virtual void WriteBody( XclExpStream& rStrm ); + /** Derived classes write the contents of the specified cell (without XF index). */ + virtual void WriteContents( XclExpStream& rStrm ) = 0; + +private: + XclExpXFId maXFId; /// The XF identifier of the cell formatting. + sal_Size mnContSize; /// The size of the cell contents. +}; + +// ---------------------------------------------------------------------------- + +/** Represents a NUMBER record that describes a cell with a double value. */ +class XclExpNumberCell : public XclExpSingleCellBase +{ + DECL_FIXEDMEMPOOL_NEWDEL( XclExpNumberCell ) + +public: + explicit XclExpNumberCell( const XclExpRoot& rRoot, const XclAddress& rXclPos, + const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId, + double fValue ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + virtual void WriteContents( XclExpStream& rStrm ); + +private: + double mfValue; /// The cell value. +}; + +// ---------------------------------------------------------------------------- + +/** Represents a BOOLERR record that describes a cell with a Boolean value. */ +class XclExpBooleanCell : public XclExpSingleCellBase +{ + DECL_FIXEDMEMPOOL_NEWDEL( XclExpBooleanCell ) + +public: + explicit XclExpBooleanCell( const XclExpRoot rRoot, const XclAddress& rXclPos, + const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId, + bool bValue ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + virtual void WriteContents( XclExpStream& rStrm ); + +private: + bool mbValue; /// The cell value. +}; + +// ---------------------------------------------------------------------------- + +//UNUSED2009-05 /** Represents a BOOLERR record that describes a cell with an error code. */ +//UNUSED2009-05 class XclExpErrorCell : public XclExpSingleCellBase +//UNUSED2009-05 { +//UNUSED2009-05 DECL_FIXEDMEMPOOL_NEWDEL( XclExpErrorCell ) +//UNUSED2009-05 +//UNUSED2009-05 public: +//UNUSED2009-05 explicit XclExpErrorCell( const XclExpRoot rRoot, const XclAddress& rXclPos, +//UNUSED2009-05 const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId, +//UNUSED2009-05 sal_uInt8 nErrCode ); +//UNUSED2009-05 +//UNUSED2009-05 virtual void SaveXml( XclExpXmlStream& rStrm ); +//UNUSED2009-05 private: +//UNUSED2009-05 virtual void WriteContents( XclExpStream& rStrm ); +//UNUSED2009-05 +//UNUSED2009-05 private: +//UNUSED2009-05 sal_uInt8 mnErrCode; /// The error code. +//UNUSED2009-05 }; + +// ---------------------------------------------------------------------------- + +class ScStringCell; +class ScEditCell; +class XclExpHyperlinkHelper; + +/** Represents a text cell record. + + May contain a BIFF2-BIFF7 LABEL record for a simple string, or a BIFF2-BIFF7 + RSTRING record for a formatted string, or a BIFF8 LABELSST string for any + string (simply stores a reference to the Shared String Table). + */ +class XclExpLabelCell : public XclExpSingleCellBase +{ + DECL_FIXEDMEMPOOL_NEWDEL( XclExpLabelCell ) + +public: + /** Constructs the record from an unformatted Calc string cell. */ + explicit XclExpLabelCell( const XclExpRoot& rRoot, const XclAddress& rXclPos, + const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId, + const ScStringCell& rCell ); + + /** Constructs the record from a formatted Calc edit cell. */ + explicit XclExpLabelCell( const XclExpRoot& rRoot, const XclAddress& rXclPos, + const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId, + const ScEditCell& rCell, XclExpHyperlinkHelper& rHlinkHelper ); + + /** Returns true if the cell contains multi-line text. */ + virtual bool IsMultiLineText() const; + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + /** Initializes the record contents. Called from constructors. */ + void Init( const XclExpRoot& rRoot, + const ScPatternAttr* pPattern, XclExpStringRef xText ); + + virtual void WriteContents( XclExpStream& rStrm ); + +private: + XclExpStringRef mxText; /// The cell text. + sal_uInt32 mnSstIndex; /// Index into Shared String Table (only used for BIFF8). + bool mbLineBreak; /// True = cell has automatic linebreaks enabled. +}; + +// ---------------------------------------------------------------------------- + +class ScFormulaCell; + +/** Represents a FORMULA record that describes a cell with a formula. */ +class XclExpFormulaCell : public XclExpSingleCellBase +{ + DECL_FIXEDMEMPOOL_NEWDEL( XclExpFormulaCell ) + +public: + explicit XclExpFormulaCell( const XclExpRoot& rRoot, const XclAddress& rXclPos, + const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId, + const ScFormulaCell& rScFmlaCell, + XclExpArrayBuffer& rArrayBfr, + XclExpShrfmlaBuffer& rShrfmlaBfr, + XclExpTableopBuffer& rTableopBfr ); + + /** Writes the FORMULA record and additional records related to the formula. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + virtual void WriteContents( XclExpStream& rStrm ); + +private: + ScFormulaCell& mrScFmlaCell; /// The Calc formula cell. + XclTokenArrayRef mxTokArr; /// The token array of the formula. + XclExpRangeFmlaRef mxAddRec; /// Additional record for matrix/shared formulas. + XclExpRecordRef mxStringRec; /// STRING record for string result. +}; + +// Multiple cell records ====================================================== + +struct XclExpMultiXFId : public XclExpXFId +{ + sal_uInt16 mnCount; /// Number of XF identifiers. + + inline explicit XclExpMultiXFId( sal_uInt32 nXFId, sal_uInt16 nCount = 1 ) : + XclExpXFId( nXFId ), mnCount( nCount ) {} +}; + +// ---------------------------------------------------------------------------- + +/** Base class for all cell records supporting multiple contents. */ +class XclExpMultiCellBase : public XclExpCellBase +{ +public: + /** Returns the column index of the last cell this record describes. */ + virtual sal_uInt16 GetLastXclCol() const; + /** Return the XF identifier of the first contained cell. */ + virtual sal_uInt32 GetFirstXFId() const; + /** Returns true, if this record does not contain at least one valid cell. */ + virtual bool IsEmpty() const; + + /** Convert all XF identifiers into the Excel XF indexes. */ + virtual void ConvertXFIndexes( const XclExpRoot& rRoot ); + /** Writes the record, calls WriteContents() for each contained cell. + @descr May write several records, if unused XF indexes are contained. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +protected: + explicit XclExpMultiCellBase( sal_uInt16 nRecId, sal_uInt16 nMulRecId, + sal_Size nContSize, const XclAddress& rXclPos ); + + /** Sets the size of the remaining contents of one cell (without the XF index). */ + inline void SetContSize( sal_Size nContSize ) { mnContSize = nContSize; } + /** Returns the size of the remaining contents of one cell (without the XF index). */ + inline sal_Size GetContSize() const { return mnContSize; } + + /** Returns the number of cells this record represents. */ + sal_uInt16 GetCellCount() const; + + /** Appends the passed XF identifier nCount times to the list of XF identifiers. */ + void AppendXFId( const XclExpMultiXFId& rXFId ); + /** Appends the passed cell format nCount times to the list of XF identifiers. */ + void AppendXFId( const XclExpRoot& rRoot, + const ScPatternAttr* pPattern, sal_uInt16 nScript, + sal_uInt32 nForcedXFId, sal_uInt16 nCount = 1 ); + + /** Tries to merge the XF ID list of the passed cell with the own list. */ + bool TryMergeXFIds( const XclExpMultiCellBase& rCell ); + /** Inserts the Excel XF index(es) into the passed vector. */ + void GetXFIndexes( ScfUInt16Vec& rXFIndexes ) const; + + /** Removes unused Excel XF index(es). + @param rXFIndexes Specifies which XF indexes are used. */ + void RemoveUnusedXFIndexes( const ScfUInt16Vec& rXFIndexes ); + +private: + /** Derived classes write the remaining contents of the specified cell (without XF index). + @param nRelCol Relative column index (starts with 0 for first cell of this record). */ + virtual void WriteContents( XclExpStream& rStrm, sal_uInt16 nRelCol ) = 0; + virtual void WriteXmlContents( XclExpXmlStream& rStrm, const XclAddress& rAddress, sal_uInt32 nXFId, sal_uInt16 nRelCol ) = 0; + +private: + typedef ::std::deque< XclExpMultiXFId > XclExpMultiXFIdDeq; + + sal_uInt16 mnMulRecId; /// Record ID for multiple record variant. + sal_Size mnContSize; /// Data size of contents for one cell + XclExpMultiXFIdDeq maXFIds; /// The XF identifiers of the cell formatting. +}; + +// ---------------------------------------------------------------------------- + +/** Represents a BLANK or MULBLANK record that describes empty but formatted cells. */ +class XclExpBlankCell : public XclExpMultiCellBase +{ + DECL_FIXEDMEMPOOL_NEWDEL( XclExpBlankCell ) + +public: + explicit XclExpBlankCell( const XclAddress& rXclPos, const XclExpMultiXFId& rXFId ); + + explicit XclExpBlankCell( const XclExpRoot& rRoot, + const XclAddress& rXclPos, sal_uInt16 nLastXclCol, + const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId ); + + /** Tries to merge the contents of the passed cell to own data. */ + virtual bool TryMerge( const XclExpCellBase& rCell ); + /** Inserts the Excel XF index(es) into the passed vector. */ + virtual void GetBlankXFIndexes( ScfUInt16Vec& rXFIndexes ) const; + /** Tries to remove unused Excel XF index(es). */ + virtual void RemoveUnusedBlankCells( const ScfUInt16Vec& rXFIndexes ); + +private: + /** Writes the remaining contents of the specified cell (without XF index). */ + virtual void WriteContents( XclExpStream& rStrm, sal_uInt16 nRelCol ); + virtual void WriteXmlContents( XclExpXmlStream& rStrm, const XclAddress& rAddress, sal_uInt32 nXFId, sal_uInt16 nRelCol ); +}; + +// ---------------------------------------------------------------------------- + +/** Represents an RK or MULRK record that describes cells with a compressed double values. */ +class XclExpRkCell : public XclExpMultiCellBase +{ + DECL_FIXEDMEMPOOL_NEWDEL( XclExpRkCell ) + +public: + explicit XclExpRkCell( const XclExpRoot& rRoot, const XclAddress& rXclPos, + const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId, + sal_Int32 nRkValue ); + + /** Tries to merge the contents of the passed cell to own data. */ + virtual bool TryMerge( const XclExpCellBase& rCell ); + +private: + /** Writes the remaining contents of the specified cell (without XF index). */ + virtual void WriteContents( XclExpStream& rStrm, sal_uInt16 nRelCol ); + virtual void WriteXmlContents( XclExpXmlStream& rStrm, const XclAddress& rAddress, sal_uInt32 nXFId, sal_uInt16 nRelCol ); + +private: + ScfInt32Vec maRkValues; /// The cell values. +}; + +// ============================================================================ +// Rows and Columns +// ============================================================================ + +class ScOutlineArray; + +/** Base class for buffers containing row or column outline data. */ +class XclExpOutlineBuffer +{ +public: + /** Returns true, if a collapsed group ends at the last processed position. */ + inline bool IsCollapsed() const { return mbCurrCollapse; } + /** Returns the highest level of an open group at the last processed position. */ + inline sal_uInt8 GetLevel() const { return ::std::min( mnCurrLevel, EXC_OUTLINE_MAX ); } + +protected: + /** Constructs the outline buffer. + @param bRows true = Process row ouline array; false = Process column outline array. */ + explicit XclExpOutlineBuffer( const XclExpRoot& rRoot, bool bRows ); + + /** Updates the current state by processing the settings at the passed Calc position. */ + void UpdateColRow( SCCOLROW nScPos ); + +private: + /** Data about an outline level. */ + struct XclExpLevelInfo + { + SCCOLROW mnScEndPos; /// The end position of a group in a level. + bool mbHidden; /// true = Group in this level is hidden. + inline explicit XclExpLevelInfo() : mnScEndPos( 0 ), mbHidden( false ) {} + }; + typedef ::std::vector< XclExpLevelInfo > XclExpLevelInfoVec; + + const ScOutlineArray* mpScOLArray; /// Pointer to Calc outline array. + XclExpLevelInfoVec maLevelInfos; /// Info for current row and all levels. + sal_uInt8 mnCurrLevel; /// Highest level of an open group for current position. + bool mbCurrCollapse; /// true = Collapsed group ends at current position. +}; + +// ---------------------------------------------------------------------------- + +/** The outline buffer for column outlines. */ +class XclExpColOutlineBuffer : public XclExpOutlineBuffer +{ +public: + inline explicit XclExpColOutlineBuffer( const XclExpRoot& rRoot ) : + XclExpOutlineBuffer( rRoot, false ) {} + + /** Updates the current state by processing the settings of the passed Calc column. */ + inline void Update( SCCOL nScCol ) + { UpdateColRow( static_cast< SCCOLROW >( nScCol ) ); } +}; + +// ---------------------------------------------------------------------------- + +/** The outline buffer for row outlines. */ +class XclExpRowOutlineBuffer : public XclExpOutlineBuffer +{ +public: + inline explicit XclExpRowOutlineBuffer( const XclExpRoot& rRoot ) : + XclExpOutlineBuffer( rRoot, true ) {} + + /** Updates the current state by processing the settings of the passed Calc row. */ + inline void Update( SCROW nScRow ) + { UpdateColRow( static_cast< SCCOLROW >( nScRow ) ); } +}; + +// ---------------------------------------------------------------------------- + +/** Represents a GUTS record containing the level count of row and column outlines. */ +class XclExpGuts : public XclExpRecord +{ +public: + explicit XclExpGuts( const XclExpRoot& rRoot ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +private: + sal_uInt16 mnColLevels; /// Number of visible column outline levels. + sal_uInt16 mnColWidth; /// Width of column outline area (pixels). + sal_uInt16 mnRowLevels; /// Number of visible row outline levels. + sal_uInt16 mnRowWidth; /// Width of row outline area (pixels). +}; + +// ---------------------------------------------------------------------------- + +/** Represents a DIMENSIONS record containing the used area of a sheet. */ +class XclExpDimensions : public XclExpRecord +{ +public: + explicit XclExpDimensions( const XclExpRoot& rRoot ); + + /** Sets the used area to the record. */ + void SetDimensions( + sal_uInt16 nFirstUsedXclCol, sal_uInt32 nFirstUsedXclRow, + sal_uInt16 nFirstFreeXclCol, sal_uInt32 nFirstFreeXclRow ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + /** Writes the contents of the DIMENSIONS record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + sal_uInt32 mnFirstUsedXclRow; /// First used row. + sal_uInt32 mnFirstFreeXclRow; /// First unused row after used area. + sal_uInt16 mnFirstUsedXclCol; /// First used column. + sal_uInt16 mnFirstFreeXclCol; /// First free column after used area. +}; + +// ============================================================================ + +/** Represents the DEFCOLWIDTH record containing the default column width of a sheet. + + Excel stores the default column width in entire character widths of the '0' + character using the application default font (i.e. the default width is 10, + if the '0' character fits 10 times into a cell in a column with default + width. + + The IsDefWidth() function returns true, if the passed width (measured in + 1/256 of the width of the '0' character) could be converted exactly to the + default width. If the passed width is rounded up or down to get the default + width, the function returns false. + */ +class XclExpDefcolwidth : public XclExpUInt16Record, protected XclExpRoot +{ +public: + explicit XclExpDefcolwidth( const XclExpRoot& rRoot ); + + /** Returns true, if the own default width exactly matches the passed width. */ + bool IsDefWidth( sal_uInt16 nXclColWidth ) const; + + /** Sets the passed column width (in 1/256 character width) as default width. */ + void SetDefWidth( sal_uInt16 nXclColWidth ); +}; + +// ---------------------------------------------------------------------------- + +/** Contains the column settings for a range of columns. + + After construction the record contains a temporary XF identifier returned + from the XF buffer. After creating the entire Excel document in memory, the + ConvertXFIndexes() function converts it into the real Excel XF index. + */ +class XclExpColinfo : public XclExpRecord, protected XclExpRoot +{ +public: + /** Constructs the record with the settings in the Calc document. */ + explicit XclExpColinfo( const XclExpRoot& rRoot, + SCCOL nScCol, SCROW nLastScRow, + XclExpColOutlineBuffer& rOutlineBfr ); + + /** Converts the XF identifier into the Excel XF index, returns the latter. */ + sal_uInt16 ConvertXFIndexes(); + + /** Tries to merge this record with the passed record. + @descr Possible, if passed record directly follows this record and has equal contents. + @return true = This record is equal to passed record and has been updated. */ + bool TryMerge( const XclExpColinfo& rColInfo ); + + /** Returns the Excel width of the column(s). */ + inline sal_uInt16 GetColWidth() const { return mnWidth; } + /** Returns the final Excel XF index of the column(s). */ + inline sal_uInt16 GetXFIndex() const { return maXFId.mnXFIndex; } + /** Returns the number of columns represented by this record. */ + inline sal_uInt16 GetColCount() const { return mnLastXclCol - mnFirstXclCol + 1; } + + /** Returns true, if the column has default format and width. */ + bool IsDefault( const XclExpDefcolwidth& rDefColWidth ) const; + + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the contents of this COLINFO record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclExpXFId maXFId; /// The XF identifier for column default format. + sal_uInt16 mnWidth; /// Excel width of the column. + sal_uInt16 mnFlags; /// Additional column flags. + sal_uInt16 mnFirstXclCol; /// Index to first column. + sal_uInt16 mnLastXclCol; /// Index to last column. +}; + +// ---------------------------------------------------------------------------- + +/** Contains COLINFO records for all columns of a Calc sheet. + + On construction one COLINFO record per column is created. After creating + the entire Excel document in memory, the ConvertXFIndexes() function converts + all temporary XF identifiers into real Excel XF indexes and merges all equal + COLINFO records together. + */ +class XclExpColinfoBuffer : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpColinfoBuffer( const XclExpRoot& rRoot ); + + /** Initializes the buffer: finds settings and formatting of all columns. + @param nLastScRow Last row used to find default formatting. */ + void Initialize( SCROW nLastScRow ); + /** Converts the XF identifiers into the Excel XF indexes and merges equal columns. + @param rXFIndexes Returns the final XF indexes of all columns. */ + void Finalize( ScfUInt16Vec& rXFIndexes ); + + /** Writes all COLINFO records of this buffer. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpColinfo > XclExpColinfoList; + typedef XclExpColinfoList::RecordRefType XclExpColinfoRef; + + XclExpColinfoList maColInfos; /// List of COLINFO records. + XclExpDefcolwidth maDefcolwidth; /// The DEFCOLWIDTH record. + XclExpColOutlineBuffer maOutlineBfr; /// Buffer for column outline groups. +}; + +// ============================================================================ + +class XclExpRow; + +/** Contains all possible default row settings. */ +struct XclExpDefaultRowData +{ + sal_uInt16 mnFlags; /// Default flags for unspecified rows. + sal_uInt16 mnHeight; /// Default height for unspecified rows. + + explicit XclExpDefaultRowData(); + explicit XclExpDefaultRowData( const XclExpRow& rRow ); + + /** Returns true, if rows are hidden by default. */ + inline bool IsHidden() const { return ::get_flag( mnFlags, EXC_DEFROW_HIDDEN ); } + /** Returns true, if the rows have a manually set height by default. */ + inline bool IsUnsynced() const { return ::get_flag( mnFlags, EXC_DEFROW_UNSYNCED ); } +}; + +// ---------------------------------------------------------------------------- + +/** Represents a DEFROWHEIGHT record containing default format for unused rows. */ +class XclExpDefrowheight : public XclExpRecord +{ +public: + explicit XclExpDefrowheight(); + + /** Sets the passed default data as current record contents. */ + void SetDefaultData( const XclExpDefaultRowData& rDefData ); + +private: + /** Writes the contents of the record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclExpDefaultRowData maDefData; /// Record data. +}; + +// ---------------------------------------------------------------------------- + +/** Represents a ROW record and additionally contains all cells records of a row. + + This class contains all cell records of a row in a spreadsheet. There are 2 + cell records in Excel that support storing a range of cells in one record + (MULBLANK for multiple blank cells, and MULRK for multiple RK values). The + insertion functions try to merge a new inserted cell with existing + neighbors, if this is supported by the current type of cell record. + + The Finalize() function converts the XF identifiers of all cell records to + the final Excel XF indexes. Then a default + */ +class XclExpRow : public XclExpRecord, protected XclExpRoot +{ +public: + /** Constructs the ROW record and converts the Calc row settings. + @param bAlwaysEmpty true = This row will not be filled with blank cells + in the Finalize() function. */ + explicit XclExpRow( const XclExpRoot& rRoot, sal_uInt16 nXclRow, + XclExpRowOutlineBuffer& rOutlineBfr, bool bAlwaysEmpty ); + + /** Returns the excel row index of this ROW record. */ + inline sal_uInt16 GetXclRow() const { return mnXclRow; } + /** Returns the height of the row in twips. */ + inline sal_uInt16 GetHeight() const { return mnHeight; } + /** Returns true, if this row does not contain at least one valid cell. */ + inline bool IsEmpty() const { return maCellList.IsEmpty(); } + /** Returns true, if this row is hidden. */ + inline bool IsHidden() const { return ::get_flag( mnFlags, EXC_ROW_HIDDEN ); } + /** Returns true, if this row contains a manually set height. */ + inline bool IsUnsynced() const { return ::get_flag( mnFlags, EXC_ROW_UNSYNCED ); } + /** Returns true, if this row is enabled (will be exported). */ + inline bool IsEnabled() const { return mbEnabled; } + + /** Appends the passed cell object to this row. */ + void AppendCell( XclExpCellRef xCell, bool bIsMergedBase ); + + /** Converts all XF identifiers into the Excel XF indexes. */ + void Finalize( const ScfUInt16Vec& rColXFIndexes ); + + /** Returns the column index of the first used cell in this row. + @descr This function can only be called after Finalize(). */ + sal_uInt16 GetFirstUsedXclCol() const; + /** Returns the column index of the first unused cell following all used cells in this row. + @descr This function can only be called after Finalize(). */ + sal_uInt16 GetFirstFreeXclCol() const; + + /** Returns true, if this row may be omitted by using the DEFROWHEIGHT record. + @descr A row may be omitted, if it does not contain any cell or + explicit default cell formatting, and is not part of an outline. + This function can only be called after Finalize(). */ + bool IsDefaultable() const; + /** Disables this row, if it is defaultable and has the passed default format. + @descr Disabled rows will not be saved. + This function can only be called after Finalize(). */ + void DisableIfDefault( const XclExpDefaultRowData& rDefRowData ); + + /** Writes all cell records of this row. */ + void WriteCellList( XclExpStream& rStrm ); + + /** Writes the ROW record if the row is not disabled (see DisableIfDefault() function). */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Initializes the record data. Called from constructors. */ + void Init( sal_uInt16 nXclRow, XclExpRowOutlineBuffer* pOutlineBfr ); + /** Inserts a cell at the specified list position, tries to merge with neighbors. */ + void InsertCell( XclExpCellRef xCell, size_t nPos, bool bIsMergedBase ); + + /** Writes the contents of the ROW record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpCellBase > XclExpCellList; + + XclExpCellList maCellList; /// List of cell records for this row. + sal_uInt16 mnXclRow; /// Excel row index of this row. + sal_uInt16 mnHeight; /// Row height in twips. + sal_uInt16 mnFlags; /// Flags for the ROW record. + sal_uInt16 mnXFIndex; /// Default row formatting. + sal_uInt16 mnOutlineLevel; /// Outline Level (for OOXML) + bool mbAlwaysEmpty; /// true = Do not add blank cells in Finalize(). + bool mbEnabled; /// true = Write this ROW record. +}; + +// ---------------------------------------------------------------------------- + +/** Collects all rows which contain all cells of a sheet. + + This row buffer automatically creates ROW records when cells are inserted + with the AppendCell() function. It is possible to force creation of more + ROW records with the CreateRows() function. In both cases, all preceding + missing ROW records are inserted too. + */ +class XclExpRowBuffer : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpRowBuffer( const XclExpRoot& rRoot ); + + /** Appends the passed cell object to the row that the cell specifies. */ + void AppendCell( XclExpCellRef xCell, bool bIsMergedBase ); + /** Forces insertion of all ROW records before the passed row. */ + void CreateRows( SCROW nFirstFreeScRow ); + + /** Converts all XF identifiers into the Excel XF indexes and calculates default formats. + @param rDefRowData (out-param) The default row format is returned here. + @param rColXFIndexes The column default XF indexes. */ + void Finalize( XclExpDefaultRowData& rDefRowData, const ScfUInt16Vec& rColXFIndexes ); + + /** Writes the DIMENSIONS record, all ROW records and all cell records. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + + XclExpDimensions* GetDimensions(); + +private: + /** Returns access to the specified ROW record. Inserts preceding missing ROW records. + @param bRowAlwaysEmpty true = Created rows will not be filled with blank cells + in the XclExpRow::Finalize() function. */ + XclExpRow& GetOrCreateRow( sal_uInt16 nXclRow, bool bRowAlwaysEmpty ); + +private: + typedef XclExpRecordList< XclExpRow > XclExpRowList; + typedef XclExpRowList::RecordRefType XclExpRowRef; + + XclExpRowList maRowList; /// List of all ROW records. + XclExpRowOutlineBuffer maOutlineBfr; /// Buffer for row outline groups. + XclExpDimensions maDimensions; /// DIMENSIONS record for used area. + XclExpRow* mpLastUsedRow; /// Last used row for faster access. + sal_uInt16 mnLastUsedXclRow; /// Last used row for faster access. +}; + +// ============================================================================ +// Cell Table +// ============================================================================ + +class XclExpNote; +class XclExpMergedcells; +class XclExpHyperlink; +class XclExpDval; + +/** This class contains the cell contents and more of an entire sheet. + + The cell table includes the settings and default formatting of all columns, + the settings and default formatting of all used rows, and the contents of + all cells of one sheet in a spreadsheet document. + + The constructor does all the work creating the cell table. It reads the + Calc sheet and converts all columns, rows, and cells to Excel record data. + Additioanlly, hyperlink records, note records, additional records for + formula cells, data validation records, and outline records are created. + + The Finalize() function does even more work. It calculates default column + settings and removes column records that are equal to this default. The + same happens with rows: A default format is calculated for each row, and + all blank cells in this row that have the same format are removed. Then, + the most used row settings are calculated, and all empty rows that have the + same settings are removed too. + + Records that are not stored inside the cell table area in an Excel file + (i.e. DEFROWHEIGHT record, NOTE records, MERGEDCELLS record, HLINK records, + DVAL and DV records for data validation) can be accessed with the function + CreateRecord(). It returns the reference to the respective record (or + record list) which can be inserted into a record list. + */ +class XclExpCellTable : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpCellTable( const XclExpRoot& rRoot ); + + /** Converts all XF identifiers into the Excel XF indexes and calculates default formats. */ + void Finalize(); + + /** Returns the reference to an internal record specified by the passed record id. + @param nRecId The record identifier that specifies which record is + returned. Possible values are: EXC_ID_DEFROWHEIGHT, EXC_ID_NOTE, + EXC_ID_MERGEDCELLS, EXC_ID_HLINK, EXC_ID_DVAL. */ + XclExpRecordRef CreateRecord( sal_uInt16 nRecId ) const; + /** Saves the entire cell table. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + typedef XclExpRecordList< XclExpNote > XclExpNoteList; + typedef XclExpRecordList< XclExpHyperlink > XclExpHyperlinkList; + + typedef ScfRef< XclExpDefrowheight > XclExpDefrowhRef; + typedef ScfRef< XclExpNoteList > XclExpNoteListRef; + typedef ScfRef< XclExpMergedcells > XclExpMergedcellsRef; + typedef ScfRef< XclExpHyperlinkList > XclExpHyperlinkRef; + typedef ScfRef< XclExpDval > XclExpDvalRef; + + XclExpColinfoBuffer maColInfoBfr; /// Buffer for column formatting. + XclExpRowBuffer maRowBfr; /// Rows and cell records. + XclExpArrayBuffer maArrayBfr; /// Buffer for ARRAY records. + XclExpShrfmlaBuffer maShrfmlaBfr; /// Buffer for SHRFMLA records. + XclExpTableopBuffer maTableopBfr; /// Buffer for TABLEOP records. + XclExpDefrowhRef mxDefrowheight; /// DEFROWHEIGHT record for default row format. + XclExpRecordRef mxGuts; /// GUTS record for outline areas. + XclExpNoteListRef mxNoteList; /// List of NOTE records. + XclExpMergedcellsRef mxMergedcells; /// MERGEDCELLS record for merged cell ranges. + XclExpHyperlinkRef mxHyperlinkList; /// List of HLINK records. + XclExpDvalRef mxDval; /// Data validation with DVAL and DV records. +}; + +#endif + diff --git a/sc/source/filter/inc/xeview.hxx b/sc/source/filter/inc/xeview.hxx new file mode 100644 index 000000000000..61e349ab1e86 --- /dev/null +++ b/sc/source/filter/inc/xeview.hxx @@ -0,0 +1,180 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XEVIEW_HXX +#define SC_XEVIEW_HXX + +#include "xerecord.hxx" +#include "xlview.hxx" +#include "xeroot.hxx" + +// Workbook view settings records ============================================= + +/** Represents the WINDOW1 record containing global workbook view settings. */ +class XclExpWindow1 : public XclExpRecord +{ +public: + explicit XclExpWindow1( const XclExpRoot& rRoot ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the contents of the WINDOW1 record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + sal_uInt16 mnFlags; /// Option flags. + sal_uInt16 mnTabBarSize; /// Size of tabbar relative to window width (per mill). +}; + +// Sheet view settings records ================================================ + +/** Represents a WINDOW2 record with general view settings for a sheet. */ +class XclExpWindow2 : public XclExpRecord +{ +public: + explicit XclExpWindow2( const XclExpRoot& rRoot, + const XclTabViewData& rData, sal_uInt32 nGridColorId ); + +private: + /** Writes the contents of the WINDOW2 record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + Color maGridColor; /// Grid color (<=BIFF5). + sal_uInt32 mnGridColorId; /// Color ID of grid color (>=BIFF8). + sal_uInt16 mnFlags; /// Option flags. + XclAddress maFirstXclPos; /// First visible cell. + sal_uInt16 mnNormalZoom; /// Zoom factor for normal view. + sal_uInt16 mnPageZoom; /// Zoom factor for pagebreak preview. +}; + +// ---------------------------------------------------------------------------- + +/** Represents an SCL record for the zoom factor of the current view of a sheet. */ +class XclExpScl : public XclExpRecord +{ +public: + explicit XclExpScl( sal_uInt16 nZoom ); + +private: + /** Tries to shorten numerator and denominator by the passed value. */ + void Shorten( sal_uInt16 nFactor ); + /** Writes the contents of the SCL record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + sal_uInt16 mnNum; /// Numerator of the zoom factor. + sal_uInt16 mnDenom; /// Denominator of the zoom factor. +}; + +// ---------------------------------------------------------------------------- + +/** Represents a PANE record containing settings for split/frozen windows. */ +class XclExpPane : public XclExpRecord +{ +public: + explicit XclExpPane( const XclTabViewData& rData ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Writes the contents of the PANE record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + sal_uInt16 mnSplitX; /// Split X position, or frozen column. + sal_uInt16 mnSplitY; /// Split Y position, or frozen row. + XclAddress maSecondXclPos; /// First visible cell in additional panes. + sal_uInt8 mnActivePane; /// Active pane (with cell cursor). +}; + +// ---------------------------------------------------------------------------- + +/** Represents a SELECTION record with selection data for a pane. */ +class XclExpSelection : public XclExpRecord +{ +public: + explicit XclExpSelection( const XclTabViewData& rData, sal_uInt8 nPane ); + + virtual void SaveXml( XclExpXmlStream& rStrm ); +private: + /** Writes the contents of the SELECTION record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + XclSelectionData maSelData; /// Selection data. + sal_uInt8 mnPane; /// Pane identifier of this selection. +}; + +class XclExpTabBgColor : public XclExpRecord +{ +public: + explicit XclExpTabBgColor( const XclTabViewData& rTabViewData ); + + /* virtual void SaveXml( XclExpXmlStream& rStrm ); TODO Fix XML Saving Stream */ +private: + /** Writes the contents of the SHEETEXT record. */ + virtual void WriteBody( XclExpStream& rStrm ); + +private: + const XclTabViewData& mrTabViewData; /// view settings data of current sheet. +}; + +// View settings ============================================================== + +/** Contains all view settings records for a single sheet. */ +class XclExpTabViewSettings : public XclExpRecordBase, protected XclExpRoot +{ +public: + /** Creates all records containing the view settings of the specified sheet. */ + explicit XclExpTabViewSettings( const XclExpRoot& rRoot, SCTAB nScTab ); + + /** Writes all view settings records to the stream. */ + virtual void Save( XclExpStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ); + +private: + /** Creates selection data for the specified pane. */ + void CreateSelectionData( sal_uInt8 nPane, + const ScAddress& rCursor, const ScRangeList& rSelection ); + + void WriteWindow2( XclExpStream& rStrm ) const; + void WriteScl( XclExpStream& rStrm ) const; + void WritePane( XclExpStream& rStrm ) const; + void WriteSelection( XclExpStream& rStrm, sal_uInt8 nPane ) const; + void WriteTabBgColor( XclExpStream& rStrm ) const; + +private: + XclTabViewData maData; /// All view settings for a sheet. + sal_uInt32 mnGridColorId; /// Color identifier for grid color. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xichart.hxx b/sc/source/filter/inc/xichart.hxx new file mode 100644 index 000000000000..d8289b3b671b --- /dev/null +++ b/sc/source/filter/inc/xichart.hxx @@ -0,0 +1,1514 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XICHART_HXX +#define SC_XICHART_HXX + +#include <vector> +#include <map> +#include <set> +#include <list> + +#include <svl/itemset.hxx> + +#include "rangelst.hxx" +#include "token.hxx" +#include "xlchart.hxx" +#include "xlstyle.hxx" +#include "xiescher.hxx" +#include "xistring.hxx" + +namespace com { namespace sun { namespace star { + namespace awt + { + struct Rectangle; + } + namespace frame + { + class XModel; + } + namespace drawing + { + class XShape; + } + namespace chart2 + { + struct ScaleData; + class XChartDocument; + class XDiagram; + class XCoordinateSystem; + class XChartType; + class XDataSeries; + class XRegressionCurve; + class XAxis; + class XLegend; + class XTitle; + class XFormattedString; + namespace data + { + class XDataProvider; + class XDataSequence; + class XLabeledDataSequence; + } + } +} } } + +struct XclObjLineData; +struct XclObjFillData; + +// Common ===================================================================== + +class ScfProgressBar; +struct XclImpChRootData; +class XclImpChChart; +class ScTokenArray; + +/** Base class for complex chart classes, provides access to other components of the chart. */ +class XclImpChRoot : public XclImpRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > XChartDocRef; + +public: + explicit XclImpChRoot( const XclImpRoot& rRoot, XclImpChChart& rChartData ); + virtual ~XclImpChRoot(); + + /** Returns this root instance - for code readability in derived classes. */ + inline const XclImpChRoot& GetChRoot() const { return *this; } + /** Returns a reference to the parent chart data object. */ + XclImpChChart& GetChartData() const; + /** Returns chart type info for a unique chart type identifier. */ + const XclChTypeInfo& GetChartTypeInfo( XclChTypeId eType ) const; + /** Returns the first fitting chart type info for an Excel chart type record identifier. */ + const XclChTypeInfo& GetChartTypeInfo( sal_uInt16 nRecId ) const; + /** Returns an info struct about auto formatting for the passed object type. */ + const XclChFormatInfo& GetFormatInfo( XclChObjectType eObjType ) const; + + /** Returns the default text color for charts. */ + Color GetFontAutoColor() const; + /** Returns the automatic line color of linear series. */ + Color GetSeriesLineAutoColor( sal_uInt16 nFormatIdx ) const; + /** Returns the automatic fill color of filled series. */ + Color GetSeriesFillAutoColor( sal_uInt16 nFormatIdx ) const; + + /** Starts the API chart document conversion. Must be called once before all API conversion. */ + void InitConversion( XChartDocRef xChartDoc, const Rectangle& rChartRect ) const; + /** Finishes the API chart document conversion. Must be called once after all API conversion. */ + void FinishConversion( XclImpDffConverter& rDffConv ) const; + + /** Returns the data provider for the chart document. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataProvider > + GetDataProvider() const; + /** Returns the drawing shape interface of the specified title object. */ + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + GetTitleShape( const XclChTextKey& rTitleKey ) const; + + /** Converts the passed horizontal coordinate from Excel chart units into 1/100 mm. */ + sal_Int32 CalcHmmFromChartX( sal_Int32 nPosX ) const; + /** Converts the passed vertical coordinate from Excel chart units into 1/100 mm. */ + sal_Int32 CalcHmmFromChartY( sal_Int32 nPosY ) const; + /** Converts the passed rectangle from Excel chart units into 1/100 mm. */ + ::com::sun::star::awt::Rectangle CalcHmmFromChartRect( const XclChRectangle& rRect ) const; + + /** Converts the passed horizontal coordinate from Excel chart units into a relative position. */ + double CalcRelativeFromChartX( sal_Int32 nPosX ) const; + /** Converts the passed vertical coordinate from Excel chart units into a relative position. */ + double CalcRelativeFromChartY( sal_Int32 nPosY ) const; + + /** Writes all line properties to the passed property set. */ + void ConvertLineFormat( + ScfPropertySet& rPropSet, + const XclChLineFormat& rLineFmt, + XclChPropertyMode ePropMode ) const; + /** Writes solid area properties to the passed property set. */ + void ConvertAreaFormat( + ScfPropertySet& rPropSet, + const XclChAreaFormat& rAreaFmt, + XclChPropertyMode ePropMode ) const; + /** Writes gradient or bitmap area properties to the passed property set. */ + void ConvertEscherFormat( + ScfPropertySet& rPropSet, + const XclChEscherFormat& rEscherFmt, + const XclChPicFormat& rPicFmt, + XclChPropertyMode ePropMode ) const; + /** Writes font properties to the passed property set. */ + void ConvertFont( + ScfPropertySet& rPropSet, + sal_uInt16 nFontIdx, + const Color* pFontColor = 0 ) const; + + /** Writes the pie rotation property for the passed angle. */ + static void ConvertPieRotation( + ScfPropertySet& rPropSet, + sal_uInt16 nAngle ); + +private: + typedef ScfRef< XclImpChRootData > XclImpChRootDataRef; + XclImpChRootDataRef mxChData; /// Reference to the root data object. +}; + +// ---------------------------------------------------------------------------- + +/** Base class for chart record groups. Provides helper functions to read sub records. + + A chart record group consists of a header record, followed by a CHBEGIN + record, followed by group sub records, and finished with a CHEND record. + */ +class XclImpChGroupBase +{ +public: + virtual ~XclImpChGroupBase(); + + /** Reads the entire record group. + @descr First calls ReadHeaderRecord() to read the contents of the + header record. Then tries to read the sub records. If next record + is a CHBEGIN record, ReadSubRecord() is called for each following + record until a CHEND record is found. */ + void ReadRecordGroup( XclImpStream& rStrm ); + + /** Helper to skip a CHBEGIN/CHEND block, includes nested blocks. */ + static void SkipBlock( XclImpStream& rStrm ); + + /** Derived classes implement to read the group header record. */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ) = 0; + /** Derived classes implement to read a record from the group. */ + virtual void ReadSubRecord( XclImpStream& rStrm ) = 0; +}; + +// Frame formatting =========================================================== + +class XclImpChFramePos +{ +public: + /** Reads the CHFRAMEPOS record (frame position and size). */ + void ReadChFramePos( XclImpStream& rStrm ); + + /** Returns read-only access to the imported frame position data. */ + inline const XclChFramePos& GetFramePosData() const { return maData; } + +private: + XclChFramePos maData; /// Position of the frame. +}; + +typedef ScfRef< XclImpChFramePos > XclImpChFramePosRef; + +// ---------------------------------------------------------------------------- + +/** The CHLINEFORMAT record containing line formatting data. */ +class XclImpChLineFormat +{ +public: + /** Creates a new line format object with automatic formatting. */ + inline explicit XclImpChLineFormat() {} + /** Creates a new line format object with the passed formatting. */ + inline explicit XclImpChLineFormat( const XclChLineFormat& rLineFmt ) : maData( rLineFmt ) {} + + /** Reads the CHLINEFORMAT record (basic line properties). */ + void ReadChLineFormat( XclImpStream& rStrm ); + + /** Returns true, if the line format is set to automatic. */ + inline bool IsAuto() const { return ::get_flag( maData.mnFlags, EXC_CHLINEFORMAT_AUTO ); } + /** Returns true, if the line style is set to something visible. */ + inline bool HasLine() const { return IsAuto() || (maData.mnPattern != EXC_CHLINEFORMAT_NONE); } + /** Returns the line width of this line format (returns 'single', if the line is invisible). */ + inline sal_Int16 GetWeight() const { return (IsAuto() || !HasLine()) ? EXC_CHLINEFORMAT_SINGLE : maData.mnWeight; } + /** Returns true, if the "show axis" flag is set. */ + inline bool IsShowAxis() const { return ::get_flag( maData.mnFlags, EXC_CHLINEFORMAT_SHOWAXIS ); } + + /** Converts and writes the contained data to the passed property set. */ + void Convert( const XclImpChRoot& rRoot, + ScfPropertySet& rPropSet, XclChObjectType eObjType, + sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN ) const; + +private: + XclChLineFormat maData; /// Contents of the CHLINEFORMAT record. +}; + +typedef ScfRef< XclImpChLineFormat > XclImpChLineFormatRef; + +// ---------------------------------------------------------------------------- + +/** The CHAREAFORMAT record containing simple area formatting data (solid or patterns). */ +class XclImpChAreaFormat +{ +public: + /** Creates a new area format object with automatic formatting. */ + inline explicit XclImpChAreaFormat() {} + /** Creates a new area format object with the passed formatting. */ + inline explicit XclImpChAreaFormat( const XclChAreaFormat& rAreaFmt ) : maData( rAreaFmt ) {} + + /** Reads the CHAREAFORMAT record (basic fill properties, e.g. transparent or colored). */ + void ReadChAreaFormat( XclImpStream& rStrm ); + + /** Returns true, if the area format is set to automatic. */ + inline bool IsAuto() const { return ::get_flag( maData.mnFlags, EXC_CHAREAFORMAT_AUTO ); } + /** Returns true, if the area style is set to something visible. */ + inline bool HasArea() const { return IsAuto() || (maData.mnPattern != EXC_PATT_NONE); } + + /** Converts and writes the contained data to the passed property set. */ + void Convert( const XclImpChRoot& rRoot, + ScfPropertySet& rPropSet, XclChObjectType eObjType, + sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN ) const; + +private: + XclChAreaFormat maData; /// Contents of the CHAREAFORMAT record. +}; + +typedef ScfRef< XclImpChAreaFormat > XclImpChAreaFormatRef; + +// ---------------------------------------------------------------------------- + +/** The CHESCHERFORMAT record containing complex area formatting data (bitmaps, hatches). */ +class XclImpChEscherFormat : public XclImpChGroupBase +{ +public: + explicit XclImpChEscherFormat( const XclImpRoot& rRoot ); + + /** Reads the CHESCHERFORMAT record (complex fill data) (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + /** Reads a record from the CHESCHERFORMAT group (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + + /** Converts and writes the contained data to the passed property set. */ + void Convert( const XclImpChRoot& rRoot, + ScfPropertySet& rPropSet, XclChObjectType eObjType ) const; + +private: + XclChEscherFormat maData; /// Fill properties for complex areas (CHESCHERFORMAT record). + XclChPicFormat maPicFmt; /// Image options, e.g. stretched, stacked (CHPICFORMAT record). +}; + +typedef ScfRef< XclImpChEscherFormat > XclImpChEscherFormatRef; + +// ---------------------------------------------------------------------------- + +/** Base class for record groups containing frame formatting. + + Frame formatting can be part of several record groups, e.g. CHFRAME, + CHDATAFORMAT, CHDROPBAR. It consists of CHLINEFORMAT, CHAREAFORMAT, and + CHESCHERFORMAT group. + */ +class XclImpChFrameBase : public XclImpChGroupBase +{ +public: + /** Creates a new frame object without internal formatting objects. */ + inline explicit XclImpChFrameBase() {} + /** Creates a new frame object with specific default formatting. */ + explicit XclImpChFrameBase( const XclChFormatInfo& rFmtInfo ); + + /** Reads a frame formatting record (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + + /** Returns true, if the line format is set to automatic. */ + inline bool IsAutoLine() const { return !mxLineFmt || mxLineFmt->IsAuto(); } + /** Returns true, if the line style is set to something visible. */ + inline bool HasLine() const { return IsAutoLine() || mxLineFmt->HasLine(); } + /** Returns the line weight used for this frame. */ + inline sal_Int16 GetLineWeight() const { return mxLineFmt.is() ? mxLineFmt->GetWeight() : EXC_CHLINEFORMAT_SINGLE; } + + /** Returns true, if the area format is set to automatic. */ + inline bool IsAutoArea() const { return !mxEscherFmt && (!mxAreaFmt || mxAreaFmt->IsAuto()); } + /** Returns true, if the area style is set to something visible. */ + inline bool HasArea() const { return mxEscherFmt.is() || IsAutoArea() || mxAreaFmt->HasArea(); } + +protected: + /** Converts and writes the contained line formatting to the passed property set. */ + void ConvertLineBase( const XclImpChRoot& rRoot, + ScfPropertySet& rPropSet, XclChObjectType eObjType, + sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN ) const; + /** Converts and writes the contained area formatting to the passed property set. */ + void ConvertAreaBase( const XclImpChRoot& rRoot, + ScfPropertySet& rPropSet, XclChObjectType eObjType, + sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN ) const; + /** Converts and writes the contained data to the passed property set. */ + void ConvertFrameBase( const XclImpChRoot& rRoot, + ScfPropertySet& rPropSet, XclChObjectType eObjType, + sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN ) const; + +protected: + XclImpChLineFormatRef mxLineFmt; /// Line format (CHLINEFORMAT record). + XclImpChAreaFormatRef mxAreaFmt; /// Area format (CHAREAFORMAT record). + XclImpChEscherFormatRef mxEscherFmt; /// Complex area format (CHESCHERFORMAT record). +}; + +// ---------------------------------------------------------------------------- + +/** Represents the CHFRAME record group containing object frame properties. + + The CHFRAME group consists of: CHFRAME, CHBEGIN, CHLINEFORMAT, + CHAREAFORMAT, CHESCHERFORMAT group, CHEND. + */ +class XclImpChFrame : public XclImpChFrameBase, protected XclImpChRoot +{ +public: + /** Creates a new frame object with specific default formatting. */ + explicit XclImpChFrame( + const XclImpChRoot& rRoot, + XclChObjectType eObjType ); + + /** Reads the CHFRAME record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + + /** Sets formatting from BIFF3-BIFF5 OBJ record, if own formatting is invisible. */ + void UpdateObjFrame( const XclObjLineData& rLineData, const XclObjFillData& rFillData ); + + /** Converts and writes the contained data to the passed property set. */ + void Convert( ScfPropertySet& rPropSet ) const; + +private: + XclChFrame maData; /// Contents of the CHFRAME record. + XclChObjectType meObjType; /// Type of the represented object. +}; + +typedef ScfRef< XclImpChFrame > XclImpChFrameRef; + +// Source links =============================================================== + +class XclImpChSourceLink : protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > XDataSequenceRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XFormattedString > XFormattedStringRef; + typedef ::com::sun::star::uno::Sequence< XFormattedStringRef > XFormattedStringSeq; + +public: + explicit XclImpChSourceLink( const XclImpChRoot& rRoot ); + virtual ~XclImpChSourceLink(); + + /** Reads the CHSOURCELINK record (link to source data). */ + void ReadChSourceLink( XclImpStream& rStrm ); + /** Sets explicit string data for this text object. */ + void SetString( const String& rString ); + /** Sets formatting runs read from a CHFORMATRUNS record. */ + void SetTextFormats( const XclFormatRunVec& rFormats ); + + /** Returns the destination object (title, values, category, ...). */ + inline sal_uInt8 GetDestType() const { return maData.mnDestType; } + /** Returns the link type (to worksheet, directly, default, ...). */ + inline sal_uInt8 GetLinkType() const { return maData.mnLinkType; } + + /** Returns true, if the source link contains explicit string data. */ + inline bool HasString() const { return mxString.is() && !mxString->IsEmpty(); } + /** Returns explicit string data or an empty string. */ + inline const String& GetString() const { return mxString.is() ? mxString->GetText() : String::EmptyString(); } + /** Returns the number of data points of this source link. */ + sal_uInt16 GetCellCount() const; + + /** Converts and writes the contained number format to the passed property set. */ + void ConvertNumFmt( ScfPropertySet& rPropSet, bool bPercent ) const; + + /** Creates a data sequence containing the link into the Calc document. */ + XDataSequenceRef CreateDataSequence( const ::rtl::OUString& rRole ) const; + /** Creates a sequence of formatted string objects. */ + XFormattedStringSeq CreateStringSequence( const XclImpChRoot& rRoot, + sal_uInt16 nLeadFontIdx, const Color& rLeadFontColor ) const; + + void FillSourceLink(::std::vector<ScSharedTokenRef>& rTokens) const; + +private: + XclChSourceLink maData; /// Contents of the CHSOURCELINK record. + XclImpStringRef mxString; /// Text data (CHSTRING record). + ScfRef< ScTokenArray> mxTokenArray; /// Token array representing the data ranges. +}; + +typedef ScfRef< XclImpChSourceLink > XclImpChSourceLinkRef; + +// Text ======================================================================= + +/** Base class for objects with font settings. Provides font conversion helper functions. */ +class XclImpChFontBase +{ +public: + virtual ~XclImpChFontBase(); + + /** Derived classes return the leading font index for the text object. */ + virtual sal_uInt16 GetFontIndex() const = 0; + /** Derived classes return the leading font color for the text object. */ + virtual Color GetFontColor() const = 0; + /** Derived classes return the rotation value for the text object. */ + virtual sal_uInt16 GetRotation() const = 0; + + /** Converts and writes the contained font settings to the passed property set. */ + void ConvertFontBase( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet ) const; + /** Converts and writes the contained rotation settings to the passed property set. */ + void ConvertRotationBase( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet, bool bSupportsStacked ) const; +}; + +// ---------------------------------------------------------------------------- + +/** The CHFONT record containing a font index for text objects. */ +class XclImpChFont +{ +public: + explicit XclImpChFont(); + /** Reads the CHFONT record (font index). */ + void ReadChFont( XclImpStream& rStrm ); + + /** Returns the contained font index. */ + inline sal_uInt16 GetFontIndex() const { return mnFontIdx; } + +private: + sal_uInt16 mnFontIdx; /// Index into font buffer. +}; + +typedef ScfRef< XclImpChFont > XclImpChFontRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHTEXT record group containing text object properties. + + The CHTEXT group consists of: CHTEXT, CHBEGIN, CHFRAMEPOS, CHFONT, + CHFORMATRUNS, CHSOURCELINK, CHSTRING, CHFRAME group, CHOBJECTLINK, and CHEND. + */ +class XclImpChText : public XclImpChGroupBase, public XclImpChFontBase, protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XTitle > XTitleRef; + +public: + explicit XclImpChText( const XclImpChRoot& rRoot ); + + /** Reads the CHTEXT record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + /** Reads a record from the CHTEXT group (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + + /** Returns the leading font index for the text object. */ + virtual sal_uInt16 GetFontIndex() const; + /** Returns the leading font color for the text object. */ + virtual Color GetFontColor() const; + /** Returns the rotation value for the text object. */ + virtual sal_uInt16 GetRotation() const; + + /** Sets explicit string data for this text object. */ + void SetString( const String& rString ); + /** Updates missing parts of this text object from the passed object. */ + void UpdateText( const XclImpChText* pParentText ); + /** Updates display type of this data point label text object. */ + void UpdateDataLabel( bool bCateg, bool bValue, bool bPercent ); + + /** Returns the target object this text is linked to. */ + inline sal_uInt16 GetLinkTarget() const { return maObjLink.mnTarget; } + /** Returns the position of the data point label this text is linked to. */ + inline const XclChDataPointPos& GetPointPos() const { return maObjLink.maPointPos; } + /** Returns true, if this text group contains string data. */ + inline bool HasString() const { return mxSrcLink.is() && mxSrcLink->HasString(); } + /** Returns true, if the text object is marked as deleted. */ + inline bool IsDeleted() const { return ::get_flag( maData.mnFlags, EXC_CHTEXT_DELETED ); } + + /** Converts and writes the contained font settings to the passed property set. */ + void ConvertFont( ScfPropertySet& rPropSet ) const; + /** Converts and writes the contained rotation settings to the passed property set. */ + void ConvertRotation( ScfPropertySet& rPropSet, bool bSupportsStacked ) const; + /** Converts and writes the contained frame data to the passed property set. */ + void ConvertFrame( ScfPropertySet& rPropSet ) const; + /** Converts and writes the contained number format to the passed property set. */ + void ConvertNumFmt( ScfPropertySet& rPropSet, bool bPercent ) const; + /** Converts and writes all contained data to the passed data point label property set. */ + void ConvertDataLabel( ScfPropertySet& rPropSet, const XclChTypeInfo& rTypeInfo ) const; + /** Creates a title text object. */ + XTitleRef CreateTitle() const; + /** Converts the manual position of the specified title */ + void ConvertTitlePosition( const XclChTextKey& rTitleKey ) const; + +private: + using XclImpChRoot::ConvertFont; + + /** Reads a CHFRLABELPROPS record. */ + void ReadChFrLabelProps( XclImpStream& rStrm ); + +private: + typedef ScfRef< XclChFrLabelProps > XclChFrLabelPropsRef; + + XclChText maData; /// Contents of the CHTEXT record. + XclChObjectLink maObjLink; /// Link target for this text object. + XclFormatRunVec maFormats; /// Formatting runs (CHFORMATRUNS record). + XclImpChFramePosRef mxFramePos; /// Relative text frame position (CHFRAMEPOS record). + XclImpChSourceLinkRef mxSrcLink; /// Linked data (CHSOURCELINK with CHSTRING record). + XclImpChFrameRef mxFrame; /// Text object frame properties (CHFRAME group). + XclImpChFontRef mxFont; /// Index into font buffer (CHFONT record). + XclChFrLabelPropsRef mxLabelProps; /// Extended data label properties (CHFRLABELPROPS record). +}; + +typedef ScfRef< XclImpChText > XclImpChTextRef; + +// Data series ================================================================ + +/** The CHMARKERFORMAT record containing data point marker formatting data. */ +class XclImpChMarkerFormat +{ +public: + /** Reads the CHMARKERFORMAT record (data point marker properties). */ + void ReadChMarkerFormat( XclImpStream& rStrm ); + + /** Returns true, if the marker format is set to automatic. */ + inline bool IsAuto() const { return ::get_flag( maData.mnFlags, EXC_CHMARKERFORMAT_AUTO ); } + + /** Converts and writes the contained data to the passed property set. */ + void Convert( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet, + sal_uInt16 nFormatIdx, sal_Int16 nLineWeight ) const; + /** Sets the marker fill color as main color to the passed property set. */ + void ConvertColor( const XclImpChRoot& rRoot, + ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx ) const; + +private: + XclChMarkerFormat maData; /// Contents of the CHMARKERFORMAT record. +}; + +typedef ScfRef< XclImpChMarkerFormat > XclImpChMarkerFormatRef; + +// ---------------------------------------------------------------------------- + +/** The CHPIEFORMAT record containing data point formatting data for pie segments. */ +class XclImpChPieFormat +{ +public: + explicit XclImpChPieFormat(); + /** Reads the CHPIEFORMAT record (pie segment properties). */ + void ReadChPieFormat( XclImpStream& rStrm ); + /** Converts and writes the contained data to the passed property set. */ + void Convert( ScfPropertySet& rPropSet ) const; + +private: + sal_uInt16 mnPieDist; /// Pie distance to diagram center. +}; + +typedef ScfRef< XclImpChPieFormat > XclImpChPieFormatRef; + +// ---------------------------------------------------------------------------- + +/** The CHSERIESFORMAT record containing additional settings for a data series. */ +class XclImpChSeriesFormat +{ +public: + explicit XclImpChSeriesFormat(); + /** Reads the CHSERIESFORMAT record (additional settings for a series). */ + void ReadChSeriesFormat( XclImpStream& rStrm ); + /** Returns true, if the series line is smoothed. */ + inline bool HasSpline() const { return ::get_flag( mnFlags, EXC_CHSERIESFORMAT_SMOOTHED ); } + +private: + sal_uInt16 mnFlags; /// Additional flags. +}; + +typedef ScfRef< XclImpChSeriesFormat > XclImpChSeriesFormatRef; + +// ---------------------------------------------------------------------------- + +/** The CH3DDATAFORMAT record containing the bar type in 3D bar charts. */ +class XclImpCh3dDataFormat +{ +public: + /** Reads the CH3DDATAFORMAT record (3D bar properties). */ + void ReadCh3dDataFormat( XclImpStream& rStrm ); + /** Converts and writes the contained data to the passed property set. */ + void Convert( ScfPropertySet& rPropSet ) const; + +private: + XclCh3dDataFormat maData; /// Contents of the CH3DDATAFORMAT record. +}; + +typedef ScfRef< XclImpCh3dDataFormat > XclImpCh3dDataFormatRef; + +// ---------------------------------------------------------------------------- + +/** The CHATTACHEDLABEL record that contains the type of a data point label. */ +class XclImpChAttachedLabel : protected XclImpChRoot +{ +public: + explicit XclImpChAttachedLabel( const XclImpChRoot& rRoot ); + /** Reads the CHATTACHEDLABEL record (data series/point labels). */ + void ReadChAttachedLabel( XclImpStream& rStrm ); + /** Creates a CHTEXT group for the label. Clones xParentText and sets additional label settings */ + XclImpChTextRef CreateDataLabel( XclImpChTextRef xParent ) const; + +private: + sal_uInt16 mnFlags; /// Additional flags. +}; + +typedef ScfRef< XclImpChAttachedLabel > XclImpChAttLabelRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHDATAFORMAT record group containing data point properties. + + The CHDATAFORMAT group consists of: CHDATAFORMAT, CHBEGIN, CHFRAME group, + CHMARKERFORMAT, CHPIEFORMAT, CH3DDATAFORMAT, CHSERIESFORMAT, + CHATTACHEDLABEL, CHEND. + */ +class XclImpChDataFormat : public XclImpChFrameBase, protected XclImpChRoot +{ +public: + explicit XclImpChDataFormat( const XclImpChRoot& rRoot ); + + /** Reads the CHDATAFORMAT record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + /** Reads a record from the CHDATAFORMAT group (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + + /** Sets this object to the specified data point position. */ + void SetPointPos( const XclChDataPointPos& rPointPos, sal_uInt16 nFormatIdx ); + /** Sets type and text formatting for a data point label (CHTEXT group). */ + inline void SetDataLabel( XclImpChTextRef xLabel ) { mxLabel = xLabel; } + + /** Updates default data format for series group. */ + void UpdateGroupFormat( const XclChExtTypeInfo& rTypeInfo ); + /** Updates missing series settings from the passed chart type group data format. */ + void UpdateSeriesFormat( const XclChExtTypeInfo& rTypeInfo, const XclImpChDataFormat* pGroupFmt ); + /** Updates missing data point settings from the passed series format. */ + void UpdatePointFormat( const XclChExtTypeInfo& rTypeInfo, const XclImpChDataFormat* pSeriesFmt ); + /** Updates default data format for trend lines. */ + void UpdateTrendLineFormat(); + + /** Returns the position of the data point described by this group. */ + inline const XclChDataPointPos& GetPointPos() const { return maData.maPointPos; } + /** Returns the format index of the data point described by this group. */ + inline sal_uInt16 GetFormatIdx() const { return maData.mnFormatIdx; } + /** Returns true, if markers are set to automatic format. */ + inline bool IsAutoMarker() const { return !mxMarkerFmt || mxMarkerFmt->IsAuto(); } + /** Returns true, if the series line is smoothed. */ + inline bool HasSpline() const { return mxSeriesFmt.is() && mxSeriesFmt->HasSpline(); } + /** Returns the data label text object. */ + inline XclImpChTextRef GetDataLabel() const { return mxLabel; } + + /** Converts and writes the contained data to the passed property set. */ + void Convert( ScfPropertySet& rPropSet, const XclChExtTypeInfo& rTypeInfo ) const; + /** Writes the line format only, e.g. for trend lines or error bars. */ + void ConvertLine( ScfPropertySet& rPropSet, XclChObjectType eObjType ) const; + /** Writes the area format only for the series or a data point. */ + void ConvertArea( ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx ) const; + +private: + /** Removes unused formatting (e.g. pie distance in a bar chart). */ + void RemoveUnusedFormats( const XclChExtTypeInfo& rTypeInfo ); + /** Updates or creates the data point label. */ + void UpdateDataLabel( const XclImpChDataFormat* pParentFmt ); + +private: + XclChDataFormat maData; /// Contents of the CHDATAFORMAT record. + XclImpChMarkerFormatRef mxMarkerFmt; /// Data point marker (CHMARKERFORMAT record). + XclImpChPieFormatRef mxPieFmt; /// Pie segment format (CHPIEFORMAT record). + XclImpChSeriesFormatRef mxSeriesFmt; /// Series properties (CHSERIESFORMAT record). + XclImpCh3dDataFormatRef mx3dDataFmt; /// 3D bar format (CH3DDATAFORMAT record). + XclImpChAttLabelRef mxAttLabel; /// Data point label type (CHATTACHEDLABEL record). + XclImpChTextRef mxLabel; /// Data point label formatting (CHTEXT group). +}; + +typedef ScfRef< XclImpChDataFormat > XclImpChDataFormatRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHSERTRENDLINE record containing settings for a trend line. */ +class XclImpChSerTrendLine : protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XRegressionCurve > XRegressionCurveRef; + +public: + explicit XclImpChSerTrendLine( const XclImpChRoot& rRoot ); + + /** Reads the CHSERTRENDLINE record. */ + void ReadChSerTrendLine( XclImpStream& rStrm ); + /** Sets formatting information for the trend line. */ + inline void SetDataFormat( XclImpChDataFormatRef xDataFmt ) { mxDataFmt = xDataFmt; } + + /** Creates an API object representing this trend line. */ + XRegressionCurveRef CreateRegressionCurve() const; + +private: + XclChSerTrendLine maData; /// Contents of the CHSERTRENDLINE record. + XclImpChDataFormatRef mxDataFmt; /// Formatting settings of the trend line. +}; + +typedef ScfRef< XclImpChSerTrendLine > XclImpChSerTrendLineRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHSERERRORBAR record containing settings for error bars. */ +class XclImpChSerErrorBar : protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > XLabeledDataSeqRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > XPropertySetRef; + +public: + explicit XclImpChSerErrorBar( const XclImpChRoot& rRoot ); + + /** Reads the CHSERERRORBAR record. */ + void ReadChSerErrorBar( XclImpStream& rStrm ); + /** Sets link and formatting information for the error bars. */ + void SetSeriesData( + XclImpChSourceLinkRef xValueLink, + XclImpChDataFormatRef xDataFmt ); + + /** Returns the type of this error bar (X/Y, plus/minus). */ + inline sal_uInt8 GetBarType() const { return maData.mnBarType; } + /** Creates a labeled data sequence object from value data link. */ + XLabeledDataSeqRef CreateValueSequence() const; + + /** Tries to create an error bar API object from the specified Excel error bars. */ + static XPropertySetRef CreateErrorBar( + const XclImpChSerErrorBar* pPosBar, + const XclImpChSerErrorBar* pNegBar ); + +private: + XclChSerErrorBar maData; /// Contents of the CHSERERRORBAR record. + XclImpChSourceLinkRef mxValueLink; /// Link data for manual error bar values. + XclImpChDataFormatRef mxDataFmt; /// Formatting settings of the error bars. +}; + +typedef ScfRef< XclImpChSerErrorBar > XclImpChSerErrorBarRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHSERIES record group describing a data series in a chart. + + The CHSERIES group consists of: CHSERIES, CHBEGIN, CHSOURCELINK groups, + CHDATAFORMAT groups, CHSERGROUP, CHSERPARENT, CHSERERRORBAR, + CHSERTRENDLINE, CHEND. + */ +class XclImpChSeries : public XclImpChGroupBase, protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > XDataSeriesRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > XLabeledDataSeqRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > XPropertySetRef; + +public: + explicit XclImpChSeries( const XclImpChRoot& rRoot, sal_uInt16 nSeriesIdx ); + + /** Reads the CHSERIES record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + /** Reads a record from the CHSERIES group (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + + /** Sets a data point or series format (CHDATAFORMAT group) for this series. */ + void SetDataFormat( XclImpChDataFormatRef xDataFmt ); + /** Sets a label text (CHTEXT group) attached to a series or data point. */ + void SetDataLabel( XclImpChTextRef xLabel ); + /** Adds error bar settings from the passed series to the own series. */ + void AddChildSeries( const XclImpChSeries& rSeries ); + /** Updates missing series formatting by using default formatting from axes sets. */ + void FinalizeDataFormats(); + + /** Returns the axes set identifier this series is assigned to (primary/secondary). */ + inline sal_uInt16 GetGroupIdx() const { return mnGroupIdx; } + /** Returns the 0-based series index described by this series. */ + inline sal_uInt16 GetSeriesIdx() const { return mnSeriesIdx; } + /** Returns the 0-based index of the parent series (e.g. of a trend line). */ + inline sal_uInt16 GetParentIdx() const { return mnParentIdx; } + /** Returns the format index of the series used for automatic line and area colors. */ + inline sal_uInt16 GetFormatIdx() const { return mxSeriesFmt.is() ? mxSeriesFmt->GetFormatIdx() : EXC_CHDATAFORMAT_DEFAULT; } + /** Returns true, if the series is child of another series (e.g. trend line). */ + inline bool HasParentSeries() const { return mnParentIdx != EXC_CHSERIES_INVALID; } + /** Returns true, if the series contains child series (e.g. trend lines). */ + inline bool HasChildSeries() const { return !maTrendLines.empty() || !maErrorBars.empty(); } + /** Returns series title or an empty string, if the series does not contain a title. */ + inline const String& GetTitle() const { return mxTitleLink.is() ? mxTitleLink->GetString() : String::EmptyString(); } + + /** Returns true, if the series line is smoothed. */ + inline bool HasSpline() const { return mxSeriesFmt.is() && mxSeriesFmt->HasSpline(); } + + /** Creates a labeled data sequence object from value data link. */ + XLabeledDataSeqRef CreateValueSequence( const ::rtl::OUString& rValueRole ) const; + /** Creates a labeled data sequence object from category data link. */ + XLabeledDataSeqRef CreateCategSequence( const ::rtl::OUString& rCategRole ) const; + /** Creates a data series object with initialized source links. */ + XDataSeriesRef CreateDataSeries() const; + + void FillAllSourceLinks(::std::vector<ScSharedTokenRef>& rTokens) const; + +private: + /** Reads a CHSOURCELINK record. */ + void ReadChSourceLink( XclImpStream& rStrm ); + /** Reads a CHDATAFORMAT group containing series and point formatting. */ + void ReadChDataFormat( XclImpStream& rStrm ); + /** Reads a CHSERPARENT record specifying the parent series of this series. */ + void ReadChSerParent( XclImpStream& rStrm ); + /** Reads a CHSERTRENDLINE record containing trend line settings. */ + void ReadChSerTrendLine( XclImpStream& rStrm ); + /** Reads a CHSERERRORBAR record containing error bar settings. */ + void ReadChSerErrorBar( XclImpStream& rStrm ); + + /** Creates a new CHDATAFORMAT group with the specified point index. */ + XclImpChDataFormatRef CreateDataFormat( sal_uInt16 nPointIdx, sal_uInt16 nFormatIdx ); + /** Returns the pointer to a CHDATAFORMAT group reference or 0 for invalid pointer index. */ + XclImpChDataFormatRef* GetDataFormatRef( sal_uInt16 nPointIdx ); + /** Returns the pointer to a CHTEXT group reference or 0 for invalid pointer index. */ + XclImpChTextRef* GetDataLabelRef( sal_uInt16 nPointIdx ); + + /** Converts all trend lines and inserts them into the passed API data series object. */ + void ConvertTrendLines( XDataSeriesRef xDataSeries ) const; + /** Tries to create an error bar API object from the specified Excel error bars. */ + XPropertySetRef CreateErrorBar( sal_uInt8 nPosBarId, sal_uInt8 nNegBarId ) const; + +private: + typedef ScfRefMap< sal_uInt16, XclImpChDataFormat > XclImpChDataFormatMap; + typedef ScfRefMap< sal_uInt16, XclImpChText > XclImpChTextMap; + typedef ::std::list< XclImpChSerTrendLineRef > XclImpChSerTrendLineList; + typedef ScfRefMap< sal_uInt8, XclImpChSerErrorBar > XclImpChSerErrorBarMap; + + XclChSeries maData; /// Contents of the CHSERIES record. + XclImpChSourceLinkRef mxValueLink; /// Link data for series values. + XclImpChSourceLinkRef mxCategLink; /// Link data for series category names. + XclImpChSourceLinkRef mxTitleLink; /// Link data for series title. + XclImpChSourceLinkRef mxBubbleLink; /// Link data for series bubble sizes. + XclImpChDataFormatRef mxSeriesFmt; /// CHDATAFORMAT group for series format. + XclImpChDataFormatMap maPointFmts; /// CHDATAFORMAT groups for data point formats. + XclImpChTextMap maLabels; /// Data point labels (CHTEXT groups). + XclImpChSerTrendLineList maTrendLines; /// Trend line settings (CHSERTRENDLINE records). + XclImpChSerErrorBarMap maErrorBars; /// Error bar settings (CHSERERRORBAR records). + sal_uInt16 mnGroupIdx; /// Chart type group (CHTYPEGROUP group) this series is assigned to. + sal_uInt16 mnSeriesIdx; /// 0-based series index. + sal_uInt16 mnParentIdx; /// 0-based index of parent series (trend lines and error bars). +}; + +typedef ScfRef< XclImpChSeries > XclImpChSeriesRef; + +// Chart type groups ========================================================== + +class XclImpChType : protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > XDiagramRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem > XCoordSystemRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType > XChartTypeRef; + +public: + explicit XclImpChType( const XclImpChRoot& rRoot ); + + /** Reads a chart type record (e.g. CHBAR, CHLINE, CHPIE, ...). */ + void ReadChType( XclImpStream& rStrm ); + /** Final processing after reading the entire chart. */ + void Finalize( bool bStockChart ); + + /** Returns the record identifier of the chart type record. */ + inline sal_uInt16 GetRecId() const { return mnRecId; } + /** Returns the chart type info struct for the contained chart type. */ + inline const XclChTypeInfo& GetTypeInfo() const { return maTypeInfo; } + /** Returns true, if the series in this chart type group are stacked on each other (no percentage). */ + bool IsStacked() const; + /** Returns true, if the series in this chart type group are stacked on each other as percentage. */ + bool IsPercent() const; + /** Returns true, if chart type has category labels enabled (may be disabled in radar charts). */ + bool HasCategoryLabels() const; + + /** Creates a coordinate system according to the contained chart type. */ + XCoordSystemRef CreateCoordSystem( bool b3dChart ) const; + /** Creates and returns an object that represents the contained chart type. */ + XChartTypeRef CreateChartType( XDiagramRef xDiagram, bool b3dChart ) const; + +private: + XclChType maData; /// Contents of the chart type record. + sal_uInt16 mnRecId; /// Record identifier for chart type. + XclChTypeInfo maTypeInfo; /// Chart type info for the contained type. +}; + +// ---------------------------------------------------------------------------- + +/** Represents the CHCHART3D record that contains 3D view settings. */ +class XclImpChChart3d +{ +public: + /** Reads the CHCHART3D record (properties for 3D charts). */ + void ReadChChart3d( XclImpStream& rStrm ); + /** Returns true, if the data points are clustered on the X axis. */ + inline bool IsClustered() const { return ::get_flag( maData.mnFlags, EXC_CHCHART3D_CLUSTER ); } + /** Converts and writes the contained data to the passed property set. */ + void Convert( ScfPropertySet& rPropSet, bool b3dWallChart ) const; + +private: + XclChChart3d maData; /// Contents of the CHCHART3D record. +}; + +typedef ScfRef< XclImpChChart3d > XclImpChChart3dRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHLEGEND record group describing the chart legend. + + The CHLEGEND group consists of: CHLEGEND, CHBEGIN, CHFRAMEPOS, CHFRAME + group, CHTEXT group, CHEND. + */ +class XclImpChLegend : public XclImpChGroupBase, protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XLegend > XLegendRef; + +public: + explicit XclImpChLegend( const XclImpChRoot& rRoot ); + + /** Reads the CHLEGEND record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + /** Reads a record from the CHLEGEND group (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + /** Final processing after reading the entire chart. */ + void Finalize(); + + /** Creates a new legend object. */ + XLegendRef CreateLegend() const; + +private: + XclChLegend maData; /// Contents of the CHLEGEND record. + XclImpChFramePosRef mxFramePos; /// Legend frame position (CHFRAMEPOS record). + XclImpChTextRef mxText; /// Legend text format (CHTEXT group). + XclImpChFrameRef mxFrame; /// Legend frame format (CHFRAME group). +}; + +typedef ScfRef< XclImpChLegend > XclImpChLegendRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHDROPBAR record group describing pos/neg bars in line charts. + + The CHDROPBAR group consists of: CHDROPBAR, CHBEGIN, CHLINEFORMAT, + CHAREAFORMAT, CHESCHERFORMAT group, CHEND. + */ +class XclImpChDropBar : public XclImpChFrameBase +{ +public: + explicit XclImpChDropBar( sal_uInt16 nDropBar ); + + /** Reads the CHDROPBAR record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + + /** Converts and writes the contained frame data to the passed property set. */ + void Convert( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet ) const; + +private: + sal_uInt16 mnDropBar; /// Drop bar identifier, needed for auto format. + sal_uInt16 mnBarDist; /// Distance between bars (CHDROPBAR record). +}; + +typedef ScfRef< XclImpChDropBar > XclImpChDropBarRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHTYPEGROUP record group describing a group of series. + + The CHTYPEGROUP group consists of: CHTYPEGROUP, CHBEGIN, a chart type + record (e.g. CHBAR, CHLINE, CHAREA, CHPIE, ...), CHCHART3D, CHLEGEND group, + CHDEFAULTTEXT groups (CHDEFAULTTEXT with CHTEXT groups), CHDROPBAR groups, + CHCHARTLINE groups (CHCHARTLINE with CHLINEFORMAT), CHDATAFORMAT group, + CHEND. + */ +class XclImpChTypeGroup : public XclImpChGroupBase, protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > XDiagramRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem > XCoordSystemRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType > XChartTypeRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > XDataSeriesRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > XLabeledDataSeqRef; + +public: + explicit XclImpChTypeGroup( const XclImpChRoot& rRoot ); + + /** Reads the CHTYPEGROUP record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + /** Reads a record from the CHTYPEGROUP group (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + /** Final processing after reading the entire chart. */ + void Finalize(); + + /** Inserts a series attached to this chart type group.*/ + void AddSeries( XclImpChSeriesRef xSeries ); + /** Marks the passed format index as used. PopUnusedFormatIndex() will not return this index. */ + void SetUsedFormatIndex( sal_uInt16 nFormatIdx ); + /** Returns the next unused format index and marks it as used. */ + sal_uInt16 PopUnusedFormatIndex(); + + /** Returns the index of this chart type group. */ + inline sal_uInt16 GetGroupIdx() const { return maData.mnGroupIdx; } + /** Returns the chart type info struct for the contained chart type. */ + inline const XclChExtTypeInfo& GetTypeInfo() const { return maTypeInfo; } + /** Returns true, if this chart type group contains at least one valid series. */ + inline bool IsValidGroup() const { return !maSeries.empty(); } + /** Returns true, if the series in this chart type group are stacked on each other (no percentage). */ + inline bool IsStacked() const { return maType.IsStacked(); } + /** Returns true, if the series in this chart type group are stacked on each other as percentage. */ + inline bool IsPercent() const { return maType.IsPercent(); } + /** Returns true, if the chart is three-dimensional. */ + inline bool Is3dChart() const { return mxChart3d.is() && maTypeInfo.mbSupports3d; } + /** Returns true, if chart type supports wall and floor format in 3d mode. */ + inline bool Is3dWallChart() const { return Is3dChart() && (maTypeInfo.meTypeCateg != EXC_CHTYPECATEG_PIE); } + /** Returns true, if the series in this chart type group are ordered on the Z axis. */ + inline bool Is3dDeepChart() const { return Is3dWallChart() && mxChart3d.is() && !mxChart3d->IsClustered(); } + /** Returns true, if category (X axis) labels are enabled (may be disabled in radar charts). */ + inline bool HasCategoryLabels() const { return maType.HasCategoryLabels(); } + /** Returns true, if points of a series show varying automatic area format. */ + bool HasVarPointFormat() const; + /** Returns true, if bars are connected with lines (stacked bar charts only). */ + bool HasConnectorLines() const; + + /** Returns the legend object. */ + inline XclImpChLegendRef GetLegend() const { return mxLegend; } + /** Returns the default series data format. */ + inline XclImpChDataFormatRef GetGroupFormat() const { return mxGroupFmt; } + /** Returns series title, if the chart type group contains only one single series. */ + const String& GetSingleSeriesTitle() const; + + /** Converts and writes all 3D settings to the passed diagram. */ + void ConvertChart3d( ScfPropertySet& rPropSet ) const; + /** Creates a coordinate system according to the contained chart type. */ + XCoordSystemRef CreateCoordSystem() const; + /** Creates and returns an object that represents the contained chart type. */ + XChartTypeRef CreateChartType( XDiagramRef xDiagram, sal_Int32 nApiAxesSetIdx ) const; + /** Creates a labeled data sequence object for axis categories. */ + XLabeledDataSeqRef CreateCategSequence() const; + +private: + /** Reads a CHDROPBAR record group. */ + void ReadChDropBar( XclImpStream& rStrm ); + /** Reads a CHCHARTLINE record group. */ + void ReadChChartLine( XclImpStream& rStrm ); + /** Reads a CHDATAFORMAT record group (default series format). */ + void ReadChDataFormat( XclImpStream& rStrm ); + + /** Returns true, if the chart type group contains a hi-lo line format. */ + inline bool HasHiLoLine() const { return maChartLines.has( EXC_CHCHARTLINE_HILO ); } + /** Returns true, if the chart type group contains drop bar formats. */ + inline bool HasDropBars() const { return !maDropBars.empty(); } + + /** Inserts the passed series into the chart type. Adds additional properties to the series. */ + void InsertDataSeries( XChartTypeRef xChartType, + XDataSeriesRef xSeries, sal_Int32 nApiAxesSetIdx ) const; + /** Creates all data series of any chart type except stock charts. */ + void CreateDataSeries( XChartTypeRef xChartType, sal_Int32 nApiAxesSetIdx ) const; + /** Creates all data series of of a stock chart. */ + void CreateStockSeries( XChartTypeRef xChartType, sal_Int32 nApiAxesSetIdx ) const; + +private: + typedef ::std::vector< XclImpChSeriesRef > XclImpChSeriesVec; + typedef ScfRefMap< sal_uInt16, XclImpChDropBar > XclImpChDropBarMap; + typedef ScfRefMap< sal_uInt16, XclImpChLineFormat > XclImpChLineFormatMap; + typedef ::std::set< sal_uInt16 > UInt16Set; + + XclChTypeGroup maData; /// Contents of the CHTYPEGROUP record. + XclImpChType maType; /// Chart type (e.g. CHBAR, CHLINE, ...). + XclChExtTypeInfo maTypeInfo; /// Extended chart type info. + XclImpChSeriesVec maSeries; /// Series attached to this chart type group (CHSERIES groups). + XclImpChSeriesRef mxFirstSeries; /// First series in this chart type group (CHSERIES groups). + XclImpChChart3dRef mxChart3d; /// 3D settings (CHCHART3D record). + XclImpChLegendRef mxLegend; /// Chart legend (CHLEGEND group). + XclImpChDropBarMap maDropBars; /// Dropbars (CHDROPBAR group). + XclImpChLineFormatMap maChartLines; /// Global line formats (CHCHARTLINE group). + XclImpChDataFormatRef mxGroupFmt; /// Default format for all series (CHDATAFORMAT group). + UInt16Set maUnusedFormats; /// Contains unused format indexes for automatic colors. +}; + +typedef ScfRef< XclImpChTypeGroup > XclImpChTypeGroupRef; + +// Axes ======================================================================= + +class XclImpChLabelRange : protected XclImpChRoot +{ +public: + typedef ::com::sun::star::chart2::ScaleData ScaleData; + +public: + explicit XclImpChLabelRange( const XclImpChRoot& rRoot ); + /** Reads the CHLABELRANGE record (category axis scaling properties). */ + void ReadChLabelRange( XclImpStream& rStrm ); + /** Converts category axis scaling settings. */ + void Convert( ScfPropertySet& rPropSet, ScaleData& rScaleData, bool bMirrorOrient ) const; + /** Converts position settings of this axis at a crossing axis. */ + void ConvertAxisPosition( ScfPropertySet& rPropSet, bool b3dChart ) const; + +private: + XclChLabelRange maData; /// Contents of the CHLABELRANGE record. +}; + +typedef ScfRef< XclImpChLabelRange > XclImpChLabelRangeRef; + +// ---------------------------------------------------------------------------- + +class XclImpChValueRange : protected XclImpChRoot +{ +public: + typedef ::com::sun::star::chart2::ScaleData ScaleData; + +public: + explicit XclImpChValueRange( const XclImpChRoot& rRoot ); + /** Reads the CHVALUERANGE record (numeric axis scaling properties). */ + void ReadChValueRange( XclImpStream& rStrm ); + /** Converts value axis scaling settings. */ + void Convert( ScaleData& rScaleData, bool bMirrorOrient ) const; + /** Converts position settings of this axis at a crossing axis. */ + void ConvertAxisPosition( ScfPropertySet& rPropSet ) const; + +private: + XclChValueRange maData; /// Contents of the CHVALUERANGE record. +}; + +typedef ScfRef< XclImpChValueRange > XclImpChValueRangeRef; + +// ---------------------------------------------------------------------------- + +class XclImpChTick : protected XclImpChRoot +{ +public: + explicit XclImpChTick( const XclImpChRoot& rRoot ); + /** Reads the CHTICK record (axis ticks properties). */ + void ReadChTick( XclImpStream& rStrm ); + + /** Returns true, if the axis shows attached labels. */ + inline bool HasLabels() const { return maData.mnLabelPos != EXC_CHTICK_NOLABEL; } + /** Returns the leading font color for the axis labels. */ + Color GetFontColor() const; + /** Returns the rotation value for the axis labels. */ + sal_uInt16 GetRotation() const; + + /** Converts and writes the contained data to the passed property set. */ + void Convert( ScfPropertySet& rPropSet ) const; + +private: + XclChTick maData; /// Contents of the CHTICK record. +}; + +typedef ScfRef< XclImpChTick > XclImpChTickRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHAXIS record group describing an entire chart axis. + + The CHAXIS group consists of: CHAXIS, CHBEGIN, CHLABELRANGE, CHEXTRANGE, + CHVALUERANGE, CHFORMAT, CHTICK, CHFONT, CHAXISLINE groups (CHAXISLINE with + CHLINEFORMAT, CHAREAFORMAT, and CHESCHERFORMAT group), CHEND. + */ +class XclImpChAxis : public XclImpChGroupBase, public XclImpChFontBase, protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XAxis > XAxisRef; + +public: + explicit XclImpChAxis( const XclImpChRoot& rRoot, sal_uInt16 nAxisType = EXC_CHAXIS_NONE ); + + /** Reads the CHAXIS record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + /** Reads a record from the CHAXIS group (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + /** Final processing after reading the entire chart. */ + void Finalize(); + + /** Returns the font index for the axis labels. */ + virtual sal_uInt16 GetFontIndex() const; + /** Returns the font color for the axis labels. */ + virtual Color GetFontColor() const; + /** Returns the rotation value for axis labels. */ + virtual sal_uInt16 GetRotation() const; + + /** Returns the type of this axis. */ + inline sal_uInt16 GetAxisType() const { return maData.mnType; } + /** Returns the axis dimension index used by the chart API. */ + inline sal_Int32 GetApiAxisDimension() const { return maData.GetApiAxisDimension(); } + /** Returns true, if the axis is active. */ + inline bool IsActivated() const { return !mxAxisLine || mxAxisLine->IsShowAxis(); } + /** Returns true, if the axis contains caption labels. */ + inline bool HasLabels() const { return !mxTick || mxTick->HasLabels(); } + /** Returns true, if the axis shows its major grid lines. */ + inline bool HasMajorGrid() const { return mxMajorGrid.is(); } + /** Returns true, if the axis shows its minor grid lines. */ + inline bool HasMinorGrid() const { return mxMinorGrid.is(); } + + /** Creates an API axis object. */ + XAxisRef CreateAxis( const XclImpChTypeGroup& rTypeGroup, const XclImpChAxis* pCrossingAxis ) const; + /** Converts and writes 3D wall/floor properties to the passed property set. */ + void ConvertWall( ScfPropertySet& rPropSet ) const; + /** Converts position settings of this axis at a crossing axis. */ + void ConvertAxisPosition( ScfPropertySet& rPropSet, const XclImpChTypeGroup& rTypeGroup ) const; + +private: + /** Reads a CHAXISLINE record specifying the target for following line properties. */ + void ReadChAxisLine( XclImpStream& rStrm ); + /** Creates a CHFRAME object and stores it into the mxWallFrame member. */ + void CreateWallFrame(); + +private: + XclChAxis maData; /// Contents of the CHAXIS record. + XclImpChLabelRangeRef mxLabelRange; /// Category scaling (CHLABELRANGE record). + XclImpChValueRangeRef mxValueRange; /// Value scaling (CHVALUERANGE record). + XclImpChTickRef mxTick; /// Axis ticks (CHTICK record). + XclImpChFontRef mxFont; /// Index into font buffer (CHFONT record). + XclImpChLineFormatRef mxAxisLine; /// Axis line format (CHLINEFORMAT record). + XclImpChLineFormatRef mxMajorGrid; /// Major grid line format (CHLINEFORMAT record). + XclImpChLineFormatRef mxMinorGrid; /// Minor grid line format (CHLINEFORMAT record). + XclImpChFrameRef mxWallFrame; /// Wall/floor format (sub records of CHFRAME group). + sal_uInt16 mnNumFmtIdx; /// Index into number format buffer (CHFORMAT record). +}; + +typedef ScfRef< XclImpChAxis > XclImpChAxisRef; + +// ---------------------------------------------------------------------------- + +/** Represents the CHAXESSET record group describing an axes set (X/Y/Z axes). + + The CHAXESSET group consists of: CHAXESSET, CHBEGIN, CHFRAMEPOS, CHAXIS + groups, CHTEXT groups, CHPLOTFRAME group (CHPLOTFRAME with CHFRAME group), + CHTYPEGROUP group, CHEND. + */ +class XclImpChAxesSet : public XclImpChGroupBase, protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > XDiagramRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem > XCoordSystemRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XAxis > XAxisRef; + +public: + explicit XclImpChAxesSet( const XclImpChRoot& rRoot, sal_uInt16 nAxesSetId ); + + /** Reads the CHAXESSET record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + /** Reads a record from the CHAXESSET group (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + /** Final processing after reading the entire chart. */ + void Finalize(); + + /** Returns true, if this axes set exists (returns false if this is a dummy object). */ + inline bool IsValidAxesSet() const { return !maTypeGroups.empty(); } + /** Returns the index of the axes set (primary/secondary). */ + inline sal_uInt16 GetAxesSetId() const { return maData.mnAxesSetId; } + /** Returns the axes set index used by the chart API. */ + inline sal_Int32 GetApiAxesSetIndex() const { return maData.GetApiAxesSetIndex(); } + + /** Returns the outer plot area position, if existing. */ + inline XclImpChFramePosRef GetPlotAreaFramePos() const { return mxFramePos; } + /** Returns the specified chart type group. */ + inline XclImpChTypeGroupRef GetTypeGroup( sal_uInt16 nGroupIdx ) const { return maTypeGroups.get( nGroupIdx ); } + /** Returns the first chart type group. */ + XclImpChTypeGroupRef GetFirstTypeGroup() const; + /** Looks for a legend in all chart type groups and returns it. */ + XclImpChLegendRef GetLegend() const; + /** Returns series title, if the axes set contains only one single series. */ + const String& GetSingleSeriesTitle() const; + + /** Creates a coordinate system and converts all series and axis settings. */ + void Convert( XDiagramRef xDiagram ) const; + /** Converts the manual positions of all axis titles. */ + void ConvertTitlePositions() const; + +private: + /** Reads a CHAXIS record group containing a single axis. */ + void ReadChAxis( XclImpStream& rStrm ); + /** Reads a CHTEXT record group containing an axis title. */ + void ReadChText( XclImpStream& rStrm ); + /** Reads the CHPLOTFRAME record group containing diagram area formatting. */ + void ReadChPlotFrame( XclImpStream& rStrm ); + /** Reads a CHTYPEGROUP record group containing chart type and chart settings. */ + void ReadChTypeGroup( XclImpStream& rStrm ); + + /** Updates text formatting of the passed axis title with global text formatting. */ + void UpdateAxisTitle( XclImpChTextRef xTitle ); + + /** Creates a coordinate system that contains all chart types for this axes set. */ + XCoordSystemRef CreateCoordSystem( XDiagramRef xDiagram ) const; + /** Creates and inserts an axis into the container and registers the coordinate system. */ + void ConvertAxis( XclImpChAxisRef xChAxis, XclImpChTextRef xChAxisTitle, + XCoordSystemRef xCoordSystem, const XclImpChAxis* pCrossingAxis ) const; + /** Creates and returns an API axis object. */ + XAxisRef CreateAxis( const XclImpChAxis& rChAxis, const XclImpChAxis* pCrossingAxis ) const; + /** Writes all properties of the background area to the passed diagram. */ + void ConvertBackground( XDiagramRef xDiagram ) const; + +private: + typedef ScfRefMap< sal_uInt16, XclImpChTypeGroup > XclImpChTypeGroupMap; + + XclChAxesSet maData; /// Contents of the CHAXESSET record. + XclImpChFramePosRef mxFramePos; /// Outer plot area position (CHFRAMEPOS record). + XclImpChAxisRef mxXAxis; /// The X axis (CHAXIS group). + XclImpChAxisRef mxYAxis; /// The Y axis (CHAXIS group). + XclImpChAxisRef mxZAxis; /// The Z axis (CHAXIS group). + XclImpChTextRef mxXAxisTitle; /// The X axis title (CHTEXT group). + XclImpChTextRef mxYAxisTitle; /// The Y axis title (CHTEXT group). + XclImpChTextRef mxZAxisTitle; /// The Z axis title (CHTEXT group). + XclImpChFrameRef mxPlotFrame; /// Plot area (CHPLOTFRAME group). + XclImpChTypeGroupMap maTypeGroups; /// Chart type groups (CHTYPEGROUP group). +}; + +typedef ScfRef< XclImpChAxesSet > XclImpChAxesSetRef; + +// The chart object =========================================================== + +/** Represents the CHCHART record group describing the chart contents. + + The CHCHART group consists of: CHCHART, CHBEGIN, SCL, CHPLOTGROWTH, CHFRAME + group, CHSERIES groups, CHPROPERTIES, CHDEFAULTTEXT groups (CHDEFAULTTEXT + with CHTEXT groups), CHUSEDAXESSETS, CHAXESSET groups, CHTEXT groups, CHEND. + */ +class XclImpChChart : public XclImpChGroupBase, protected XclImpChRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > XChartDocRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > XDiagramRef; + +public: + explicit XclImpChChart( const XclImpRoot& rRoot ); + virtual ~XclImpChChart(); + + /** Reads the CHCHART record (called by base class). */ + virtual void ReadHeaderRecord( XclImpStream& rStrm ); + /** Reads a record from the CHCHART group (called by base class). */ + virtual void ReadSubRecord( XclImpStream& rStrm ); + /** Reads a CHDEFAULTTEXT group (default text formats). */ + void ReadChDefaultText( XclImpStream& rStrm ); + /** Reads a CHDATAFORMAT group describing a series format or a data point format. */ + void ReadChDataFormat( XclImpStream& rStrm ); + + /** Sets formatting from BIFF3-BIFF5 OBJ record, if own formatting is invisible. */ + void UpdateObjFrame( const XclObjLineData& rLineData, const XclObjFillData& rFillData ); + + /** Returns the specified chart type group. */ + XclImpChTypeGroupRef GetTypeGroup( sal_uInt16 nGroupIdx ) const; + /** Returns the specified default text. */ + XclImpChTextRef GetDefaultText( XclChTextType eTextType ) const; + /** Returns true, if the plot area has benn moved and/or resized manually. */ + bool IsManualPlotArea() const; + /** Returns the number of units on the progress bar needed for the chart. */ + inline sal_Size GetProgressSize() const { return 2 * EXC_CHART_PROGRESS_SIZE; } + + /** Converts and writes all properties to the passed chart. */ + void Convert( XChartDocRef xChartDoc, + XclImpDffConverter& rDffConv, + const ::rtl::OUString& rObjName, + const Rectangle& rChartRect ) const; + +private: + /** Reads a CHSERIES group (data series source and formatting). */ + void ReadChSeries( XclImpStream& rStrm ); + /** Reads a CHPROPERTIES record (global chart properties). */ + void ReadChProperties( XclImpStream& rStrm ); + /** Reads a CHAXESSET group (primary/secondary axes set). */ + void ReadChAxesSet( XclImpStream& rStrm ); + /** Reads a CHTEXT group (chart title and series/point captions). */ + void ReadChText( XclImpStream& rStrm ); + + /** Final processing after reading the entire chart data. */ + void Finalize(); + /** Finalizes series list, assigns child series to parent series. */ + void FinalizeSeries(); + /** Assigns all imported CHDATAFORMAT groups to the respective series. */ + void FinalizeDataFormats(); + /** Finalizes chart title, tries to detect title auto-generated from series name. */ + void FinalizeTitle(); + + /** Creates and returns a new diagram object and converts global chart settings. */ + XDiagramRef CreateDiagram() const; + +private: + typedef ::std::vector< XclImpChSeriesRef > XclImpChSeriesVec; + typedef ScfRefMap< XclChDataPointPos, XclImpChDataFormat > XclImpChDataFormatMap; + typedef ScfRefMap< sal_uInt16, XclImpChText > XclImpChTextMap; + + XclChRectangle maRect; /// Position of the chart on the sheet (CHCHART record). + XclImpChSeriesVec maSeries; /// List of series data (CHSERIES groups). + XclImpChDataFormatMap maDataFmts; /// All series and point formats (CHDATAFORMAT groups). + XclImpChFrameRef mxFrame; /// Chart frame format (CHFRAME group). + XclChProperties maProps; /// Chart properties (CHPROPERTIES record). + XclImpChTextMap maDefTexts; /// Default text objects (CHDEFAULTTEXT groups). + XclImpChAxesSetRef mxPrimAxesSet; /// Primary axes set (CHAXESSET group). + XclImpChAxesSetRef mxSecnAxesSet; /// Secondary axes set (CHAXESSET group). + XclImpChTextRef mxTitle; /// Chart title (CHTEXT group). + XclImpChLegendRef mxLegend; /// Chart legend (CHLEGEND group). +}; + +typedef ScfRef< XclImpChChart > XclImpChChartRef; + +// ---------------------------------------------------------------------------- + +/** Drawing container of a chart. */ +class XclImpChartDrawing : public XclImpDrawing +{ +public: + explicit XclImpChartDrawing( const XclImpRoot& rRoot, bool bOwnTab ); + + /** Converts all objects and inserts them into the chart drawing page. */ + void ConvertObjects( + XclImpDffConverter& rDffConv, + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& rxModel, + const Rectangle& rChartRect ); + + /** Calculate the resulting rectangle of the passed anchor. */ + virtual Rectangle CalcAnchorRect( const XclObjAnchor& rAnchor, bool bDffAnchor ) const; + /** Called whenever an object has been inserted into the draw page. */ + virtual void OnObjectInserted( const XclImpDrawObjBase& rDrawObj ); + +private: + Rectangle maChartRect; /// Position and size of the chart shape in 1/100 mm. + SCTAB mnScTab; /// Index of the sheet that contains the chart. + bool mbOwnTab; /// True = own sheet, false = embedded object. +}; + +// ---------------------------------------------------------------------------- + +/** Represents the entire chart substream (all records in BOF/EOF block). */ +class XclImpChart : protected XclImpRoot +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > XModelRef; + +public: + /** Constructs a new chart object. + @param bOwnTab True = chart is on an own sheet; false = chart is an embedded object. */ + explicit XclImpChart( const XclImpRoot& rRoot, bool bOwnTab ); + virtual ~XclImpChart(); + + /** Reads the complete chart substream (BOF/EOF block). + @descr The passed stream must be located in the BOF record of the chart substream. */ + void ReadChartSubStream( XclImpStream& rStrm ); + /** Sets formatting from BIFF3-BIFF5 OBJ record, if own formatting is invisible. */ + void UpdateObjFrame( const XclObjLineData& rLineData, const XclObjFillData& rFillData ); + + /** Returns the number of units on the progress bar needed for the chart. */ + sal_Size GetProgressSize() const; + /** Returns true, if the chart is based on a pivot table. */ + inline bool IsPivotChart() const { return mbIsPivotChart; } + + /** Creates the chart object in the passed component. */ + void Convert( XModelRef xModel, + XclImpDffConverter& rDffConv, + const ::rtl::OUString& rObjName, + const Rectangle& rChartRect ) const; + +private: + /** Returns (initially creates) the drawing container for embedded shapes. **/ + XclImpChartDrawing& GetChartDrawing(); + /** Reads the CHCHART group (entire chart data). */ + void ReadChChart( XclImpStream& rStrm ); + +private: + typedef ScfRef< XclImpChartDrawing > XclImpChartDrawingRef; + + XclImpChChartRef mxChartData; /// The chart data (CHCHART group). + XclImpChartDrawingRef mxChartDrawing; /// Drawing container for embedded shapes. + bool mbOwnTab; /// true = own sheet; false = embedded object. + bool mbIsPivotChart; /// true = chart is based on a pivot table. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xicontent.hxx b/sc/source/filter/inc/xicontent.hxx new file mode 100644 index 000000000000..810c435d34bf --- /dev/null +++ b/sc/source/filter/inc/xicontent.hxx @@ -0,0 +1,311 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XICONTENT_HXX +#define SC_XICONTENT_HXX + +#include "global.hxx" +#include "rangelst.hxx" +#include "xlcontent.hxx" +#include "xistring.hxx" +#include "xiroot.hxx" + +#include <map> + +/* ============================================================================ +Classes to import the big Excel document contents (related to several cells or +globals for the document). +- Shared string tables +- Hyperlinks +- Label ranges +- Conditional formatting +- Data validation +- Web queries +- Stream decryption +============================================================================ */ + +// Shared string table ======================================================== + +class ScBaseCell; + +/** The SST (shared string table) contains all strings used in a BIFF8 file. + + This class loads the SST, provides access to the strings, and is able to + create Calc string or edit cells. + */ +class XclImpSst : protected XclImpRoot +{ +public: + explicit XclImpSst( const XclImpRoot& rRoot ); + + /** Reads the entire SST record. + @descr Import stream must be located at start of a SST record. */ + void ReadSst( XclImpStream& rStrm ); + + /** Returns a pointer to the string with the passed index. */ + const XclImpString* GetString( sal_uInt32 nSstIndex ) const; + + /** Creates a new text cell or edit cell for a Calc document. + @param nXFIndex Index to XF for first text portion (checks escapement). */ + ScBaseCell* CreateCell( sal_uInt32 nSstIndex, sal_uInt16 nXFIndex = 0 ) const; + +private: + typedef ::std::vector< XclImpString > XclImpStringVec; + XclImpStringVec maStrings; /// List with all strings in the SST. +}; + +// Hyperlinks ================================================================= + +/** Provides importing hyperlinks and inserting them into a document. */ +class XclImpHyperlink : ScfNoInstance +{ +public: + /** Reads a HLINK record and inserts it into the document. + @descr Import stream must be located at start of a HLINK record. */ + static void ReadHlink( XclImpStream& rStrm ); + + /** Reads the (undocumented) embedded hyperlink data and returns the URL. */ + static String ReadEmbeddedData( XclImpStream& rStrm ); + + /** Inserts the URL into a range of cells. Does not modify value or formula cells. */ + static void InsertUrl( const XclImpRoot& rRoot, const XclRange& rXclRange, const String& rUrl ); + + /** Convert the sheet name with invalid character(s) in URL when the URL is + to a location within the same document (e.g. #'Sheet&Name'.A1). */ + static void ConvertToValidTabName(String& rName); +}; + +// Label ranges =============================================================== + +/** Provides importing label ranges and inserting them into a document. */ +class XclImpLabelranges : ScfNoInstance +{ +public: + /** Reads a LABELRANGES record and inserts the label ranges into the document. + @descr Import stream must be located at start of a LABELRANGES record. */ + static void ReadLabelranges( XclImpStream& rStrm ); +}; + +// Conditional formatting ===================================================== + +class ScConditionalFormat; + +/** Represents a conditional format with condition formulas, and formatting attributes. */ +class XclImpCondFormat : protected XclImpRoot +{ +public: + explicit XclImpCondFormat( const XclImpRoot& rRoot, sal_uInt32 nFormatIndex ); + virtual ~XclImpCondFormat(); + + /** Reads a CONDFMT record and initializes this conditional format. */ + void ReadCondfmt( XclImpStream& rStrm ); + /** Reads a CF record and adds a new condition and the formatting attributes. */ + void ReadCF( XclImpStream& rStrm ); + + /** Inserts this conditional format into the document. */ + void Apply(); + +private: + typedef ::std::auto_ptr< ScConditionalFormat > ScCondFmtPtr; + + ScRangeList maRanges; /// Destination cell ranges. + ScCondFmtPtr mxScCondFmt; /// Calc conditional format. + sal_uInt32 mnFormatIndex; /// Index of this conditional format in list. + sal_uInt16 mnCondCount; /// Number of conditions to be inserted. + sal_uInt16 mnCondIndex; /// Condition index to be inserted next. +}; + +// ---------------------------------------------------------------------------- + +/** Imports and collects all conditional formatting of a sheet. */ +class XclImpCondFormatManager : protected XclImpRoot +{ +public: + explicit XclImpCondFormatManager( const XclImpRoot& rRoot ); + + /** Reads a CONDFMT record and starts a new conditional format to be filled from CF records. */ + void ReadCondfmt( XclImpStream& rStrm ); + /** Reads a CF record and inserts the formatting data to the current conditional format. */ + void ReadCF( XclImpStream& rStrm ); + + /** Inserts the conditional formattings into the document. */ + void Apply(); + +private: + typedef ScfDelList< XclImpCondFormat > XclImpCondFmtList; + XclImpCondFmtList maCondFmtList; /// List with all conditional formattings. +}; + +// Data Validation ============================================================ + +/** Provides importing validation data and inserting it into a document. */ +class XclImpValidation : ScfNoInstance +{ +public: + /** Reads a DVAL record and sets marks the dropdown arrow control to be ignored. */ + static void ReadDval( XclImpStream& rStrm ); + /** Reads a DV record and inserts validation data into the document. */ + static void ReadDV( XclImpStream& rStrm ); +}; + +// Web queries ================================================================ + +/** Stores the data of one web query. */ +class XclImpWebQuery : ScfNoCopy +{ +public: + explicit XclImpWebQuery( const ScRange& rDestRange ); + + /** Reads a PARAMQRY record and sets data to the web query. */ + void ReadParamqry( XclImpStream& rStrm ); + /** Reads a WQSTRING record and sets URL. */ + void ReadWqstring( XclImpStream& rStrm ); + /** Reads a WEBQRYSETTINGS record and sets refresh rate. */ + void ReadWqsettings( XclImpStream& rStrm ); + /** Reads a WEBQRYTABLES record and sets source range list. */ + void ReadWqtables( XclImpStream& rStrm ); + + /** Inserts the web query into the document. */ + void Apply( ScDocument& rDoc, const String& rFilterName ); + +private: + /** Specifies the type of the web query (which ranges are imported). */ + enum XclImpWebQueryMode + { + xlWQUnknown, /// Not specified. + xlWQDocument, /// Entire document. + xlWQAllTables, /// All tables. + xlWQSpecTables /// Specific tables. + }; + + String maURL; /// Source document URL. + String maTables; /// List of source range names. + ScRange maDestRange; /// Destination range. + XclImpWebQueryMode meMode; /// Current mode of the web query. + sal_uInt16 mnRefresh; /// Refresh time in minutes. +}; + +// ---------------------------------------------------------------------------- + +class XclImpWebQueryBuffer : protected XclImpRoot +{ +public: + explicit XclImpWebQueryBuffer( const XclImpRoot& rRoot ); + + /** Reads the QSI record and creates a new web query in the buffer. */ + void ReadQsi( XclImpStream& rStrm ); + /** Reads a PARAMQRY record and sets data to the current web query. */ + void ReadParamqry( XclImpStream& rStrm ); + /** Reads a WQSTRING record and sets URL to the current web query. */ + void ReadWqstring( XclImpStream& rStrm ); + /** Reads a WEBQRYSETTINGS record and sets refresh rate to the current web query. */ + void ReadWqsettings( XclImpStream& rStrm ); + /** Reads a WEBQRYTABLES record and sets source range list to the current web query. */ + void ReadWqtables( XclImpStream& rStrm ); + + /** Inserts all web queries into the document. */ + void Apply(); + +private: + typedef ScfDelList< XclImpWebQuery > XclImpWebQueryList; + XclImpWebQueryList maWQList; /// List of the web query objects. +}; + +// Decryption ================================================================= + +/** Provides static functions to import stream decryption settings. */ +class XclImpDecryptHelper : ScfNoInstance +{ +public: + /** Reads the FILEPASS record, queries a password and sets decryption algorihm. + @return Error code that may cause an error message after import. */ + static ErrCode ReadFilepass( XclImpStream& rStrm ); +}; + +// ============================================================================ + +// Document protection ======================================================== + +class XclImpDocProtectBuffer : protected XclImpRoot +{ +public: + explicit XclImpDocProtectBuffer( const XclImpRoot& rRoot ); + + /** document structure protection flag */ + void ReadDocProtect( XclImpStream& rStrm ); + + /** document windows properties protection flag */ + void ReadWinProtect( XclImpStream& rStrm ); + + void ReadPasswordHash( XclImpStream& rStrm ); + + void Apply() const; + +private: + sal_uInt16 mnPassHash; + bool mbDocProtect:1; + bool mbWinProtect:1; +}; + +// Sheet protection =========================================================== + +class XclImpSheetProtectBuffer : protected XclImpRoot +{ +public: + explicit XclImpSheetProtectBuffer( const XclImpRoot& rRoot ); + + void ReadProtect( XclImpStream& rStrm, SCTAB nTab ); + + void ReadOptions( XclImpStream& rStrm, SCTAB nTab ); + + void ReadPasswordHash( XclImpStream& rStrm, SCTAB nTab ); + + void Apply() const; + +private: + struct Sheet + { + bool mbProtected; + sal_uInt16 mnPasswordHash; + sal_uInt16 mnOptions; + + Sheet(); + Sheet(const Sheet& r); + }; + + Sheet* GetSheetItem( SCTAB nTab ); + +private: + typedef ::std::map<SCTAB, Sheet> ProtectedSheetMap; + ProtectedSheetMap maProtectedSheets; +}; + + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xiescher.hxx b/sc/source/filter/inc/xiescher.hxx new file mode 100644 index 000000000000..0167d160f297 --- /dev/null +++ b/sc/source/filter/inc/xiescher.hxx @@ -0,0 +1,1275 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XIESCHER_HXX +#define SC_XIESCHER_HXX + +#include <vector> +#include <map> +#include <filter/msfilter/msdffimp.hxx> +#include <filter/msfilter/msocximex.hxx> +#include <vcl/graph.hxx> +#include "xlescher.hxx" +#include "xiroot.hxx" +#include "xistring.hxx" + +namespace com { namespace sun { namespace star { + namespace drawing { class XShape; } + namespace form { class XForm; } +} } } + +class SdrObjList; +class ScfProgressBar; +class ScfPropertySet; +class XclImpChart; +class XclImpDffConverter; +class XclImpDrawing; + +// Drawing objects ============================================================ + +class XclImpDrawObjBase; +typedef ScfRef< XclImpDrawObjBase > XclImpDrawObjRef; + +/** Base class for drawing objects (OBJ records). */ +class XclImpDrawObjBase : protected XclImpRoot +{ +public: + explicit XclImpDrawObjBase( const XclImpRoot& rRoot ); + virtual ~XclImpDrawObjBase(); + + /** Reads the BIFF3 OBJ record, returns a new drawing object. */ + static XclImpDrawObjRef ReadObj3( const XclImpRoot& rRoot, XclImpStream& rStrm ); + /** Reads the BIFF4 OBJ record, returns a new drawing object. */ + static XclImpDrawObjRef ReadObj4( const XclImpRoot& rRoot, XclImpStream& rStrm ); + /** Reads the BIFF5 OBJ record, returns a new drawing object. */ + static XclImpDrawObjRef ReadObj5( const XclImpRoot& rRoot, XclImpStream& rStrm ); + /** Reads the BIFF8 OBJ record, returns a new drawing object. */ + static XclImpDrawObjRef ReadObj8( const XclImpRoot& rRoot, XclImpStream& rStrm ); + + /** Sets whether this is an area object (then its width and height must be greater than 0). */ + inline void SetAreaObj( bool bAreaObj ) { mbAreaObj = bAreaObj; } + /** If set to true, a new SdrObject will be created while in DFF import. */ + inline void SetSimpleMacro( bool bMacro ) { mbSimpleMacro = bMacro; } + + /** Sets the object anchor explicitly. */ + void SetAnchor( const XclObjAnchor& rAnchor ); + /** Sets shape data from DFF stream. */ + void SetDffData( const DffObjData& rDffObjData, const String& rObjName, const String& rHyperlink, bool bVisible, bool bAutoMargin ); + + /** If set to false, the SdrObject will not be created, processed, or inserted into the draw page. */ + inline void SetProcessSdrObj( bool bProcess ) { mbProcessSdr = bProcess; } + /** If set to false, the SdrObject will be created or processed, but not be inserted into the draw page. */ + inline void SetInsertSdrObj( bool bInsert ) { mbInsertSdr = bInsert; } + /** If set to true, a new SdrObject will be created while in DFF import. */ + inline void SetCustomDffObj( bool bCustom ) { mbCustomDff = bCustom; } + + /** Returns the sheet index and Excel object identifier from OBJ record. */ + inline sal_uInt16 GetObjId() const { return mnObjId; } + /** Returns the Excel object type from OBJ record. */ + inline sal_uInt16 GetObjType() const { return mnObjType; } + /** Returns the name of this object, may generate a default name. */ + String GetObjName() const; + /** Returns associated macro name, if set, otherwise zero length string. */ + inline const String& GetMacroName() const { return maMacroName; } + + /** Returns the shape identifier used in the DFF stream. */ + inline sal_uInt32 GetDffShapeId() const { return mnDffShapeId; } + /** Returns the shape flags from the DFF stream. */ + inline sal_uInt32 GetDffFlags() const { return mnDffFlags; } + + /** Returns true, if the object is hidden. */ + inline bool IsHidden() const { return mbHidden; } + /** Returns true, if the object is visible. */ + inline bool IsVisible() const { return mbVisible; } + /** Returns true, if the object is printable. */ + inline bool IsPrintable() const { return mbPrintable; } + + /** Returns the object anchor if existing, null otherwise. */ + const XclObjAnchor* GetAnchor() const; + /** Returns true, if the passed size is valid for this object. */ + bool IsValidSize( const Rectangle& rAnchorRect ) const; + /** Returns the range in the sheet covered by this object. */ + ScRange GetUsedArea( SCTAB nScTab ) const; + + /** Returns true, if the object is valid and will be processed. */ + inline bool IsProcessSdrObj() const { return mbProcessSdr && !mbHidden; } + /** Returns true, if the SdrObject will be created or processed, but not be inserted into the draw page. */ + inline bool IsInsertSdrObj() const { return mbInsertSdr; } + + /** Returns the needed size on the progress bar (calls virtual DoGetProgressSize() function). */ + sal_Size GetProgressSize() const; + /** Creates and returns an SdrObject from the contained data. Caller takes ownership! */ + SdrObject* CreateSdrObject( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect, bool bIsDff ) const; + /** Additional processing for the passed SdrObject before insertion into + the drawing page (calls virtual DoPreProcessSdrObj() function). */ + void PreProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + /** Additional processing for the passed SdrObject after insertion into the + drawing page (calls virtual DoPostProcessSdrObj() function). */ + void PostProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + +protected: + /** Reads the object name in a BIFF5 OBJ record. */ + void ReadName5( XclImpStream& rStrm, sal_uInt16 nNameLen ); + /** Reads the macro link in a BIFF3 OBJ record. */ + void ReadMacro3( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the macro link in a BIFF4 OBJ record. */ + void ReadMacro4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the macro link in a BIFF5 OBJ record. */ + void ReadMacro5( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the ftMacro sub structure in an OBJ record. */ + void ReadMacro8( XclImpStream& rStrm ); + + /** Converts the passed line formatting to the passed SdrObject. */ + void ConvertLineStyle( SdrObject& rSdrObj, const XclObjLineData& rLineData ) const; + /** Converts the passed fill formatting to the passed SdrObject. */ + void ConvertFillStyle( SdrObject& rSdrObj, const XclObjFillData& rFillData ) const; + /** Converts the passed frame flags to the passed SdrObject. */ + void ConvertFrameStyle( SdrObject& rSdrObj, sal_uInt16 nFrameFlags ) const; + + /** Returns a solid line color from the passed line data struct. */ + Color GetSolidLineColor( const XclObjLineData& rLineData ) const; + /** Returns a solid fill color from the passed fill data struct. */ + Color GetSolidFillColor( const XclObjFillData& rFillData ) const; + + /** Derived classes read the contents of the a BIFF3 OBJ record from the passed stream. */ + virtual void DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Derived classes read the contents of the a BIFF4 OBJ record from the passed stream. */ + virtual void DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Derived classes read the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Derived classes read the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + + /** Derived classes may return a progress bar size different from 1. */ + virtual sal_Size DoGetProgressSize() const; + /** Derived classes create and return a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + /** Derived classes may perform additional processing for the passed SdrObject before insertion. */ + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + /** Derived classes may perform additional processing for the passed SdrObject after insertion. */ + virtual void DoPostProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + +private: + /** Reads the contents of a BIFF3 OBJ record. */ + void ImplReadObj3( XclImpStream& rStrm ); + /** Reads the contents of a BIFF4 OBJ record. */ + void ImplReadObj4( XclImpStream& rStrm ); + /** Reads the contents of a BIFF5 OBJ record. */ + void ImplReadObj5( XclImpStream& rStrm ); + /** Reads the contents of a BIFF8 OBJ record. */ + void ImplReadObj8( XclImpStream& rStrm ); + +private: + XclObjAnchor maAnchor; /// The position of the object in its parent. + sal_uInt16 mnObjId; /// The object identifier (unique per drawing). + sal_uInt16 mnObjType; /// The Excel object type from OBJ record. + sal_uInt32 mnDffShapeId; /// Shape ID from DFF stream. + sal_uInt32 mnDffFlags; /// Shape flags from DFF stream. + String maObjName; /// Name of the object. + String maMacroName; /// Name of an attached macro. + String maHyperlink; /// On-click hyperlink URL. + bool mbHasAnchor; /// true = maAnchor is initialized. + bool mbHidden; /// true = Object is hidden. + bool mbVisible; /// true = Object is visible. + bool mbPrintable; /// true = Object is printable. + bool mbAreaObj; /// true = Width and height must be greater than 0. + bool mbAutoMargin; /// true = Set automatic text margin. + bool mbSimpleMacro; /// true = Create simple macro link and hyperlink. + bool mbProcessSdr; /// true = Object is valid, do processing and insertion. + bool mbInsertSdr; /// true = Insert the SdrObject into draw page. + bool mbCustomDff; /// true = Recreate SdrObject in DFF import. +}; + +// ---------------------------------------------------------------------------- + +class XclImpDrawObjVector : public ::std::vector< XclImpDrawObjRef > +{ +public: + inline explicit XclImpDrawObjVector() {} + + /** Tries to insert the passed object into the last group or appends it. */ + void InsertGrouped( XclImpDrawObjRef xDrawObj ); + + /** Returns the needed size on the progress bar for all contained objects. */ + sal_Size GetProgressSize() const; +}; + +// ---------------------------------------------------------------------------- + +/** A placeholder object for unknown object types. */ +class XclImpPhObj : public XclImpDrawObjBase +{ +public: + explicit XclImpPhObj( const XclImpRoot& rRoot ); +}; + +// ---------------------------------------------------------------------------- + +/** A group object. */ +class XclImpGroupObj : public XclImpDrawObjBase +{ +public: + explicit XclImpGroupObj( const XclImpRoot& rRoot ); + + /** Tries to insert the drawing object into this or a nested group. */ + bool TryInsert( XclImpDrawObjRef xDrawObj ); + +protected: + /** Reads the contents of the a BIFF3 OBJ record from the passed stream. */ + virtual void DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF4 OBJ record from the passed stream. */ + virtual void DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Returns a progress bar size that takes all group children into account. */ + virtual sal_Size DoGetProgressSize() const; + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + +protected: + XclImpDrawObjVector maChildren; /// Grouped objects. + sal_uInt16 mnFirstUngrouped; /// Object identfier of first object not grouped into this group. +}; + +// ---------------------------------------------------------------------------- + +/** A line object. */ +class XclImpLineObj : public XclImpDrawObjBase +{ +public: + explicit XclImpLineObj( const XclImpRoot& rRoot ); + +protected: + /** Reads the contents of the a BIFF3 OBJ record from the passed stream. */ + virtual void DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF4 OBJ record from the passed stream. */ + virtual void DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + +protected: + XclObjLineData maLineData; /// BIFF5 line formatting. + sal_uInt16 mnArrows; /// Line arrows. + sal_uInt8 mnStartPoint; /// Starting point. +}; + +// ---------------------------------------------------------------------------- + +/** A rectangle or oval object. */ +class XclImpRectObj : public XclImpDrawObjBase +{ +public: + explicit XclImpRectObj( const XclImpRoot& rRoot ); + +protected: + /** Reads fil data, line data, and frame flags. */ + void ReadFrameData( XclImpStream& rStrm ); + + /** Converts fill formatting, line formattind, and frame style. */ + void ConvertRectStyle( SdrObject& rSdrObj ) const; + + /** Reads the contents of the a BIFF3 OBJ record from the passed stream. */ + virtual void DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF4 OBJ record from the passed stream. */ + virtual void DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + +protected: + XclObjFillData maFillData; /// BIFF5 fill formatting. + XclObjLineData maLineData; /// BIFF5 line formatting. + sal_uInt16 mnFrameFlags; /// Additional flags. +}; + +// ---------------------------------------------------------------------------- + +/** An oval object. */ +class XclImpOvalObj : public XclImpRectObj +{ +public: + explicit XclImpOvalObj( const XclImpRoot& rRoot ); + +protected: + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; +}; + +// ---------------------------------------------------------------------------- + +/** An arc object. */ +class XclImpArcObj : public XclImpDrawObjBase +{ +public: + explicit XclImpArcObj( const XclImpRoot& rRoot ); + +protected: + /** Reads the contents of the a BIFF3 OBJ record from the passed stream. */ + virtual void DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF4 OBJ record from the passed stream. */ + virtual void DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + +protected: + XclObjFillData maFillData; /// BIFF5 fill formatting. + XclObjLineData maLineData; /// BIFF5 line formatting. + sal_uInt8 mnQuadrant; /// Visible quadrant of the circle. +}; + +// ---------------------------------------------------------------------------- + +/** A polygon object. */ +class XclImpPolygonObj : public XclImpRectObj +{ +public: + explicit XclImpPolygonObj( const XclImpRoot& rRoot ); + +protected: + /** Reads the COORDLIST record following the OBJ record. */ + void ReadCoordList( XclImpStream& rStrm ); + + /** Reads the contents of the a BIFF4 OBJ record from the passed stream. */ + virtual void DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + +protected: + typedef ::std::vector< Point > PointVector; + PointVector maCoords; /// Coordinates relative to bounding rectangle. + sal_uInt16 mnPolyFlags; /// Additional flags. + sal_uInt16 mnPointCount; /// Polygon point count. +}; + +// ---------------------------------------------------------------------------- + +struct XclImpObjTextData +{ + XclObjTextData maData; /// BIFF5 text data. + XclImpStringRef mxString; /// Plain or rich string. + + /** Reads a byte string from the passed stream. */ + void ReadByteString( XclImpStream& rStrm ); + /** Reads text formatting from the passed stream. */ + void ReadFormats( XclImpStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +/** A drawing object supporting text contents. Used for all simple objects in BIFF8. */ +class XclImpTextObj : public XclImpRectObj +{ +public: + explicit XclImpTextObj( const XclImpRoot& rRoot ); + + /** Stores the passed textbox data. */ + inline void SetTextData( const XclImpObjTextData& rTextData ) { maTextData = rTextData; } + +protected: + /** Reads the contents of the a BIFF3 OBJ record from the passed stream. */ + virtual void DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF4 OBJ record from the passed stream. */ + virtual void DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + /** Inserts the contained text data at the passed object. */ + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + +protected: + XclImpObjTextData maTextData; /// Textbox data from BIFF5 OBJ or BIFF8 TXO record. +}; + +// ---------------------------------------------------------------------------- + +/** A chart object. This is the drawing object wrapper for the chart data. */ +class XclImpChartObj : public XclImpRectObj +{ +public: + /** @param bOwnTab True = chart is on an own sheet; false = chart is an embedded object. */ + explicit XclImpChartObj( const XclImpRoot& rRoot, bool bOwnTab = false ); + + /** Reads the complete chart substream (BOF/EOF block). */ + void ReadChartSubStream( XclImpStream& rStrm ); + +protected: + /** Reads the contents of the a BIFF3 OBJ record from the passed stream. */ + virtual void DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF4 OBJ record from the passed stream. */ + virtual void DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + /** Returns the needed size on the progress bar. */ + virtual sal_Size DoGetProgressSize() const; + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + /** Converts the chart document. */ + virtual void DoPostProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + +private: + /** Calculates the object anchor of a sheet chart (chart fills one page). */ + void FinalizeTabChart(); + +private: + typedef ScfRef< XclImpChart > XclImpChartRef; + + XclImpChartRef mxChart; /// The chart itself (BOF/EOF substream data). + bool mbOwnTab; /// true = own sheet; false = embedded object. +}; + +// ---------------------------------------------------------------------------- + +/** A note object, which is a specialized text box objext. */ +class XclImpNoteObj : public XclImpTextObj +{ +public: + explicit XclImpNoteObj( const XclImpRoot& rRoot ); + + /** Sets note flags and the note position in the Calc sheet. */ + void SetNoteData( const ScAddress& rScPos, sal_uInt16 nNoteFlags ); + +protected: + /** Inserts the note into the document, sets visibility. */ + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + +private: + ScAddress maScPos; /// Cell position of the note object. + sal_uInt16 mnNoteFlags; /// Flags from NOTE record. +}; + +// ---------------------------------------------------------------------------- + +/** Helper base class for TBX and OCX form controls to manage spreadsheet links. */ +class XclImpControlHelper +{ +public: + explicit XclImpControlHelper( const XclImpRoot& rRoot, XclCtrlBindMode eBindMode ); + virtual ~XclImpControlHelper(); + + /** Returns true, if a linked cell address is present. */ + inline bool HasCellLink() const { return mxCellLink.is(); } + /** Returns true, if a linked source cell range is present. */ + inline bool HasSourceRange() const { return mxSrcRange.is(); } + + /** Returns the SdrObject from the passed control shape and sets the bounding rectangle. */ + SdrObject* CreateSdrObjectFromShape( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape, + const Rectangle& rAnchorRect ) const; + + /** Sets additional properties to the form control model, calls virtual DoProcessControl(). */ + void ProcessControl( const XclImpDrawObjBase& rDrawObj ) const; + +protected: + /** Reads the formula for the linked cell from the current position of the stream. */ + void ReadCellLinkFormula( XclImpStream& rStrm, bool bWithBoundSize ); + /** Reads the formula for the source range from the current position of the stream. */ + void ReadSourceRangeFormula( XclImpStream& rStrm, bool bWithBoundSize ); + + /** Derived classes will set additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + +private: + /** Reads a list of cell ranges from a formula at the current stream position. */ + void ReadRangeList( ScRangeList& rScRanges, XclImpStream& rStrm ); + /** Reads leading formula size and a list of cell ranges from a formula if the leading size is not zero. */ + void ReadRangeList( ScRangeList& rScRanges, XclImpStream& rStrm, bool bWithBoundSize ); + +private: + const XclImpRoot& mrRoot; /// Not derived from XclImpRoot to allow multiple inheritance. + mutable ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + mxShape; /// The UNO wrapper of the control shape. + ScfRef< ScAddress > mxCellLink; /// Linked cell in the Calc document. + ScfRef< ScRange > mxSrcRange; /// Source data range in the Calc document. + XclCtrlBindMode meBindMode; /// Value binding mode. +}; + +// ---------------------------------------------------------------------------- + +/** Base class for textbox based form controls. */ +class XclImpTbxObjBase : public XclImpTextObj, public XclImpControlHelper +{ +public: + explicit XclImpTbxObjBase( const XclImpRoot& rRoot ); + + /** Sets line and fill formatting from the passed DFF property set. */ + void SetDffProperties( const DffPropSet& rDffPropSet ); + + /** Returns the service name of the control component to be created. */ + inline ::rtl::OUString GetServiceName() const { return DoGetServiceName(); } + /** Fills the passed macro event descriptor. */ + bool FillMacroDescriptor( + ::com::sun::star::script::ScriptEventDescriptor& rDescriptor ) const; + +protected: + /** Sets control text formatting. */ + void ConvertFont( ScfPropertySet& rPropSet ) const; + /** Sets control label and text formatting. */ + void ConvertLabel( ScfPropertySet& rPropSet ) const; + + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + /** Additional processing on the SdrObject, calls new virtual function DoProcessControl(). */ + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + + /** Derived classes return the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const = 0; + /** Derived classes return the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const = 0; +}; + +// ---------------------------------------------------------------------------- + +/** A button control. */ +class XclImpButtonObj : public XclImpTbxObjBase +{ +public: + explicit XclImpButtonObj( const XclImpRoot& rRoot ); + +protected: + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; +}; + +// ---------------------------------------------------------------------------- + +/** A checkbox control. */ +class XclImpCheckBoxObj : public XclImpTbxObjBase +{ +public: + explicit XclImpCheckBoxObj( const XclImpRoot& rRoot ); + +protected: + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; + +protected: + sal_uInt16 mnState; + sal_uInt16 mnCheckBoxFlags; +}; + +// ---------------------------------------------------------------------------- + +/** An option button control. */ +class XclImpOptionButtonObj : public XclImpCheckBoxObj +{ +public: + explicit XclImpOptionButtonObj( const XclImpRoot& rRoot ); + +protected: + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; + +protected: + sal_uInt16 mnNextInGroup; /// Next option button in a group. + sal_uInt16 mnFirstInGroup; /// 1 = Button is the first in a group. +}; + +// ---------------------------------------------------------------------------- + +/** A label control. */ +class XclImpLabelObj : public XclImpTbxObjBase +{ +public: + explicit XclImpLabelObj( const XclImpRoot& rRoot ); + +protected: + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; +}; + +// ---------------------------------------------------------------------------- + +/** A groupbox control. */ +class XclImpGroupBoxObj : public XclImpTbxObjBase +{ +public: + explicit XclImpGroupBoxObj( const XclImpRoot& rRoot ); + +protected: + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; + +protected: + sal_uInt16 mnGroupBoxFlags; +}; + +// ---------------------------------------------------------------------------- + +/** A dialog control. */ +class XclImpDialogObj : public XclImpTbxObjBase +{ +public: + explicit XclImpDialogObj( const XclImpRoot& rRoot ); + +protected: + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; +}; + +// ---------------------------------------------------------------------------- + +/** An edit control. */ +class XclImpEditObj : public XclImpTbxObjBase +{ +public: + explicit XclImpEditObj( const XclImpRoot& rRoot ); + +protected: + /** REturns true, if the field type is numeric. */ + bool IsNumeric() const; + + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; + +protected: + sal_uInt16 mnContentType; + sal_uInt16 mnMultiLine; + sal_uInt16 mnScrollBar; + sal_uInt16 mnListBoxObjId; +}; + +// ---------------------------------------------------------------------------- + +/** Base class of scrollable form controls (spin button, scrollbar, listbox, dropdown). */ +class XclImpTbxObjScrollableBase : public XclImpTbxObjBase +{ +public: + explicit XclImpTbxObjScrollableBase( const XclImpRoot& rRoot ); + +protected: + /** Reads scrollbar data. */ + void ReadSbs( XclImpStream& rStrm ); + + /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + +protected: + sal_uInt16 mnValue; + sal_uInt16 mnMin; + sal_uInt16 mnMax; + sal_uInt16 mnStep; + sal_uInt16 mnPageStep; + sal_uInt16 mnOrient; + sal_uInt16 mnThumbWidth; + sal_uInt16 mnScrollFlags; +}; + +// ---------------------------------------------------------------------------- + +/** A spinbutton control. */ +class XclImpSpinButtonObj : public XclImpTbxObjScrollableBase +{ +public: + explicit XclImpSpinButtonObj( const XclImpRoot& rRoot ); + +protected: + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; +}; + +// ---------------------------------------------------------------------------- + +/** A scrollbar control. */ +class XclImpScrollBarObj : public XclImpTbxObjScrollableBase +{ +public: + explicit XclImpScrollBarObj( const XclImpRoot& rRoot ); + +protected: + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; +}; + +// ---------------------------------------------------------------------------- + +/** Base class for list controls (listbox, dropdown). */ +class XclImpTbxObjListBase : public XclImpTbxObjScrollableBase +{ +public: + explicit XclImpTbxObjListBase( const XclImpRoot& rRoot ); + +protected: + /** Reads common listbox settings. */ + void ReadLbsData( XclImpStream& rStrm ); + /** Sets common listbox/dropdown formatting attributes. */ + void SetBoxFormatting( ScfPropertySet& rPropSet ) const; + +protected: + sal_uInt16 mnEntryCount; + sal_uInt16 mnSelEntry; + sal_uInt16 mnListFlags; + sal_uInt16 mnEditObjId; + bool mbHasDefFontIdx; +}; + +// ---------------------------------------------------------------------------- + +/** A listbox control. */ +class XclImpListBoxObj : public XclImpTbxObjListBase +{ +public: + explicit XclImpListBoxObj( const XclImpRoot& rRoot ); + +protected: + /** Reads listbox settings and selection. */ + void ReadFullLbsData( XclImpStream& rStrm, sal_Size nRecLeft ); + + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; + +protected: + ScfUInt8Vec maSelection; +}; + +// ---------------------------------------------------------------------------- + +/** A dropdown listbox control. */ +class XclImpDropDownObj : public XclImpTbxObjListBase +{ +public: + explicit XclImpDropDownObj( const XclImpRoot& rRoot ); + +protected: + /** Returns the type of the dropdown control. */ + sal_uInt16 GetDropDownType() const; + + /** Reads dropdown box settings. */ + void ReadFullLbsData( XclImpStream& rStrm ); + + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + /** Sets additional properties for the current form control. */ + virtual void DoProcessControl( ScfPropertySet& rPropSet ) const; + /** Returns the service name of the control component to be created. */ + virtual ::rtl::OUString DoGetServiceName() const; + /** Returns the type of the macro event to be created. */ + virtual XclTbxEventType DoGetEventType() const; + +protected: + sal_uInt16 mnLeft; + sal_uInt16 mnTop; + sal_uInt16 mnRight; + sal_uInt16 mnBottom; + sal_uInt16 mnDropDownFlags; + sal_uInt16 mnLineCount; + sal_uInt16 mnMinWidth; +}; + +// ---------------------------------------------------------------------------- + +/** A picture, an embedded or linked OLE object, or an OCX form control. */ +class XclImpPictureObj : public XclImpRectObj, public XclImpControlHelper +{ +public: + explicit XclImpPictureObj( const XclImpRoot& rRoot ); + + /** Returns the graphic imported from the IMGDATA record. */ + inline const Graphic& GetGraphic() const { return maGraphic; } + /** Returns the visible area of the imported graphic. */ + inline const Rectangle& GetVisArea() const { return maVisArea; } + + /** Returns true, if the OLE object will be shown as symbol. */ + inline bool IsSymbol() const { return mbSymbol; } + /** Returns the storage name for the OLE object. */ + String GetOleStorageName() const; + + /** Returns true, if this object is an OCX form control. */ + inline bool IsOcxControl() const { return mbEmbedded && mbControl && mbUseCtlsStrm; } + /** Returns the position in the 'Ctls' stream for additional form control data. */ + inline sal_Size GetCtlsStreamPos() const { return mnCtlsStrmPos; } + /** Returns the size in the 'Ctls' stream for additional form control data. */ + inline sal_Size GetCtlsStreamSize() const { return mnCtlsStrmSize; } + +protected: + /** Reads the contents of the a BIFF3 OBJ record from the passed stream. */ + virtual void DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF4 OBJ record from the passed stream. */ + virtual void DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ); + /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ + virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); + /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ + virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); + /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + /** Overloaded to do additional processing on the SdrObject. */ + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + +private: + /** Reads and sets the picture flags from a BIFF3-BIFF5 OBJ picture record. */ + void ReadFlags3( XclImpStream& rStrm ); + /** Reads the contents of the OBJFLAGS subrecord. */ + void ReadFlags8( XclImpStream& rStrm ); + /** Reads the contents of the OBJPICTFMLA subrecord. */ + void ReadPictFmla( XclImpStream& rStrm, sal_uInt16 nLinkSize ); + +private: + Graphic maGraphic; /// Picture or OLE placeholder graphic. + Rectangle maVisArea; /// Size of graphic. + String maClassName; /// Class name of embedded OLE object. + sal_uInt32 mnStorageId; /// Identifier of the storage for this object. + sal_Size mnCtlsStrmPos; /// Position in 'Ctls' stream for this control. + sal_Size mnCtlsStrmSize; /// Size in 'Ctls' stream for this control. + bool mbEmbedded; /// true = Embedded OLE object. + bool mbLinked; /// true = Linked OLE object. + bool mbSymbol; /// true = Show as symbol. + bool mbControl; /// true = Form control, false = OLE object. + bool mbUseCtlsStrm; /// true = Form control data in 'Ctls' stream, false = Own storage. +}; + +// DFF stream conversion ====================================================== + +/** The solver container collects all connector rules for connected objects. */ +class XclImpSolverContainer : public SvxMSDffSolverContainer +{ +public: +//UNUSED2009-05 /** Reads the entire solver container. Stream must point to begin of container header. */ +//UNUSED2009-05 void ReadSolverContainer( SvStream& rDffStrm ); + + /** Inserts information about a new SdrObject. */ + void InsertSdrObjectInfo( SdrObject& rSdrObj, sal_uInt32 nDffShapeId, sal_uInt32 nDffFlags ); + /** Removes inforamtion of an SdrObject (and all child objects if it is a group). */ + void RemoveSdrObjectInfo( SdrObject& rSdrObj ); + + /** Inserts the SdrObject pointers into all connector rules. */ + void UpdateConnectorRules(); + /** Removes all contained connector rules. */ + void RemoveConnectorRules(); + +private: + /** Returns the first connector rule from the internal list. */ + SvxMSDffConnectorRule* GetFirstRule(); + /** Returns the next connector rule from the internal list. */ + SvxMSDffConnectorRule* GetNextRule(); + /** Updates the data of a connected shape in a connector rule. */ + void UpdateConnection( sal_uInt32 nDffShapeId, SdrObject*& rpSdrObj, sal_uInt32* pnDffFlags = 0 ); + +private: + /** Stores data about an SdrObject processed during import. */ + struct XclImpSdrInfo + { + SdrObject* mpSdrObj; /// Pointer to an SdrObject. + sal_uInt32 mnDffFlags; /// Shape flags from DFF stream. + inline explicit XclImpSdrInfo() : mpSdrObj( 0 ), mnDffFlags( 0 ) {} + inline void Set( SdrObject* pSdrObj, sal_uInt32 nDffFlags ) + { mpSdrObj = pSdrObj; mnDffFlags = nDffFlags; } + }; + typedef ::std::map< sal_uInt32, XclImpSdrInfo > XclImpSdrInfoMap; + typedef ::std::map< SdrObject*, sal_uInt32 > XclImpSdrObjMap; + + XclImpSdrInfoMap maSdrInfoMap; /// Maps shape IDs to SdrObjects and flags. + XclImpSdrObjMap maSdrObjMap; /// Maps SdrObjects to shape IDs. +}; + +// ---------------------------------------------------------------------------- + +/** Simple implementation of the SVX DFF manager. Implements resolving palette + colors. Used by XclImpDffPropSet (as is), extended by XclImpDffConverter. + */ +class XclImpSimpleDffConverter : public SvxMSDffManager, protected XclImpRoot +{ +public: + explicit XclImpSimpleDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ); + virtual ~XclImpSimpleDffConverter(); + +protected: + /** Returns a color from the Excel color palette. */ + virtual FASTBOOL GetColorFromPalette( USHORT nIndex, Color& rColor ) const; +}; + +// ---------------------------------------------------------------------------- + +/** This is the central instance for converting binary DFF data into shape + objects. Used for all sheet shapes and shapes embedded in chart objects. + + The class derives from SvxMSDffManager and SvxMSConvertOCXControls and + contains core implementation of DFF stream import and OCX form control + import. + */ +class XclImpDffConverter : public XclImpSimpleDffConverter, private SvxMSConvertOCXControls +{ +public: + explicit XclImpDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ); + virtual ~XclImpDffConverter(); + + /** Initializes the internal progress bar with the passed size and starts it. */ + void StartProgressBar( sal_Size nProgressSize ); + /** Increase the progress bar by the passed value. */ + void Progress( sal_Size nDelta = 1 ); + + /** Initially called before the objects of the passed drawing manager are converted. */ + void InitializeDrawing( XclImpDrawing& rDrawing, SdrModel& rSdrModel, SdrPage& rSdrPage ); + /** Processes BIFF5 drawing objects without DFF data, inserts into the passed object list. */ + void ProcessObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj ); + /** Processes all objects in the passed list. */ + void ProcessDrawing( const XclImpDrawObjVector& rDrawObjs ); + /** Processes a drawing container in the passed DFF stream, converts all objects. */ + void ProcessDrawing( SvStream& rDffStrm ); + /** Finally called after the objects of the passed drawing manager have been converted. */ + void FinalizeDrawing(); + + /** Creates the SdrObject for the passed Excel TBX form control object. */ + SdrObject* CreateSdrObject( const XclImpTbxObjBase& rTbxObj, const Rectangle& rAnchorRect ); + /** Creates the SdrObject for the passed Excel OLE object or OCX form control object. */ + SdrObject* CreateSdrObject( const XclImpPictureObj& rPicObj, const Rectangle& rAnchorRect ); + + /** Returns true, if the conversion of OLE objects is supported. */ + bool SupportsOleObjects() const; + /** Returns the default text margin in drawing layer units. */ + inline sal_Int32 GetDefaultTextMargin() const { return mnDefTextMargin; } + +private: + // virtual functions of SvxMSDffManager + + /** Reads the client anchor from the DFF stream and sets it at the correct object. */ + virtual void ProcessClientAnchor2( + SvStream& rDffStrm, + DffRecordHeader& rHeader, + void* pClientData, + DffObjData& rObjData ); + /** Processes an DFF object, reads properties from DFF stream. */ + virtual SdrObject* ProcessObj( + SvStream& rDffStrm, + DffObjData& rDffObjData, + void* pClientData, + Rectangle& rTextRect, + SdrObject* pOldSdrObj = 0 ); + /** Returns the BLIP stream position, based on the passed DFF stream position. */ + virtual ULONG Calc_nBLIPPos( ULONG nOrgVal, ULONG nStreamPos ) const; + + // virtual functions of SvxMSConvertOCXControls + + /** Inserts the passed control rxFComp into the form. Needs call to SetCurrentForm() before. */ + virtual sal_Bool InsertControl( + const ::com::sun::star::uno::Reference< + ::com::sun::star::form::XFormComponent >& rxFormComp, + const ::com::sun::star::awt::Size& rSize, + ::com::sun::star::uno::Reference< + ::com::sun::star::drawing::XShape >* pxShape, + BOOL bFloatingCtrl ); + +private: + /** Data per registered drawing manager, will be stacked for recursive calls. */ + struct XclImpDffConvData + { + XclImpDrawing& mrDrawing; /// Current drawing container with all drawing objects. + SdrModel& mrSdrModel; /// The SdrModel of the drawing manager. + SdrPage& mrSdrPage; /// The SdrPage of the drawing manager. + XclImpSolverContainer maSolverCont; /// The solver container for connector rules. + ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > + mxCtrlForm; /// Controls form of current drawing page. + sal_Int32 mnLastCtrlIndex; /// Last insertion index of a form control (for macro events). + bool mbHasCtrlForm; /// True = mxCtrlForm is initialized (but maybe still null). + + explicit XclImpDffConvData( XclImpDrawing& rDrawing, + SdrModel& rSdrModel, SdrPage& rSdrPage ); + }; + + /** Returns the current drawing manager data struct from top of the stack. */ + XclImpDffConvData& GetConvData(); + /** Returns the current drawing manager data struct from top of the stack. */ + const XclImpDffConvData& GetConvData() const; + + /** Reads contents of a hyperlink property and returns the extracted URL. */ + String ReadHlinkProperty( SvStream& rDffStrm ) const; + + /** Processes a drawing container (all drawing data of a sheet). */ + void ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader ); + /** Processes the global shape group container (all shapes of a sheet). */ + void ProcessShGrContainer( SvStream& rDffStrm, const DffRecordHeader& rShGrHeader ); + /** Processes the solver container (connectors of a sheet). */ + void ProcessSolverContainer( SvStream& rDffStrm, const DffRecordHeader& rSolverHeader ); + /** Processes a shape or shape group container (one top-level shape). */ + void ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader ); + + /** Inserts the passed SdrObject into the document. This function takes ownership of pSdrObj! */ + void InsertSdrObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj ); + /** Initializes the mxCtrlForm referring to the standard controls form. */ + void InitControlForm(); + +private: + typedef ScfRef< ScfProgressBar > ScfProgressBarRef; + typedef ScfRef< XclImpDffConvData > XclImpDffConvDataRef; + typedef ::std::vector< XclImpDffConvDataRef > XclImpDffConvDataStack; + + const ::rtl::OUString maStdFormName; /// Standard name of control forms. + SotStorageStreamRef mxCtlsStrm; /// The 'Ctls' stream for OCX form controls. + ScfProgressBarRef mxProgress; /// The progress bar used in ProcessObj(). + XclImpDffConvDataStack maDataStack; /// Stack for registered drawing managers. + sal_uInt32 mnOleImpFlags; /// Application OLE import settings. + sal_Int32 mnDefTextMargin; /// Default margin in text boxes. +}; + +// Drawing manager ============================================================ + +/** Base class for a container for all objects on a drawing (spreadsheet or + embedded chart object). */ +class XclImpDrawing : protected XclImpRoot +{ +public: + explicit XclImpDrawing( const XclImpRoot& rRoot, bool bOleObjects ); + virtual ~XclImpDrawing(); + + /** Reads and returns a bitmap from the IMGDATA record. */ + static Graphic ReadImgData( const XclImpRoot& rRoot, XclImpStream& rStrm ); + + /** Reads a plain OBJ record (without leading DFF data). */ + void ReadObj( XclImpStream& rStrm ); + /** Reads the MSODRAWING or MSODRAWINGSELECTION record. */ + void ReadMsoDrawing( XclImpStream& rStrm ); + + /** Returns true, if the conversion of OLE objects is supported. */ + inline bool SupportsOleObjects() const { return mbOleObjs; } + /** Finds the OBJ record data related to the DFF shape at the passed position. */ + XclImpDrawObjRef FindDrawObj( const DffRecordHeader& rHeader ) const; + /** Finds the OBJ record data specified by the passed object identifier. */ + XclImpDrawObjRef FindDrawObj( sal_uInt16 nObjId ) const; + /** Finds the textbox data related to the DFF shape at the passed position. */ + const XclImpObjTextData* FindTextData( const DffRecordHeader& rHeader ) const; + + /** Sets the object with the passed identification to be skipped on import. */ + void SetSkipObj( sal_uInt16 nObjId ); + /** Returns the size of the progress bar shown while processing all objects. */ + sal_Size GetProgressSize() const; + + /** Derived classes calculate the resulting rectangle of the passed anchor. */ + virtual Rectangle CalcAnchorRect( const XclObjAnchor& rAnchor, bool bDffAnchor ) const = 0; + /** Called whenever an object has been inserted into the draw page. */ + virtual void OnObjectInserted( const XclImpDrawObjBase& rDrawObj ) = 0; + +protected: + /** Appends a new drawing object to the list of raw objects (without DFF data). */ + void AppendRawObject( const XclImpDrawObjRef& rxDrawObj ); + /** Converts all objects and inserts them into the current drawing page. */ + void ImplConvertObjects( XclImpDffConverter& rDffConv, SdrModel& rSdrModel, SdrPage& rSdrPage ); + +private: + /** Reads and returns a bitmap from WMF/PICT format. */ + static void ReadWmf( Graphic& rGraphic, const XclImpRoot& rRoot, XclImpStream& rStrm ); + /** Reads and returns a bitmap from BMP format. */ + static void ReadBmp( Graphic& rGraphic, const XclImpRoot& rRoot, XclImpStream& rStrm ); + + /** Reads contents of an DFF record and append data to internal DFF stream. */ + void ReadDffRecord( XclImpStream& rStrm ); + /** Reads a BIFF8 OBJ record following an MSODRAWING record. */ + void ReadObj8( XclImpStream& rStrm ); + /** Reads the TXO record and following CONTINUE records containing string and formatting. */ + void ReadTxo( XclImpStream& rStrm ); + +private: + typedef ::std::map< sal_Size, XclImpDrawObjRef > XclImpObjMap; + typedef ::std::map< sal_uInt16, XclImpDrawObjRef > XclImpObjMapById; + typedef ScfRef< XclImpObjTextData > XclImpObjTextRef; + typedef ::std::map< sal_Size, XclImpObjTextRef > XclImpObjTextMap; + + XclImpDrawObjVector maRawObjs; /// BIFF5 objects without DFF data. + SvMemoryStream maDffStrm; /// Copy of the DFF page stream in memory. + XclImpObjMap maObjMap; /// Maps BIFF8 drawing objects to DFF stream position. + XclImpObjMapById maObjMapId; /// Maps BIFF8 drawing objects to object ID. + XclImpObjTextMap maTextMap; /// Maps BIFF8 TXO textbox data to DFF stream position. + ScfUInt16Vec maSkipObjs; /// IDs of all objects to be skipped. + bool mbOleObjs; /// True = draw model supports OLE objects. +}; + +// ---------------------------------------------------------------------------- + +/** Drawing manager of a single sheet. */ +class XclImpSheetDrawing : public XclImpDrawing +{ +public: + explicit XclImpSheetDrawing( const XclImpRoot& rRoot, SCTAB nScTab ); + + /** Reads the NOTE record. */ + void ReadNote( XclImpStream& rStrm ); + /** Inserts a new chart object and reads the chart substream (BOF/EOF block). + @descr Used to import chart sheets, which do not have a corresponding OBJ record. */ + void ReadTabChart( XclImpStream& rStrm ); + + /** Returns the total cell range covered by any shapes in the sheet. */ + inline const ScRange& GetUsedArea() const { return maScUsedArea; } + /** Converts all objects and inserts them into the sheet drawing page. */ + void ConvertObjects( XclImpDffConverter& rDffConv ); + + /** Calculate the resulting rectangle of the passed anchor. */ + virtual Rectangle CalcAnchorRect( const XclObjAnchor& rAnchor, bool bDffAnchor ) const; + /** On call, updates the used area of the sheet. */ + virtual void OnObjectInserted( const XclImpDrawObjBase& rDrawObj ); + +private: + /** Reads a BIFF3-BIFF5 NOTE record. */ + void ReadNote3( XclImpStream& rStrm ); + /** Reads a BIFF8 NOTE record. */ + void ReadNote8( XclImpStream& rStrm ); + +private: + ScRange maScUsedArea; /// Sheet index and used area in this sheet. +}; + +// The object manager ========================================================= + +/** Stores all drawing and OLE objects and additional data related to these objects. */ +class XclImpObjectManager : protected XclImpRoot +{ +public: + explicit XclImpObjectManager( const XclImpRoot& rRoot ); + virtual ~XclImpObjectManager(); + + /** Reads the MSODRAWINGGROUP record. */ + void ReadMsoDrawingGroup( XclImpStream& rStrm ); + + /** Returns (initially creates) the drawing manager of the specified sheet. */ + XclImpSheetDrawing& GetSheetDrawing( SCTAB nScTab ); + /** Inserts all objects into the Calc document. */ + void ConvertObjects(); + + /** Returns the default name for the passed object. */ + String GetDefaultObjName( const XclImpDrawObjBase& rDrawObj ) const; + /** Returns the used area in the sheet with the passed index. */ + ScRange GetUsedArea( SCTAB nScTab ) const; + + // ------------------------------------------------------------------------ +private: + typedef ::std::map< sal_uInt16, String > DefObjNameMap; + typedef ScfRef< XclImpSheetDrawing > XclImpSheetDrawingRef; + typedef ::std::map< SCTAB, XclImpSheetDrawingRef > XclImpSheetDrawingMap; + + DefObjNameMap maDefObjNames; /// Default base names for all object types. + SvMemoryStream maDggStrm; /// Copy of global DFF data (DGG container) in memory. + XclImpSheetDrawingMap maSheetDrawings; /// Drawing managers of all sheets. +}; + +// DFF property set helper ==================================================== + +/** This class reads an DFF property set (msofbtOPT record). + + It can return separate property values or an item set which contains items + translated from these properties. + */ +class XclImpDffPropSet : protected XclImpRoot +{ +public: + explicit XclImpDffPropSet( const XclImpRoot& rRoot ); + + /** Reads an DFF property set from the stream. + @descr The stream must point to the start of an DFF record containing properties. */ + void Read( XclImpStream& rStrm ); + + /** Returns the specified property or the default value, if not extant. */ + sal_uInt32 GetPropertyValue( sal_uInt16 nPropId, sal_uInt32 nDefault = 0 ) const; + + /** Translates the properties and fills the item set. */ + void FillToItemSet( SfxItemSet& rItemSet ) const; + +private: + typedef ::std::auto_ptr< SvMemoryStream > SvMemoryStreamPtr; + + SvMemoryStream maDummyStrm; /// Dummy DGG stream for DFF manager. + XclImpSimpleDffConverter maDffConv; /// DFF converter used to resolve palette colors. + SvMemoryStreamPtr mxMemStrm; /// Helper stream. +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclImpDffPropSet& rPropSet ); + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xiformula.hxx b/sc/source/filter/inc/xiformula.hxx new file mode 100644 index 000000000000..6151222746cd --- /dev/null +++ b/sc/source/filter/inc/xiformula.hxx @@ -0,0 +1,68 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XIFORMULA_HXX +#define SC_XIFORMULA_HXX + +#include "xlformula.hxx" +#include "xiroot.hxx" + +// Formula compiler =========================================================== + +class ScRangeList; +class XclImpFmlaCompImpl; + +/** The formula compiler to create Calc token arrays from Excel token arrays. */ +class XclImpFormulaCompiler : protected XclImpRoot +{ +public: + explicit XclImpFormulaCompiler( const XclImpRoot& rRoot ); + virtual ~XclImpFormulaCompiler(); + + /** Creates a range list from the passed Excel token array. + @param rStrm Stream pointing to additional formula data (e.g. constant array data). */ + void CreateRangeList( + ScRangeList& rScRanges, XclFormulaType eType, + const XclTokenArray& rXclTokArr, XclImpStream& rStrm ); + + /** + * Creates a formula token array from the Excel token array. Note that + * the caller must create a copy of the token array instance returend by + * this function if the caller needs to persistently store the array, + * because the pointer points to an array instance on the stack. + */ + const ScTokenArray* CreateFormula( XclFormulaType eType, const XclTokenArray& rXclTokArr ); + +private: + typedef ScfRef< XclImpFmlaCompImpl > XclImpFmlaCompImplRef; + XclImpFmlaCompImplRef mxImpl; +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xihelper.hxx b/sc/source/filter/inc/xihelper.hxx new file mode 100644 index 000000000000..05412c306c0c --- /dev/null +++ b/sc/source/filter/inc/xihelper.hxx @@ -0,0 +1,369 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XIHELPER_HXX +#define SC_XIHELPER_HXX + +#include <editeng/editdata.hxx> +#include "scmatrix.hxx" +#include "xladdress.hxx" +#include "xiroot.hxx" +#include "xistring.hxx" + +// Excel->Calc cell address/range conversion ================================== + +/** Provides functions to convert Excel cell addresses to Calc cell addresses. */ +class XclImpAddressConverter : public XclAddressConverterBase +{ +public: + explicit XclImpAddressConverter( const XclImpRoot& rRoot ); + + // cell address ----------------------------------------------------------- + + /** Checks if the passed Excel cell address is valid. + @param rXclPos The Excel cell address to check. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell address is not valid. + @return true = Cell address in rXclPos is valid. */ + bool CheckAddress( const XclAddress& rXclPos, bool bWarn ); + + /** Converts the passed Excel cell address to a Calc cell address. + @param rScPos (Out) The converted Calc cell address, if valid. + @param rXclPos The Excel cell address to convert. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell address is invalid. + @return true = Cell address returned in rScPos is valid. */ + bool ConvertAddress( ScAddress& rScPos, + const XclAddress& rXclPos, SCTAB nScTab, bool bWarn ); + + /** Returns a valid cell address by moving it into allowed dimensions. + @param rXclPos The Excel cell address to convert. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell address is invalid. + @return The converted Calc cell address. */ + ScAddress CreateValidAddress( const XclAddress& rXclPos, + SCTAB nScTab, bool bWarn ); + + // cell range ------------------------------------------------------------- + + /** Checks if the passed cell range is valid (checks start and end position). + @param rXclRange The Excel cell range to check. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell range is not valid. + @return true = Cell range in rXclRange is valid. */ + bool CheckRange( const XclRange& rXclRange, bool bWarn ); + + /** Converts the passed Excel cell range to a Calc cell range. + @param rScRange (Out) The converted Calc cell range, if valid. + @param rXclRange The Excel cell range to convert. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the cell range contains invalid cells. + @return true = Cell range returned in rScRange is valid (original or cropped). */ + bool ConvertRange( ScRange& rScRange, const XclRange& rXclRange, + SCTAB nScTab1, SCTAB nScTab2, bool bWarn ); + +//UNUSED2009-05 /** Returns a valid cell range by moving it into allowed dimensions. +//UNUSED2009-05 @descr The start and/or end position of the range may be modified. +//UNUSED2009-05 @param rXclRange The Excel cell range to convert. +//UNUSED2009-05 @param bWarn true = Sets the internal flag that produces a warning box +//UNUSED2009-05 after loading/saving the file, if the cell range contains invalid cells. +//UNUSED2009-05 @return The converted Calc cell range. */ +//UNUSED2009-05 ScRange CreateValidRange( const XclRange& rXclRange, +//UNUSED2009-05 SCTAB nScTab1, SCTAB nScTab2, bool bWarn ); + + // cell range list -------------------------------------------------------- + +//UNUSED2009-05 /** Checks if the passed cell range list is valid. +//UNUSED2009-05 @param rXclRanges The Excel cell range list to check. +//UNUSED2009-05 @param bWarn true = Sets the internal flag that produces a warning box +//UNUSED2009-05 after loading/saving the file, if the cell range list contains at +//UNUSED2009-05 least one invalid range. +//UNUSED2009-05 @return true = Cell range list in rScRanges is completly valid. */ +//UNUSED2009-05 bool CheckRangeList( const XclRangeList& rXclRanges, bool bWarn ); + + /** Converts the passed Excel cell range list to a Calc cell range list. + @descr The start position of the ranges will not be modified. Cell + ranges that fit partly into valid dimensions are cropped + accordingly. Cell ranges that do not fit at all, are not inserted + into the Calc cell range list. + @param rScRanges (Out) The converted Calc cell range list. + @param rXclRanges The Excel cell range list to convert. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if at least one of the cell ranges + contains invalid cells. */ + void ConvertRangeList( ScRangeList& rScRanges, + const XclRangeList& rXclRanges, SCTAB nScTab, bool bWarn ); +}; + +// String->EditEngine conversion ============================================== + +class ScBaseCell; +class EditTextObject; + +/** This class provides methods to convert an XclImpString. + @The string can be converted to an edit engine text object or directly + to a Calc edit cell. */ +class XclImpStringHelper : ScfNoInstance +{ +public: + /** Returns a new edit engine text object. + @param nXFIndex Index to XF for first text portion (for escapement). */ + static EditTextObject* CreateTextObject( + const XclImpRoot& rRoot, + const XclImpString& rString ); + +//UNUSED2009-05 /** Returns a new edit engine text object for a cell note. +//UNUSED2009-05 @param nXFIndex Index to XF for first text portion (for escapement). */ +//UNUSED2009-05 static EditTextObject* CreateNoteObject( +//UNUSED2009-05 const XclImpRoot& rRoot, +//UNUSED2009-05 const XclImpString& rString ); + + /** Creates a new text cell or edit cell for a Calc document. + @param nXFIndex Index to XF for first text portion (for escapement). */ + static ScBaseCell* CreateCell( + const XclImpRoot& rRoot, + const XclImpString& rString, + sal_uInt16 nXFIndex = 0 ); +}; + +// Header/footer conversion =================================================== + +class EditEngine; +class EditTextObject; +class SfxItemSet; +class SvxFieldItem; +struct XclFontData; + +/** Converts an Excel header/footer string into three edit engine text objects. + @descr Header/footer content is divided into three parts: Left, center and + right portion. All formatting information is encoded in the Excel string + using special character seuences. A control sequence starts with the ampersand + character. + + Supported control sequences: + &L start of left portion + &C start of center portion + &R start of right portion + &P current page number + &N page count + &D current date + &T current time + &A table name + &F file name without path (see also &Z&F) + &Z file path without file name (converted to full file name, see also &Z&F) + &Z&F file path and name + &U underlining on/off + &E double underlining on/off + &S strikeout characters on/off + &X superscript on/off + &Y subscript on/off + &"fontname,fontstyle" use font with name 'fontname' and style 'fontstyle' + &fontheight set font height in points ('fontheight' is a decimal value) + + Known but unsupported control sequences: + &G picture + */ +class XclImpHFConverter : protected XclImpRoot, ScfNoCopy +{ +public: + explicit XclImpHFConverter( const XclImpRoot& rRoot ); + ~XclImpHFConverter(); + + /** Parses the passed string and creates three new edit engine text objects. */ + void ParseString( const String& rHFString ); + + /** Creates a ScPageHFItem and inserts it into the passed item set. */ + void FillToItemSet( SfxItemSet& rItemSet, sal_uInt16 nWhichId ) const; + /** Returns the total height of the converted header or footer in twips. */ + sal_Int32 GetTotalHeight() const; + +private: // types + typedef ::std::auto_ptr< XclFontData > XclFontDataPtr; + + /** Enumerates the supported header/footer portions. */ + enum XclImpHFPortion { EXC_HF_LEFT, EXC_HF_CENTER, EXC_HF_RIGHT, EXC_HF_PORTION_COUNT }; + + /** Contains all information about a header/footer portion. */ + struct XclImpHFPortionInfo + { + typedef ScfRef< EditTextObject > EditTextObjectRef; + EditTextObjectRef mxObj; /// Edit engine text object. + ESelection maSel; /// Edit engine selection. + sal_Int32 mnHeight; /// Height of previous lines in twips. + sal_uInt16 mnMaxLineHt; /// Maximum font height for the current text line. + explicit XclImpHFPortionInfo(); + }; + typedef ::std::vector< XclImpHFPortionInfo > XclImpHFPortionInfoVec; + +private: + /** Returns the current edit engine text object. */ + inline XclImpHFPortionInfo& GetCurrInfo() { return maInfos[ meCurrObj ]; } + /** Returns the current edit engine text object. */ + inline XclImpHFPortionInfo::EditTextObjectRef& GetCurrObj() { return GetCurrInfo().mxObj; } + /** Returns the current selection. */ + inline ESelection& GetCurrSel() { return GetCurrInfo().maSel; } + + /** Returns the maximum line height of the specified portion. */ + sal_uInt16 GetMaxLineHeight( XclImpHFPortion ePortion ) const; + /** Returns the current maximum line height. */ + sal_uInt16 GetCurrMaxLineHeight() const; + + /** Updates the maximum line height of the specified portion, using the current font size. */ + void UpdateMaxLineHeight( XclImpHFPortion ePortion ); + /** Updates the current maximum line height, using the current font size. */ + void UpdateCurrMaxLineHeight(); + + /** Sets the font attributes at the current selection. + @descr After that, the start position of the current selection object is + adjusted to the end of the selection. */ + void SetAttribs(); + /** Resets font data to application default font. */ + void ResetFontData(); + + /** Inserts maCurrText into edit engine and adjusts the current selection object. + @descr The text shall not contain a newline character. + The text will be cleared after insertion. */ + void InsertText(); + /** Inserts the passed text field and adjusts the current selection object. */ + void InsertField( const SvxFieldItem& rFieldItem ); + /** Inserts a line break and adjusts the current selection object. */ + void InsertLineBreak(); + + /** Creates the edit engine text object of current portion from edit engine. */ + void CreateCurrObject(); + /** Changes current header/footer portion to eNew. + @descr Creates text object of current portion and reinitializes edit engine. */ + void SetNewPortion( XclImpHFPortion eNew ); + +private: + EditEngine& mrEE; /// The header/footer edit engine. + XclImpHFPortionInfoVec maInfos; /// Edit engine text objects for all portions. + String maCurrText; /// Current text to insert into edit engine. + XclFontDataPtr mxFontData; /// Font data of current text. + XclImpHFPortion meCurrObj; /// The current portion. +}; + +// URL conversion ============================================================= + +/** This class contains static methods to decode an URL stored in an Excel file. + @descr Excel URLs can contain a sheet name, for instance: path\[test.xls]Sheet1 + This sheet name will be extracted automatically. */ +class XclImpUrlHelper : ScfNoInstance +{ +public: + /** Decodes an encoded external document URL with optional sheet name. + @param rUrl Returns the decoded file name incl. path. + @param rTabName Returns the decoded sheet name. + @param rbSameWb Returns true, if the URL is a reference to the own workbook. + @param rEncodedUrl An encoded URL from Excel. */ + static void DecodeUrl( + String& rUrl, + String& rTabName, + bool& rbSameWb, + const XclImpRoot& rRoot, + const String& rEncodedUrl ); + + /** Decodes an encoded external document URL without sheet name. + @param rUrl Returns the decoded file name incl. path. + @param rbSameWb Returns true, if the URL is a reference to the own workbook. + @param rEncodedUrl An encoded URL from Excel. */ + static void DecodeUrl( + String& rUrl, + bool& rbSameWb, + const XclImpRoot& rRoot, + const String& rEncodedUrl ); + + /** Decodes the passed URL to OLE or DDE link components. + @descr For DDE links: Decodes to application name and topic. + For OLE object links: Decodes to class name and document URL. + @return true = decoding was successful, returned strings are valid (not empty). */ + static bool DecodeLink( String& rApplic, String& rTopic, const String rEncUrl ); +}; + +// Cached values ============================================================== + +class ScTokenArray; + +/** This class stores one cached value of a cached value list (used for instance in + CRN, EXTERNNAME, tArray). */ +class XclImpCachedValue : ScfNoCopy +{ +public: + /** Creates a cached value and reads contents from stream and stores it with its array address. */ + explicit XclImpCachedValue( XclImpStream& rStrm ); + virtual ~XclImpCachedValue(); + + /** Returns the type of the cached value (EXC_CACHEDVAL_*). */ + inline sal_uInt8 GetType() const { return mnType; } + /** Returns the cached string value, if this value is a string, else an empty string. */ + inline const String& GetString() const { return mxStr.get() ? *mxStr : EMPTY_STRING; } + /** Returns the cached number, if this value has number type, else 0.0. */ + inline double GetValue() const { return mfValue; } + /** Returns the cached Boolean value, if this value has Boolean type, else false. */ + inline bool GetBool() const { return (mnType == EXC_CACHEDVAL_BOOL) && (mnBoolErr != 0); } + /** Returns the cached Calc error code, if this value has Error type, else 0. */ + inline sal_uInt8 GetXclError() const { return (mnType == EXC_CACHEDVAL_ERROR) ? mnBoolErr : EXC_ERR_NA; } + /** Returns the cached Calc error code, if this value has Error type, else 0. */ + USHORT GetScError() const; + /** Returns the token array if this is a Boolean value or error value, else 0. */ + inline const ScTokenArray* GetBoolErrFmla() const { return mxTokArr.get(); } + +protected: + typedef ::std::auto_ptr< String > StringPtr; + typedef ::std::auto_ptr< const ScTokenArray > ScTokenArrayPtr; + + StringPtr mxStr; /// Cached value is a string. + double mfValue; /// Cached value is a double. + ScTokenArrayPtr mxTokArr; /// Cached value is a formula or error code or Boolean. + sal_uInt8 mnBoolErr; /// Boolean value or Excel error code. + sal_uInt8 mnType; /// The type of the cached value (EXC_CACHEDVAL_*). +}; + +// ---------------------------------------------------------------------------- + +/** Contains cached values in a 2-dimensional array. */ +class XclImpCachedMatrix +{ +public: + explicit XclImpCachedMatrix( XclImpStream& rStrm ); + ~XclImpCachedMatrix(); + + /** Creates a new ScMatrix object and fills it with the contained values. */ + ScMatrixRef CreateScMatrix() const; + +private: + typedef ScfDelList< XclImpCachedValue > XclImpValueList; + + XclImpValueList maValueList; /// List of cached cell values. + SCSIZE mnScCols; /// Number of cached columns. + SCSIZE mnScRows; /// Number of cached rows. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xilink.hxx b/sc/source/filter/inc/xilink.hxx new file mode 100644 index 000000000000..dbbb4606114e --- /dev/null +++ b/sc/source/filter/inc/xilink.hxx @@ -0,0 +1,210 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XILINK_HXX +#define SC_XILINK_HXX + +#include <map> +#include "xllink.hxx" +#include "xiroot.hxx" + +/* ============================================================================ +Classes for import of different kinds of internal/external references. +- 3D cell and cell range links +- External cell and cell range links +- External defined names +- Add-in functions +- DDE links +- OLE object links +============================================================================ */ + +// Excel sheet indexes ======================================================== + +/** A buffer containing information about names and creation order of sheets. + + The first purpose of this buffer is to translate original Excel + sheet names into Calc sheet indexes. This is not trivial because the filter + may rename the Calc sheets during creation. This buffer stores the original + Excel sheet names with the corresponding Calc sheet indexes. + + The second purpose is to store the creation order of all sheets inside the + Excel workbook. The creation order list is contained in the TABID record + and needed to import the change log. Example: If the list contains 3;1;2 + this means that the second sheet in the file was created first, than the + third sheet in the file was created and finally the first sheet. + */ +class XclImpTabInfo +{ +public: + // original Excel sheet names --------------------------------------------- + + /** Appends an original Excel sheet name with corresponding Calc sheet index. */ + void AppendXclTabName( const String& rXclTabName, SCTAB nScTab ); + /** Inserts a Calc sheet index (increases all following sheet indexes). */ + void InsertScTab( SCTAB nScTab ); + + /** Returns the Calc sheet index from the passed original Excel sheet name. */ + SCTAB GetScTabFromXclName( const String& rXclTabName ) const; + + // record creation order - TABID record ----------------------------------- + + /** Reads the TABID record. */ + void ReadTabid( XclImpStream& rStrm ); + + /** Returns the current sheet index calculated from creation index. + @param nCreatedId The creation index of the sheet (1-based). + @param nMaxTabId All values greater than this parameter are not used to find the index. + @return The 0-based index of the sheet nCreatedId if it is contained in the list. + Example: The buffer is 3;5;2;4;1, nCreatedId is 1 and nMaxTabId is 3. The function will + return 2 which is the 0-based index of sheet 1 in the list 3;2;1. */ + sal_uInt16 GetCurrentIndex( sal_uInt16 nCreatedId, sal_uInt16 nMaxTabId = 0xFFFF ) const; + +private: + typedef ::std::map< String, SCTAB > XclTabNameMap; + + XclTabNameMap maTabNames; /// All Excel sheet names with Calc sheet index. + ScfUInt16Vec maTabIdVec; /// The vector with sheet indexes. +}; + +// External names ============================================================= + +/** Type of an external name. */ +enum XclImpExtNameType +{ + xlExtName, /// An external defined name. + xlExtAddIn, /// An add-in function name. + xlExtDDE, /// A DDE link range. + xlExtOLE, /// An OLE object link. + xlExtEuroConvert /// An external in Excel, but internal in OO function name. +}; + +// ---------------------------------------------------------------------------- + +class XclImpCachedMatrix; +class ScTokenArray; +class XclImpSupbook; + +/** Stores contents of an external name. + @descr Supported: External defined names, AddIn names, DDE links and OLE objects. */ +class XclImpExtName +{ +public: + /** Reads the external name from the stream. */ + explicit XclImpExtName( const XclImpSupbook& rSupbook, XclImpStream& rStrm, + XclSupbookType eSubType, ExcelToSc* pFormulaConv ); + ~XclImpExtName(); + + /** Create and apply the cached list of this DDE Link to the document. */ + void CreateDdeData( ScDocument& rDoc, + const String& rApplc, const String& rExtDoc ) const; + + void CreateExtNameData( ScDocument& rDoc, sal_uInt16 nFileId ) const; + + bool HasFormulaTokens() const; + + inline XclImpExtNameType GetType() const { return meType; } + inline const String& GetName() const { return maName; } + inline sal_uInt32 GetStorageId() const { return mnStorageId; } + +private: + typedef ::std::auto_ptr< XclImpCachedMatrix > XclImpCachedMatrixPtr; + typedef ::std::auto_ptr< ScTokenArray > TokenArrayPtr; + + XclImpCachedMatrixPtr mxDdeMatrix; /// Cached results of the DDE link. + TokenArrayPtr mxArray; /// Formula tokens for external name. + String maName; /// The name of the external name. + sal_uInt32 mnStorageId; /// Storage ID for OLE object storages. + XclImpExtNameType meType; /// Type of the external name. +}; + +// Import link manager ======================================================== + +class XclImpLinkManagerImpl; + +/** This is the central class for the import of all internal/external links. + @descr This manager stores all data about external documents with their sheets + and cached cell contents. Additionally it handles external names, such as add-in + function names, DDE links, and OLE object links. + File contents in BIFF8: + - Record SUPBOOK: Contains the name of an external document and the names of its sheets. + This record is optionally followed by NAME, EXTERNNAME, XCT and CRN records. + - Record XCT: Contains the number and sheet index of the following CRN records. + - Record CRN: Contains addresses (row and column) and values of external referenced cells. + - Record NAME: Contains defined names of the own workbook. + - Record EXTERNNAME: Contains external defined names, DDE links, or OLE object links. + - Record EXTERNSHEET: Contains indexes to URLs of external documents (SUPBOOKs) + and sheet indexes for each external reference used anywhere in the workbook. + This record follows a list of SUPBOOK records (with their attached records). +*/ +class XclImpLinkManager : protected XclImpRoot +{ +public: + explicit XclImpLinkManager( const XclImpRoot& rRoot ); + ~XclImpLinkManager(); + + /** Reads the EXTERNSHEET record. */ + void ReadExternsheet( XclImpStream& rStrm ); + /** Reads a SUPBOOK record. */ + void ReadSupbook( XclImpStream& rStrm ); + /** Reads an XCT record and appends it to the current SUPBOOK. */ + void ReadXct( XclImpStream& rStrm ); + /** Reads a CRN record and appends it to the current SUPBOOK. */ + void ReadCrn( XclImpStream& rStrm ); + /** Reads an EXTERNNAME record and appends it to the current SUPBOOK. */ + void ReadExternname( XclImpStream& rStrm, ExcelToSc* pFormulaConv = NULL ); + + /** Returns true, if the specified XTI entry contains an internal reference. */ + bool IsSelfRef( sal_uInt16 nXtiIndex ) const; + /** Returns the Calc sheet index range of the specified XTI entry. + @return true = XTI data found, returned sheet index range is valid. */ + bool GetScTabRange( + SCTAB& rnFirstScTab, SCTAB& rnLastScTab, + sal_uInt16 nXtiIndex ) const; + /** Returns the specified external name or 0 on error. */ + const XclImpExtName* GetExternName( sal_uInt16 nXtiIndex, sal_uInt16 nExtName ) const; + + const String* GetSupbookUrl( sal_uInt16 nXtiIndex ) const; + + const String& GetSupbookTabName( sal_uInt16 nXti, sal_uInt16 nXtiTab ) const; + + /** Tries to decode the URL of the specified XTI entry to OLE or DDE link components. + @descr For DDE links: Decodes to application name and topic. + For OLE object links: Decodes to class name and document URL. + @return true = decoding was successful, returned strings are valid (not empty). */ + bool GetLinkData( String& rApplic, String& rTopic, sal_uInt16 nXtiIndex ) const; + /** Returns the specified macro name or an empty string on error. */ + const String& GetMacroName( sal_uInt16 nExtSheet, sal_uInt16 nExtName ) const; + +private: + typedef ::std::auto_ptr< XclImpLinkManagerImpl > XclImpLinkMgrImplPtr; + XclImpLinkMgrImplPtr mxImpl; +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xiname.hxx b/sc/source/filter/inc/xiname.hxx new file mode 100644 index 000000000000..ccf1b88af947 --- /dev/null +++ b/sc/source/filter/inc/xiname.hxx @@ -0,0 +1,98 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XINAME_HXX +#define SC_XINAME_HXX + +#include <map> +#include "xlname.hxx" +#include "xiroot.hxx" + +//class ScDocument; +//class ScTokenArray; + +// ============================================================================ + +class ScRangeData; + +/** Represents a defined name. It may be related to a single sheet or global. */ +class XclImpName : protected XclImpRoot +{ +public: + explicit XclImpName( XclImpStream& rStrm, sal_uInt16 nXclNameIdx ); + + inline const String& GetXclName() const { return maXclName; } + inline const String& GetScName() const { return maScName; } + inline SCTAB GetScTab() const { return mnScTab; } + inline const ScRangeData* GetScRangeData() const { return mpScData; } + inline bool IsGlobal() const { return mnScTab == SCTAB_MAX; } + inline bool IsVBName() const { return mbVBName; } + +private: + String maXclName; /// Original name read from the file. + String maScName; /// Name inserted into the Calc document. + const ScRangeData* mpScData; /// Pointer to Calc defined name (no ownership). + sal_Unicode mcBuiltIn; /// Excel built-in name index. + SCTAB mnScTab; /// Calc sheet index of local names. + bool mbVBName; /// true = Visual Basic procedure. +}; + +// ---------------------------------------------------------------------------- + +/** This buffer contains all internal defined names of the document. + @descr It manages the position of the names in the document, means if they are + global or attached to a specific sheet. While inserting the names into the Calc + document this buffer resolves conflicts caused by equal names from different + sheets. */ +class XclImpNameManager : protected XclImpRoot +{ +public: + explicit XclImpNameManager( const XclImpRoot& rRoot ); + + /** Reads a NAME record and creates an entry in this buffer. */ + void ReadName( XclImpStream& rStrm ); + + /** Tries to find the name used in Calc, based on the original Excel defined name. + @param nScTab The sheet index for local names or SCTAB_MAX for global names. + If no local name is found, tries to find a matching global name. + @return Pointer to the defined name or 0 on error. */ + const XclImpName* FindName( const String& rXclName, SCTAB nScTab = SCTAB_MAX ) const; + + /** Returns the defined name specified by its Excel index. + @param nXclNameIdx The index of the internal defined name. + @return Pointer to the defined name or 0 on error. */ + const XclImpName* GetName( sal_uInt16 nXclNameIdx ) const; + +private: + typedef ScfDelList< XclImpName > XclImpNameList; + XclImpNameList maNameList; +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xipage.hxx b/sc/source/filter/inc/xipage.hxx new file mode 100644 index 000000000000..0571e10e7046 --- /dev/null +++ b/sc/source/filter/inc/xipage.hxx @@ -0,0 +1,82 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XIPAGE_HXX +#define SC_XIPAGE_HXX + +#include "xlpage.hxx" +#include "xiroot.hxx" + +// Page settings ============================================================== + +/** Contains all page (print) settings for a single sheet. + @descr Supports reading all related records and creating a page style sheet. */ +class XclImpPageSettings : protected XclImpRoot +{ +public: + explicit XclImpPageSettings( const XclImpRoot& rRoot ); + + /** Returns read-only access to the page data. */ + inline const XclPageData& GetPageData() const { return maData; } + + /** Initializes the object to be used for a new sheet. */ + void Initialize(); + + /** Reads a SETUP record and inserts contained data. */ + void ReadSetup( XclImpStream& rStrm ); + /** Reads a ***MARGIN record (reads all 4 margin records). */ + void ReadMargin( XclImpStream& rStrm ); + /** Reads a HCENTER or VCENTER record. */ + void ReadCenter( XclImpStream& rStrm ); + /** Reads a HEADER or FOOTER record. */ + void ReadHeaderFooter( XclImpStream& rStrm ); + /** Reads a HORIZONTALPAGEBREAKS or VERTICALPAGEBREAKS record. */ + void ReadPageBreaks( XclImpStream& rStrm ); + /** Reads a PRINTHEADERS record. */ + void ReadPrintHeaders( XclImpStream& rStrm ); + /** Reads a PRINTGRIDLINES record. */ + void ReadPrintGridLines( XclImpStream& rStrm ); + /** Reads an IMGDATA record and creates the SvxBrushItem. */ + void ReadImgData( XclImpStream& rStrm ); + + /** Overrides paper size and orientation (used in sheet-charts). */ + void SetPaperSize( sal_uInt16 nXclPaperSize, bool bPortrait ); + /** Sets or clears the fit-to-pages setting (contained in WSBOOL record). */ + inline void SetFitToPages( bool bFitToPages ) { maData.mbFitToPages = bFitToPages; } + + /** Creates a page stylesheet from current settings and sets it at current sheet. */ + void Finalize(); + +private: + XclPageData maData; /// Page settings data. + bool mbValidPaper; /// true = Paper size and orientation valid. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xipivot.hxx b/sc/source/filter/inc/xipivot.hxx new file mode 100644 index 000000000000..edac8a0fd99f --- /dev/null +++ b/sc/source/filter/inc/xipivot.hxx @@ -0,0 +1,457 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XIPIVOT_HXX +#define SC_XIPIVOT_HXX + +#include <list> +#include "xlpivot.hxx" +#include "xiroot.hxx" + +class ScDPSaveData; +class ScDPSaveDimension; + +// ============================================================================ +// Pivot cache +// ============================================================================ + +/** Represents a data item in a pivot cache. */ +class XclImpPCItem : public XclPCItem +{ +public: + explicit XclImpPCItem( XclImpStream& rStrm ); + + /** Inserts the item data into the passed document. */ + void WriteToSource( const XclImpRoot& rRoot, const ScAddress& rScPos ) const; + +private: + /** Reads an SXDOUBLE record describing a floating-point item. */ + void ReadSxdouble( XclImpStream& rStrm ); + /** Reads an SXBOOLEAN record describing a boolean item. */ + void ReadSxboolean( XclImpStream& rStrm ); + /** Reads an SXERROR record describing an error code item. */ + void ReadSxerror( XclImpStream& rStrm ); + /** Reads an SXINTEGER record describing an integer item. */ + void ReadSxinteger( XclImpStream& rStrm ); + /** Reads an SXSTRING record describing a text item. */ + void ReadSxstring( XclImpStream& rStrm ); + /** Reads an SXDATETIME record describing a date/time item. */ + void ReadSxdatetime( XclImpStream& rStrm ); + /** Reads an SXEMPTY record describing an empty item. */ + void ReadSxempty( XclImpStream& rStrm ); +}; + +typedef ScfRef< XclImpPCItem > XclImpPCItemRef; + +// ============================================================================ + +struct ScDPNumGroupInfo; +class XclImpPivotCache; + +/** Represents a field in a pivot cache (a column of data items in the source area). */ +class XclImpPCField : public XclPCField, protected XclImpRoot +{ +public: + /** Creates a pivot cache field by reading an SXFIELD record. */ + explicit XclImpPCField( const XclImpRoot& rRoot, + XclImpPivotCache& rPCache, sal_uInt16 nFieldIdx ); + virtual ~XclImpPCField(); + + // general field/item access ---------------------------------------------- + + /** Returns the name of the field, uses the passed visible name if supported. */ + const String& GetFieldName( const ScfStringVec& rVisNames ) const; + + /** Returns the base field if this is a grouping field. */ + const XclImpPCField* GetGroupBaseField() const; + + /** Returns the number of items of this field. */ + sal_uInt16 GetItemCount() const; + /** Returns the item at the specified position or 0 on error. */ + const XclImpPCItem* GetItem( sal_uInt16 nItemIdx ) const; + /** Returns the item representing a limit value in numeric/date/time grouping fields. + @param nItemIdx One of EXC_SXFIELD_INDEX_MIN, EXC_SXFIELD_INDEX_MAX, or EXC_SXFIELD_INDEX_STEP. */ + const XclImpPCItem* GetLimitItem( sal_uInt16 nItemIdx ) const; + + /** Inserts the field name into the document. */ + void WriteFieldNameToSource( SCCOL nScCol, SCTAB nScTab ) const; + /** Inserts the specified item data into the document. */ + void WriteOrigItemToSource( SCROW nScRow, SCTAB nScTab, sal_uInt16 nItemIdx ) const; + /** Inserts the data of the last inserted item into the document. */ + void WriteLastOrigItemToSource( SCROW nScRow, SCTAB nScTab ) const; + + // records ---------------------------------------------------------------- + + /** Reads the SXFIELD record describing the field. */ + void ReadSxfield( XclImpStream& rStrm ); + /** Reads an item data record describing a new item. */ + void ReadItem( XclImpStream& rStrm ); + /** Reads the SXNUMGROUP record describing numeric grouping fields. */ + void ReadSxnumgroup( XclImpStream& rStrm ); + /** Reads the SXGROUPINFO record describing the item order in grouping fields. */ + void ReadSxgroupinfo( XclImpStream& rStrm ); + + // grouping --------------------------------------------------------------- + + /** Inserts grouping information of this field into the passed ScDPSaveData. */ + void ConvertGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const; + + // ------------------------------------------------------------------------ +private: + /** Inserts standard grouping information of this field into the passed ScDPSaveData. */ + void ConvertStdGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const; + /** Inserts numeric grouping information of this field into the passed ScDPSaveData. */ + void ConvertNumGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const; + /** Inserts date grouping information of this field into the passed ScDPSaveData. */ + void ConvertDateGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const; + + /** Returns a Calc struct with numeric grouping data. */ + ScDPNumGroupInfo GetScNumGroupInfo() const; + /** Returns a Calc struct with date grouping data. */ + ScDPNumGroupInfo GetScDateGroupInfo() const; + + /** Returns a limit value for numeric grouping fields. */ + const double* GetNumGroupLimit( sal_uInt16 nLimitIdx ) const; + /** Returns a limit value for date grouping fields (minimum/maximum only). */ + const DateTime* GetDateGroupLimit( sal_uInt16 nLimitIdx ) const; + /** Returns the step value for date grouping fields. */ + const sal_Int16* GetDateGroupStep() const; + +private: + typedef ::std::vector< XclImpPCItemRef > XclImpPCItemVec; + + XclImpPivotCache& mrPCache; /// Parent pivot cache containing this field. + XclImpPCItemVec maItems; /// List of all displayed data items. + XclImpPCItemVec maOrigItems; /// List of all source data items. + XclImpPCItemVec maNumGroupItems; /// List of items containing numeric grouping limits. + mutable SCCOL mnSourceScCol; /// Column index of source data for this field. + bool mbNumGroupInfoRead; /// true = Numeric grouping info read (SXNUMGROUP record). +}; + +typedef ScfRef< XclImpPCField > XclImpPCFieldRef; + +// ============================================================================ + +class XclImpPivotCache : protected XclImpRoot +{ +public: + explicit XclImpPivotCache( const XclImpRoot& rRoot ); + virtual ~XclImpPivotCache(); + + // data access ------------------------------------------------------------ + + /** Returns the data source range read from the DCONREF record. */ + inline const ScRange& GetSourceRange() const { return maSrcRange; } + + /** Returns the number of pivot cache fields. */ + sal_uInt16 GetFieldCount() const; + /** Returns read-only access to a pivot cache field. */ + const XclImpPCField* GetField( sal_uInt16 nFieldIdx ) const; + + // records ---------------------------------------------------------------- + + /** Reads an SXIDSTM record containing a pivot cache stream identifier and the pivot cache. */ + void ReadSxidstm( XclImpStream& rStrm ); + /** Reads an SXVS record containing the source type of the pivot cache. */ + void ReadSxvs( XclImpStream& rStrm ); + /** Reads a DCONREF record containing the source range of the pivot cache. */ + void ReadDconref( XclImpStream& rStrm ); + /** Reads the entire pivot cache stream. Uses decrypter from passed stream. */ + void ReadPivotCacheStream( XclImpStream& rStrm ); + + bool IsRefreshOnLoad() const; + +private: + typedef ::std::vector< XclImpPCFieldRef > XclImpPCFieldVec; + + XclPCInfo maPCInfo; /// Pivot cache settings (SXDB record). + XclImpPCFieldVec maFields; /// List of pivot cache fields. + ScRange maSrcRange; /// Source range in the spreadsheet. + String maUrl; /// URL of the source data. + String maTabName; /// Sheet name of the source data. + sal_uInt16 mnStrmId; /// Pivot cache stream identifier. + sal_uInt16 mnSrcType; /// Source data type. + bool mbSelfRef; /// true = Source data from own document. +}; + +typedef ScfRef< XclImpPivotCache > XclImpPivotCacheRef; + +// ============================================================================ +// Pivot table +// ============================================================================ + +class XclImpPivotTable; + +// ============================================================================ + +class XclImpPTItem +{ +public: + explicit XclImpPTItem( const XclImpPCField* pCacheField ); + + /** Returns the internal name of the item or 0, if no name could be found. */ + const String* GetItemName() const; + /** Returns the displayed name of the item or 0, if no name could be found. */ + const String* GetVisItemName() const; + + /** Reads an SXVI record containing data of this item. */ + void ReadSxvi( XclImpStream& rStrm ); + + /** Inserts this item into the passed ScDPSaveDimension. */ + void ConvertItem( ScDPSaveDimension& rSaveDim ) const; + +private: + XclPTItemInfo maItemInfo; /// General data for this item. + const XclImpPCField* mpCacheField; /// Corresponding pivot cache field. +}; + +typedef ScfRef< XclImpPTItem > XclImpPTItemRef; + +// ============================================================================ + +class XclImpPTField +{ +public: + explicit XclImpPTField( const XclImpPivotTable& rPTable, sal_uInt16 nCacheIdx ); + + // general field/item access ---------------------------------------------- + + /** Returns the corresponding pivot cache field of this field. */ + const XclImpPCField* GetCacheField() const; + /** Returns the name of this field that is used to create the Calc dimensions. */ + const String& GetFieldName() const; + /** Returns the internally set visible name of this field. */ + const String& GetVisFieldName() const; + + /** Returns the specified item. */ + const XclImpPTItem* GetItem( sal_uInt16 nItemIdx ) const; + /** Returns the internal name of the specified item. */ + const String* GetItemName( sal_uInt16 nItemIdx ) const; + /** Returns the displayed name of the specified item. */ + const String* GetVisItemName( sal_uInt16 nItemIdx ) const; + + /** Returns the flags of the axes this field is part of. */ + inline sal_uInt16 GetAxes() const { return maFieldInfo.mnAxes; } + /** Sets the flags of the axes this field is part of. */ + inline void SetAxes( sal_uInt16 nAxes ) { maFieldInfo.mnAxes = nAxes; } + + // records ---------------------------------------------------------------- + + /** Reads an SXVD record describing the field. */ + void ReadSxvd( XclImpStream& rStrm ); + /** Reads an SXVDEX record describing extended options of the field. */ + void ReadSxvdex( XclImpStream& rStrm ); + /** Reads an SXVI record describing a new item of this field. */ + void ReadSxvi( XclImpStream& rStrm ); + + // row/column fields ------------------------------------------------------ + + void ConvertRowColField( ScDPSaveData& rSaveData ) const; + + // page fields ------------------------------------------------------------ + + void SetPageFieldInfo( const XclPTPageFieldInfo& rPageInfo ); + void ConvertPageField( ScDPSaveData& rSaveData ) const; + + // hidden fields ---------------------------------------------------------- + + void ConvertHiddenField( ScDPSaveData& rSaveData ) const; + + // data fields ------------------------------------------------------------ + + bool HasDataFieldInfo() const; + void AddDataFieldInfo( const XclPTDataFieldInfo& rDataInfo ); + void ConvertDataField( ScDPSaveData& rSaveData ) const; + + // ------------------------------------------------------------------------ +private: + ScDPSaveDimension* ConvertRCPField( ScDPSaveData& rSaveData ) const; + void ConvertFieldInfo( ScDPSaveDimension& rSaveDim ) const; + + void ConvertDataField( ScDPSaveDimension& rSaveDim, const XclPTDataFieldInfo& rDataInfo ) const; + void ConvertDataFieldInfo( ScDPSaveDimension& rSaveDim, const XclPTDataFieldInfo& rDataInfo ) const; + void ConvertItems( ScDPSaveDimension& rSaveDim ) const; + +private: + typedef ::std::list< XclPTDataFieldInfo > XclPTDataFieldInfoList; + typedef ::std::vector< XclImpPTItemRef > XclImpPTItemVec; + + const XclImpPivotTable& mrPTable; /// Parent pivot table containing this field. + XclPTFieldInfo maFieldInfo; /// General field info (SXVD record). + XclPTFieldExtInfo maFieldExtInfo; /// Extended field info (SXVDEX record). + XclPTPageFieldInfo maPageInfo; /// Page field info (entry from SXPI record). + XclPTDataFieldInfoList maDataInfoList; /// List of extended data field info (SXDI records). + XclImpPTItemVec maItems; /// List of all items of this field. +}; + +typedef ScfRef< XclImpPTField > XclImpPTFieldRef; + +// ============================================================================ + +class XclImpPivotTable : protected XclImpRoot +{ +public: + explicit XclImpPivotTable( const XclImpRoot& rRoot ); + virtual ~XclImpPivotTable(); + + // cache/field access, misc. ---------------------------------------------- + + inline XclImpPivotCacheRef GetPivotCache() const { return mxPCache; } + inline const ScfStringVec& GetVisFieldNames() const { return maVisFieldNames; } + + sal_uInt16 GetFieldCount() const; + const XclImpPTField* GetField( sal_uInt16 nFieldIdx ) const; + XclImpPTField* GetFieldAcc( sal_uInt16 nFieldIdx ); + const String& GetFieldName( sal_uInt16 nFieldIdx ) const; + + const XclImpPTField* GetDataField( sal_uInt16 nDataFieldIdx ) const; + const String& GetDataFieldName( sal_uInt16 nDataFieldIdx ) const; + + // records ---------------------------------------------------------------- + + /** Reads an SXVIEW record starting a new pivot table. */ + void ReadSxview( XclImpStream& rStrm ); + /** Reads an SXVD record describing a new field. */ + void ReadSxvd( XclImpStream& rStrm ); + /** Reads an SXVI record describing a new item of the current field. */ + void ReadSxvi( XclImpStream& rStrm ); + /** Reads an SXVDEX record describing extended options of the current field. */ + void ReadSxvdex( XclImpStream& rStrm ); + /** Reads an SXIVD record containing the row field or column field order. */ + void ReadSxivd( XclImpStream& rStrm ); + /** Reads an SXPI record containing page field data. */ + void ReadSxpi( XclImpStream& rStrm ); + /** Reads an SXDI record containing data field data. */ + void ReadSxdi( XclImpStream& rStrm ); + /** Reads an SXEX record containing additional settings for the pivot table. */ + void ReadSxex( XclImpStream& rStrm ); + /** Reads an SXVIEWEX9 record that specifies the pivot tables + * autoformat. */ + void ReadSxViewEx9( XclImpStream& rStrm ); + + // ------------------------------------------------------------------------ + + /** Inserts the pivot table into the Calc document. */ + void Convert(); + + void MaybeRefresh(); + + void ApplyMergeFlags(const ScRange& rOutRange, const ScDPSaveData& rSaveData); + + // ------------------------------------------------------------------------ +private: + typedef ::std::vector< XclImpPTFieldRef > XclImpPTFieldVec; + + XclImpPivotCacheRef mxPCache; /// Pivot cache containing field/item names. + + XclPTInfo maPTInfo; /// General info about the pivot table (SXVIEW record). + XclPTExtInfo maPTExtInfo; /// Extended info about the pivot table (SXEX record). + XclPTViewEx9Info maPTViewEx9Info; /// (SXVIEWEX9 record) + XclImpPTFieldVec maFields; /// Vector containing all fields. + XclImpPTFieldRef mxCurrField; /// Current field for importing additional info. + ScfStringVec maVisFieldNames; /// Vector containing all visible field names. + ScfUInt16Vec maRowFields; /// Row field indexes. + ScfUInt16Vec maColFields; /// Column field indexes. + ScfUInt16Vec maPageFields; /// Page field indexes. + ScfUInt16Vec maOrigDataFields; /// Original data field indexes. + ScfUInt16Vec maFiltDataFields; /// Filtered data field indexes. + XclImpPTField maDataOrientField; /// Special data field orientation field. + ScRange maOutScRange; /// Output range in the Calc document. + ScDPObject* mpDPObj; +}; + +typedef ScfRef< XclImpPivotTable > XclImpPivotTableRef; + +// ============================================================================ +// ============================================================================ + +/** The main class for pivot table import. + + This class contains functions to read all records related to pivot tables + and pivot caches. + */ +class XclImpPivotTableManager : protected XclImpRoot +{ +public: + explicit XclImpPivotTableManager( const XclImpRoot& rRoot ); + virtual ~XclImpPivotTableManager(); + + // pivot cache records ---------------------------------------------------- + + /** Returns the pivot cache with the specified 0-based index. */ + XclImpPivotCacheRef GetPivotCache( sal_uInt16 nCacheIdx ); + + /** Reads an SXIDSTM record containing a pivot cache stream identifier and the pivot cache. */ + void ReadSxidstm( XclImpStream& rStrm ); + /** Reads an SXVS record containing the source type of a pivot cache. */ + void ReadSxvs( XclImpStream& rStrm ); + /** Reads a DCONREF record containing the source range of a pivot cache. */ + void ReadDconref( XclImpStream& rStrm ); + + // pivot table records ---------------------------------------------------- + + /** Reads an SXVIEW record describing a new pivot table. */ + void ReadSxview( XclImpStream& rStrm ); + /** Reads an SXVD record describing a new field. */ + void ReadSxvd( XclImpStream& rStrm ); + /** Reads an SXVDEX record describing extended options of a field. */ + void ReadSxvdex( XclImpStream& rStrm ); + /** Reads an SXIVD record containing the row field or column field order. */ + void ReadSxivd( XclImpStream& rStrm ); + /** Reads an SXPI record containing page field data. */ + void ReadSxpi( XclImpStream& rStrm ); + /** Reads an SXDI record containing data field data. */ + void ReadSxdi( XclImpStream& rStrm ); + /** Reads an SXVI record describing a new item of the current field. */ + void ReadSxvi( XclImpStream& rStrm ); + /** Reads an SXEX record containing additional settings for a pivot table. */ + void ReadSxex( XclImpStream& rStrm ); + /** Reads an SXVIEWEX9 record that specifies the pivot tables + * autoformat. */ + void ReadSxViewEx9( XclImpStream& rStrm ); + + // ------------------------------------------------------------------------ + + /** Reads all used pivot caches and creates additional sheets for external data sources. */ + void ReadPivotCaches( XclImpStream& rStrm ); + /** Inserts all pivot tables into the Calc document. */ + void ConvertPivotTables(); + + void MaybeRefreshPivotTables(); + +private: + typedef ::std::vector< XclImpPivotCacheRef > XclImpPivotCacheVec; + typedef ::std::vector< XclImpPivotTableRef > XclImpPivotTableVec; + + XclImpPivotCacheVec maPCaches; /// List of all pivot caches. + XclImpPivotTableVec maPTables; /// List of all pivot tables. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xiroot.hxx b/sc/source/filter/inc/xiroot.hxx new file mode 100644 index 000000000000..c5cf284d2d2e --- /dev/null +++ b/sc/source/filter/inc/xiroot.hxx @@ -0,0 +1,219 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XIROOT_HXX +#define SC_XIROOT_HXX + +#include "xlroot.hxx" + +// Forward declarations of objects in public use ============================== + +class XclImpStream; +class XclImpString; + +typedef ScfRef< XclImpString > XclImpStringRef; + +// Global data ================================================================ + +class XclImpAddressConverter; +class XclImpFormulaCompiler; +class XclImpSst; +class XclImpPalette; +class XclImpFontBuffer; +class XclImpNumFmtBuffer; +class XclImpXFBuffer; +class XclImpXFRangeBuffer; +class XclImpTabInfo; +class XclImpNameManager; +class XclImpLinkManager; +class XclImpObjectManager; +class XclImpSheetDrawing; +class XclImpCondFormatManager; +class XclImpAutoFilterBuffer; +class XclImpWebQueryBuffer; +class XclImpPivotTableManager; +class XclImpPageSettings; +class XclImpDocViewSettings; +class XclImpTabViewSettings; +class XclImpSheetProtectBuffer; +class XclImpDocProtectBuffer; + +class _ScRangeListTabs; +class ExcelToSc; + +/** Stores global buffers and data needed for Excel import filter. */ +struct XclImpRootData : public XclRootData +{ + typedef ScfRef< XclImpAddressConverter > XclImpAddrConvRef; + typedef ScfRef< XclImpFormulaCompiler > XclImpFmlaCompRef; + + typedef ScfRef< XclImpSst > XclImpSstRef; + typedef ScfRef< XclImpPalette > XclImpPaletteRef; + typedef ScfRef< XclImpFontBuffer > XclImpFontBfrRef; + typedef ScfRef< XclImpNumFmtBuffer > XclImpNumFmtBfrRef; + typedef ScfRef< XclImpXFBuffer > XclImpXFBfrRef; + typedef ScfRef< XclImpXFRangeBuffer > XclImpXFRangeBfrRef; + typedef ScfRef< XclImpTabInfo > XclImpTabInfoRef; + typedef ScfRef< XclImpNameManager > XclImpNameMgrRef; + typedef ScfRef< XclImpLinkManager > XclImpLinkMgrRef; + typedef ScfRef< XclImpObjectManager > XclImpObjectMgrRef; + typedef ScfRef< XclImpCondFormatManager > XclImpCondFmtMgrRef; + typedef ScfRef< XclImpWebQueryBuffer > XclImpWebQueryBfrRef; + typedef ScfRef< XclImpPivotTableManager > XclImpPTableMgrRef; + typedef ScfRef< XclImpPageSettings > XclImpPageSettRef; + typedef ScfRef< XclImpDocViewSettings > XclImpDocViewSettRef; + typedef ScfRef< XclImpTabViewSettings > XclImpTabViewSettRef; + typedef ScfRef< XclImpSheetProtectBuffer > XclImpTabProtectRef; + typedef ScfRef< XclImpDocProtectBuffer > XclImpDocProtectRef; + + XclImpAddrConvRef mxAddrConv; /// The address converter. + XclImpFmlaCompRef mxFmlaComp; /// The formula compiler. + + XclImpSstRef mxSst; /// The shared string table. + XclImpPaletteRef mxPalette; /// The color buffer. + XclImpFontBfrRef mxFontBfr; /// All fonts in the file. + XclImpNumFmtBfrRef mxNumFmtBfr; /// All number formats in the file. + XclImpXFBfrRef mpXFBfr; /// All XF record data in the file. + XclImpXFRangeBfrRef mxXFRangeBfr; /// Buffer of XF index ranges in a sheet. + + XclImpTabInfoRef mxTabInfo; /// Sheet creation order list. + XclImpNameMgrRef mxNameMgr; /// Internal defined names. + XclImpLinkMgrRef mxLinkMgr; /// Manager for internal/external links. + + XclImpObjectMgrRef mxObjMgr; /// All drawing objects. + XclImpCondFmtMgrRef mxCondFmtMgr; /// Conditional formattings. + XclImpWebQueryBfrRef mxWebQueryBfr; /// All web queries. + XclImpPTableMgrRef mxPTableMgr; /// All pivot tables and pivot caches. + + XclImpPageSettRef mxPageSett; /// Page settings for current sheet. + XclImpDocViewSettRef mxDocViewSett; /// View settings for entire document. + XclImpTabViewSettRef mxTabViewSett; /// View settings for current sheet. + XclImpTabProtectRef mxTabProtect; /// Sheet protection options for current sheet. + XclImpDocProtectRef mxDocProtect; /// Document protection options. + + bool mbHasCodePage; /// true = CODEPAGE record exists. + bool mbHasBasic; /// true = document contains VB project. + + explicit XclImpRootData( XclBiff eBiff, SfxMedium& rMedium, + SotStorageRef xRootStrg, ScDocument& rDoc, rtl_TextEncoding eTextEnc ); + virtual ~XclImpRootData(); +}; + +// ---------------------------------------------------------------------------- + +/** Access to global data from other classes. */ +class XclImpRoot : public XclRoot +{ +public: + explicit XclImpRoot( XclImpRootData& rImpRootData ); + + /** Returns this root instance - for code readability in derived classes. */ + inline const XclImpRoot& GetRoot() const { return *this; } + + /** Sets a code page read from a CODEPAGE record for byte string import. */ + void SetCodePage( sal_uInt16 nCodePage ); + /** Sets text encoding from the default application font (in case of missing CODEPAGE record). */ + void SetAppFontEncoding( rtl_TextEncoding eAppFontEnc ); + + /** Is called when import filter starts importing a single sheet (all BIFF versions). */ + void InitializeTable( SCTAB nScTab ); + /** Is called when import filter stops importing a single sheet (all BIFF versions). */ + void FinalizeTable(); + + /** Returns the address converter. */ + XclImpAddressConverter& GetAddressConverter() const; + /** Returns the formula converter. */ + XclImpFormulaCompiler& GetFormulaCompiler() const; + /** Returns the old formula converter. */ + ExcelToSc& GetOldFmlaConverter() const; + + /** Returns the shared string table. */ + XclImpSst& GetSst() const; + /** Returns the color buffer. */ + XclImpPalette& GetPalette() const; + /** Returns the font buffer. */ + XclImpFontBuffer& GetFontBuffer() const; + /** Returns the number format buffer. */ + XclImpNumFmtBuffer& GetNumFmtBuffer() const; + /** Returns the cell formatting attributes buffer. */ + XclImpXFBuffer& GetXFBuffer() const; + /** Returns the buffer of XF index ranges for a sheet. */ + XclImpXFRangeBuffer& GetXFRangeBuffer() const; + + /** Returns the buffer that contains all print areas in the document. */ + _ScRangeListTabs& GetPrintAreaBuffer() const; + /** Returns the buffer that contains all print titles in the document. */ + _ScRangeListTabs& GetTitleAreaBuffer() const; + + /** Returns the buffer that contains the sheet creation order. */ + XclImpTabInfo& GetTabInfo() const; + /** Returns the buffer that contains internal defined names. */ + XclImpNameManager& GetNameManager() const; + /** Returns the link manager. */ + XclImpLinkManager& GetLinkManager() const; + + /** Returns the drawing object manager. */ + XclImpObjectManager& GetObjectManager() const; + /** Returns the drawing container of the current sheet. */ + XclImpSheetDrawing& GetCurrSheetDrawing() const; + /** Returns the conditional formattings manager. */ + XclImpCondFormatManager& GetCondFormatManager() const; + /** Returns the filter manager. */ + XclImpAutoFilterBuffer& GetFilterManager() const; + /** Returns the web query buffer. */ + XclImpWebQueryBuffer& GetWebQueryBuffer() const; + /** Returns the pivot table manager. */ + XclImpPivotTableManager& GetPivotTableManager() const; + /** Returns the sheet protection options of the current sheet. */ + XclImpSheetProtectBuffer& GetSheetProtectBuffer() const; + /** Returns the document protection options. */ + XclImpDocProtectBuffer& GetDocProtectBuffer() const; + + /** Returns the page settings of the current sheet. */ + XclImpPageSettings& GetPageSettings() const; + /** Returns the view settings of the entire document. */ + XclImpDocViewSettings& GetDocViewSettings() const; + /** Returns the view settings of the current sheet. */ + XclImpTabViewSettings& GetTabViewSettings() const; + + /** Returns the Calc add-in function name for an Excel function name. */ + String GetScAddInName( const String& rXclName ) const; + + /** Returns true, if the document contains a VB project. */ + inline bool HasBasic() const { return mrImpData.mbHasBasic; } + /** Called to indicate that the document contains a VB project. */ + inline void SetHasBasic() { mrImpData.mbHasBasic = true; } + /** Reads the CODENAME record and inserts the codename into the document. */ + void ReadCodeName( XclImpStream& rStrm, bool bGlobals ); + +private: + mutable XclImpRootData& mrImpData; /// Reference to the global import data struct. +}; + +// ============================================================================ + +#endif diff --git a/sc/source/filter/inc/xistream.hxx b/sc/source/filter/inc/xistream.hxx new file mode 100644 index 000000000000..9b27077d78e7 --- /dev/null +++ b/sc/source/filter/inc/xistream.hxx @@ -0,0 +1,529 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XISTREAM_HXX +#define SC_XISTREAM_HXX + +#include <comphelper/docpasswordhelper.hxx> +#include <filter/msfilter/mscodec.hxx> +#include "xlstream.hxx" +#include "xlconst.hxx" + +class XclImpRoot; + +/* ============================================================================ +Input stream class for Excel import +- CONTINUE record handling +- ByteString and UniString support +- Decryption +============================================================================ */ + +// ============================================================================ +// Decryption +// ============================================================================ + +class XclImpDecrypter; +typedef ScfRef< XclImpDecrypter > XclImpDecrypterRef; + +/** Base class for BIFF stream decryption. */ +class XclImpDecrypter : public ::comphelper::IDocPasswordVerifier +{ +public: + explicit XclImpDecrypter(); + virtual ~XclImpDecrypter(); + + /** Returns the current error code of the decrypter. */ + inline ErrCode GetError() const { return mnError; } + /** Returns true, if the decoder has been initialized correctly. */ + inline bool IsValid() const { return mnError == ERRCODE_NONE; } + + /** Creates a (ref-counted) copy of this decrypter object. */ + XclImpDecrypterRef Clone() const; + + /** Implementation of the ::comphelper::IDocPasswordVerifier interface, + calls the new virtual function implVerify(). */ + virtual ::comphelper::DocPasswordVerifierResult + verifyPassword( const ::rtl::OUString& rPassword ); + + /** Updates the decrypter on start of a new record or after seeking stream. */ + void Update( SvStream& rStrm, sal_uInt16 nRecSize ); + /** Reads and decrypts nBytes bytes and stores data into the existing(!) buffer pData. + @return Count of bytes really read. */ + sal_uInt16 Read( SvStream& rStrm, void* pData, sal_uInt16 nBytes ); + +protected: + /** Protected copy c'tor for OnClone(). */ + explicit XclImpDecrypter( const XclImpDecrypter& rSrc ); + +private: + /** Implementation of cloning this object. */ + virtual XclImpDecrypter* OnClone() const = 0; + /** Derived classes implement password verification and initialization of + the decoder. */ + virtual bool OnVerify( const ::rtl::OUString& rPassword ) = 0; + /** Implementation of updating the decrypter. */ + virtual void OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 nRecSize ) = 0; + /** Implementation of the decryption. */ + virtual sal_uInt16 OnRead( SvStream& rStrm, sal_uInt8* pnData, sal_uInt16 nBytes ) = 0; + +private: + ErrCode mnError; /// Decrypter error code. + sal_Size mnOldPos; /// Last known stream position. + sal_uInt16 mnRecSize; /// Current record size. +}; + +// ---------------------------------------------------------------------------- + +/** Decrypts BIFF5 stream contents. */ +class XclImpBiff5Decrypter : public XclImpDecrypter +{ +public: + explicit XclImpBiff5Decrypter( sal_uInt16 nKey, sal_uInt16 nHash ); + +private: + /** Private copy c'tor for OnClone(). */ + explicit XclImpBiff5Decrypter( const XclImpBiff5Decrypter& rSrc ); + + /** Implementation of cloning this object. */ + virtual XclImpBiff5Decrypter* OnClone() const; + /** Implements password verification and initialization of the decoder. */ + virtual bool OnVerify( const ::rtl::OUString& rPassword ); + /** Implementation of updating the decrypter. */ + virtual void OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 nRecSize ); + /** Implementation of the decryption. */ + virtual sal_uInt16 OnRead( SvStream& rStrm, sal_uInt8* pnData, sal_uInt16 nBytes ); + +private: + ::msfilter::MSCodec_XorXLS95 maCodec; /// Crypto algorithm implementation. + ::std::vector< sal_uInt8 > maPassword; + sal_uInt16 mnKey; + sal_uInt16 mnHash; +}; + +// ---------------------------------------------------------------------------- + +/** Decrypts BIFF8 stream contents using the given document identifier. */ +class XclImpBiff8Decrypter : public XclImpDecrypter +{ +public: + explicit XclImpBiff8Decrypter( sal_uInt8 pnSalt[ 16 ], + sal_uInt8 pnVerifier[ 16 ], sal_uInt8 pnVerifierHash[ 16 ] ); + +private: + /** Private copy c'tor for OnClone(). */ + explicit XclImpBiff8Decrypter( const XclImpBiff8Decrypter& rSrc ); + + /** Implementation of cloning this object. */ + virtual XclImpBiff8Decrypter* OnClone() const; + /** Implements password verification and initialization of the decoder. */ + virtual bool OnVerify( const ::rtl::OUString& rPassword ); + /** Implementation of updating the decrypter. */ + virtual void OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 nRecSize ); + /** Implementation of the decryption. */ + virtual sal_uInt16 OnRead( SvStream& rStrm, sal_uInt8* pnData, sal_uInt16 nBytes ); + + /** Returns the block number corresponding to the passed stream position. */ + sal_uInt32 GetBlock( sal_Size nStrmPos ) const; + /** Returns the block offset corresponding to the passed stream position. */ + sal_uInt16 GetOffset( sal_Size nStrmPos ) const; + +private: + ::msfilter::MSCodec_Std97 maCodec; /// Crypto algorithm implementation. + ::std::vector< sal_uInt16 > maPassword; + ::std::vector< sal_uInt8 > maSalt; + ::std::vector< sal_uInt8 > maVerifier; + ::std::vector< sal_uInt8 > maVerifierHash; +}; + +// ============================================================================ +// Stream +// ============================================================================ + +/** This class represents an Excel stream position. + @descr It contains the relevant data for a stream position inside of a record + (including CONTINUE records). */ +class XclImpStreamPos +{ +public: + /** Constructs an invalid stream position data object. */ + explicit XclImpStreamPos(); + + /** Sets the stream position data to the passed values. */ + void Set( const SvStream& rStrm, sal_Size nNextPos, sal_Size nCurrSize, + sal_uInt16 nRawRecId, sal_uInt16 nRawRecSize, sal_uInt16 nRawRecLeft, + bool bValid ); + + /** Writes the contained stream position data to the given variables. */ + void Get( SvStream& rStrm, sal_Size& rnNextPos, sal_Size& rnCurrSize, + sal_uInt16& rnRawRecId, sal_uInt16& rnRawRecSize, sal_uInt16& rnRawRecLeft, + bool& rbValid ) const; + +private: + sal_Size mnPos; /// Absolute position of the stream. + sal_Size mnNextPos; /// Absolute position of next record. + sal_Size mnCurrSize; /// Current calculated size of the record. + sal_uInt16 mnRawRecId; /// Current raw record ID (including CONTINUEs). + sal_uInt16 mnRawRecSize; /// Current raw record size (without following CONTINUEs). + sal_uInt16 mnRawRecLeft; /// Bytes left in current raw record (without following CONTINUEs). + bool mbValid; /// Read state: false = record overread. +}; + +// ============================================================================ + +/** This class is used to import record oriented streams. + @descr An instance is constructed with an SvStream. The SvStream stream is + reset to its start while constructing this stream. + + To start reading a record call StartNextRecord(). Now it is possible to + read all contents of the record using operator>>() or any of the Read***() + functions. If some data exceeds the record size limit, the stream looks for + a following CONTINUE record and jumps automatically to it. It is NOT + allowed that an atomic data type is split into two records (i.e. 4 bytes of + a double in one record and the other 4 bytes in a following CONTINUE). + + Trying to read over the record limits results in a stream error. The + IsValid() function indicates that with returning false. From now on it is + undefined what data the read functions will return. The error state will be + reset, if the record is reset (with the method ResetRecord()) or if the + next record is started. + + To switch off the automatic lookup of CONTINUE records, use ResetRecord() + with false parameter. This is useful i.e. on import of Escher objects, + where sometimes solely CONTINUE records will occur. The automatic lookup + keeps switched off until the method ResetRecord() is called with parameter + true. All other settings done on the stream (i.e. alternative CONTINUE + record identifier, enabled decryption, NUL substitution character) will be + reset to default values, if a new record is started. + + The import stream supports decrypting the stream data. The contents of a + record (not the record header) will be encrypted by Excel if the file has + been stored with password protection. The functions SetDecrypter(), + EnableDecryption(), and DisableDecryption() control the usage of the + decryption algorithms. SetDecrypter() sets a new decryption algorithm and + initially enables it. DisableDecryption() may be used to stop the usage of + the decryption temporarily (sometimes record contents are never encrypted, + i.e. all BOF records or the stream position in BOUNDSHEET). Decryption will + be reenabled automatically, if a new record is started with the function + StartNextRecord(). + + It is possible to store several stream positions inside a record (including + its CONTINUE records). The positions are stored on a stack, which can be + controlled with the functions PushPosition(), PopPosition() and + RejectPosition(). The stack will be cleared whenever a new record is + started with the function StartNextRecord(). + + Additionally a single global stream position can be stored which keeps + valid during the whole import process (methods StoreGlobalPosition(), + SeekGlobalPosition() and DeleteGlobalPosition()). This is the only way to + jump back to a previous record (that is a real jump without return). +*/ +class XclImpStream +{ +public: + /** Detects the BIFF version of the passed workbook stream. */ + static XclBiff DetectBiffVersion( SvStream& rStrm ); + + /** Constructs the Excel record import stream using a TOOLS stream object. + @param rInStrm The system input stream. Will be set to its start position. + Must exist as long as this object exists. + @param bContLookup Automatic CONTINUE lookup on/off. */ + explicit XclImpStream( + SvStream& rInStrm, + const XclImpRoot& rRoot, + bool bContLookup = true ); + + ~XclImpStream(); + + /** Returns the filter root data. */ + inline const XclImpRoot& GetRoot() const { return mrRoot; } + + /** Sets stream pointer to the start of the next record content. + @descr Ignores all CONTINUE records of the current record, if automatic + CONTINUE usage is switched on. + @return false = no record found (end of stream). */ + bool StartNextRecord(); + /** Sets stream pointer to the start of the record content for the record + at the passed absolute stream position. + @return false = no record found (end of stream). */ + bool StartNextRecord( sal_Size nNextRecPos ); + /** Sets stream pointer to begin of record content. + @param bContLookup Automatic CONTINUE lookup on/off. In difference + to other stream settings, this setting is persistent until next call of + this function (because it is wanted to receive the next CONTINUE + records separately). + @param nAltContId Sets an alternative record ID for content + continuation. This value is reset automatically when a new record is + started with StartNextRecord(). */ + void ResetRecord( bool bContLookup, + sal_uInt16 nAltContId = EXC_ID_UNKNOWN ); + + /** Enables decryption of record contents for the rest of the stream. */ + void SetDecrypter( XclImpDecrypterRef xDecrypter ); + /** Sets decrypter from another stream. */ + void CopyDecrypterFrom( const XclImpStream& rStrm ); + /** Returns true, if a valid decrypter is set at the stream. */ + bool HasValidDecrypter() const; + /** Switches usage of current decryption algorithm on/off. + @descr Encryption is re-enabled automatically, if a new record is + started using the function StartNextRecord(). */ + void EnableDecryption( bool bEnable = true ); + /** Switches usage of current decryption algorithm off. + @descr This is a record-local setting. The function StartNextRecord() + always enables decryption. */ + inline void DisableDecryption() { EnableDecryption( false ); } + + /** Pushes current position on user position stack. + @descr This stack is emptied when starting a new record with + StartNextRecord(). The decryption state (enabled/disabled) is not + pushed onto the stack. */ + void PushPosition(); + /** Seeks to last position from user position stack. + @descr This position will be removed from the stack. */ + void PopPosition(); +//UNUSED2008-05 /** Removes last position from user position stack, but does not seek to it. */ +//UNUSED2008-05 void RejectPosition(); + + /** Stores current position. This position keeps valid in all records. */ + void StoreGlobalPosition(); + /** Seeks to the stored global user position. */ + void SeekGlobalPosition(); + /** Invalidates global user position. */ + inline void DeleteGlobalPosition() { mbHasGlobPos = false; } + + /** Returns record reading state: false = record overread. */ + inline bool IsValid() const { return mbValid; } + /** Returns the current record ID. */ + inline sal_uInt16 GetRecId() const { return mnRecId; } + /** Returns the position inside of the whole record content. */ + sal_Size GetRecPos() const; + /** Returns the data size of the whole record without record headers. */ + sal_Size GetRecSize(); + /** Returns remaining data size of the whole record without record headers. */ + sal_Size GetRecLeft(); + /** Returns the record ID of the following record. */ + sal_uInt16 GetNextRecId(); + + XclImpStream& operator>>( sal_Int8& rnValue ); + XclImpStream& operator>>( sal_uInt8& rnValue ); + XclImpStream& operator>>( sal_Int16& rnValue ); + XclImpStream& operator>>( sal_uInt16& rnValue ); + XclImpStream& operator>>( sal_Int32& rnValue ); + XclImpStream& operator>>( sal_uInt32& rnValue ); + XclImpStream& operator>>( float& rfValue ); + XclImpStream& operator>>( double& rfValue ); + + sal_Int8 ReadInt8(); + sal_uInt8 ReaduInt8(); + sal_Int16 ReadInt16(); + sal_uInt16 ReaduInt16(); + sal_Int32 ReadInt32(); + sal_uInt32 ReaduInt32(); + float ReadFloat(); + double ReadDouble(); + + /** Reads nBytes bytes to the existing(!) buffer pData. + @return Count of bytes really read. */ + sal_Size Read( void* pData, sal_Size nBytes ); + /** Copies nBytes bytes to rOutStrm. + @return Count of bytes really written. */ + sal_Size CopyToStream( SvStream& rOutStrm, sal_Size nBytes ); + + /** Copies the entire record to rOutStrm. The current record position keeps unchanged. + @return Count of bytes really written. */ + sal_Size CopyRecordToStream( SvStream& rOutStrm ); + + /** Seeks absolute in record content to the specified position. + @descr The value 0 means start of record, independent from physical stream position. */ + void Seek( sal_Size nPos ); + /** Seeks forward inside the current record. */ + void Ignore( sal_Size nBytes ); + + // *** special string functions *** --------------------------------------- + + // *** read/ignore unicode strings *** ------------------------------------ + /* - look for CONTINUE records even if CONTINUE handling disabled + (only if inside of a CONTINUE record - for TXO import) + - no overread assertions (for Applix wrong string length export bug) + + structure of an Excel unicode string: + (1) 2 byte character count + (2) 1 byte flags (16-bit-characters, rich string, far east string) + (3) [2 byte rich string format run count] + (4) [4 byte far east data size] + (5) character array + (6) [4 * (rich string format run count) byte] + (7) [(far east data size) byte] + header = (1), (2) + ext. header = (3), (4) + ext. data = (6), (7) + */ + + /** Reads ext. header, detects 8/16 bit mode, sets all ext. info. + @return Total size of ext. data. */ + sal_Size ReadUniStringExtHeader( + bool& rb16Bit, bool& rbRich, bool& rbFareast, + sal_uInt16& rnFormatRuns, sal_uInt32& rnExtInf, sal_uInt8 nFlags ); + /** Seeks to begin of character array, detects 8/16 bit mode. + @return Total size of ext. data. */ + sal_Size ReadUniStringExtHeader( bool& rb16Bit, sal_uInt8 nFlags ); + + /** Sets a replacement character for NUL characters. + @descr NUL characters must be replaced, because Tools strings cannot + handle them. The substitution character is reset to '?' automatically, + if a new record is started using the function StartNextRecord(). + @param cNulSubst The character to use for NUL replacement. It is + possible to specify NUL here. in this case strings are terminated when + the first NUL occurs during string import. */ + inline void SetNulSubstChar( sal_Unicode cNulSubst = '?' ) { mcNulSubst = cNulSubst; } + + /** Reads nChars characters and returns the string. */ + String ReadRawUniString( sal_uInt16 nChars, bool b16Bit ); + /** Reads ext. header, nChar characters, ext. data and returns the string. */ + String ReadUniString( sal_uInt16 nChars, sal_uInt8 nFlags ); + /** Reads 8 bit flags, ext. header, nChar characters, ext. data and returns the string. */ + String ReadUniString( sal_uInt16 nChars ); + /** Reads 16 bit character count, 8 bit flags, ext. header, character array, + ext. data and returns the string. */ + String ReadUniString(); + + /** Ignores nChars characters. */ + void IgnoreRawUniString( sal_uInt16 nChars, bool b16Bit ); + /** Ignores ext. header, nChar characters, ext. data. */ + void IgnoreUniString( sal_uInt16 nChars, sal_uInt8 nFlags ); + /** Ignores 8 bit flags, ext. header, nChar characters, ext. data. */ + void IgnoreUniString( sal_uInt16 nChars ); + /** Ignores 16 bit character count, 8 bit flags, ext. header, character array, ext. data. */ + void IgnoreUniString(); + + // *** read/ignore 8-bit-strings, store in String *** --------------------- + + /** Reads nChar byte characters and returns the string. */ + String ReadRawByteString( sal_uInt16 nChars ); + /** Reads 8/16 bit string length, character array and returns the string. */ + String ReadByteString( bool b16BitLen ); + + // *** SvStream functions *** --------------------------------------------- + + /** Returns the absolute stream position. */ + inline sal_Size GetSvStreamPos() const { return mrStrm.Tell(); } + /** Returns the stream size. */ + inline sal_Size GetSvStreamSize() const { return mnStreamSize; } + +private: + /** Stores current stream position into rPos. */ + void StorePosition( XclImpStreamPos& rPos ); + /** Restores stream position contained in rPos. */ + void RestorePosition( const XclImpStreamPos& rPos ); + + /** Seeks to next raw record header and reads record ID and size. + @descr This is a "raw" function, means that stream members are + inconsistent after return. Does only change mnRawRecId, mnRawRecSize, + and the base stream position, but no other members. + @return false = No record header found (end of stream). */ + bool ReadNextRawRecHeader(); + + /** Initializes the decrypter to read a new record. */ + void SetupDecrypter(); + /** Initializes all members after base stream has been seeked to new raw record. */ + void SetupRawRecord(); + /** Initializes all members after base stream has been seeked to new record. */ + void SetupRecord(); + + /** Returns true, if the passed ID is real or alternative continuation record ID. */ + bool IsContinueId( sal_uInt16 nRecId ) const; + + /** Goes to start of the next CONTINUE record. + @descr Stream must be located at the end of a raw record, and handling + of CONTINUE records must be enabled. + @return Copy of mbValid. */ + bool JumpToNextContinue(); + /** Goes to start of the next CONTINUE record while reading strings. + @descr Stream must be located at the end of a raw record. If reading + has been started in a CONTINUE record, jumps to an existing following + CONTINUE record, even if handling of CONTINUE records is disabled (This + is a special handling for TXO string data). Reads additional Unicode + flag byte at start of the new raw record and sets or resets rb16Bit. + @return Copy of mbValid. */ + bool JumpToNextStringContinue( bool& rb16Bit ); + + /** Ensures that reading nBytes bytes is possible with next stream access. + @descr Stream must be located at the end of a raw record, and handling + of CONTINUE records must be enabled. + @return Copy of mbValid. */ + bool EnsureRawReadSize( sal_uInt16 nBytes ); + /** Returns the maximum size of raw data possible to read in one block. */ + sal_uInt16 GetMaxRawReadSize( sal_Size nBytes ) const; + + /** Reads and decrypts nBytes bytes to the existing(!) buffer pData. + @return Count of bytes really read. */ + sal_uInt16 ReadRawData( void* pData, sal_uInt16 nBytes ); + + /** Reads 8 bit/16 bit string length. */ + inline sal_uInt16 ReadByteStrLen( bool b16BitLen ) + { return b16BitLen ? ReaduInt16() : ReaduInt8(); } + +private: + typedef ::std::vector< XclImpStreamPos > XclImpStreamPosStack; + + SvStream& mrStrm; /// Reference to the system input stream. + const XclImpRoot& mrRoot; /// Filter root data. + + XclImpDecrypterRef mxDecrypter; /// Provides methods to decrypt data. + + XclImpStreamPos maFirstRec; /// Start position of current record. + XclImpStreamPosStack maPosStack; /// Stack for record positions. + + XclImpStreamPos maGlobPos; /// User defined position elsewhere in stream. + sal_uInt16 mnGlobRecId; /// Record ID for user defined position. + bool mbGlobValidRec; /// Was user position a valid record? + bool mbHasGlobPos; /// Is user position defined? + + sal_Size mnStreamSize; /// Size of system stream. + sal_Size mnNextRecPos; /// Start of next record header. + sal_Size mnCurrRecSize; /// Helper for record position. + sal_Size mnComplRecSize; /// Size of complete record data (with CONTINUEs). + bool mbHasComplRec; /// true = mnComplRecSize is valid. + + sal_uInt16 mnRecId; /// Current record ID (not the CONTINUE ID). + sal_uInt16 mnAltContId; /// Alternative record ID for content continuation. + + sal_uInt16 mnRawRecId; /// Current raw record ID (including CONTINUEs). + sal_uInt16 mnRawRecSize; /// Current raw record size (without following CONTINUEs). + sal_uInt16 mnRawRecLeft; /// Bytes left in current raw record (without following CONTINUEs). + + sal_Unicode mcNulSubst; /// Replacement for NUL characters. + + bool mbCont; /// Automatic CONTINUE lookup on/off. + bool mbUseDecr; /// Usage of decryption. + bool mbValidRec; /// false = No more records to read. + bool mbValid; /// false = Record overread. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xistring.hxx b/sc/source/filter/inc/xistring.hxx new file mode 100644 index 000000000000..a6f00d26d2e2 --- /dev/null +++ b/sc/source/filter/inc/xistring.hxx @@ -0,0 +1,121 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XISTRING_HXX +#define SC_XISTRING_HXX + +#include "xlstring.hxx" + +// Byte/Unicode strings ======================================================= + +class XclImpStream; + +/** This class represents an unformatted or formatted string and provides importing from stream. */ +class XclImpString +{ +public: + /** Constructs an empty string. */ + explicit XclImpString(); + /** Constructs an unformatted string. */ + explicit XclImpString( const String& rString ); + + ~XclImpString(); + + /** Reads a complete string from the passed stream. */ + void Read( XclImpStream& rStrm, XclStrFlags nFlags = EXC_STR_DEFAULT ); + + /** Sets the passed string data. */ + inline void SetText( const String& rText ) { maString = rText; } + /** Sets the passed formatting buffer. */ + inline void SetFormats( const XclFormatRunVec& rFormats ) { maFormats = rFormats; } + /** Insert a formatting run to the format buffer. */ + inline void AppendFormat( sal_uInt16 nChar, sal_uInt16 nFontIdx ) { AppendFormat( maFormats, nChar, nFontIdx ); } + /** Reads and appends the formatting information (run count and runs) from stream. */ + inline void ReadFormats( XclImpStream& rStrm ) { ReadFormats( rStrm, maFormats ); } + /** Reads and appends nRunCount formatting runs from stream. */ + inline void ReadFormats( XclImpStream& rStrm, sal_uInt16 nRunCount ) { ReadFormats( rStrm, maFormats, nRunCount ); } + /** Reads and appends formatting runs from an OBJ or TXO record. */ + inline void ReadObjFormats( XclImpStream& rStrm, sal_uInt16 nFormatSize ) { ReadObjFormats( rStrm, maFormats, nFormatSize ); } + + /** Returns true, if the string is empty. */ + inline bool IsEmpty() const { return maString.Len() == 0; } + /** Returns the pure text data of the string. */ + inline const String& GetText() const { return maString; } + + /** Returns true, if the string contains formatting information. */ + inline bool IsRich() const { return !maFormats.empty(); } + /** Returns the formatting run vector. */ + inline const XclFormatRunVec& GetFormats() const { return maFormats; } + + /** Insert a formatting run to the passed format buffer. */ + static void AppendFormat( XclFormatRunVec& rFormats, sal_uInt16 nChar, sal_uInt16 nFontIdx ); + /** Reads and appends the formatting information (run count and runs) from stream. */ + static void ReadFormats( XclImpStream& rStrm, XclFormatRunVec& rFormats ); + /** Reads and appends nRunCount formatting runs from stream. */ + static void ReadFormats( XclImpStream& rStrm, XclFormatRunVec& rFormats, sal_uInt16 nRunCount ); + /** Reads and appends formatting runs from an OBJ or TXO record. */ + static void ReadObjFormats( XclImpStream& rStrm, XclFormatRunVec& rFormats, sal_uInt16 nFormatSize ); + +private: + String maString; /// The text data of the string. + XclFormatRunVec maFormats; /// All formatting runs. +}; + +// String iterator ============================================================ + +/** Iterates over formatted string portions. */ +class XclImpStringIterator +{ +public: + explicit XclImpStringIterator( const XclImpString& rString ); + + /** Returns true, if the iterator references a valid text portion. */ + inline bool Is() const { return mnTextBeg < mrText.Len(); } + /** Returns the index of the current text portion. */ + inline size_t GetPortionIndex() const { return mnPortion; } + /** Returns the string of the current text portion. */ + String GetPortionText() const; + /** Returns the font index of the current text portion. */ + sal_uInt16 GetPortionFont() const; + + /** Moves iterator to next text portion. */ + XclImpStringIterator& operator++(); + +private: + const String& mrText; /// The processed string. + const XclFormatRunVec& mrFormats; /// The vector of formatting runs. + size_t mnPortion; /// Current text portion. + xub_StrLen mnTextBeg; /// First character of current portion. + xub_StrLen mnTextEnd; /// First character of next portion. + size_t mnFormatsBeg; /// Formatting run index for current portion. + size_t mnFormatsEnd; /// Formatting run index for next portion. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xistyle.hxx b/sc/source/filter/inc/xistyle.hxx new file mode 100644 index 000000000000..104002542a17 --- /dev/null +++ b/sc/source/filter/inc/xistyle.hxx @@ -0,0 +1,679 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XISTYLE_HXX +#define SC_XISTYLE_HXX + +#include <list> +#include <tools/mempool.hxx> +#include "rangelst.hxx" +#include "patattr.hxx" +#include "xladdress.hxx" +#include "xlstyle.hxx" +#include "xiroot.hxx" + +class ScDocumentPool; + +/* ============================================================================ +- Buffers for style records (PALETTE, FONT, FORMAT, XF) + and a container for XF indexes for every used cell in a sheet. +============================================================================ */ + +// PALETTE record - color information ========================================= + +/** Stores the default colors for the current BIFF version and the contents of + a PALETTE record. */ +class XclImpPalette : public XclDefaultPalette +{ +public: + explicit XclImpPalette( const XclImpRoot& rRoot ); + + /** Clears all buffered data, used to set up for a new sheet. */ + void Initialize(); + + /** Returns the RGB color data for a (non-zero-based) Excel palette entry. + @descr First looks for a color read from file, then looks for a default color. + @return The color from current or default palette or COL_AUTO, if nothing else found. */ + ColorData GetColorData( sal_uInt16 nXclIndex ) const; + /** Returns the color for a (non-zero-based) Excel palette entry. + @descr First looks for a color read from file, then looks for a default color. + @return The color from current or default palette or COL_AUTO, if nothing else found. */ + inline Color GetColor( sal_uInt16 nXclIndex ) const + { return Color( GetColorData( nXclIndex ) ); } + + /** Reads a PALETTE record. */ + void ReadPalette( XclImpStream& rStrm ); + +private: + typedef ::std::vector< ColorData > ColorDataVec; + ColorDataVec maColorTable; /// Colors read from file. +}; + +// FONT record - font information ============================================= + +/** Stores all data of an Excel font and provides import of FONT records. */ +class XclImpFont : protected XclImpRoot +{ +public: + explicit XclImpFont( const XclImpRoot& rRoot ); + + /** Constructs a font from font data. + @descr Special handling for font style (bold, italic) in font name, + overwrites settings in rFontData. */ + explicit XclImpFont( const XclImpRoot& rRoot, const XclFontData& rFontData ); + + /** Sets all font attributes to used or unused. */ + void SetAllUsedFlags( bool bUsed ); + /** Sets the passed font data and all used flags to 'used'. */ + void SetFontData( const XclFontData& rFontData, bool bHasCharSet ); + + /** Returns read-only access to font data. */ + inline const XclFontData& GetFontData() const { return maData; } + /** Returns true, if the font character set is valid. */ + inline bool HasCharSet() const { return mbHasCharSet; } + /** Returns true, if the font contains superscript or subscript. */ + inline bool HasEscapement() const { return maData.mnEscapem != EXC_FONTESC_NONE; } + /** Returns the text encoding for strings used with this font. */ + rtl_TextEncoding GetFontEncoding() const; + + /** Returns true, if this font contains characters for Western scripts. */ + inline bool HasWesternChars() const { return mbHasWstrn; } + /** Returns true, if this font contains characters for Asian scripts (CJK). */ + inline bool HasAsianChars() const { return mbHasAsian; } + /** Returns true, if this font contains characters for Complex scripts (CTL). */ + inline bool HasComplexChars() const { return mbHasCmplx; } + + /** Reads a FONT record for all BIFF versions. */ + void ReadFont( XclImpStream& rStrm ); + /** Reads an EFONT record (BIFF2 font color). */ + void ReadEfont( XclImpStream& rStrm ); + /** Reads the font block from a CF (conditional format) record. */ + void ReadCFFontBlock( XclImpStream& rStrm ); + + /** Fills all font properties to the item set. + @param rItemSet The destination item set. + @param eType The type of Which-IDs. + @param bSkipPoolDefs true = Do not put items equal to pool default; false = Put all items. */ + void FillToItemSet( SfxItemSet& rItemSet, XclFontItemType eType, + bool bSkipPoolDefs = false ) const; + /** Writes all font properties to the passed property set. + @param pFontColor If set, overrides internal stored font color. */ + void WriteFontProperties( ScfPropertySet& rPropSet, + XclFontPropSetType eType, const Color* pFontColor = 0 ) const; + +private: + /** Reads and sets height and flags. */ + void ReadFontData2( XclImpStream& rStrm ); + /** Reads and sets height, flags, color, boldness, script, family and charset. */ + void ReadFontData5( XclImpStream& rStrm ); + + /** Reads and sets the font color. */ + void ReadFontColor( XclImpStream& rStrm ); + + /** Reads and sets a byte string as font name. */ + void ReadFontName2( XclImpStream& rStrm ); + /** Reads and sets a Unicode string as font name. */ + void ReadFontName8( XclImpStream& rStrm ); + + /** Tests whether the font contains CJK or CTL characters. + @descr This is only a weak guess using preselected characters. */ + void GuessScriptType(); + +private: + XclFontData maData; /// All font attributes. + bool mbHasCharSet; /// true = Font contains own character set info. + bool mbHasWstrn; /// true = Font contains Western script characters. + bool mbHasAsian; /// true = Font contains Asian script characters. + bool mbHasCmplx; /// true = Font contains Complex script characters. + bool mbFontNameUsed; /// true = Font name, family, charset used. + bool mbHeightUsed; /// true = Font height used. + bool mbColorUsed; /// true = Color used. + bool mbWeightUsed; /// true = Weight used. + bool mbEscapemUsed; /// true = Escapement type used. + bool mbUnderlUsed; /// true = Underline style used. + bool mbItalicUsed; /// true = Italic used. + bool mbStrikeUsed; /// true = Strikeout used. + bool mbOutlineUsed; /// true = Outlined used. + bool mbShadowUsed; /// true = Shadowed used. +}; + +// ---------------------------------------------------------------------------- + +/** Stores the data of all fonts occurred in an Excel file. */ +class XclImpFontBuffer : protected XclImpRoot, ScfNoCopy +{ +public: + explicit XclImpFontBuffer( const XclImpRoot& rRoot ); + + /** Clears all buffered data, used to set up for a new sheet. */ + void Initialize(); + + /** Returns the object that stores all contents of a FONT record. */ + const XclImpFont* GetFont( sal_uInt16 nFontIndex ) const; + /** Returns the application font data of this file, needed i.e. for column width. */ + inline const XclFontData& GetAppFontData() const { return maAppFont; } + + /** Reads a FONT record. */ + void ReadFont( XclImpStream& rStrm ); + /** Reads an EFONT record (BIFF2 font color). */ + void ReadEfont( XclImpStream& rStrm ); + + /** Fills all font properties from a FONT record to the item set. + @param rItemSet The destination item set. + @param eType The type of Which-IDs. + @param nFontIdx The Excel index of the font. + @param bSkipPoolDefs true = Do not put items equal to pool default; false = Put all items. */ + void FillToItemSet( SfxItemSet& rItemSet, XclFontItemType eType, + sal_uInt16 nFontIdx, bool bSkipPoolDefs = false ) const; + /** Writes all font properties to the passed property set. + @param pFontColor If set, overrides internal stored font color. */ + void WriteFontProperties( + ScfPropertySet& rPropSet, XclFontPropSetType eType, + sal_uInt16 nFontIdx, const Color* pFontColor = 0 ) const; + /** Writes default font properties for form controls to the passed property set. */ + void WriteDefaultCtrlFontProperties( ScfPropertySet& rPropSet ) const; + +private: + /** Updates the application default font. */ + void UpdateAppFont( const XclFontData& rFontData, bool bHasCharSet ); + +private: + ScfDelList< XclImpFont > maFontList; /// List of all FONT records in the Excel file. + XclFontData maAppFont; /// Application font (for column width). + XclImpFont maFont4; /// Built-in font with index 4. + XclImpFont maCtrlFont; /// BIFF5 default form controls font (Helv,8pt,bold). +}; + +// FORMAT record - number formats ============================================= + +/** Stores all user defined number formats occured in the file. */ +class XclImpNumFmtBuffer : public XclNumFmtBuffer, protected XclImpRoot +{ +public: + explicit XclImpNumFmtBuffer( const XclImpRoot& rRoot ); + + /** Clears all buffered data, used to set up for a new sheet. */ + void Initialize(); + + /** Reads a FORMAT record. */ + void ReadFormat( XclImpStream& rStrm ); + /** Creates the number formats in the Calc document. */ + void CreateScFormats(); + + /** Returns the format key with the passed Excel index or NUMBERFORMAT_ENTRY_NOT_FOUND on error. */ + ULONG GetScFormat( sal_uInt16 nXclNumFmt ) const; + + /** Fills an Excel number format to the passed item set. + @param rItemSet The destination item set. + @param nXclNumFmt The Excel number format index. + @param bSkipPoolDefs true = Do not put items equal to pool default; false = Put all items. */ + void FillToItemSet( + SfxItemSet& rItemSet, sal_uInt16 nXclNumFmt, + bool bSkipPoolDefs = false ) const; + /** Fills a Calc number format to the passed item set. + @param rItemSet The destination item set. + @param nScNumFmt The Calc number formatter index of the format. + @param bSkipPoolDefs true = Do not put items equal to pool default; false = Put all items. */ + void FillScFmtToItemSet( + SfxItemSet& rItemSet, ULONG nScNumFmt, + bool bSkipPoolDefs = false ) const; + +private: + typedef ::std::map< sal_uInt16, ULONG > XclImpIndexMap; + + XclImpIndexMap maIndexMap; /// Maps Excel format indexes to Calc formats. + sal_uInt16 mnNextXclIdx; /// Index counter for BIFF2-BIFF4. +}; + +// XF, STYLE record - Cell formatting ========================================= + +/** Extends the XclCellProt struct for import. + @descr Provides functions to fill from Excel record data and to fill to item sets. */ +struct XclImpCellProt : public XclCellProt +{ + /** Fills this struct with BIFF2 XF record data. */ + void FillFromXF2( sal_uInt8 nNumFmt ); + /** Fills this struct with BIFF3-BIFF8 XF record data. */ + void FillFromXF3( sal_uInt16 nProt ); + + /** Inserts items representing this protection style into the item set. + @param bSkipPoolDefs true = Do not put items equal to pool default; false = Put all items. */ + void FillToItemSet( SfxItemSet& rItemSet, bool bSkipPoolDefs = false ) const; +}; + +// ---------------------------------------------------------------------------- + +/** Extends the XclCellAlign struct for import. + @descr Provides functions to fill from Excel record data and to fill to item sets. */ +struct XclImpCellAlign : public XclCellAlign +{ + /** Fills this struct with BIFF2 XF record data. */ + void FillFromXF2( sal_uInt8 nFlags ); + /** Fills this struct with BIFF3 XF record data. */ + void FillFromXF3( sal_uInt16 nAlign ); + /** Fills this struct with BIFF4 XF record data. */ + void FillFromXF4( sal_uInt16 nAlign ); + /** Fills this struct with BIFF5/BIFF7 XF record data. */ + void FillFromXF5( sal_uInt16 nAlign ); + /** Fills this struct with BIFF8 XF record data. */ + void FillFromXF8( sal_uInt16 nAlign, sal_uInt16 nMiscAttrib ); + + /** Inserts items representing this alignment style into the item set. + @param bSkipPoolDefs true = Do not put items equal to pool default; false = Put all items. */ + void FillToItemSet( SfxItemSet& rItemSet, const XclImpFont* pFont, bool bSkipPoolDefs = false ) const; +}; + +// ---------------------------------------------------------------------------- + +/** Extends the XclCellBorder struct for import. + @descr Provides functions to fill from Excel record data and to fill to item sets. */ +struct XclImpCellBorder : public XclCellBorder +{ + bool mbLeftUsed; /// true = Left line style used. + bool mbRightUsed; /// true = Right line style used. + bool mbTopUsed; /// true = Top line style used. + bool mbBottomUsed; /// true = Bottom line style used. + bool mbDiagUsed; /// true = Diagonal line style used. + + explicit XclImpCellBorder(); + + /** Sets outer line states and diagonal line states to used or unused. */ + void SetUsedFlags( bool bOuterUsed, bool bDiagUsed ); + + /** Fills this struct with BIFF2 XF record data. */ + void FillFromXF2( sal_uInt8 nFlags ); + /** Fills this struct with BIFF3/BIFF4 XF record data. */ + void FillFromXF3( sal_uInt32 nBorder ); + /** Fills this struct with BIFF5/BIFF7 XF record data. */ + void FillFromXF5( sal_uInt32 nBorder, sal_uInt32 nArea ); + /** Fills this struct with BIFF8 XF record data. */ + void FillFromXF8( sal_uInt32 nBorder1, sal_uInt32 nBorder2 ); + + /** Fills this struct with BIFF8 CF (conditional format) record data. */ + void FillFromCF8( sal_uInt16 nLineStyle, sal_uInt32 nLineColor, sal_uInt32 nFlags ); + + /** Returns true, if any of the outer border lines is visible. */ + bool HasAnyOuterBorder() const; + + /** Inserts a box item representing this border style into the item set. + @param bSkipPoolDefs true = Do not put items equal to pool default; false = Put all items. */ + void FillToItemSet( + SfxItemSet& rItemSet, + const XclImpPalette& rPalette, + bool bSkipPoolDefs = false ) const; +}; + +// ---------------------------------------------------------------------------- + +/** Extends the XclCellArea struct for import. + @descr Provides functions to fill from Excel record data and to fill to item sets. */ +struct XclImpCellArea : public XclCellArea +{ + bool mbForeUsed; /// true = Foreground color used. + bool mbBackUsed; /// true = Background color used. + bool mbPattUsed; /// true = Pattern used. + + explicit XclImpCellArea(); + + /** Sets colors and pattern state to used or unused. */ + void SetUsedFlags( bool bUsed ); + + /** Fills this struct with BIFF2 XF record data. */ + void FillFromXF2( sal_uInt8 nFlags ); + /** Fills this struct with BIFF3/BIFF4 XF record data. */ + void FillFromXF3( sal_uInt16 nArea ); + /** Fills this struct with BIFF5/BIFF7 XF record data. */ + void FillFromXF5( sal_uInt32 nArea ); + /** Fills this struct with BIFF8 XF record data. */ + void FillFromXF8( sal_uInt32 nBorder2, sal_uInt16 nArea ); + + /** Fills this struct with BIFF8 CF (conditional format) record data. */ + void FillFromCF8( sal_uInt16 nPattern, sal_uInt16 nColor, sal_uInt32 nFlags ); + + /** Inserts a brush item representing this area style into the item set. + @param bSkipPoolDefs true = Do not put items equal to pool default; false = Put all items. */ + void FillToItemSet( + SfxItemSet& rItemSet, + const XclImpPalette& rPalette, + bool bSkipPoolDefs = false ) const; +}; + +// ---------------------------------------------------------------------------- + +/** Represents an XF record index with additional information. */ +class XclImpXFIndex +{ +public: + inline explicit XclImpXFIndex( sal_uInt16 nXFIndex, bool bBoolCell = false ) : + mnXFIndex( nXFIndex ), mbBoolCell( bBoolCell ) {} + + inline sal_uInt16 GetXFIndex() const { return mnXFIndex; } + inline bool IsBoolCell() const { return mbBoolCell; } + +private: + sal_uInt16 mnXFIndex; /// The XF record index. + bool mbBoolCell; /// true = A Boolean value cell. +}; + +inline bool operator==( const XclImpXFIndex& rLeft, const XclImpXFIndex& rRight ) +{ return (rLeft.GetXFIndex() == rRight.GetXFIndex()) && (rLeft.IsBoolCell() == rRight.IsBoolCell()); } + +inline bool operator!=( const XclImpXFIndex& rLeft, const XclImpXFIndex& rRight ) +{ return !(rLeft == rRight); } + +// ---------------------------------------------------------------------------- + +/** Contains all data of a XF record and a Calc item set. */ +class XclImpXF : public XclXFBase, protected XclImpRoot, ScfNoCopy +{ +public: + explicit XclImpXF( const XclImpRoot& rRoot ); + virtual ~XclImpXF(); + + /** Reads an XF record. */ + void ReadXF( XclImpStream& rStrm ); + + inline sal_uInt8 GetHorAlign() const { return maAlignment.mnHorAlign; } + inline sal_uInt8 GetVerAlign() const { return maAlignment.mnVerAlign; } + inline sal_uInt16 GetFontIndex() const { return mnXclFont; } + + /** Creates a Calc item set containing an item set with all cell properties. + @param bSkipPoolDefs true = Do not put items equal to pool default; false = Put all items. + @return A read-only reference to the item set stored internally. */ + const ScPatternAttr& CreatePattern( bool bSkipPoolDefs = false ); + + /** Inserts all formatting attributes to the specified area in the Calc document. + @param nForcedNumFmt If not set to NUMBERFORMAT_ENTRY_NOT_FOUND, it will overwrite + the number format of the XF. */ + void ApplyPattern( + SCCOL nScCol1, SCROW nScRow1, + SCCOL nScCol2, SCROW nScRow2, + SCTAB nScTab, + ULONG nForceScNumFmt = NUMBERFORMAT_ENTRY_NOT_FOUND ); + +private: + void ReadXF2( XclImpStream& rStrm ); + void ReadXF3( XclImpStream& rStrm ); + void ReadXF4( XclImpStream& rStrm ); + void ReadXF5( XclImpStream& rStrm ); + void ReadXF8( XclImpStream& rStrm ); + + /** Sets all "attribute used" flags according to the passed mask. + @descr In cell XFs, a set bit represents "used", in style XFs it is a cleared bit. + Therefore mbCellXF must be set correctly before calling this method. */ + void SetUsedFlags( sal_uInt8 nUsedFlags ); + +private: + typedef ::std::auto_ptr< ScPatternAttr > ScPatternAttrPtr; + + ScPatternAttrPtr mpPattern; /// Calc item set. + ScStyleSheet* mpStyleSheet; /// Calc cell style sheet. + + XclImpCellProt maProtection; /// Cell protection flags. + XclImpCellAlign maAlignment; /// All alignment attributes. + XclImpCellBorder maBorder; /// Border line style. + XclImpCellArea maArea; /// Background area style. + sal_uInt16 mnXclNumFmt; /// Index to number format. + sal_uInt16 mnXclFont; /// Index to font record. +}; + +// ---------------------------------------------------------------------------- + +/** Contains all data of a cell style associated with an XF record. */ +class XclImpStyle : protected XclImpRoot +{ +public: + explicit XclImpStyle( const XclImpRoot& rRoot ); + + /** Reads a STYLE record. */ + void ReadStyle( XclImpStream& rStrm ); + + inline const String& GetName() const { return maName; } + inline sal_uInt16 GetXfId() const { return mnXfId; } + inline bool IsBuiltin() const { return mbBuiltin && (mnBuiltinId != EXC_STYLE_USERDEF); } + inline sal_uInt8 GetBuiltinId() const { return mnBuiltinId; } + inline sal_uInt8 GetLevel() const { return mnLevel; } + + /** Creates a cell style sheet and inserts it into the Calc document. + @return The pointer to the cell style sheet, or 0, if there is no style sheet. */ + ScStyleSheet* CreateStyleSheet(); + /** Creates the Calc style sheet, if this is a user-defined style. */ + void CreateUserStyle( const String& rFinalName ); + +private: + String maName; /// Cell style name. + sal_uInt16 mnXfId; /// Formatting for this cell style. + sal_uInt8 mnBuiltinId; /// Identifier for builtin styles. + sal_uInt8 mnLevel; /// Level for builtin column/row styles. + bool mbBuiltin; /// True = builtin style. + bool mbCustom; /// True = customized builtin style. + bool mbHidden; /// True = style not visible in GUI. + + String maFinalName; /// Final name used in the Calc document. + ScStyleSheet* mpStyleSheet; /// Calc cell style sheet. +}; + +// ---------------------------------------------------------------------------- + +/** Contains all XF records occured in the file. + @descr This class is able to read XF records (BIFF2 - BIFF8) and STYLE records (BIFF8). */ +class XclImpXFBuffer : protected XclImpRoot, ScfNoCopy +{ +public: + explicit XclImpXFBuffer( const XclImpRoot& rRoot ); + + /** Clears all buffered data, used to set up for a new sheet. */ + void Initialize(); + + /** Reads an XF record. */ + void ReadXF( XclImpStream& rStrm ); + /** Reads a STYLE record. */ + void ReadStyle( XclImpStream& rStrm ); + + /** Returns the object that stores all contents of an XF record. */ + inline XclImpXF* GetXF( sal_uInt16 nXFIndex ) const + { return maXFList.GetObject( nXFIndex ); } + + /** Returns the index to the Excel font used in the specified XF record. */ + sal_uInt16 GetFontIndex( sal_uInt16 nXFIndex ) const; + /** Returns the Excel font used in the specified XF record. */ + const XclImpFont* GetFont( sal_uInt16 nXFIndex ) const; + + /** Creates all user defined style sheets. */ + void CreateUserStyles(); + /** Creates a cell style sheet of the passed XF and inserts it into the Calc document. + @return The pointer to the cell style sheet, or 0, if there is no style sheet. */ + ScStyleSheet* CreateStyleSheet( sal_uInt16 nXFIndex ); + + /** Inserts formatting attributes from an XF to the specified area in the Calc document. + @param nForcedNumFmt If not set to NUMBERFORMAT_ENTRY_NOT_FOUND, it will overwrite + the number format of the XF. */ + void ApplyPattern( + SCCOL nScCol1, SCROW nScRow1, + SCCOL nScCol2, SCROW nScRow2, + SCTAB nScTab, const XclImpXFIndex& rXFIndex ); + +private: + typedef ScfDelList< XclImpStyle > XclImpStyleList; + typedef ::std::map< sal_uInt16, XclImpStyle* > XclImpStyleMap; + + ScfDelList< XclImpXF > maXFList; /// List of contents of all XF record. + XclImpStyleList maBuiltinStyles; /// List of built-in cell styles. + XclImpStyleList maUserStyles; /// List of user defined cell styles. + XclImpStyleMap maStylesByXf; /// Maps XF records to cell styles. +}; + +// Buffer for XF indexes in cells ============================================= + +/** Contains an (encoded) XF index for a range of rows in a single column. */ +class XclImpXFRange +{ + DECL_FIXEDMEMPOOL_NEWDEL( XclImpXFRange ) + +public: + SCROW mnScRow1; /// The first row of an equal-formatted range. + SCROW mnScRow2; /// The last row of an equal-formatted range. + XclImpXFIndex maXFIndex; /// Extended XF index. + + inline explicit XclImpXFRange( SCROW nScRow, const XclImpXFIndex& rXFIndex ); + inline explicit XclImpXFRange( SCROW nFirstScRow, SCROW nLastScRow, const XclImpXFIndex& rXFIndex ); + + /** Returns true, if nScRow is contained in own row range. */ + inline bool Contains( SCROW nScRow ) const; + + /** Returns true, if the range has been expanded. */ + bool Expand( SCROW nScRow, const XclImpXFIndex& rXFIndex ); + /** Returns true, if the range has been expanded. */ + bool Expand( const XclImpXFRange& rNextRange ); +}; + +inline XclImpXFRange::XclImpXFRange( SCROW nScRow, const XclImpXFIndex& rXFIndex ) : + mnScRow1( nScRow ), + mnScRow2( nScRow ), + maXFIndex( rXFIndex ) +{ +} + +inline XclImpXFRange::XclImpXFRange( SCROW nFirstScRow, SCROW nLastScRow, const XclImpXFIndex& rXFIndex ) : + mnScRow1( nFirstScRow ), + mnScRow2( nLastScRow ), + maXFIndex( rXFIndex ) +{ +} + +inline bool XclImpXFRange::Contains( SCROW nScRow ) const +{ + return (mnScRow1 <= nScRow) && (nScRow <= mnScRow2); +} + +// ---------------------------------------------------------------------------- + +/** Contains the XF indexes for every used cell in a column. */ +class XclImpXFRangeColumn : ScfNoCopy +{ +public: + inline explicit XclImpXFRangeColumn() {} + + /** Returns the first formatted cell range in this column. */ + inline XclImpXFRange* First() { return maIndexList.First(); } + /** Returns the next formatted cell range in this column. */ + inline XclImpXFRange* Next() { return maIndexList.Next(); } + + /** Inserts a single row range into the list. */ + void SetDefaultXF( const XclImpXFIndex& rXFIndex ); + + /** Inserts a new (encoded) XF index (first try to expand the last range). */ + void SetXF( SCROW nScRow, const XclImpXFIndex& rXFIndex ); + +private: + /** Finds the previous and next row range from row position nScRow. + @descr If an XF still exists, it is contained in rpPrevRange. */ + void Find( + XclImpXFRange*& rpPrevRange, + XclImpXFRange*& rpNextRange, + ULONG& rnNextIndex, + SCROW nScRow ) const; + + /** Tries to concatenate a range with its predecessor. + @descr The ranges must have the same XF index and must not have a gap. + The resulting range has the index nIndex-1. */ + void TryConcatPrev( ULONG nIndex ); + +private: + ScfDelList< XclImpXFRange > maIndexList; /// The list of XF index range. +}; + +// ---------------------------------------------------------------------------- + +/** Contains the XF indexes for every used cell in a single sheet. */ +class XclImpXFRangeBuffer : protected XclImpRoot, ScfNoCopy +{ +public: + explicit XclImpXFRangeBuffer( const XclImpRoot& rRoot ); + virtual ~XclImpXFRangeBuffer(); + + /** Clears all buffered data, used to set up for a new sheet. */ + void Initialize(); + + /** Inserts a new XF index. */ + void SetXF( const ScAddress& rScPos, sal_uInt16 nXFIndex ); + /** Inserts a new XF index for blank cells. */ + void SetBlankXF( const ScAddress& rScPos, sal_uInt16 nXFIndex ); + /** Inserts a new XF index for boolean cells. */ + void SetBoolXF( const ScAddress& rScPos, sal_uInt16 nXFIndex ); + /** Inserts a new XF index for all cells in a row. */ + void SetRowDefXF( SCROW nScRow, sal_uInt16 nXFIndex ); + /** Inserts a new XF index for all cells in a column. */ + void SetColumnDefXF( SCCOL nScCol, sal_uInt16 nXFIndex ); + + /** Inserts a range of hyperlink cells. */ + void SetHyperlink( const XclRange& rXclRange, const String& rUrl ); + + /** Inserts the first cell of a merged cell range. */ + void SetMerge( SCCOL nScCol, SCROW nScRow ); + /** Inserts a complete merged cell range. */ + void SetMerge( SCCOL nScCol1, SCROW nScRow1, SCCOL nScCol2, SCROW nScRow2 ); + + /** Applies styles and cell merging to the current sheet in the document. */ + void Finalize(); + +private: + /** Insertion mode of an XF index. */ + enum XclImpXFInsertMode + { + xlXFModeCell, /// Filled cell. + xlXFModeBoolCell, /// Cell with a single Boolean value. + xlXFModeBlank, /// Blank cell. + xlXFModeRow /// Row default XF. + }; + +private: + /** Inserts a new XF index for the specified cell type. */ + void SetXF( const ScAddress& rScPos, sal_uInt16 nXFIndex, XclImpXFInsertMode eMode ); + + /** Copies border of the last cell of the range to the first cell to keep it visible + when the range is merged. + @param nLine + BOX_LINE_RIGHT = copy most-right border of top row; + BOX_LINE_BOTTOM = copy most-bottom border of first column. */ + void SetBorderLine( const ScRange& rRange, SCTAB nScTab, USHORT nLine ); + +private: + typedef ScfRef< XclImpXFRangeColumn > XclImpXFRangeColumnRef; + typedef ::std::vector< XclImpXFRangeColumnRef > XclImpXFRangeColumnVec; + typedef ::std::pair< XclRange, String > XclImpHyperlinkRange; + typedef ::std::list< XclImpHyperlinkRange > XclImpHyperlinkList; + + XclImpXFRangeColumnVec maColumns; /// Array of column XF index buffers. + XclImpHyperlinkList maHyperlinks; /// Maps URLs to hyperlink cells. + ScRangeList maMergeList; /// List of merged cell ranges. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xiview.hxx b/sc/source/filter/inc/xiview.hxx new file mode 100644 index 000000000000..2451d69ee01c --- /dev/null +++ b/sc/source/filter/inc/xiview.hxx @@ -0,0 +1,95 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XIVIEW_HXX +#define SC_XIVIEW_HXX + +#include "xlview.hxx" +#include "xiroot.hxx" + +// Document view settings ===================================================== + +/** Contains document view settings (WINDOW1 record). */ +class XclImpDocViewSettings : protected XclImpRoot +{ +public: + explicit XclImpDocViewSettings( const XclImpRoot& rRoot ); + + /** Reads a WINDOW1 record. */ + void ReadWindow1( XclImpStream& rStrm ); + + /** Returns the Calc index of the displayed sheet. */ + SCTAB GetDisplScTab() const; + + /** Sets the view settings at the document. */ + void Finalize(); + +private: + XclDocViewData maData; /// Document view settings data. +}; + +// Sheet view settings ======================================================== + +/** Contains all view settings for a single sheet. + + Usage: + 1) When import filter starts reading a worksheet substream, inizialize an + instance of this class with the Initialize() function. This will set + all view options to Excel default values. + 2) Read all view related records using the Read*() functions. + 3) When import filter ends reading a worksheet substream, call Finalize() + to set all view settings to the current sheet of the Calc document. + */ +class XclImpTabViewSettings : protected XclImpRoot +{ +public: + explicit XclImpTabViewSettings( const XclImpRoot& rRoot ); + + /** Initializes the object to be used for a new sheet. */ + void Initialize(); + + /** Reads a WINDOW2 record. */ + void ReadWindow2( XclImpStream& rStrm, bool bChart ); + /** Reads an SCL record. */ + void ReadScl( XclImpStream& rStrm ); + /** Reads a PANE record. */ + void ReadPane( XclImpStream& rStrm ); + /** Reads a SELECTION record. */ + void ReadSelection( XclImpStream& rStrm ); + /** Reads a SHEETEXT record (Tab Color). */ + void ReadTabBgColor( XclImpStream& rStrm, XclImpPalette& rPal ); + /** Sets the view settings at the current sheet or the extended sheet options object. */ + void Finalize(); + +private: + XclTabViewData maData; /// Sheet view settings data. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xladdress.hxx b/sc/source/filter/inc/xladdress.hxx new file mode 100644 index 000000000000..0ac5ca3031a4 --- /dev/null +++ b/sc/source/filter/inc/xladdress.hxx @@ -0,0 +1,197 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLADDRESS_HXX +#define SC_XLADDRESS_HXX + +#include <vector> +#include "address.hxx" + +class ScRangeList; +class XclImpStream; +class XclExpStream; + +// ============================================================================ + +/** A 2D cell address struct with Excel column and row indexes. */ +struct XclAddress +{ + sal_uInt16 mnCol; + sal_uInt16 mnRow; + + inline explicit XclAddress( ScAddress::Uninitialized ) {} + inline explicit XclAddress() : mnCol( 0 ), mnRow( 0 ) {} + inline explicit XclAddress( sal_uInt16 nCol, sal_uInt16 nRow ) : mnCol( nCol ), mnRow( nRow ) {} + + inline void Set( sal_uInt16 nCol, sal_uInt16 nRow ) { mnCol = nCol; mnRow = nRow; } + + void Read( XclImpStream& rStrm, bool bCol16Bit = true ); + void Write( XclExpStream& rStrm, bool bCol16Bit = true ) const; +}; + +inline bool operator==( const XclAddress& rL, const XclAddress& rR ) +{ + return (rL.mnCol == rR.mnCol) && (rL.mnRow == rR.mnRow); +} + +inline bool operator<( const XclAddress& rL, const XclAddress& rR ) +{ + return (rL.mnCol < rR.mnCol) || ((rL.mnCol == rR.mnCol) && (rL.mnRow < rR.mnRow)); +} + +inline XclImpStream& operator>>( XclImpStream& rStrm, XclAddress& rXclPos ) +{ + rXclPos.Read( rStrm ); + return rStrm; +} + +inline XclExpStream& operator<<( XclExpStream& rStrm, const XclAddress& rXclPos ) +{ + rXclPos.Write( rStrm ); + return rStrm; +} + +// ---------------------------------------------------------------------------- + +/** A 2D cell range address struct with Excel column and row indexes. */ +struct XclRange +{ + XclAddress maFirst; + XclAddress maLast; + + inline explicit XclRange( ScAddress::Uninitialized e ) : maFirst( e ), maLast( e ) {} + inline explicit XclRange() {} + inline explicit XclRange( const XclAddress& rPos ) : maFirst( rPos ), maLast( rPos ) {} + inline explicit XclRange( const XclAddress& rFirst, const XclAddress& rLast ) : maFirst( rFirst ), maLast( rLast ) {} + inline explicit XclRange( sal_uInt16 nCol1, sal_uInt16 nRow1, sal_uInt16 nCol2, sal_uInt16 nRow2 ) : + maFirst( nCol1, nRow1 ), maLast( nCol2, nRow2 ) {} + + inline void Set( const XclAddress& rFirst, const XclAddress& rLast ) + { maFirst = rFirst; maLast = rLast; } + inline void Set( sal_uInt16 nCol1, sal_uInt16 nRow1, sal_uInt16 nCol2, sal_uInt16 nRow2 ) + { maFirst.Set( nCol1, nRow1 ); maLast.Set( nCol2, nRow2 ); } + + inline sal_uInt16 GetColCount() const { return maLast.mnCol - maFirst.mnCol + 1; } + inline sal_uInt16 GetRowCount() const { return maLast.mnRow - maFirst.mnRow + 1; } + bool Contains( const XclAddress& rPos ) const; + + void Read( XclImpStream& rStrm, bool bCol16Bit = true ); + void Write( XclExpStream& rStrm, bool bCol16Bit = true ) const; +}; + +inline bool operator==( const XclRange& rL, const XclRange& rR ) +{ + return (rL.maFirst == rR.maFirst) && (rL.maLast == rR.maLast); +} + +inline bool operator<( const XclRange& rL, const XclRange& rR ) +{ + return (rL.maFirst < rR.maFirst) || ((rL.maFirst == rR.maFirst) && (rL.maLast < rR.maLast)); +} + +inline XclImpStream& operator>>( XclImpStream& rStrm, XclRange& rXclRange ) +{ + rXclRange.Read( rStrm ); + return rStrm; +} + +inline XclExpStream& operator<<( XclExpStream& rStrm, const XclRange& rXclRange ) +{ + rXclRange.Write( rStrm ); + return rStrm; +} + +// ---------------------------------------------------------------------------- + +/** A 2D cell range address list with Excel column and row indexes. */ +class XclRangeList : public ::std::vector< XclRange > +{ +public: + inline explicit XclRangeList() {} + + XclRange GetEnclosingRange() const; + + void Read( XclImpStream& rStrm, bool bCol16Bit = true ); + void Write( XclExpStream& rStrm, bool bCol16Bit = true ) const; + void WriteSubList( XclExpStream& rStrm, + size_t nBegin, size_t nCount, bool bCol16Bit = true ) const; +}; + +inline XclImpStream& operator>>( XclImpStream& rStrm, XclRangeList& rXclRanges ) +{ + rXclRanges.Read( rStrm ); + return rStrm; +} + +inline XclExpStream& operator<<( XclExpStream& rStrm, const XclRangeList& rXclRanges ) +{ + rXclRanges.Write( rStrm ); + return rStrm; +} + +// ============================================================================ + +class XclTracer; + +/** Base class for import/export address converters. */ +class XclAddressConverterBase +{ +public: + explicit XclAddressConverterBase( XclTracer& rTracer, const ScAddress& rMaxPos ); + virtual ~XclAddressConverterBase(); + + /** Returns whether the "some columns have been cut" warning box should be shown. */ + inline bool IsColTruncated() const { return mbColTrunc; } + /** Returns whether the "some rows have been cut" warning box should be shown. */ + inline bool IsRowTruncated() const { return mbRowTrunc; } + /** Returns whether the "some sheets have been cut" warning box should be shown. */ + inline bool IsTabTruncated() const { return mbTabTrunc; } + + // ------------------------------------------------------------------------ + + /** Checks if the passed sheet index is valid. + @param nScTab The sheet index to check. + @param bWarn true = Sets the internal flag that produces a warning box + after loading/saving the file, if the sheet index is not valid. + @return true = Sheet index in nScTab is valid. */ + bool CheckScTab( SCTAB nScTab, bool bWarn ); + + // ------------------------------------------------------------------------ +protected: + XclTracer& mrTracer; /// Tracer for invalid addresses. + ScAddress maMaxPos; /// Default maximum position. + sal_uInt16 mnMaxCol; /// Maximum column index, as 16-bit value. + sal_uInt16 mnMaxRow; /// Maximum row index, as 16-bit value. + bool mbColTrunc; /// Flag for "columns truncated" warning box. + bool mbRowTrunc; /// Flag for "rows truncated" warning box. + bool mbTabTrunc; /// Flag for "tables truncated" warning box. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlchart.hxx b/sc/source/filter/inc/xlchart.hxx new file mode 100755 index 000000000000..13eda8619cc0 --- /dev/null +++ b/sc/source/filter/inc/xlchart.hxx @@ -0,0 +1,1486 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLCHART_HXX +#define SC_XLCHART_HXX + +// disable/enable support for varied point colors property +#define EXC_CHART2_VARYCOLORSBY_PROP 0 +// disable/enable restriction to hair lines in 3D bar charts (#i83151#) +#define EXC_CHART2_3DBAR_HAIRLINES_ONLY 1 + +#include <map> +#include <tools/gen.hxx> +#include "fapihelper.hxx" + +namespace com { namespace sun { namespace star { + namespace container { class XNameContainer; } + namespace lang { class XMultiServiceFactory; } + namespace chart { class XChartDocument; } + namespace chart2 { class XChartDocument; } + namespace drawing { class XShape; } +} } } + +class XclRoot; + +// Property names ============================================================= + +// service names +#define SERVICE_DRAWING_BITMAPTABLE CREATE_OUSTRING( "com.sun.star.drawing.BitmapTable" ) +#define SERVICE_DRAWING_DASHTABLE CREATE_OUSTRING( "com.sun.star.drawing.DashTable" ) +#define SERVICE_DRAWING_GRADIENTTABLE CREATE_OUSTRING( "com.sun.star.drawing.GradientTable" ) +#define SERVICE_DRAWING_HATCHTABLE CREATE_OUSTRING( "com.sun.star.drawing.HatchTable" ) + +#define SERVICE_CHART2_AXIS CREATE_OUSTRING( "com.sun.star.chart2.Axis" ) +#define SERVICE_CHART2_CARTESIANCOORDSYS2D CREATE_OUSTRING( "com.sun.star.chart2.CartesianCoordinateSystem2d" ) +#define SERVICE_CHART2_CARTESIANCOORDSYS3D CREATE_OUSTRING( "com.sun.star.chart2.CartesianCoordinateSystem3d" ) +#define SERVICE_CHART2_DATAPROVIDER CREATE_OUSTRING( "com.sun.star.chart2.data.DataProvider" ) +#define SERVICE_CHART2_DATASERIES CREATE_OUSTRING( "com.sun.star.chart2.DataSeries" ) +#define SERVICE_CHART2_DIAGRAM CREATE_OUSTRING( "com.sun.star.chart2.Diagram" ) +#define SERVICE_CHART2_ERRORBAR CREATE_OUSTRING( "com.sun.star.chart2.ErrorBar" ) +#define SERVICE_CHART2_EXPREGCURVE CREATE_OUSTRING( "com.sun.star.chart2.ExponentialRegressionCurve" ) +#define SERVICE_CHART2_FORMATTEDSTRING CREATE_OUSTRING( "com.sun.star.chart2.FormattedString" ) +#define SERVICE_CHART2_LABELEDDATASEQ CREATE_OUSTRING( "com.sun.star.chart2.data.LabeledDataSequence" ) +#define SERVICE_CHART2_LEGEND CREATE_OUSTRING( "com.sun.star.chart2.Legend" ) +#define SERVICE_CHART2_LINEARREGCURVE CREATE_OUSTRING( "com.sun.star.chart2.LinearRegressionCurve" ) +#define SERVICE_CHART2_LINEARSCALING CREATE_OUSTRING( "com.sun.star.chart2.LinearScaling" ) +#define SERVICE_CHART2_LOGREGCURVE CREATE_OUSTRING( "com.sun.star.chart2.LogarithmicRegressionCurve" ) +#define SERVICE_CHART2_LOGSCALING CREATE_OUSTRING( "com.sun.star.chart2.LogarithmicScaling" ) +#define SERVICE_CHART2_POLARCOORDSYS2D CREATE_OUSTRING( "com.sun.star.chart2.PolarCoordinateSystem2d" ) +#define SERVICE_CHART2_POLARCOORDSYS3D CREATE_OUSTRING( "com.sun.star.chart2.PolarCoordinateSystem3d" ) +#define SERVICE_CHART2_POTREGCURVE CREATE_OUSTRING( "com.sun.star.chart2.PotentialRegressionCurve" ) +#define SERVICE_CHART2_TITLE CREATE_OUSTRING( "com.sun.star.chart2.Title" ) + +// property names +#define EXC_CHPROP_ADDITIONALSHAPES CREATE_OUSTRING( "AdditionalShapes" ) +#define EXC_CHPROP_ANCHORPOSITION CREATE_OUSTRING( "AnchorPosition" ) +#define EXC_CHPROP_ARRANGEORDER CREATE_OUSTRING( "ArrangeOrder" ) +#define EXC_CHPROP_ATTAXISINDEX CREATE_OUSTRING( "AttachedAxisIndex" ) +#define EXC_CHPROP_ATTRIBDATAPOINTS CREATE_OUSTRING( "AttributedDataPoints" ) +#define EXC_CHPROP_BLACKDAY CREATE_OUSTRING( "BlackDay" ) +#define EXC_CHPROP_COLOR CREATE_OUSTRING( "Color" ) +#define EXC_CHPROP_CONNECTBARS CREATE_OUSTRING( "ConnectBars" ) +#define EXC_CHPROP_CROSSOVERPOSITION CREATE_OUSTRING( "CrossoverPosition" ) +#define EXC_CHPROP_CROSSOVERVALUE CREATE_OUSTRING( "CrossoverValue" ) +#define EXC_CHPROP_CURVESTYLE CREATE_OUSTRING( "CurveStyle" ) +#define EXC_CHPROP_D3DCAMERAGEOMETRY CREATE_OUSTRING( "D3DCameraGeometry" ) +#define EXC_CHPROP_D3DSCENEAMBIENTCOLOR CREATE_OUSTRING( "D3DSceneAmbientColor" ) +#define EXC_CHPROP_D3DSCENELIGHTON1 CREATE_OUSTRING( "D3DSceneLightOn1" ) +#define EXC_CHPROP_D3DSCENELIGHTCOLOR2 CREATE_OUSTRING( "D3DSceneLightColor2" ) +#define EXC_CHPROP_D3DSCENELIGHTDIR2 CREATE_OUSTRING( "D3DSceneLightDirection2" ) +#define EXC_CHPROP_D3DSCENELIGHTON2 CREATE_OUSTRING( "D3DSceneLightOn2" ) +#define EXC_CHPROP_D3DSCENEPERSPECTIVE CREATE_OUSTRING( "D3DScenePerspective" ) +#define EXC_CHPROP_D3DSCENESHADEMODE CREATE_OUSTRING( "D3DSceneShadeMode" ) +#define EXC_CHPROP_D3DTRANSFORMMATRIX CREATE_OUSTRING( "D3DTransformMatrix" ) +#define EXC_CHPROP_DISPLAYLABELS CREATE_OUSTRING( "DisplayLabels" ) +#define EXC_CHPROP_ERRORBARSTYLE CREATE_OUSTRING( "ErrorBarStyle" ) +#define EXC_CHPROP_ERRORBARX CREATE_OUSTRING( "ErrorBarX" ) +#define EXC_CHPROP_ERRORBARY CREATE_OUSTRING( "ErrorBarY" ) +#define EXC_CHPROP_EXPANSION CREATE_OUSTRING( "Expansion" ) +#define EXC_CHPROP_FILLBITMAPMODE CREATE_OUSTRING( "FillBitmapMode" ) +#define EXC_CHPROP_FILLSTYLE CREATE_OUSTRING( "FillStyle" ) +#define EXC_CHPROP_GAPWIDTHSEQ CREATE_OUSTRING( "GapwidthSequence" ) +#define EXC_CHPROP_GEOMETRY3D CREATE_OUSTRING( "Geometry3D" ) +#define EXC_CHPROP_HASMAINTITLE CREATE_OUSTRING( "HasMainTitle" ) +#define EXC_CHPROP_INCLUDEHIDDENCELLS CREATE_OUSTRING( "IncludeHiddenCells" ) +#define EXC_CHPROP_JAPANESE CREATE_OUSTRING( "Japanese" ) +#define EXC_CHPROP_LABEL CREATE_OUSTRING( "Label" ) +#define EXC_CHPROP_LABELPLACEMENT CREATE_OUSTRING( "LabelPlacement" ) +#define EXC_CHPROP_LABELPOSITION CREATE_OUSTRING( "LabelPosition" ) +#define EXC_CHPROP_LABELSEPARATOR CREATE_OUSTRING( "LabelSeparator" ) +#define EXC_CHPROP_MAJORTICKS CREATE_OUSTRING( "MajorTickmarks" ) +#define EXC_CHPROP_MARKPOSITION CREATE_OUSTRING( "MarkPosition" ) +#define EXC_CHPROP_MINORTICKS CREATE_OUSTRING( "MinorTickmarks" ) +#define EXC_CHPROP_MISSINGVALUETREATMENT CREATE_OUSTRING( "MissingValueTreatment" ) +#define EXC_CHPROP_NEGATIVEERROR CREATE_OUSTRING( "NegativeError" ) +#define EXC_CHPROP_NUMBERFORMAT CREATE_OUSTRING( "NumberFormat" ) +#define EXC_CHPROP_OFFSET CREATE_OUSTRING( "Offset" ) +#define EXC_CHPROP_OVERLAPSEQ CREATE_OUSTRING( "OverlapSequence" ) +#define EXC_CHPROP_PERCENTAGENUMFMT CREATE_OUSTRING( "PercentageNumberFormat" ) +#define EXC_CHPROP_PERCENTDIAGONAL CREATE_OUSTRING( "PercentDiagonal" ) +#define EXC_CHPROP_PERSPECTIVE CREATE_OUSTRING( "Perspective" ) +#define EXC_CHPROP_POSITIVEERROR CREATE_OUSTRING( "PositiveError" ) +#define EXC_CHPROP_RELATIVEPOSITION CREATE_OUSTRING( "RelativePosition" ) +#define EXC_CHPROP_RIGHTANGLEDAXES CREATE_OUSTRING( "RightAngledAxes" ) +#define EXC_CHPROP_ROLE CREATE_OUSTRING( "Role" ) +#define EXC_CHPROP_ROTATIONHORIZONTAL CREATE_OUSTRING( "RotationHorizontal" ) +#define EXC_CHPROP_ROTATIONVERTICAL CREATE_OUSTRING( "RotationVertical" ) +#define EXC_CHPROP_SHOW CREATE_OUSTRING( "Show" ) +#define EXC_CHPROP_SHOWCORRELATION CREATE_OUSTRING( "ShowCorrelationCoefficient" ) +#define EXC_CHPROP_SHOWEQUATION CREATE_OUSTRING( "ShowEquation" ) +#define EXC_CHPROP_SHOWFIRST CREATE_OUSTRING( "ShowFirst" ) +#define EXC_CHPROP_SHOWHIGHLOW CREATE_OUSTRING( "ShowHighLow" ) +#define EXC_CHPROP_SHOWNEGATIVEERROR CREATE_OUSTRING( "ShowNegativeError" ) +#define EXC_CHPROP_SHOWPOSITIVEERROR CREATE_OUSTRING( "ShowPositiveError" ) +#define EXC_CHPROP_STACKCHARACTERS CREATE_OUSTRING( "StackCharacters" ) +#define EXC_CHPROP_STACKINGDIR CREATE_OUSTRING( "StackingDirection" ) +#define EXC_CHPROP_STARTINGANGLE CREATE_OUSTRING( "StartingAngle" ) +#define EXC_CHPROP_SWAPXANDYAXIS CREATE_OUSTRING( "SwapXAndYAxis" ) +#define EXC_CHPROP_SYMBOL CREATE_OUSTRING( "Symbol" ) +#define EXC_CHPROP_TEXTBREAK CREATE_OUSTRING( "TextBreak" ) +#define EXC_CHPROP_TEXTOVERLAP CREATE_OUSTRING( "TextOverlap" ) +#define EXC_CHPROP_TEXTROTATION CREATE_OUSTRING( "TextRotation" ) +#define EXC_CHPROP_USERINGS CREATE_OUSTRING( "UseRings" ) +#define EXC_CHPROP_VARYCOLORSBY CREATE_OUSTRING( "VaryColorsByPoint" ) +#define EXC_CHPROP_WEIGHT CREATE_OUSTRING( "Weight" ) +#define EXC_CHPROP_WHITEDAY CREATE_OUSTRING( "WhiteDay" ) + +// data series roles +#define EXC_CHPROP_ROLE_CATEG CREATE_OUSTRING( "categories" ) +#define EXC_CHPROP_ROLE_ERRORBARS_NEGX CREATE_OUSTRING( "error-bars-x-negative" ) +#define EXC_CHPROP_ROLE_ERRORBARS_NEGY CREATE_OUSTRING( "error-bars-y-negative" ) +#define EXC_CHPROP_ROLE_ERRORBARS_POSX CREATE_OUSTRING( "error-bars-x-positive" ) +#define EXC_CHPROP_ROLE_ERRORBARS_POSY CREATE_OUSTRING( "error-bars-y-positive" ) +#define EXC_CHPROP_ROLE_LABEL CREATE_OUSTRING( "label" ) +#define EXC_CHPROP_ROLE_SIZES CREATE_OUSTRING( "sizes" ) +#define EXC_CHPROP_ROLE_XVALUES CREATE_OUSTRING( "values-x" ) +#define EXC_CHPROP_ROLE_YVALUES CREATE_OUSTRING( "values-y" ) +#define EXC_CHPROP_ROLE_OPENVALUES CREATE_OUSTRING( "values-first" ) +#define EXC_CHPROP_ROLE_CLOSEVALUES CREATE_OUSTRING( "values-last" ) +#define EXC_CHPROP_ROLE_LOWVALUES CREATE_OUSTRING( "values-min" ) +#define EXC_CHPROP_ROLE_HIGHVALUES CREATE_OUSTRING( "values-max" ) +#define EXC_CHPROP_ROLE_SIZEVALUES CREATE_OUSTRING( "values-size" ) + +// Constants and Enumerations ================================================= + +const sal_Size EXC_CHART_PROGRESS_SIZE = 10; +const sal_uInt16 EXC_CHART_AUTOROTATION = 0xFFFF; /// Automatic rotation, e.g. axis labels (internal use only). + +const sal_Int32 EXC_CHART_AXIS_NONE = -1; /// For internal use only. +const sal_Int32 EXC_CHART_AXIS_X = 0; /// API X axis index. +const sal_Int32 EXC_CHART_AXIS_Y = 1; /// API Y axis index. +const sal_Int32 EXC_CHART_AXIS_Z = 2; /// API Z axis index. +const sal_Int32 EXC_CHART_AXESSET_NONE = -1; /// For internal use only. +const sal_Int32 EXC_CHART_AXESSET_PRIMARY = 0; /// API primary axes set index. +const sal_Int32 EXC_CHART_AXESSET_SECONDARY = 1; /// API secondary axes set index. + +const sal_Int32 EXC_CHART_TOTALUNITS = 4000; /// Most chart objects are positioned in 1/4000 of chart area. +const sal_Int32 EXC_CHART_PLOTAREAUNITS = 1000; /// For objects that are positioned in 1/1000 of plot area. + +// (0x0850) CHFRINFO ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHFRINFO = 0x0850; + +const sal_uInt8 EXC_CHFRINFO_EXCEL2000 = 9; +const sal_uInt8 EXC_CHFRINFO_EXCELXP2003 = 10; +const sal_uInt8 EXC_CHFRINFO_EXCEL2007 = 11; + +// (0x0852, 0x0853) CHFRBLOCKBEGIN, CHFRBLOCKEND ------------------------------ + +const sal_uInt16 EXC_ID_CHFRBLOCKBEGIN = 0x0852; +const sal_uInt16 EXC_ID_CHFRBLOCKEND = 0x0853; + +const sal_uInt16 EXC_CHFRBLOCK_TYPE_AXESSET = 0; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_TEXT = 2; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_AXIS = 4; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_TYPEGROUP = 5; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_DATATABLE = 6; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_FRAME = 7; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_LEGEND = 9; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_LEGENDEX = 10; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_SERIES = 12; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_CHART = 13; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_DATAFORMAT = 14; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_DROPBAR = 15; +const sal_uInt16 EXC_CHFRBLOCK_TYPE_UNKNOWN = 0xFFFF; /// For internal use only. + +const sal_uInt16 EXC_CHFRBLOCK_TEXT_TITLE = 0; +const sal_uInt16 EXC_CHFRBLOCK_TEXT_DEFTEXT = 2; +const sal_uInt16 EXC_CHFRBLOCK_TEXT_AXISTITLE = 4; +const sal_uInt16 EXC_CHFRBLOCK_TEXT_DATALABEL = 5; + +const sal_uInt16 EXC_CHFRBLOCK_FRAME_STANDARD = 0; +const sal_uInt16 EXC_CHFRBLOCK_FRAME_PLOTFRAME = 1; +const sal_uInt16 EXC_CHFRBLOCK_FRAME_BACKGROUND = 2; + +// (0x086B) CHFRLABELPROPS ---------------------------------------------------- + +const sal_uInt16 EXC_ID_CHFRLABELPROPS = 0x086B; + +const sal_uInt16 EXC_CHFRLABELPROPS_SHOWSERIES = 0x0001; +const sal_uInt16 EXC_CHFRLABELPROPS_SHOWCATEG = 0x0002; +const sal_uInt16 EXC_CHFRLABELPROPS_SHOWVALUE = 0x0004; +const sal_uInt16 EXC_CHFRLABELPROPS_SHOWPERCENT = 0x0008; +const sal_uInt16 EXC_CHFRLABELPROPS_SHOWBUBBLE = 0x0010; + +// (0x1001) CHUNITS ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHUNITS = 0x1001; + +const sal_uInt16 EXC_CHUNITS_TWIPS = 0; +const sal_uInt16 EXC_CHUNITS_PIXELS = 1; + +// (0x1002) CHCHART ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHCHART = 0x1002; + +// (0x1003) CHSERIES ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHSERIES = 0x1003; + +const sal_uInt16 EXC_CHSERIES_DATE = 0; +const sal_uInt16 EXC_CHSERIES_NUMERIC = 1; +const sal_uInt16 EXC_CHSERIES_SEQUENCE = 2; +const sal_uInt16 EXC_CHSERIES_TEXT = 3; + +const sal_uInt16 EXC_CHSERIES_MAXSERIES = 255; /// Maximum valid series index. +const sal_uInt16 EXC_CHSERIES_INVALID = 0xFFFF; /// Invalid series index (for internal use). + +// (0x1006) CHDATAFORMAT ------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHDATAFORMAT = 0x1006; + +const sal_uInt16 EXC_CHDATAFORMAT_MAXPOINTCOUNT = 32000; /// Maximum number of data points. +const sal_uInt16 EXC_CHDATAFORMAT_DEFAULT = 0xFFFD; /// As format index: global default for an axes set. +const sal_uInt16 EXC_CHDATAFORMAT_UNKNOWN = 0xFFFE; /// As point index: unknown format, don't use. +const sal_uInt16 EXC_CHDATAFORMAT_ALLPOINTS = 0xFFFF; /// As point index: default for a series. + +const sal_uInt16 EXC_CHDATAFORMAT_OLDCOLORS = 0x0001; + +// (0x1007) CHLINEFORMAT ------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHLINEFORMAT = 0x1007; + +const sal_uInt16 EXC_CHLINEFORMAT_SOLID = 0; +const sal_uInt16 EXC_CHLINEFORMAT_DASH = 1; +const sal_uInt16 EXC_CHLINEFORMAT_DOT = 2; +const sal_uInt16 EXC_CHLINEFORMAT_DASHDOT = 3; +const sal_uInt16 EXC_CHLINEFORMAT_DASHDOTDOT = 4; +const sal_uInt16 EXC_CHLINEFORMAT_NONE = 5; +const sal_uInt16 EXC_CHLINEFORMAT_DARKTRANS = 6; +const sal_uInt16 EXC_CHLINEFORMAT_MEDTRANS = 7; +const sal_uInt16 EXC_CHLINEFORMAT_LIGHTTRANS = 8; + +const sal_Int16 EXC_CHLINEFORMAT_HAIR = -1; +const sal_Int16 EXC_CHLINEFORMAT_SINGLE = 0; +const sal_Int16 EXC_CHLINEFORMAT_DOUBLE = 1; +const sal_Int16 EXC_CHLINEFORMAT_TRIPLE = 2; + +const sal_uInt16 EXC_CHLINEFORMAT_AUTO = 0x0001; +const sal_uInt16 EXC_CHLINEFORMAT_SHOWAXIS = 0x0004; + +// (0x1009) CHMARKERFORMAT ---------------------------------------------------- + +const sal_uInt16 EXC_ID_CHMARKERFORMAT = 0x1009; + +const sal_uInt16 EXC_CHMARKERFORMAT_NOSYMBOL = 0; +const sal_uInt16 EXC_CHMARKERFORMAT_SQUARE = 1; +const sal_uInt16 EXC_CHMARKERFORMAT_DIAMOND = 2; +const sal_uInt16 EXC_CHMARKERFORMAT_TRIANGLE = 3; +const sal_uInt16 EXC_CHMARKERFORMAT_CROSS = 4; +const sal_uInt16 EXC_CHMARKERFORMAT_STAR = 5; +const sal_uInt16 EXC_CHMARKERFORMAT_DOWJ = 6; +const sal_uInt16 EXC_CHMARKERFORMAT_STDDEV = 7; +const sal_uInt16 EXC_CHMARKERFORMAT_CIRCLE = 8; +const sal_uInt16 EXC_CHMARKERFORMAT_PLUS = 9; + +const sal_uInt32 EXC_CHMARKERFORMAT_HAIRSIZE = 60; /// Automatic symbol size for hair lines. +const sal_uInt32 EXC_CHMARKERFORMAT_SINGLESIZE = 100; /// Automatic symbol size for single lines. +const sal_uInt32 EXC_CHMARKERFORMAT_DOUBLESIZE = 140; /// Automatic symbol size for double lines. +const sal_uInt32 EXC_CHMARKERFORMAT_TRIPLESIZE = 180; /// Automatic symbol size for triple lines. + +const sal_uInt16 EXC_CHMARKERFORMAT_AUTO = 0x0001; +const sal_uInt16 EXC_CHMARKERFORMAT_NOFILL = 0x0010; +const sal_uInt16 EXC_CHMARKERFORMAT_NOLINE = 0x0020; + +// (0x100A) CHAREAFORMAT ------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHAREAFORMAT = 0x100A; + +const sal_uInt16 EXC_CHAREAFORMAT_AUTO = 0x0001; +const sal_uInt16 EXC_CHAREAFORMAT_INVERTNEG = 0x0002; + +// (0x100B) CHPIEFORMAT ------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHPIEFORMAT = 0x100B; + +// (0x100C) CHATTACHEDLABEL --------------------------------------------------- + +const sal_uInt16 EXC_ID_CHATTACHEDLABEL = 0x100C; + +const sal_uInt16 EXC_CHATTLABEL_SHOWVALUE = 0x0001; +const sal_uInt16 EXC_CHATTLABEL_SHOWPERCENT = 0x0002; +const sal_uInt16 EXC_CHATTLABEL_SHOWCATEGPERC = 0x0004; +const sal_uInt16 EXC_CHATTLABEL_SMOOTHED = 0x0008; /// Smoothed line. +const sal_uInt16 EXC_CHATTLABEL_SHOWCATEG = 0x0010; +const sal_uInt16 EXC_CHATTLABEL_SHOWBUBBLE = 0x0020; + +// (0x100D) CHSTRING ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHSTRING = 0x100D; + +// (0x1014) CHTYPEGROUP ------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHTYPEGROUP = 0x1014; + +const sal_uInt16 EXC_CHTYPEGROUP_VARIEDCOLORS = 0x0001; /// Varied colors for points. + +// (0x1015) CHLEGEND ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHLEGEND = 0x1015; + +const sal_uInt8 EXC_CHLEGEND_BOTTOM = 0; +const sal_uInt8 EXC_CHLEGEND_CORNER = 1; +const sal_uInt8 EXC_CHLEGEND_TOP = 2; +const sal_uInt8 EXC_CHLEGEND_RIGHT = 3; +const sal_uInt8 EXC_CHLEGEND_LEFT = 4; +const sal_uInt8 EXC_CHLEGEND_NOTDOCKED = 7; + +const sal_uInt8 EXC_CHLEGEND_CLOSE = 0; +const sal_uInt8 EXC_CHLEGEND_MEDIUM = 1; +const sal_uInt8 EXC_CHLEGEND_OPEN = 2; + +const sal_uInt16 EXC_CHLEGEND_DOCKED = 0x0001; +const sal_uInt16 EXC_CHLEGEND_AUTOSERIES = 0x0002; +const sal_uInt16 EXC_CHLEGEND_AUTOPOSX = 0x0004; +const sal_uInt16 EXC_CHLEGEND_AUTOPOSY = 0x0008; +const sal_uInt16 EXC_CHLEGEND_STACKED = 0x0010; +const sal_uInt16 EXC_CHLEGEND_DATATABLE = 0x0020; + +// (0x1017) CHBAR, CHCOLUMN --------------------------------------------------- + +const sal_uInt16 EXC_ID_CHBAR = 0x1017; + +const sal_uInt16 EXC_CHBAR_HORIZONTAL = 0x0001; +const sal_uInt16 EXC_CHBAR_STACKED = 0x0002; +const sal_uInt16 EXC_CHBAR_PERCENT = 0x0004; +const sal_uInt16 EXC_CHBAR_SHADOW = 0x0008; + +// (0x1018, 0x101A) CHLINE, CHAREA -------------------------------------------- + +const sal_uInt16 EXC_ID_CHLINE = 0x1018; +const sal_uInt16 EXC_ID_CHAREA = 0x101A; + +const sal_uInt16 EXC_CHLINE_STACKED = 0x0001; +const sal_uInt16 EXC_CHLINE_PERCENT = 0x0002; +const sal_uInt16 EXC_CHLINE_SHADOW = 0x0004; + +// (0x1019) CHPIE ------------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHPIE = 0x1019; + +const sal_uInt16 EXC_CHPIE_SHADOW = 0x0001; +const sal_uInt16 EXC_CHPIE_LINES = 0x0002; + +// (0x101B) CHSCATTER --------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHSCATTER = 0x101B; + +const sal_uInt16 EXC_CHSCATTER_AREA = 1; /// Bubble area refers to value. +const sal_uInt16 EXC_CHSCATTER_WIDTH = 2; /// Bubble width refers to value. + +const sal_uInt16 EXC_CHSCATTER_BUBBLES = 0x0001; +const sal_uInt16 EXC_CHSCATTER_SHOWNEG = 0x0002; +const sal_uInt16 EXC_CHSCATTER_SHADOW = 0x0004; + +// (0x001C) CHCHARTLINE ------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHCHARTLINE = 0x101C; + +const sal_uInt16 EXC_CHCHARTLINE_DROP = 0; /// Drop lines. +const sal_uInt16 EXC_CHCHARTLINE_HILO = 1; /// Hi-lo lines. +const sal_uInt16 EXC_CHCHARTLINE_CONNECT = 2; /// Connector lines in stacked bar charts. + +// (0x101D) CHAXIS ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHAXIS = 0x101D; + +const sal_uInt16 EXC_CHAXIS_X = 0; +const sal_uInt16 EXC_CHAXIS_Y = 1; +const sal_uInt16 EXC_CHAXIS_Z = 2; +const sal_uInt16 EXC_CHAXIS_NONE = 0xFFFF; /// For internal use only. + +// (0x101E) CHTICK ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHTICK = 0x101E; + +const sal_uInt8 EXC_CHTICK_INSIDE = 0x01; +const sal_uInt8 EXC_CHTICK_OUTSIDE = 0x02; + +const sal_uInt8 EXC_CHTICK_NOLABEL = 0; +const sal_uInt8 EXC_CHTICK_LOW = 1; /// Below diagram/right of diagram. +const sal_uInt8 EXC_CHTICK_HIGH = 2; /// Above diagram/left of diagram. +const sal_uInt8 EXC_CHTICK_NEXT = 3; /// Next to axis. + +const sal_uInt8 EXC_CHTICK_TRANSPARENT = 1; +const sal_uInt8 EXC_CHTICK_OPAQUE = 2; + +const sal_uInt16 EXC_CHTICK_AUTOCOLOR = 0x0001; +const sal_uInt16 EXC_CHTICK_AUTOFILL = 0x0002; +const sal_uInt16 EXC_CHTICK_AUTOROT = 0x0020; + +// (0x101F) CHVALUERANGE ------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHVALUERANGE = 0x101F; + +const sal_uInt16 EXC_CHVALUERANGE_AUTOMIN = 0x0001; +const sal_uInt16 EXC_CHVALUERANGE_AUTOMAX = 0x0002; +const sal_uInt16 EXC_CHVALUERANGE_AUTOMAJOR = 0x0004; +const sal_uInt16 EXC_CHVALUERANGE_AUTOMINOR = 0x0008; +const sal_uInt16 EXC_CHVALUERANGE_AUTOCROSS = 0x0010; +const sal_uInt16 EXC_CHVALUERANGE_LOGSCALE = 0x0020; +const sal_uInt16 EXC_CHVALUERANGE_REVERSE = 0x0040; /// Axis direction reversed. +const sal_uInt16 EXC_CHVALUERANGE_MAXCROSS = 0x0080; /// Other axis crosses at own maximum. +const sal_uInt16 EXC_CHVALUERANGE_BIT8 = 0x0100; /// This bit is always set in BIFF5+. + +// (0x1020) CHLABELRANGE ----------------------------------------------------- + +const sal_uInt16 EXC_ID_CHLABELRANGE = 0x1020; + +const sal_uInt16 EXC_CHLABELRANGE_BETWEEN = 0x0001; /// Axis between categories. +const sal_uInt16 EXC_CHLABELRANGE_MAXCROSS = 0x0002; /// Other axis crosses at own maximum. +const sal_uInt16 EXC_CHLABELRANGE_REVERSE = 0x0004; /// Axis direction reversed. + +// (0x1021) CHAXISLINE -------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHAXISLINE = 0x1021; + +const sal_uInt16 EXC_CHAXISLINE_AXISLINE = 0; /// Axis line itself. +const sal_uInt16 EXC_CHAXISLINE_MAJORGRID = 1; /// Major grid line. +const sal_uInt16 EXC_CHAXISLINE_MINORGRID = 2; /// Minor grid line. +const sal_uInt16 EXC_CHAXISLINE_WALLS = 3; /// Walls (X, Z axis), floor (Y axis). + +// (0x1024) CHDEFAULTTEXT ----------------------------------------------------- + +const sal_uInt16 EXC_ID_CHDEFAULTTEXT = 0x1024; + +const sal_uInt16 EXC_CHDEFTEXT_TEXTLABEL = 0; /// Default for text data labels (not used?). +const sal_uInt16 EXC_CHDEFTEXT_NUMLABEL = 1; /// Default for numeric data labels (not used?). +const sal_uInt16 EXC_CHDEFTEXT_GLOBAL = 2; /// Default text for all chart objects. +const sal_uInt16 EXC_CHDEFTEXT_AXESSET = 3; /// Default text for axes and data points (BIFF8 only). +const sal_uInt16 EXC_CHDEFTEXT_NONE = 0xFFFF; /// No default text available. + +// (0x1025) CHTEXT ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHTEXT = 0x1025; + +const sal_uInt8 EXC_CHTEXT_ALIGN_TOPLEFT = 1; /// Horizontal: left, vertical: top. +const sal_uInt8 EXC_CHTEXT_ALIGN_CENTER = 2; +const sal_uInt8 EXC_CHTEXT_ALIGN_BOTTOMRIGHT = 3; /// Horizontal: right, vertical: bottom. +const sal_uInt8 EXC_CHTEXT_ALIGN_JUSTIFY = 4; +const sal_uInt8 EXC_CHTEXT_ALIGN_DISTRIBUTE = 5; + +const sal_uInt16 EXC_CHTEXT_TRANSPARENT = 1; +const sal_uInt16 EXC_CHTEXT_OPAQUE = 2; + +const sal_uInt16 EXC_CHTEXT_AUTOCOLOR = 0x0001; /// Automatic text color. +const sal_uInt16 EXC_CHTEXT_SHOWSYMBOL = 0x0002; /// Legend symbol for data point caption. +const sal_uInt16 EXC_CHTEXT_SHOWVALUE = 0x0004; /// Data point caption is the value. +const sal_uInt16 EXC_CHTEXT_VERTICAL = 0x0008; +const sal_uInt16 EXC_CHTEXT_AUTOTEXT = 0x0010; /// Label text generated from chart data. +const sal_uInt16 EXC_CHTEXT_AUTOGEN = 0x0020; /// Text object is inserted automatically. +const sal_uInt16 EXC_CHTEXT_DELETED = 0x0040; /// Text object is removed. +const sal_uInt16 EXC_CHTEXT_AUTOFILL = 0x0080; /// Automatic text background mode (transparent/opaque). +const sal_uInt16 EXC_CHTEXT_SHOWCATEGPERC = 0x0800; /// Data point caption is category and percent. +const sal_uInt16 EXC_CHTEXT_SHOWPERCENT = 0x1000; /// Data point caption as percent. +const sal_uInt16 EXC_CHTEXT_SHOWBUBBLE = 0x2000; /// Show bubble size. +const sal_uInt16 EXC_CHTEXT_SHOWCATEG = 0x4000; /// Data point caption is category name. + +const sal_uInt16 EXC_CHTEXT_POS_DEFAULT = 0; +const sal_uInt16 EXC_CHTEXT_POS_OUTSIDE = 1; +const sal_uInt16 EXC_CHTEXT_POS_INSIDE = 2; +const sal_uInt16 EXC_CHTEXT_POS_CENTER = 3; +const sal_uInt16 EXC_CHTEXT_POS_AXIS = 4; +const sal_uInt16 EXC_CHTEXT_POS_ABOVE = 5; +const sal_uInt16 EXC_CHTEXT_POS_BELOW = 6; +const sal_uInt16 EXC_CHTEXT_POS_LEFT = 7; +const sal_uInt16 EXC_CHTEXT_POS_RIGHT = 8; +const sal_uInt16 EXC_CHTEXT_POS_AUTO = 9; +const sal_uInt16 EXC_CHTEXT_POS_MOVED = 10; + +// (0x1026) CHFONT ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHFONT = 0x1026; + +// (0x1027) CHOBJECTLINK ------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHOBJECTLINK = 0x1027; + +// link targets +const sal_uInt16 EXC_CHOBJLINK_NONE = 0; /// No link target. +const sal_uInt16 EXC_CHOBJLINK_TITLE = 1; /// Chart title. +const sal_uInt16 EXC_CHOBJLINK_YAXIS = 2; /// Value axis (Y axis). +const sal_uInt16 EXC_CHOBJLINK_XAXIS = 3; /// Category axis (X axis). +const sal_uInt16 EXC_CHOBJLINK_DATA = 4; /// Data series/point. +const sal_uInt16 EXC_CHOBJLINK_ZAXIS = 7; /// Series axis (Z axis). +const sal_uInt16 EXC_CHOBJLINK_AXISUNIT = 12; /// Unit name for axis labels. + +// (0x1032) CHFRAME ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHFRAME = 0x1032; + +const sal_uInt16 EXC_CHFRAME_STANDARD = 0; +const sal_uInt16 EXC_CHFRAME_SHADOW = 4; + +const sal_uInt16 EXC_CHFRAME_AUTOSIZE = 0x0001; +const sal_uInt16 EXC_CHFRAME_AUTOPOS = 0x0002; + +// (0x1033, 0x1034) CHBEGIN, CHEND -------------------------------------------- + +const sal_uInt16 EXC_ID_CHBEGIN = 0x1033; +const sal_uInt16 EXC_ID_CHEND = 0x1034; + +// (0x1035) CHPLOTFRAME ------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHPLOTFRAME = 0x1035; + +// (0x103A) CHCHART3D --------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHCHART3D = 0x103A; + +const sal_uInt16 EXC_CHCHART3D_REAL3D = 0x0001; /// true = real 3d perspective. +const sal_uInt16 EXC_CHCHART3D_CLUSTER = 0x0002; /// false = Z axis, true = clustered/stacked. +const sal_uInt16 EXC_CHCHART3D_AUTOHEIGHT = 0x0004; /// true = automatic height to width ratio. +const sal_uInt16 EXC_CHCHART3D_HASWALLS = 0x0010; /// true = 3d chart has walls/floor. +const sal_uInt16 EXC_CHCHART3D_2DWALLS = 0x0020; /// true = 2d wall/gridlines, no floor. + +// (0x103C) CHPICFORMAT ------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHPICFORMAT = 0x103C; + +const sal_uInt16 EXC_CHPICFORMAT_NONE = 0; /// For internal use only. +const sal_uInt16 EXC_CHPICFORMAT_STRETCH = 1; /// Bitmap stretched to area. +const sal_uInt16 EXC_CHPICFORMAT_STACK = 2; /// Bitmap stacked. +const sal_uInt16 EXC_CHPICFORMAT_SCALE = 3; /// Bitmap scaled to axis scale. + +const sal_uInt16 EXC_CHPICFORMAT_WMF = 2; +const sal_uInt16 EXC_CHPICFORMAT_BMP = 9; +const sal_uInt16 EXC_CHPICFORMAT_DEFAULT = 19; + +const sal_uInt16 EXC_CHPICFORMAT_WINDOWS = 0x0001; +const sal_uInt16 EXC_CHPICFORMAT_MACOS = 0x0002; +const sal_uInt16 EXC_CHPICFORMAT_FORMATONLY = 0x0100; +const sal_uInt16 EXC_CHPICFORMAT_DEFAULTFLAGS = 0x0E00; /// Default flags for export. + +// (0x103D) CHDROPBAR --------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHDROPBAR = 0x103D; + +const sal_uInt16 EXC_CHDROPBAR_UP = 0; +const sal_uInt16 EXC_CHDROPBAR_DOWN = 1; +const sal_uInt16 EXC_CHDROPBAR_NONE = 0xFFFF; + +// (0x103E, 0x1040) CHRADARLINE, CHRADARAREA ---------------------------------- + +const sal_uInt16 EXC_ID_CHRADARLINE = 0x103E; +const sal_uInt16 EXC_ID_CHRADARAREA = 0x1040; + +const sal_uInt16 EXC_CHRADAR_AXISLABELS = 0x0001; +const sal_uInt16 EXC_CHRADAR_SHADOW = 0x0002; + +// (0x103F) CHSURFACE --------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHSURFACE = 0x103F; + +const sal_uInt16 EXC_CHSURFACE_FILLED = 0x0001; +const sal_uInt16 EXC_CHSURFACE_SHADING = 0x0002; + +// (0x1041) CHAXESSET --------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHAXESSET = 0x1041; + +const sal_uInt16 EXC_CHAXESSET_PRIMARY = 0; +const sal_uInt16 EXC_CHAXESSET_SECONDARY = 1; +const sal_uInt16 EXC_CHAXESSET_NONE = 0xFFFF; /// For internal use. + +// (0x1044) CHPROPERTIES ------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHPROPERTIES = 0x1044; + +const sal_uInt16 EXC_CHPROPS_MANSERIES = 0x0001; /// Manual series allocation. +const sal_uInt16 EXC_CHPROPS_SHOWVISIBLEONLY = 0x0002; /// Show visible cells only. +const sal_uInt16 EXC_CHPROPS_NORESIZE = 0x0004; /// Do not resize chart with window. +const sal_uInt16 EXC_CHPROPS_MANPLOTAREA = 0x0008; /// Manual plot area mode. +const sal_uInt16 EXC_CHPROPS_USEMANPLOTAREA = 0x0010; /// Manual plot area layout in CHFRAMEPOS record. + +const sal_uInt8 EXC_CHPROPS_EMPTY_SKIP = 0; /// Skip empty values. +const sal_uInt8 EXC_CHPROPS_EMPTY_ZERO = 1; /// Plot empty values as zero. +const sal_uInt8 EXC_CHPROPS_EMPTY_INTERPOLATE = 2; /// Interpolate empty values. + +// (0x1045) CHSERGROUP -------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHSERGROUP = 0x1045; + +const sal_uInt16 EXC_CHSERGROUP_NONE = 0xFFFF; /// For internal use: no chart type group. + +// (0x1048, 0x0858) CHPIVOTREF ------------------------------------------------ + +const sal_uInt16 EXC_ID5_CHPIVOTREF = 0x1048; +const sal_uInt16 EXC_ID8_CHPIVOTREF = 0x0858; + +// (0x104A) CHSERPARENT ------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHSERPARENT = 0x104A; + +// (0x104B) CHSERTRENDLINE ---------------------------------------------------- + +const sal_uInt16 EXC_ID_CHSERTRENDLINE = 0x104B; + +const sal_uInt8 EXC_CHSERTREND_POLYNOMIAL = 0; /// If order is 1, trend line is linear. +const sal_uInt8 EXC_CHSERTREND_EXPONENTIAL = 1; +const sal_uInt8 EXC_CHSERTREND_LOGARITHMIC = 2; +const sal_uInt8 EXC_CHSERTREND_POWER = 3; +const sal_uInt8 EXC_CHSERTREND_MOVING_AVG = 4; + +// (0x104E) CHFORMAT ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHFORMAT = 0x104E; + +// (0x104F) CHFRAMEPOS -------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHFRAMEPOS = 0x104F; + +const sal_uInt16 EXC_CHFRAMEPOS_POINTS = 0; +const sal_uInt16 EXC_CHFRAMEPOS_ABSSIZE_POINTS = 1; +const sal_uInt16 EXC_CHFRAMEPOS_PARENT = 2; +const sal_uInt16 EXC_CHFRAMEPOS_DEFOFFSET_PLOT = 3; +const sal_uInt16 EXC_CHFRAMEPOS_CHARTSIZE = 5; + +// (0x1050) CHFORMATRUNS ------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHFORMATRUNS = 0x1050; + +// (0x1051) CHSOURCELINK ------------------------------------------------------ + +const sal_uInt16 EXC_ID_CHSOURCELINK = 0x1051; + +const sal_uInt8 EXC_CHSRCLINK_TITLE = 0; +const sal_uInt8 EXC_CHSRCLINK_VALUES = 1; +const sal_uInt8 EXC_CHSRCLINK_CATEGORY = 2; +const sal_uInt8 EXC_CHSRCLINK_BUBBLES = 3; + +const sal_uInt8 EXC_CHSRCLINK_DEFAULT = 0; +const sal_uInt8 EXC_CHSRCLINK_DIRECTLY = 1; +const sal_uInt8 EXC_CHSRCLINK_WORKSHEET = 2; + +const sal_uInt16 EXC_CHSRCLINK_NUMFMT = 0x0001; + +// (0x105B) CHSERERRORBAR ----------------------------------------------------- + +const sal_uInt16 EXC_ID_CHSERERRORBAR = 0x105B; + +const sal_uInt8 EXC_CHSERERR_NONE = 0; /// For internal use only. +const sal_uInt8 EXC_CHSERERR_XPLUS = 1; +const sal_uInt8 EXC_CHSERERR_XMINUS = 2; +const sal_uInt8 EXC_CHSERERR_YPLUS = 3; +const sal_uInt8 EXC_CHSERERR_YMINUS = 4; + +const sal_uInt8 EXC_CHSERERR_PERCENT = 1; +const sal_uInt8 EXC_CHSERERR_FIXED = 2; +const sal_uInt8 EXC_CHSERERR_STDDEV = 3; +const sal_uInt8 EXC_CHSERERR_CUSTOM = 4; +const sal_uInt8 EXC_CHSERERR_STDERR = 5; + +const sal_uInt8 EXC_CHSERERR_END_BLANK = 0; /// Line end: blank. +const sal_uInt8 EXC_CHSERERR_END_TSHAPE = 1; /// Line end: t-shape. + +// (0x105D) CHSERIESFORMAT ---------------------------------------------------- + +const sal_uInt16 EXC_ID_CHSERIESFORMAT = 0x105D; + +const sal_uInt16 EXC_CHSERIESFORMAT_SMOOTHED = 0x0001; +const sal_uInt16 EXC_CHSERIESFORMAT_BUBBLE3D = 0x0002; +const sal_uInt16 EXC_CHSERIESFORMAT_SHADOW = 0x0004; + +// (0x105F) CH3DDATAFORMAT ---------------------------------------------------- + +const sal_uInt16 EXC_ID_CH3DDATAFORMAT = 0x105F; + +const sal_uInt8 EXC_CH3DDATAFORMAT_RECT = 0; /// Rectangular base. +const sal_uInt8 EXC_CH3DDATAFORMAT_CIRC = 1; /// Circular base. + +const sal_uInt8 EXC_CH3DDATAFORMAT_STRAIGHT = 0; /// Straight to top. +const sal_uInt8 EXC_CH3DDATAFORMAT_SHARP = 1; /// Sharp top. +const sal_uInt8 EXC_CH3DDATAFORMAT_TRUNC = 2; /// Shart top, truncated. + +// (0x1061) CHPIEEXT ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHPIEEXT = 0x1061; + +// (0x1066) CHESCHERFORMAT ---------------------------------------------------- + +const sal_uInt16 EXC_ID_CHESCHERFORMAT = 0x1066; + +// Other record IDs ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_CHWRAPPEDRECORD = 0x0851; +const sal_uInt16 EXC_ID_CHUNITPROPERTIES = 0x0857; +const sal_uInt16 EXC_ID_CHUSEDAXESSETS = 0x1046; +const sal_uInt16 EXC_ID_CHLABELRANGE2 = 0x1062; +const sal_uInt16 EXC_ID_CHPLOTGROWTH = 0x1064; +const sal_uInt16 EXC_ID_CHSERINDEX = 0x1065; +const sal_uInt16 EXC_ID_CHUNKNOWN = 0xFFFF; + +// ============================================================================ +// Structs and classes +// ============================================================================ + +// Common ===================================================================== + +struct XclChRectangle +{ + sal_Int32 mnX; /// X position of the object in 1/4000 of chart width. + sal_Int32 mnY; /// Y position of the object in 1/4000 of chart height. + sal_Int32 mnWidth; /// Width of the object in 1/4000 of chart width. + sal_Int32 mnHeight; /// Height of the object in 1/4000 of chart height. + + explicit XclChRectangle(); +}; + +// ---------------------------------------------------------------------------- + +/** Specifies the position of a data series or data point. */ +struct XclChDataPointPos +{ + sal_uInt16 mnSeriesIdx; /// Series index of series or a data point. + sal_uInt16 mnPointIdx; /// Index of a data point inside a series. + + explicit XclChDataPointPos( + sal_uInt16 nSeriesIdx = EXC_CHSERIES_INVALID, + sal_uInt16 nPointIdx = EXC_CHDATAFORMAT_ALLPOINTS ); +}; + +bool operator<( const XclChDataPointPos& rL, const XclChDataPointPos& rR ); + +// ---------------------------------------------------------------------------- + +/** Contains the type and context of a block of future records which are + guarded by CHFRBLOCKBEGIN and CHFRBLOCKEND records. */ +struct XclChFrBlock +{ + sal_uInt16 mnType; /// Type of the future record block. + sal_uInt16 mnContext; /// Context dependent on type. + sal_uInt16 mnValue1; /// Optional primary value for current context. + sal_uInt16 mnValue2; /// Optional secondary value for current context. + + explicit XclChFrBlock( sal_uInt16 nType ); +}; + +// Frame formatting =========================================================== + +struct XclChFramePos +{ + XclChRectangle maRect; /// Object dependent position data. + sal_uInt16 mnTLMode; /// Top-left position mode. + sal_uInt16 mnBRMode; /// Bottom-right position mode. + + explicit XclChFramePos(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChLineFormat +{ + Color maColor; /// Line color. + sal_uInt16 mnPattern; /// Line pattern (solid, dashed, ...). + sal_Int16 mnWeight; /// Line weight (hairline, single, ...). + sal_uInt16 mnFlags; /// Additional flags. + + explicit XclChLineFormat(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChAreaFormat +{ + Color maPattColor; /// Pattern color. + Color maBackColor; /// Pattern background color. + sal_uInt16 mnPattern; /// Fill pattern. + sal_uInt16 mnFlags; /// Additional flags. + + explicit XclChAreaFormat(); +}; + +// ---------------------------------------------------------------------------- + +class SfxItemSet; +class EscherPropertyContainer; + +struct XclChEscherFormat +{ + typedef ScfRef< SfxItemSet > SfxItemSetRef; + typedef ScfRef< EscherPropertyContainer > EscherPropSetRef; + + SfxItemSetRef mxItemSet; /// Item set for Escher properties import. + EscherPropSetRef mxEscherSet; /// Container for Escher properties export. + + explicit XclChEscherFormat(); + ~XclChEscherFormat(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChPicFormat +{ + sal_uInt16 mnBmpMode; /// Bitmap mode, e.g. stretched, stacked. + sal_uInt16 mnFormat; /// Image data format (WMF, BMP). + sal_uInt16 mnFlags; /// Additional flags. + double mfScale; /// Picture scaling (units). + + explicit XclChPicFormat(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChFrame +{ + sal_uInt16 mnFormat; /// Format type of the frame. + sal_uInt16 mnFlags; /// Additional flags. + + explicit XclChFrame(); +}; + +// Source links =============================================================== + +struct XclChSourceLink +{ + sal_uInt8 mnDestType; /// Type of the destination (title, values, ...). + sal_uInt8 mnLinkType; /// Link type (directly, linked to worksheet, ...). + sal_uInt16 mnFlags; /// Additional flags. + sal_uInt16 mnNumFmtIdx; /// Number format index. + + explicit XclChSourceLink(); +}; + +// Text ======================================================================= + +struct XclChObjectLink +{ + XclChDataPointPos maPointPos; /// Position of the data point. + sal_uInt16 mnTarget; /// Target of the link. + + explicit XclChObjectLink(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChFrLabelProps +{ + String maSeparator; /// Separator between label values. + sal_uInt16 mnFlags; /// Flags indicating which values to be displayed. + + explicit XclChFrLabelProps(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChText +{ + XclChRectangle maRect; /// Position of the text object. + Color maTextColor; /// Text color. + sal_uInt8 mnHAlign; /// Horizontal alignment. + sal_uInt8 mnVAlign; /// Vertical alignment. + sal_uInt16 mnBackMode; /// Background mode: transparent, opaque. + sal_uInt16 mnFlags; /// Additional flags. + sal_uInt16 mnFlags2; /// Text object placement and text direction (BIFF8+). + sal_uInt16 mnRotation; /// Text object rotation (BIFF8+). + + explicit XclChText(); +}; + +// Data series ================================================================ + +struct XclChMarkerFormat +{ + Color maLineColor; /// Border line color. + Color maFillColor; /// Fill color. + sal_uInt32 mnMarkerSize; /// Size of a marker + sal_uInt16 mnMarkerType; /// Marker type (none, diamond, ...). + sal_uInt16 mnFlags; /// Additional flags. + + explicit XclChMarkerFormat(); +}; + +// ---------------------------------------------------------------------------- + +struct XclCh3dDataFormat +{ + sal_uInt8 mnBase; /// Base form. + sal_uInt8 mnTop; /// Top egde mode. + + explicit XclCh3dDataFormat(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChDataFormat +{ + XclChDataPointPos maPointPos; /// Position of the data point or series. + sal_uInt16 mnFormatIdx; /// Formatting index for automatic colors. + sal_uInt16 mnFlags; /// Additional flags. + + explicit XclChDataFormat(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChSerTrendLine +{ + double mfIntercept; /// Forced intercept. + double mfForecastFor; /// Counter to forecast forward. + double mfForecastBack; /// Counter to forecast backward. + sal_uInt8 mnLineType; /// Type of the trend line. + sal_uInt8 mnOrder; /// Polynomial order or moving average counter. + sal_uInt8 mnShowEquation; /// 1 = Show equation. + sal_uInt8 mnShowRSquared; /// 1 = Show R-squared. + + explicit XclChSerTrendLine(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChSerErrorBar +{ + double mfValue; /// Fixed value for several source types. + sal_uInt16 mnValueCount; /// Number of custom error values. + sal_uInt8 mnBarType; /// Type of the error bar (X/Y). + sal_uInt8 mnSourceType; /// Type of source values. + sal_uInt8 mnLineEnd; /// Type of the line ends. + + explicit XclChSerErrorBar(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChSeries +{ + sal_uInt16 mnCategType; /// Data type for category entries. + sal_uInt16 mnValueType; /// Data type for value entries. + sal_uInt16 mnBubbleType; /// Data type for bubble entries. + sal_uInt16 mnCategCount; /// Number of category entries. + sal_uInt16 mnValueCount; /// Number of value entries. + sal_uInt16 mnBubbleCount; /// Number of bubble entries. + + explicit XclChSeries(); +}; + +// Chart type groups ========================================================== + +struct XclChType +{ + sal_Int16 mnOverlap; /// Bar overlap width (CHBAR). + sal_Int16 mnGap; /// Gap between bars (CHBAR). + sal_uInt16 mnRotation; /// Rotation angle of first pie (CHPIE). + sal_uInt16 mnPieHole; /// Hole size in donut chart (CHPIE). + sal_uInt16 mnBubbleSize; /// Bubble size in bubble chart (CHSCATTER). + sal_uInt16 mnBubbleType; /// Bubble type in bubble chart (CHSCATTER). + sal_uInt16 mnFlags; /// Additional flags (all chart types). + + explicit XclChType(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChChart3d +{ + sal_uInt16 mnRotation; /// Rotation (0...359deg). + sal_Int16 mnElevation; /// Elevation (-90...+90deg). + sal_uInt16 mnEyeDist; /// Eye distance to chart (0...100). + sal_uInt16 mnRelHeight; /// Height relative to width. + sal_uInt16 mnRelDepth; /// Depth relative to width. + sal_uInt16 mnDepthGap; /// Space between series. + sal_uInt16 mnFlags; /// Additional flags. + + explicit XclChChart3d(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChLegend +{ + XclChRectangle maRect; /// Position of the legend. + sal_uInt8 mnDockMode; /// Docking mode. + sal_uInt8 mnSpacing; /// Spacing between elements. + sal_uInt16 mnFlags; /// Additional flags. + + explicit XclChLegend(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChTypeGroup +{ + sal_uInt16 mnFlags; /// Additional flags. + sal_uInt16 mnGroupIdx; /// Chart type group index. + + explicit XclChTypeGroup(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChProperties +{ + sal_uInt16 mnFlags; /// Additional flags. + sal_uInt8 mnEmptyMode; /// Plotting mode for empty cells. + + explicit XclChProperties(); +}; + +// Axes ======================================================================= + +struct XclChLabelRange +{ + sal_uInt16 mnCross; /// Crossing position of other axis. + sal_uInt16 mnLabelFreq; /// Frequency of labels. + sal_uInt16 mnTickFreq; /// Frequency of ticks. + sal_uInt16 mnFlags; /// Additional flags. + + explicit XclChLabelRange(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChValueRange +{ + double mfMin; /// Minimum value on axis. + double mfMax; /// Maximum value on axis. + double mfMajorStep; /// Distance for major grid lines. + double mfMinorStep; /// Distance for minor grid lines. + double mfCross; /// Crossing position of other axis. + sal_uInt16 mnFlags; /// Additional flags. + + explicit XclChValueRange(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChTick +{ + Color maTextColor; /// Tick labels color. + sal_uInt8 mnMajor; /// Type of tick marks of major grid. + sal_uInt8 mnMinor; /// Type of tick marks of minor grid. + sal_uInt8 mnLabelPos; /// Position of labels relative to axis. + sal_uInt8 mnBackMode; /// Background mode: transparent, opaque. + sal_uInt16 mnFlags; /// Additional flags. + sal_uInt16 mnRotation; /// Tick labels angle (BIFF8+). + + explicit XclChTick(); +}; + +// ---------------------------------------------------------------------------- + +struct XclChAxis +{ + sal_uInt16 mnType; /// Axis type. + + explicit XclChAxis(); + + /** Returns the axis dimension index used by the chart API. */ + sal_Int32 GetApiAxisDimension() const; +}; + +// ---------------------------------------------------------------------------- + +struct XclChAxesSet +{ + XclChRectangle maRect; /// Position of the axes set (inner plot area). + sal_uInt16 mnAxesSetId; /// Primary/secondary axes set. + + explicit XclChAxesSet(); + + /** Returns the axes set index used by the chart API. */ + sal_Int32 GetApiAxesSetIndex() const; +}; + +// Property mode ============================================================== + +/** Specifies the type of a formatting. This results in different property names. */ +enum XclChPropertyMode +{ + EXC_CHPROPMODE_COMMON, /// Common objects, no special handling. + EXC_CHPROPMODE_LINEARSERIES, /// Specific to data series drawn as lines. + EXC_CHPROPMODE_FILLEDSERIES /// Specific to data series drawn as areas. +}; + +// Static helper functions ==================================================== + +/** Contains static helper functions for the chart filters. */ +class XclChartHelper +{ +public: + /** Returns a palette index for automatic series line colors. */ + static sal_uInt16 GetSeriesLineAutoColorIdx( sal_uInt16 nFormatIdx ); + /** Returns a palette index for automatic series fill colors. */ + static sal_uInt16 GetSeriesFillAutoColorIdx( sal_uInt16 nFormatIdx ); + /** Returns a transparency value for automatic series fill colors. */ + static sal_uInt8 GetSeriesFillAutoTransp( sal_uInt16 nFormatIdx ); + /** Returns an automatic symbol index for the passed format index. */ + static sal_uInt16 GetAutoMarkerType( sal_uInt16 nFormatIdx ); + /** Returns true, if the passed marker type is filled. */ + static bool HasMarkerFillColor( sal_uInt16 nMarkerType ); + /** Returns the role name for a manual data source for error bars. */ + static ::rtl::OUString GetErrorBarValuesRole( sal_uInt8 nBarType ); +}; + +// Chart formatting info provider ============================================= + +/** Enumerates different object types for specific automatic formatting behaviour. */ +enum XclChObjectType +{ + EXC_CHOBJTYPE_BACKGROUND, /// Chart background. + EXC_CHOBJTYPE_PLOTFRAME, /// Wall formatting in 2d charts. + EXC_CHOBJTYPE_WALL3D, /// Wall formatting in 3d charts. + EXC_CHOBJTYPE_FLOOR3D, /// Floor formatting in 3d charts. + EXC_CHOBJTYPE_TEXT, /// Text boxes (titles, data point labels). + EXC_CHOBJTYPE_LEGEND, /// Chart legend. + EXC_CHOBJTYPE_LINEARSERIES, /// Series formatting in a chart supporting line formatting only. + EXC_CHOBJTYPE_FILLEDSERIES, /// Series formatting in a chart supporting area formatting. + EXC_CHOBJTYPE_AXISLINE, /// Axis line format. + EXC_CHOBJTYPE_GRIDLINE, /// Axis grid line format. + EXC_CHOBJTYPE_TRENDLINE, /// Series trend line. + EXC_CHOBJTYPE_ERRORBAR, /// Series error bar. + EXC_CHOBJTYPE_CONNECTLINE, /// Data point connector line. + EXC_CHOBJTYPE_HILOLINE, /// High/low lines in stock charts. + EXC_CHOBJTYPE_WHITEDROPBAR, /// White-day drop bar in stock charts. + EXC_CHOBJTYPE_BLACKDROPBAR /// Black-day drop bar in stock charts. +}; + +/** Enumerates different types to handle missing frame objects. */ +enum XclChFrameType +{ + EXC_CHFRAMETYPE_AUTO, /// Missing frame represents automatic formatting. + EXC_CHFRAMETYPE_INVISIBLE /// Missing frame represents invisible formatting. +}; + +/** Contains information about auto formatting of a specific chart object type. */ +struct XclChFormatInfo +{ + XclChObjectType meObjType; /// Object type for automatic format. + XclChPropertyMode mePropMode; /// Property mode for property set helper. + sal_uInt16 mnAutoLineColorIdx; /// Automatic line color index. + sal_Int16 mnAutoLineWeight; /// Automatic line weight (hairline, single, ...). + sal_uInt16 mnAutoPattColorIdx; /// Automatic fill pattern color index. + XclChFrameType meDefFrameType; /// Default format type for missing frame objects. + bool mbCreateDefFrame; /// true = Create missing frame objects on import. + bool mbDeleteDefFrame; /// true = Delete default frame formatting on export. + bool mbIsFrame; /// true = Object is a frame, false = Object is a line. +}; + +// ---------------------------------------------------------------------------- + +/** Provides access to chart auto formatting for all available object types. */ +class XclChFormatInfoProvider +{ +public: + explicit XclChFormatInfoProvider(); + + /** Returns an info struct about auto formatting for the passed object type. */ + const XclChFormatInfo& GetFormatInfo( XclChObjectType eObjType ) const; + +private: + typedef ::std::map< XclChObjectType, const XclChFormatInfo* > XclFmtInfoMap; + XclFmtInfoMap maInfoMap; /// Maps object type to formatting data. +}; + +// Chart type info provider =================================================== + +/** Enumerates all kinds of different chart types. */ +enum XclChTypeId +{ + EXC_CHTYPEID_BAR, /// Vertical bar chart. + EXC_CHTYPEID_HORBAR, /// Horizontal bar chart. + EXC_CHTYPEID_LINE, /// Line chart. + EXC_CHTYPEID_AREA, /// Area chart. + EXC_CHTYPEID_STOCK, /// Stock chart. + EXC_CHTYPEID_RADARLINE, /// Linear radar chart. + EXC_CHTYPEID_RADARAREA, /// Filled radar chart. + EXC_CHTYPEID_PIE, /// Pie chart. + EXC_CHTYPEID_DONUT, /// Donut chart. + EXC_CHTYPEID_PIEEXT, /// Pie-to-pie or pie-to-bar chart. + EXC_CHTYPEID_SCATTER, /// Scatter (XY) chart. + EXC_CHTYPEID_BUBBLES, /// Bubble chart. + EXC_CHTYPEID_SURFACE, /// Surface chart. + EXC_CHTYPEID_UNKNOWN /// Default for unknown chart types. +}; + +/** Enumerates different categories of similar chart types. */ +enum XclChTypeCateg +{ + EXC_CHTYPECATEG_BAR, /// Bar charts (horizontal or vertical). + EXC_CHTYPECATEG_LINE, /// Line charts (line, area, stock charts). + EXC_CHTYPECATEG_RADAR, /// Radar charts (linear or filled). + EXC_CHTYPECATEG_PIE, /// Pie and donut charts. + EXC_CHTYPECATEG_SCATTER, /// Scatter and bubble charts. + EXC_CHTYPECATEG_SURFACE /// Surface charts. +}; + +/** Enumerates modes for varying point colors in a series. */ +enum XclChVarPointMode +{ + EXC_CHVARPOINT_NONE, /// No varied colors supported. + EXC_CHVARPOINT_SINGLE, /// Only supported, if type group contains only one series. + EXC_CHVARPOINT_MULTI /// Supported for multiple series in a chart type group. +}; + +/** Contains information for a chart type. */ +struct XclChTypeInfo +{ + XclChTypeId meTypeId; /// Unique chart type identifier. + XclChTypeCateg meTypeCateg; /// Chart type category this type belongs to. + sal_uInt16 mnRecId; /// Record identifier written to the file. + const sal_Char* mpcServiceName; /// Service name of the type. + XclChVarPointMode meVarPointMode; /// Mode for varying point colors. + sal_Int32 mnDefaultLabelPos; /// Default data label position (API constant). + bool mbCombinable2d; /// true = Types can be combined in one axes set. + bool mbSupports3d; /// true = 3d type allowed, false = Only 2d type. + bool mbPolarCoordSystem; /// true = Polar, false = Cartesian. + bool mbSeriesIsFrame2d; /// true = Series with area formatting (2d charts). + bool mbSeriesIsFrame3d; /// true = Series with area formatting (3d charts). + bool mbSingleSeriesVis; /// true = Only first series visible. + bool mbCategoryAxis; /// true = X axis contains categories. + bool mbSwappedAxesSet; /// true = X and Y axes are swapped. + bool mbSupportsStacking; /// true = Series can be stacked on each other. + bool mbReverseSeries; /// true = Insert unstacked series in reverse order. + bool mbTicksBetweenCateg; /// true = X axis ticks between categories. +}; + +/** Extended chart type information and access functions. */ +struct XclChExtTypeInfo : public XclChTypeInfo +{ + bool mb3dChart; /// Chart is actually a 3D chart. + bool mbSpline; /// Series lines are smoothed. + + explicit XclChExtTypeInfo( const XclChTypeInfo& rTypeInfo ); + + void Set( const XclChTypeInfo& rTypeInfo, bool b3dChart, bool bSpline ); + + /** Returns true, if this chart type supports area formatting for its series. */ + inline bool IsSeriesFrameFormat() const + { return mb3dChart ? mbSeriesIsFrame3d : mbSeriesIsFrame2d; } + /** Returns the correct object type identifier for series and data points. */ + inline XclChObjectType GetSeriesObjectType() const + { return IsSeriesFrameFormat() ? EXC_CHOBJTYPE_FILLEDSERIES : EXC_CHOBJTYPE_LINEARSERIES; } +}; + +// ---------------------------------------------------------------------------- + +/** Provides access to chart type info structs for all available chart types. */ +class XclChTypeInfoProvider +{ +public: + explicit XclChTypeInfoProvider(); + + /** Returns chart type info for a unique chart type identifier. */ + const XclChTypeInfo& GetTypeInfo( XclChTypeId eType ) const; + /** Returns the first fitting chart type info for an Excel chart type record identifier. */ + const XclChTypeInfo& GetTypeInfoFromRecId( sal_uInt16 nRecId ) const; + /** Returns the first fitting chart type info for the passed service name. */ + const XclChTypeInfo& GetTypeInfoFromService( const ::rtl::OUString& rServiceName ) const; + +private: + typedef ::std::map< XclChTypeId, const XclChTypeInfo* > XclChTypeInfoMap; + XclChTypeInfoMap maInfoMap; /// Maps chart types to type info data. +}; + +// Chart text and title object helpers ======================================== + +/** Enumerates different text box types for default text formatting and title + positioning. */ +enum XclChTextType +{ + EXC_CHTEXTTYPE_TITLE, /// Chart title. + EXC_CHTEXTTYPE_LEGEND, /// Chart legend. + EXC_CHTEXTTYPE_AXISTITLE, /// Chart axis titles. + EXC_CHTEXTTYPE_AXISLABEL, /// Chart axis labels. + EXC_CHTEXTTYPE_DATALABEL /// Data point labels. +}; + +/** A map key for text and title objects. */ +struct XclChTextKey : public ::std::pair< XclChTextType, ::std::pair< sal_uInt16, sal_uInt16 > > +{ + inline explicit XclChTextKey( XclChTextType eTextType, sal_uInt16 nMainIdx = 0, sal_uInt16 nSubIdx = 0 ) + { first = eTextType; second.first = nMainIdx; second.second = nSubIdx; } +}; + +/** Function prototype receiving a chart document and returning a title shape. */ +typedef ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + (*XclChGetShapeFunc)( const ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDocument >& ); + +// Property helpers =========================================================== + +class XclChObjectTable +{ +public: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > XNameContainerRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > XServiceFactoryRef; + +public: + explicit XclChObjectTable( XServiceFactoryRef xFactory, + const ::rtl::OUString& rServiceName, const ::rtl::OUString& rObjNameBase ); + + /** Returns a named formatting object from the chart document. */ + ::com::sun::star::uno::Any GetObject( const ::rtl::OUString& rObjName ); + /** Insertes a named formatting object into the chart document. */ + ::rtl::OUString InsertObject( const ::com::sun::star::uno::Any& rObj ); + +private: + XServiceFactoryRef mxFactory; /// Factory to create the container. + XNameContainerRef mxContainer; /// Container for the objects. + ::rtl::OUString maServiceName; /// Service name to create the container. + ::rtl::OUString maObjNameBase; /// Base of names for inserted objects. + sal_Int32 mnIndex; /// Index to create unique identifiers. +}; + +// ---------------------------------------------------------------------------- + +struct XclFontData; + +/** Helper class for usage of property sets. */ +class XclChPropSetHelper +{ +public: + explicit XclChPropSetHelper(); + + /** Reads all line properties from the passed property set. */ + void ReadLineProperties( + XclChLineFormat& rLineFmt, + XclChObjectTable& rDashTable, + const ScfPropertySet& rPropSet, + XclChPropertyMode ePropMode ); + /** Reads solid area properties from the passed property set. + @return true = object contains complex fill properties. */ + bool ReadAreaProperties( + XclChAreaFormat& rAreaFmt, + const ScfPropertySet& rPropSet, + XclChPropertyMode ePropMode ); + /** Reads gradient or bitmap area properties from the passed property set. */ + void ReadEscherProperties( + XclChEscherFormat& rEscherFmt, + XclChPicFormat& rPicFmt, + XclChObjectTable& rGradientTable, + XclChObjectTable& rHatchTable, + XclChObjectTable& rBitmapTable, + const ScfPropertySet& rPropSet, + XclChPropertyMode ePropMode ); + /** Reads all marker properties from the passed property set. */ + void ReadMarkerProperties( + XclChMarkerFormat& rMarkerFmt, + const ScfPropertySet& rPropSet, + sal_uInt16 nFormatIdx ); + /** Reads rotation properties from the passed property set. */ + sal_uInt16 ReadRotationProperties( + const ScfPropertySet& rPropSet, + bool bSupportsStacked ); + + /** Writes all line properties to the passed property set. */ + void WriteLineProperties( + ScfPropertySet& rPropSet, + XclChObjectTable& rDashTable, + const XclChLineFormat& rLineFmt, + XclChPropertyMode ePropMode ); + /** Writes solid area properties to the passed property set. */ + void WriteAreaProperties( + ScfPropertySet& rPropSet, + const XclChAreaFormat& rAreaFmt, + XclChPropertyMode ePropMode ); + /** Writes gradient or bitmap area properties to the passed property set. */ + void WriteEscherProperties( + ScfPropertySet& rPropSet, + XclChObjectTable& rGradientTable, + XclChObjectTable& rHatchTable, + XclChObjectTable& rBitmapTable, + const XclChEscherFormat& rEscherFmt, + const XclChPicFormat& rPicFmt, + XclChPropertyMode ePropMode ); + /** Writes all marker properties to the passed property set. */ + void WriteMarkerProperties( + ScfPropertySet& rPropSet, + const XclChMarkerFormat& rMarkerFmt ); + /** Writes rotation properties to the passed property set. */ + void WriteRotationProperties( + ScfPropertySet& rPropSet, + sal_uInt16 nRotation, + bool bSupportsStacked ); + +private: + /** Returns a line property set helper according to the passed property mode. */ + ScfPropSetHelper& GetLineHelper( XclChPropertyMode ePropMode ); + /** Returns an area property set helper according to the passed property mode. */ + ScfPropSetHelper& GetAreaHelper( XclChPropertyMode ePropMode ); + /** Returns a gradient property set helper according to the passed property mode. */ + ScfPropSetHelper& GetGradientHelper( XclChPropertyMode ePropMode ); + /** Returns a hatch property set helper according to the passed property mode. */ + ScfPropSetHelper& GetHatchHelper( XclChPropertyMode ePropMode ); + +private: + ScfPropSetHelper maLineHlpCommon; /// Properties for lines in common objects. + ScfPropSetHelper maLineHlpLinear; /// Properties for lines in linear series. + ScfPropSetHelper maLineHlpFilled; /// Properties for lines in filled series. + ScfPropSetHelper maAreaHlpCommon; /// Properties for areas in common objects. + ScfPropSetHelper maAreaHlpFilled; /// Properties for areas in filled series. + ScfPropSetHelper maGradHlpCommon; /// Properties for gradients in common objects. + ScfPropSetHelper maGradHlpFilled; /// Properties for gradients in filled series. + ScfPropSetHelper maHatchHlpCommon; /// Properties for hatches in common objects. + ScfPropSetHelper maHatchHlpFilled; /// Properties for hatches in filled series. + ScfPropSetHelper maBitmapHlp; /// Properties for bitmaps. +}; + +// ============================================================================ + +/** Base struct for internal root data structs for import and export. */ +struct XclChRootData +{ + typedef ScfRef< XclChTypeInfoProvider > XclChTypeProvRef; + typedef ScfRef< XclChFormatInfoProvider > XclChFmtInfoProvRef; + typedef ScfRef< XclChObjectTable > XclChObjectTableRef; + typedef ::std::map< XclChTextKey, XclChGetShapeFunc > XclChGetShapeFuncMap; + + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > + mxChartDoc; /// The chart document. + Rectangle maChartRect; /// Position and size of the chart shape. + XclChTypeProvRef mxTypeInfoProv; /// Provides info about chart types. + XclChFmtInfoProvRef mxFmtInfoProv; /// Provides info about auto formatting. + XclChObjectTableRef mxLineDashTable; /// Container for line dash styles. + XclChObjectTableRef mxGradientTable; /// Container for gradient fill styles. + XclChObjectTableRef mxHatchTable; /// Container for hatch fill styles. + XclChObjectTableRef mxBitmapTable; /// Container for bitmap fill styles. + XclChGetShapeFuncMap maGetShapeFuncs; /// Maps title shape getter functions. + sal_Int32 mnBorderGapX; /// Border gap to chart space in 1/100mm. + sal_Int32 mnBorderGapY; /// Border gap to chart space in 1/100mm. + double mfUnitSizeX; /// Size of a chart X unit (1/4000 of chart width) in 1/100 mm. + double mfUnitSizeY; /// Size of a chart Y unit (1/4000 of chart height) in 1/100 mm. + + explicit XclChRootData(); + virtual ~XclChRootData(); + + /** Starts the API chart document conversion. Must be called once before any API access. */ + void InitConversion( + const XclRoot& rRoot, + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >& rxChartDoc, + const Rectangle& rChartRect ); + /** Finishes the API chart document conversion. Must be called once before any API access. */ + void FinishConversion(); + + /** Returns the drawing shape interface of the specified title object. */ + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + GetTitleShape( const XclChTextKey& rTitleKey ) const; +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlconst.hxx b/sc/source/filter/inc/xlconst.hxx new file mode 100644 index 000000000000..42160aae7529 --- /dev/null +++ b/sc/source/filter/inc/xlconst.hxx @@ -0,0 +1,277 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLCONST_HXX +#define SC_XLCONST_HXX + +#include "address.hxx" + +// Common ===================================================================== + +// BIFF versions -------------------------------------------------------------- + +/** An enumeration for all Excel file format types (BIFF types). */ +enum XclBiff +{ + EXC_BIFF2 = 0, /// MS Excel 2.1 + EXC_BIFF3, /// MS Excel 3.0 + EXC_BIFF4, /// MS Excel 4.0 + EXC_BIFF5, /// MS Excel 5.0, MS Excel 7.0 (95) + EXC_BIFF8, /// MS Excel 8.0 (97), 9.0 (2000), 10.0 (XP), 11.0 (2003) + EXC_BIFF_UNKNOWN /// Unknown BIFF version. +}; + +/** An enumeration for all Excel output format types. */ +enum XclOutput +{ + EXC_OUTPUT_BINARY, /// MS Excel binary .xls + EXC_OUTPUT_XML_2007, /// MS Excel 2007 .xlsx +}; + +// Excel sheet dimensions ----------------------------------------------------- + +const SCCOL EXC_MAXCOL2 = 255; +const SCROW EXC_MAXROW2 = 16383; +const SCTAB EXC_MAXTAB2 = 0; + +const SCCOL EXC_MAXCOL3 = EXC_MAXCOL2; +const SCROW EXC_MAXROW3 = EXC_MAXROW2; +const SCTAB EXC_MAXTAB3 = EXC_MAXTAB2; + +const SCCOL EXC_MAXCOL4 = EXC_MAXCOL3; +const SCROW EXC_MAXROW4 = EXC_MAXROW3; +const SCTAB EXC_MAXTAB4 = 32767; + +const SCCOL EXC_MAXCOL5 = EXC_MAXCOL4; +const SCROW EXC_MAXROW5 = EXC_MAXROW4; +const SCTAB EXC_MAXTAB5 = EXC_MAXTAB4; + +const SCCOL EXC_MAXCOL8 = EXC_MAXCOL5; +const SCROW EXC_MAXROW8 = 65535; +const SCTAB EXC_MAXTAB8 = EXC_MAXTAB5; + +const sal_uInt16 EXC_NOTAB = SAL_MAX_UINT16; /// An invalid Excel sheet index, for common use. +const SCTAB SCTAB_INVALID = SCTAB_MAX; /// An invalid Calc sheet index, for common use. +const SCTAB SCTAB_GLOBAL = SCTAB_MAX; /// A Calc sheet index for the workbook globals. + +// Storage/stream names ------------------------------------------------------- + +#define EXC_STORAGE_OLE_LINKED CREATE_STRING( "LNK" ) +#define EXC_STORAGE_OLE_EMBEDDED CREATE_STRING( "MBD" ) +#define EXC_STORAGE_VBA_PROJECT CREATE_STRING( "_VBA_PROJECT_CUR" ) +#define EXC_STORAGE_VBA CREATE_STRING( "VBA" ) + +#define EXC_STREAM_BOOK CREATE_STRING( "Book" ) +#define EXC_STREAM_WORKBOOK CREATE_STRING( "Workbook" ) +#define EXC_STREAM_CTLS CREATE_STRING( "Ctls" ) + +// Encoded URLs --------------------------------------------------------------- + +const sal_Unicode EXC_URLSTART_ENCODED = '\x01'; /// Encoded URL. +const sal_Unicode EXC_URLSTART_SELF = '\x02'; /// Reference to own workbook. +const sal_Unicode EXC_URLSTART_SELFENCODED = '\x03'; /// Encoded self reference. +const sal_Unicode EXC_URLSTART_OWNDOC = '\x04'; /// Reference to own workbook (BIFF5/BIFF7). + +const sal_Unicode EXC_URL_DOSDRIVE = '\x01'; /// DOS drive letter or UNC server name. +const sal_Unicode EXC_URL_DRIVEROOT = '\x02'; /// Root directory of current drive. +const sal_Unicode EXC_URL_SUBDIR = '\x03'; /// Directory name delimiter. +const sal_Unicode EXC_URL_PARENTDIR = '\x04'; /// Parent directory. +const sal_Unicode EXC_URL_RAW = '\x05'; /// Unencoded URL. +const sal_Unicode EXC_URL_SHEETNAME = '\x09'; /// Sheet name starts here (BIFF4). + +const sal_Unicode EXC_DDE_DELIM = '\x03'; /// DDE application-topic delimiter + +// Error codes ---------------------------------------------------------------- + +const sal_uInt8 EXC_ERR_NULL = 0x00; +const sal_uInt8 EXC_ERR_DIV0 = 0x07; +const sal_uInt8 EXC_ERR_VALUE = 0x0F; +const sal_uInt8 EXC_ERR_REF = 0x17; +const sal_uInt8 EXC_ERR_NAME = 0x1D; +const sal_uInt8 EXC_ERR_NUM = 0x24; +const sal_uInt8 EXC_ERR_NA = 0x2A; + +// Cached values list (EXTERNNAME, ptgArray, ...) ----------------------------- + +const sal_uInt8 EXC_CACHEDVAL_EMPTY = 0x00; +const sal_uInt8 EXC_CACHEDVAL_DOUBLE = 0x01; +const sal_uInt8 EXC_CACHEDVAL_STRING = 0x02; +const sal_uInt8 EXC_CACHEDVAL_BOOL = 0x04; +const sal_uInt8 EXC_CACHEDVAL_ERROR = 0x10; + +// RK values ------------------------------------------------------------------ + +const sal_Int32 EXC_RK_100FLAG = 0x00000001; +const sal_Int32 EXC_RK_INTFLAG = 0x00000002; +const sal_Int32 EXC_RK_VALUEMASK = 0xFFFFFFFC; + +const sal_Int32 EXC_RK_DBL = 0x00000000; +const sal_Int32 EXC_RK_DBL100 = EXC_RK_100FLAG; +const sal_Int32 EXC_RK_INT = EXC_RK_INTFLAG; +const sal_Int32 EXC_RK_INT100 = EXC_RK_100FLAG | EXC_RK_INTFLAG; + +// Measures ------------------------------------------------------------------- + +const sal_Int32 EXC_POINTS_PER_INCH = 72; +const sal_Int32 EXC_TWIPS_PER_INCH = EXC_POINTS_PER_INCH * 20; + +const sal_uInt8 EXC_ORIENT_NONE = 0; /// Text orientation: not rotated. +const sal_uInt8 EXC_ORIENT_STACKED = 1; /// Text orientation: vertically stacked. +const sal_uInt8 EXC_ORIENT_90CCW = 2; /// Text orientation: 90 deg counterclockwise. +const sal_uInt8 EXC_ORIENT_90CW = 3; /// Text orientation: 90 deg clockwise. + +const sal_uInt8 EXC_ROT_NONE = 0; /// Text rotation: not rotated. +const sal_uInt8 EXC_ROT_90CCW = 90; /// Text rotation: 90 deg counterclockwise. +const sal_uInt8 EXC_ROT_90CW = 180; /// Text rotation: 90 deg clockwise. +const sal_uInt8 EXC_ROT_STACKED = 255; /// Text rotation: vertically stacked. + +// Records (ordered by lowest record ID) ====================================== + +// (0x0009, 0x0209, 0x0409, 0x0809) BOF --------------------------------------- + +const sal_uInt16 EXC_ID2_BOF = 0x0009; +const sal_uInt16 EXC_ID3_BOF = 0x0209; +const sal_uInt16 EXC_ID4_BOF = 0x0409; +const sal_uInt16 EXC_ID5_BOF = 0x0809; + +const sal_uInt16 EXC_BOF_BIFF2 = 0x0200; +const sal_uInt16 EXC_BOF_BIFF3 = 0x0300; +const sal_uInt16 EXC_BOF_BIFF4 = 0x0400; +const sal_uInt16 EXC_BOF_BIFF5 = 0x0500; +const sal_uInt16 EXC_BOF_BIFF8 = 0x0600; + +const sal_uInt16 EXC_BOF_GLOBALS = 0x0005; /// BIFF5-BIFF8 workbook globals. +const sal_uInt16 EXC_BOF_VBMODULE = 0x0006; /// BIFF5-BIFF8 Visual BASIC module. +const sal_uInt16 EXC_BOF_SHEET = 0x0010; /// Regular worksheet. +const sal_uInt16 EXC_BOF_CHART = 0x0020; /// Chart sheet. +const sal_uInt16 EXC_BOF_MACROSHEET = 0x0040; /// Macro sheet. +const sal_uInt16 EXC_BOF_WORKSPACE = 0x0100; /// Workspace. +const sal_uInt16 EXC_BOF_UNKNOWN = 0xFFFF; /// Internal use only. + +// (0x000A) EOF --------------------------------------------------------------- + +const sal_uInt16 EXC_ID_EOF = 0x000A; + +// (0x0012) PROTECT ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_PROTECT = 0x0012; + +// (0x0013) PASSWORD ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_PASSWORD = 0x0013; + +// (0x0019) WINDOWPROTECT ----------------------------------------------------- + +const sal_uInt16 EXC_ID_WINDOWPROTECT = 0x0019; + +// (0x0042) CODEPAGE ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_CODEPAGE = 0x0042; + +// (0x0081) WSBOOL ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_WSBOOL = 0x0081; + +const sal_uInt16 EXC_WSBOOL_ROWBELOW = 0x0040; +const sal_uInt16 EXC_WSBOOL_COLBELOW = 0x0080; +const sal_uInt16 EXC_WSBOOL_FITTOPAGE = 0x0100; + +const sal_uInt16 EXC_WSBOOL_DEFAULTFLAGS = 0x04C1; + +// (0x0086) WRITEPROT --------------------------------------------------------- + +const sal_uInt16 EXC_ID_WRITEPROT = 0x0086; + +// (0x008C) COUNTRY ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_COUNTRY = 0x008C; + +// (0x009B) FILTERMODE -------------------------------------------------------- + +const sal_uInt16 EXC_ID_FILTERMODE = 0x009B; + +// (0x009C) FNGROUPCOUNT ------------------------------------------------------ + +const sal_uInt16 EXC_ID_FNGROUPCOUNT = 0x009C; + +// (0x009D) AUTOFILTERINFO ---------------------------------------------------- + +const sal_uInt16 EXC_ID_AUTOFILTERINFO = 0x009D; + +// (0x009E) AUTOFILTER -------------------------------------------------------- + +const sal_uInt16 EXC_ID_AUTOFILTER = 0x009E; + +// (0x00BF, 0x00C0, 0x00C1) TOOLBARHDR, TOOLBAREND, MMS ----------------------- + +const sal_uInt16 EXC_ID_TOOLBARHDR = 0x00BF; +const sal_uInt16 EXC_ID_TOOLBAREND = 0x00C0; +const sal_uInt16 EXC_ID_MMS = 0x00C1; + +// (0x00E1, 0x00E2) INTERFACEHDR, INTERFACEEND -------------------------------- + +const sal_uInt16 EXC_ID_INTERFACEHDR = 0x00E1; +const sal_uInt16 EXC_ID_INTERFACEEND = 0x00E2; + +// (0x0160) USESELFS ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_USESELFS = 0x0160; + +// (0x0161) DSF --------------------------------------------------------------- + +const sal_uInt16 EXC_ID_DSF = 0x0161; + +// (0x01AA,0x01AB) USERSVIEWBEGIN, USERSVIEWEND ------------------------------- + +const sal_uInt16 EXC_ID_USERSVIEWBEGIN = 0x01AA; +const sal_uInt16 EXC_ID_USERSVIEWEND = 0x01AB; + +// (0x01BA) CODENAME ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_CODENAME = 0x01BA; + +// (0x01C0) XL9FILE ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_XL9FILE = 0x01C0; + +// (0x8xx) Future records ----------------------------------------------------- + +/** Enumerates different header types of future records. */ +enum XclFutureRecType +{ + EXC_FUTUREREC_SIMPLE, /// Record identifier and empty flags field. + EXC_FUTUREREC_UNUSEDREF /// Record identifier, empty flags field, unused range address. +}; + +const sal_uInt16 EXC_FUTUREREC_EMPTYFLAGS = 0x0000; +const sal_uInt16 EXC_FUTUREREC_HASREF = 0x0001; +const sal_uInt16 EXC_FUTUREREC_ALERT = 0x0002; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlcontent.hxx b/sc/source/filter/inc/xlcontent.hxx new file mode 100644 index 000000000000..41e916472e70 --- /dev/null +++ b/sc/source/filter/inc/xlcontent.hxx @@ -0,0 +1,194 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLCONTENT_HXX +#define SC_XLCONTENT_HXX + +#include <sal/types.h> + +// Constants ================================================================== + +// (0x005B) FILESHARING ------------------------------------------------------- + +const sal_uInt16 EXC_ID_FILESHARING = 0x005B; + +// (0x00E5) MERGEDCELLS ------------------------------------------------------- + +const sal_uInt16 EXC_ID_MERGEDCELLS = 0x00E5; +const sal_uInt16 EXC_MERGEDCELLS_MAXCOUNT = 1027; + +// (0x002F) FILEPASS ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_FILEPASS = 0x002F; + +const sal_uInt16 EXC_FILEPASS_BIFF5 = 0x0000; +const sal_uInt16 EXC_FILEPASS_BIFF8 = 0x0001; +const sal_uInt16 EXC_FILEPASS_BIFF8_STD = 0x0001; +const sal_uInt16 EXC_FILEPASS_BIFF8_STRONG = 0x0002; + +// (0x00FC, 0x00FF) SST, EXTSST ----------------------------------------------- + +const sal_uInt16 EXC_ID_SST = 0x00FC; +const sal_uInt16 EXC_ID_EXTSST = 0x00FF; + +// (0x015F) LABELRANGES ------------------------------------------------------- + +const sal_uInt16 EXC_ID_LABELRANGES = 0x015F; + +// (0x01B0) CONDFMT, (0x01B1) CF ---------------------------------------------- + +const sal_uInt16 EXC_ID_CONDFMT = 0x01B0; +const sal_uInt16 EXC_ID_CF = 0x01B1; + +const sal_uInt8 EXC_CF_TYPE_NONE = 0x00; +const sal_uInt8 EXC_CF_TYPE_CELL = 0x01; +const sal_uInt8 EXC_CF_TYPE_FMLA = 0x02; + +const sal_uInt8 EXC_CF_CMP_NONE = 0x00; +const sal_uInt8 EXC_CF_CMP_BETWEEN = 0x01; +const sal_uInt8 EXC_CF_CMP_NOT_BETWEEN = 0x02; +const sal_uInt8 EXC_CF_CMP_EQUAL = 0x03; +const sal_uInt8 EXC_CF_CMP_NOT_EQUAL = 0x04; +const sal_uInt8 EXC_CF_CMP_GREATER = 0x05; +const sal_uInt8 EXC_CF_CMP_LESS = 0x06; +const sal_uInt8 EXC_CF_CMP_GREATER_EQUAL = 0x07; +const sal_uInt8 EXC_CF_CMP_LESS_EQUAL = 0x08; + +const sal_uInt32 EXC_CF_BORDER_LEFT = 0x00000400; /// Left border line modified? +const sal_uInt32 EXC_CF_BORDER_RIGHT = 0x00000800; /// Right border line modified? +const sal_uInt32 EXC_CF_BORDER_TOP = 0x00001000; /// Top border line modified? +const sal_uInt32 EXC_CF_BORDER_BOTTOM = 0x00002000; /// Bottom border line modified? +const sal_uInt32 EXC_CF_BORDER_ALL = 0x00003C00; /// Any border line modified? +const sal_uInt32 EXC_CF_AREA_PATTERN = 0x00010000; /// Pattern modified? +const sal_uInt32 EXC_CF_AREA_FGCOLOR = 0x00020000; /// Foreground color modified? +const sal_uInt32 EXC_CF_AREA_BGCOLOR = 0x00040000; /// Background color modified? +const sal_uInt32 EXC_CF_AREA_ALL = 0x00070000; /// Any area attribute modified? +const sal_uInt32 EXC_CF_ALLDEFAULT = 0x003FFFFF; /// Default flags. +const sal_uInt32 EXC_CF_BLOCK_FONT = 0x04000000; /// Font block present? +const sal_uInt32 EXC_CF_BLOCK_BORDER = 0x10000000; /// Border block present? +const sal_uInt32 EXC_CF_BLOCK_AREA = 0x20000000; /// Pattern block present? + +const sal_uInt32 EXC_CF_FONT_STYLE = 0x00000002; /// Font posture or weight modified? +const sal_uInt32 EXC_CF_FONT_STRIKEOUT = 0x00000080; /// Font cancellation modified? +const sal_uInt32 EXC_CF_FONT_ALLDEFAULT = 0x0000009A; /// Default flags. + +const sal_uInt32 EXC_CF_FONT_UNDERL = 0x00000001; /// Font underline type modified? +const sal_uInt32 EXC_CF_FONT_ESCAPEM = 0x00000001; /// Font escapement type modified? + +// (0x01B2) DVAL -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_DVAL = 0x01B2; +const sal_uInt32 EXC_DVAL_NOOBJ = 0xFFFFFFFF; + +// (0x01BE) DV ---------------------------------------------------------------- + +const sal_uInt16 EXC_ID_DV = 0x01BE; + +// data validation flags +const sal_uInt32 EXC_DV_STRINGLIST = 0x00000080; +const sal_uInt32 EXC_DV_IGNOREBLANK = 0x00000100; +const sal_uInt32 EXC_DV_SUPPRESSDROPDOWN = 0x00000200; +const sal_uInt32 EXC_DV_SHOWPROMPT = 0x00040000; +const sal_uInt32 EXC_DV_SHOWERROR = 0x00080000; + +// data validation data mode +const sal_uInt32 EXC_DV_MODE_MASK = 0x0000000F; +const sal_uInt32 EXC_DV_MODE_ANY = 0x00000000; +const sal_uInt32 EXC_DV_MODE_WHOLE = 0x00000001; +const sal_uInt32 EXC_DV_MODE_DECIMAL = 0x00000002; +const sal_uInt32 EXC_DV_MODE_LIST = 0x00000003; +const sal_uInt32 EXC_DV_MODE_DATE = 0x00000004; +const sal_uInt32 EXC_DV_MODE_TIME = 0x00000005; +const sal_uInt32 EXC_DV_MODE_TEXTLEN = 0x00000006; +const sal_uInt32 EXC_DV_MODE_CUSTOM = 0x00000007; + +// data validation conditions +const sal_uInt32 EXC_DV_COND_MASK = 0x00F00000; +const sal_uInt32 EXC_DV_COND_BETWEEN = 0x00000000; +const sal_uInt32 EXC_DV_COND_NOTBETWEEN = 0x00100000; +const sal_uInt32 EXC_DV_COND_EQUAL = 0x00200000; +const sal_uInt32 EXC_DV_COND_NOTEQUAL = 0x00300000; +const sal_uInt32 EXC_DV_COND_GREATER = 0x00400000; +const sal_uInt32 EXC_DV_COND_LESS = 0x00500000; +const sal_uInt32 EXC_DV_COND_EQGREATER = 0x00600000; +const sal_uInt32 EXC_DV_COND_EQLESS = 0x00700000; + +// data validation error style +const sal_uInt32 EXC_DV_ERROR_MASK = 0x00000070; +const sal_uInt32 EXC_DV_ERROR_STOP = 0x00000000; +const sal_uInt32 EXC_DV_ERROR_WARNING = 0x00000010; +const sal_uInt32 EXC_DV_ERROR_INFO = 0x00000020; + +// (0x01B8) HLINK ------------------------------------------------------------- + +const sal_uInt16 EXC_ID_HLINK = 0x01B8; + +const sal_uInt32 EXC_HLINK_BODY = 0x00000001; /// Contains file link or URL. +const sal_uInt32 EXC_HLINK_ABS = 0x00000002; /// Absolute path. +const sal_uInt32 EXC_HLINK_DESCR = 0x00000014; /// Description. +const sal_uInt32 EXC_HLINK_MARK = 0x00000008; /// Text mark. +const sal_uInt32 EXC_HLINK_FRAME = 0x00000080; /// Target frame. +const sal_uInt32 EXC_HLINK_UNC = 0x00000100; /// UNC path. + +// web queries ================================================================ + +#define EXC_WEBQRY_FILTER "calc_HTML_WebQuery" + +// (0x00CD) WQSTRING +const sal_uInt16 EXC_ID_WQSTRING = 0x00CD; + +// (0x00DC) PARAMQRY +const sal_uInt16 EXC_ID_PQRY = 0x00DC; +const sal_uInt16 EXC_PQRYTYPE_ODBC = 1; /// Source type: ODBC. +const sal_uInt16 EXC_PQRYTYPE_WEBQUERY = 4; /// Source type: webquery. +const sal_uInt16 EXC_PQRY_ODBC = 0x0008; /// ODBC connection. +const sal_uInt16 EXC_PQRY_WEBQUERY = 0x0040; /// Web query. +const sal_uInt16 EXC_PQRY_TABLES = 0x0100; /// All tables. + +// (0x01AD) QSI +const sal_uInt16 EXC_ID_QSI = 0x01AD; +const sal_uInt16 EXC_QSI_DEFAULTFLAGS = 0x0349; /// Flags for export. + +// (0x0802) unknown record +const sal_uInt16 EXC_ID_0802 = 0x0802; + +// (0x0803) WEBQRYSETTINGS +const sal_uInt16 EXC_ID_WQSETT = 0x0803; +const sal_uInt16 EXC_WQSETT_ALL = 0x0000; /// All tables or entire document. +const sal_uInt16 EXC_WQSETT_SPECTABLES = 0x0002; /// Specific tables. +const sal_uInt16 EXC_WQSETT_DEFAULTFLAGS = 0x0023; /// Flags for export. +const sal_uInt16 EXC_WQSETT_NOFORMAT = 0x0001; +const sal_uInt16 EXC_WQSETT_FORMATRTF = 0x0002; +const sal_uInt16 EXC_WQSETT_FORMATFULL = 0x0003; + +// (0x0804) WEBQRYTABLES +const sal_uInt16 EXC_ID_WQTABLES = 0x0804; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlescher.hxx b/sc/source/filter/inc/xlescher.hxx new file mode 100644 index 000000000000..921da6b8741b --- /dev/null +++ b/sc/source/filter/inc/xlescher.hxx @@ -0,0 +1,450 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLESCHER_HXX +#define SC_XLESCHER_HXX + +#include <tools/gen.hxx> +#include <vcl/mapunit.hxx> +#include "fapihelper.hxx" +#include "xladdress.hxx" +#include "xlstyle.hxx" + +namespace com { namespace sun { namespace star { + namespace drawing { class XShape; } + namespace awt { class XControlModel; } + namespace script { struct ScriptEventDescriptor; } +} } } + +class SdrObject; +class Rectangle; +class ScDocument; +class SvStream; +class XclImpStream; +class XclExpStream; + +// Constants and Enumerations ================================================= + +// (0x001C) NOTE -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_NOTE = 0x001C; +const sal_uInt16 EXC_NOTE_VISIBLE = 0x0002; +const sal_uInt16 EXC_NOTE5_MAXLEN = 2048; + +// (0x005D) OBJ --------------------------------------------------------------- + +const sal_uInt16 EXC_ID_OBJ = 0x005D; + +const sal_uInt16 EXC_OBJ_INVALID_ID = 0; + +// object types +const sal_uInt16 EXC_OBJTYPE_GROUP = 0; +const sal_uInt16 EXC_OBJTYPE_LINE = 1; +const sal_uInt16 EXC_OBJTYPE_RECTANGLE = 2; +const sal_uInt16 EXC_OBJTYPE_OVAL = 3; +const sal_uInt16 EXC_OBJTYPE_ARC = 4; +const sal_uInt16 EXC_OBJTYPE_CHART = 5; +const sal_uInt16 EXC_OBJTYPE_TEXT = 6; +const sal_uInt16 EXC_OBJTYPE_BUTTON = 7; +const sal_uInt16 EXC_OBJTYPE_PICTURE = 8; +const sal_uInt16 EXC_OBJTYPE_POLYGON = 9; // new in BIFF4 +const sal_uInt16 EXC_OBJTYPE_CHECKBOX = 11; // new in BIFF5 +const sal_uInt16 EXC_OBJTYPE_OPTIONBUTTON = 12; +const sal_uInt16 EXC_OBJTYPE_EDIT = 13; +const sal_uInt16 EXC_OBJTYPE_LABEL = 14; +const sal_uInt16 EXC_OBJTYPE_DIALOG = 15; +const sal_uInt16 EXC_OBJTYPE_SPIN = 16; +const sal_uInt16 EXC_OBJTYPE_SCROLLBAR = 17; +const sal_uInt16 EXC_OBJTYPE_LISTBOX = 18; +const sal_uInt16 EXC_OBJTYPE_GROUPBOX = 19; +const sal_uInt16 EXC_OBJTYPE_DROPDOWN = 20; +const sal_uInt16 EXC_OBJTYPE_NOTE = 25; // new in BIFF8 +const sal_uInt16 EXC_OBJTYPE_DRAWING = 30; +const sal_uInt16 EXC_OBJTYPE_UNKNOWN = 0xFFFF; /// For internal use only. + +// BIFF3-BIFF5 flags +const sal_uInt16 EXC_OBJ_HIDDEN = 0x0100; +const sal_uInt16 EXC_OBJ_VISIBLE = 0x0200; +const sal_uInt16 EXC_OBJ_PRINTABLE = 0x0400; + +// BIFF5 line formatting +const sal_uInt8 EXC_OBJ_LINE_AUTOCOLOR = 64; + +const sal_uInt8 EXC_OBJ_LINE_SOLID = 0; +const sal_uInt8 EXC_OBJ_LINE_DASH = 1; +const sal_uInt8 EXC_OBJ_LINE_DOT = 2; +const sal_uInt8 EXC_OBJ_LINE_DASHDOT = 3; +const sal_uInt8 EXC_OBJ_LINE_DASHDOTDOT = 4; +const sal_uInt8 EXC_OBJ_LINE_MEDTRANS = 5; +const sal_uInt8 EXC_OBJ_LINE_DARKTRANS = 6; +const sal_uInt8 EXC_OBJ_LINE_LIGHTTRANS = 7; +const sal_uInt8 EXC_OBJ_LINE_NONE = 255; + +const sal_uInt8 EXC_OBJ_LINE_HAIR = 0; +const sal_uInt8 EXC_OBJ_LINE_THIN = 1; +const sal_uInt8 EXC_OBJ_LINE_MEDIUM = 2; +const sal_uInt8 EXC_OBJ_LINE_THICK = 3; + +const sal_uInt8 EXC_OBJ_LINE_AUTO = 0x01; + +const sal_uInt8 EXC_OBJ_ARROW_NONE = 0; +const sal_uInt8 EXC_OBJ_ARROW_OPEN = 1; +const sal_uInt8 EXC_OBJ_ARROW_FILLED = 2; +const sal_uInt8 EXC_OBJ_ARROW_OPENBOTH = 3; +const sal_uInt8 EXC_OBJ_ARROW_FILLEDBOTH = 4; + +const sal_uInt8 EXC_OBJ_ARROW_NARROW = 0; +const sal_uInt8 EXC_OBJ_ARROW_MEDIUM = 1; +const sal_uInt8 EXC_OBJ_ARROW_WIDE = 2; + +const sal_uInt8 EXC_OBJ_LINE_TL = 0; +const sal_uInt8 EXC_OBJ_LINE_TR = 1; +const sal_uInt8 EXC_OBJ_LINE_BR = 2; +const sal_uInt8 EXC_OBJ_LINE_BL = 3; + +// BIFF5 fill formatting +const sal_uInt8 EXC_OBJ_FILL_AUTOCOLOR = 65; + +const sal_uInt8 EXC_OBJ_FILL_AUTO = 0x01; + +// BIFF5 frame formatting +const sal_uInt16 EXC_OBJ_FRAME_SHADOW = 0x0002; + +// BIFF5 text objects +const sal_uInt8 EXC_OBJ_HOR_LEFT = 1; +const sal_uInt8 EXC_OBJ_HOR_CENTER = 2; +const sal_uInt8 EXC_OBJ_HOR_RIGHT = 3; +const sal_uInt8 EXC_OBJ_HOR_JUSTIFY = 4; + +const sal_uInt8 EXC_OBJ_VER_TOP = 1; +const sal_uInt8 EXC_OBJ_VER_CENTER = 2; +const sal_uInt8 EXC_OBJ_VER_BOTTOM = 3; +const sal_uInt8 EXC_OBJ_VER_JUSTIFY = 4; + +const sal_uInt16 EXC_OBJ_ORIENT_NONE = 0; +const sal_uInt16 EXC_OBJ_ORIENT_STACKED = 1; /// Stacked top to bottom. +const sal_uInt16 EXC_OBJ_ORIENT_90CCW = 2; /// 90 degr. counterclockwise. +const sal_uInt16 EXC_OBJ_ORIENT_90CW = 3; /// 90 degr. clockwise. + +const sal_uInt16 EXC_OBJ_TEXT_AUTOSIZE = 0x0080; +const sal_uInt16 EXC_OBJ_TEXT_LOCKED = 0x0200; + +const sal_Int32 EXC_OBJ_TEXT_MARGIN = 20000; /// Automatic text margin (EMUs). + +// BIFF5 arc objects +const sal_uInt8 EXC_OBJ_ARC_TR = 0; +const sal_uInt8 EXC_OBJ_ARC_TL = 1; +const sal_uInt8 EXC_OBJ_ARC_BL = 2; +const sal_uInt8 EXC_OBJ_ARC_BR = 3; + +// BIFF5 polygon objects +const sal_uInt16 EXC_OBJ_POLY_CLOSED = 0x0100; + +// BIFF5 pictures/OLE objects +const sal_uInt16 EXC_OBJ_PIC_MANUALSIZE = 0x0001; +const sal_uInt16 EXC_OBJ_PIC_DDE = 0x0002; +const sal_uInt16 EXC_OBJ_PIC_SYMBOL = 0x0008; +const sal_uInt16 EXC_OBJ_PIC_CONTROL = 0x0010; /// Form control (BIFF8). +const sal_uInt16 EXC_OBJ_PIC_CTLSSTREAM = 0x0020; /// Data in Ctls stream (BIFF8). +const sal_uInt16 EXC_OBJ_PIC_AUTOLOAD = 0x0200; /// Auto-load form control (BIFF8). + +// BIFF5 button objects +const sal_uInt16 EXC_OBJ_BUTTON_DEFAULT = 0x0001; +const sal_uInt16 EXC_OBJ_BUTTON_HELP = 0x0002; +const sal_uInt16 EXC_OBJ_BUTTON_CANCEL = 0x0004; +const sal_uInt16 EXC_OBJ_BUTTON_CLOSE = 0x0008; + +// BIFF5 checkboxs, radio buttons +const sal_uInt16 EXC_OBJ_CHECKBOX_UNCHECKED = 0; +const sal_uInt16 EXC_OBJ_CHECKBOX_CHECKED = 1; +const sal_uInt16 EXC_OBJ_CHECKBOX_TRISTATE = 2; +const sal_uInt16 EXC_OBJ_CHECKBOX_FLAT = 0x0001; + +// BIFF5 editbox objects +const sal_uInt16 EXC_OBJ_EDIT_TEXT = 0; +const sal_uInt16 EXC_OBJ_EDIT_INTEGER = 1; +const sal_uInt16 EXC_OBJ_EDIT_DOUBLE = 2; +const sal_uInt16 EXC_OBJ_EDIT_REFERENCE = 3; +const sal_uInt16 EXC_OBJ_EDIT_FORMULA = 4; + +// BIFF5 scrollbars/spinbuttons +const sal_uInt16 EXC_OBJ_SCROLLBAR_MIN = 0; +const sal_uInt16 EXC_OBJ_SCROLLBAR_MAX = 30000; + +const sal_uInt16 EXC_OBJ_SCROLLBAR_HOR = 0x0001; + +const sal_uInt16 EXC_OBJ_SCROLLBAR_DEFFLAGS = 0x0001; +const sal_uInt16 EXC_OBJ_SCROLLBAR_FLAT = 0x0008; + +// BIFF5 listboxes/dropdowns +const sal_uInt8 EXC_OBJ_LISTBOX_SINGLE = 0; /// Single selection. +const sal_uInt8 EXC_OBJ_LISTBOX_MULTI = 1; /// Multi selection. +const sal_uInt8 EXC_OBJ_LISTBOX_RANGE = 2; /// Range selection. + +const sal_uInt16 EXC_OBJ_LISTBOX_EDIT = 0x0002; +const sal_uInt16 EXC_OBJ_LISTBOX_FLAT = 0x0008; + +// BIFF5 dropdown listboxes +const sal_uInt16 EXC_OBJ_DROPDOWN_LISTBOX = 0; /// Listbox, text not editable. +const sal_uInt16 EXC_OBJ_DROPDOWN_COMBOBOX = 1; /// Dropdown listbox with editable text. +const sal_uInt16 EXC_OBJ_DROPDOWN_SIMPLE = 2; /// Dropdown button only, no text area. +const sal_uInt16 EXC_OBJ_DROPDOWN_MAX = 3; +const sal_uInt16 EXC_OBJ_DROPDOWN_FILTERED = 0x0008; /// Drowdown style: filtered. + +// BIFF5 groupboxes +const sal_uInt16 EXC_OBJ_GROUPBOX_FLAT = 0x0001; + +// BIFF8 sub records +const sal_uInt16 EXC_ID_OBJEND = 0x0000; /// End of OBJ. +const sal_uInt16 EXC_ID_OBJMACRO = 0x0004; /// Macro link. +const sal_uInt16 EXC_ID_OBJBUTTON = 0x0005; /// Button data. +const sal_uInt16 EXC_ID_OBJGMO = 0x0006; /// Group marker. +const sal_uInt16 EXC_ID_OBJCF = 0x0007; /// Clipboard format. +const sal_uInt16 EXC_ID_OBJFLAGS = 0x0008; /// Option flags. +const sal_uInt16 EXC_ID_OBJPICTFMLA = 0x0009; /// OLE link formula. +const sal_uInt16 EXC_ID_OBJCBLS = 0x000A; /// Check box/radio button data. +const sal_uInt16 EXC_ID_OBJRBO = 0x000B; /// Radio button group data. +const sal_uInt16 EXC_ID_OBJSBS = 0x000C; /// Scroll bar data. +const sal_uInt16 EXC_ID_OBJNTS = 0x000D; /// Note data. +const sal_uInt16 EXC_ID_OBJSBSFMLA = 0x000E; /// Scroll bar/list box/combo box cell link. +const sal_uInt16 EXC_ID_OBJGBODATA = 0x000F; /// Group box data. +const sal_uInt16 EXC_ID_OBJEDODATA = 0x0010; /// Edit box data. +const sal_uInt16 EXC_ID_OBJRBODATA = 0x0011; /// Radio button group data. +const sal_uInt16 EXC_ID_OBJCBLSDATA = 0x0012; /// Check box/radio button data. +const sal_uInt16 EXC_ID_OBJLBSDATA = 0x0013; /// List box/combo box data. +const sal_uInt16 EXC_ID_OBJCBLSFMLA = 0x0014; /// Check box/radio button cell link. +const sal_uInt16 EXC_ID_OBJCMO = 0x0015; /// Common object settings. +const sal_uInt16 EXC_ID_OBJUNKNOWN = 0xFFFF; /// For internal use only. + +// BIFF8 OBJCMO: flags +const sal_uInt16 EXC_OBJCMO_PRINTABLE = 0x0010; /// Object printable. +const sal_uInt16 EXC_OBJCMO_AUTOLINE = 0x2000; /// Automatic line formatting. +const sal_uInt16 EXC_OBJCMO_AUTOFILL = 0x4000; /// Automatic fill formatting. + +/** Value binding mode for cells linked to form controls. */ +enum XclCtrlBindMode +{ + EXC_CTRL_BINDCONTENT, /// Binds cell to content of control. + EXC_CTRL_BINDPOSITION /// Binds cell to position in control (e.g. listbox selection index). +}; + +// (0x007F) IMGDATA ----------------------------------------------------------- + +const sal_uInt16 EXC_ID3_IMGDATA = 0x007F; +const sal_uInt16 EXC_ID8_IMGDATA = 0x00E9; + +const sal_uInt16 EXC_IMGDATA_WMF = 2; +const sal_uInt16 EXC_IMGDATA_BMP = 9; + +const sal_uInt16 EXC_IMGDATA_WIN = 1; +const sal_uInt16 EXC_IMGDATA_MAC = 2; + +const sal_uInt32 EXC_IMGDATA_MAXREC8 = 0x201C; +const sal_uInt32 EXC_IMGDATA_MAXCONT8 = 0x2014; + +// (0x00A9) COORDLIST --------------------------------------------------------- + +const sal_uInt16 EXC_ID_COORDLIST = 0x00A9; + +// (0x00EB) MSODRAWINGGROUP --------------------------------------------------- + +const sal_uInt16 EXC_ID_MSODRAWINGGROUP = 0x00EB; + +// (0x00EC) MSODRAWING -------------------------------------------------------- + +const sal_uInt16 EXC_ID_MSODRAWING = 0x00EC; + +// additional flags not extant in svx headers +const sal_uInt16 EXC_ESC_ANCHOR_POSLOCKED = 0x0001; +const sal_uInt16 EXC_ESC_ANCHOR_SIZELOCKED = 0x0002; +const sal_uInt16 EXC_ESC_ANCHOR_LOCKED = EXC_ESC_ANCHOR_POSLOCKED|EXC_ESC_ANCHOR_SIZELOCKED; + +// (0x00ED) MSODRAWINGSELECTION ----------------------------------------------- + +const sal_uInt16 EXC_ID_MSODRAWINGSEL = 0x00ED; + +// (0x01B6) TXO --------------------------------------------------------------- + +const sal_uInt16 EXC_ID_TXO = 0x01B6; + +// TXO constants are eqzal to BIFF5 OBJ text object flags + +// Structs and classes ======================================================== + +/** Identifies a drawing object by sheet index and object identifier. */ +struct XclObjId +{ + SCTAB mnScTab; /// Calc sheet index. + sal_uInt16 mnObjId; /// Excel object identifier. + + explicit XclObjId(); + explicit XclObjId( SCTAB nScTab, sal_uInt16 nObjId ); +}; + +bool operator==( const XclObjId& rL, const XclObjId& rR ); +bool operator<( const XclObjId& rL, const XclObjId& rR ); + +// ---------------------------------------------------------------------------- + +/** Represents the position (anchor) of an object in a Calc document. */ +struct XclObjAnchor : public XclRange +{ + sal_uInt16 mnLX; /// X offset in left column (1/1024 of column width). + sal_uInt16 mnTY; /// Y offset in top row (1/256 of row height). + sal_uInt16 mnRX; /// X offset in right column (1/1024 of column width). + sal_uInt16 mnBY; /// Y offset in bottom row (1/256 of row height). + + explicit XclObjAnchor(); + + /** Calculates a rectangle from the contained coordinates. */ + Rectangle GetRect( const XclRoot& rRoot, SCTAB nScTab, MapUnit eMapUnit ) const; + /** Initializes the anchor coordinates for a sheet. */ + void SetRect( const XclRoot& rRoot, SCTAB nScTab, const Rectangle& rRect, MapUnit eMapUnit ); + + /** Initializes the anchor coordinates for an embedded draw page. */ + void SetRect( const Size& rPageSize, sal_Int32 nScaleX, sal_Int32 nScaleY, + const Rectangle& rRect, MapUnit eMapUnit, bool bDffAnchor ); +}; + +template< typename StreamType > +StreamType& operator>>( StreamType& rStrm, XclObjAnchor& rAnchor ) +{ + return rStrm + >> rAnchor.maFirst.mnCol >> rAnchor.mnLX + >> rAnchor.maFirst.mnRow >> rAnchor.mnTY + >> rAnchor.maLast.mnCol >> rAnchor.mnRX + >> rAnchor.maLast.mnRow >> rAnchor.mnBY; +} + +template< typename StreamType > +StreamType& operator<<( StreamType& rStrm, const XclObjAnchor& rAnchor ) +{ + return rStrm + << rAnchor.maFirst.mnCol << rAnchor.mnLX + << rAnchor.maFirst.mnRow << rAnchor.mnTY + << rAnchor.maLast.mnCol << rAnchor.mnRX + << rAnchor.maLast.mnRow << rAnchor.mnBY; +} + +// ---------------------------------------------------------------------------- + +struct XclObjLineData +{ + sal_uInt8 mnColorIdx; + sal_uInt8 mnStyle; + sal_uInt8 mnWidth; + sal_uInt8 mnAuto; + + explicit XclObjLineData(); + + inline bool IsAuto() const { return ::get_flag( mnAuto, EXC_OBJ_LINE_AUTO ); } + inline bool IsVisible() const { return IsAuto() || (mnStyle != EXC_OBJ_LINE_NONE); } +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclObjLineData& rLineData ); + +// ---------------------------------------------------------------------------- + +struct XclObjFillData +{ + sal_uInt8 mnBackColorIdx; + sal_uInt8 mnPattColorIdx; + sal_uInt8 mnPattern; + sal_uInt8 mnAuto; + + explicit XclObjFillData(); + + inline bool IsAuto() const { return ::get_flag( mnAuto, EXC_OBJ_FILL_AUTO ); } + inline bool IsFilled() const { return IsAuto() || (mnPattern != EXC_PATT_NONE); } +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclObjFillData& rFillData ); + +// ---------------------------------------------------------------------------- + +struct XclObjTextData +{ + sal_uInt16 mnTextLen; + sal_uInt16 mnFormatSize; + sal_uInt16 mnLinkSize; + sal_uInt16 mnDefFontIdx; + sal_uInt16 mnFlags; + sal_uInt16 mnOrient; + sal_uInt16 mnButtonFlags; + sal_uInt16 mnShortcut; + sal_uInt16 mnShortcutEA; + + explicit XclObjTextData(); + + /** Reads text data from a BIFF3/BIFF4 OBJ record. */ + void ReadObj3( XclImpStream& rStrm ); + /** Reads text data from a BIFF5 OBJ record. */ + void ReadObj5( XclImpStream& rStrm ); + /** Reads text data from a BIFF8 TXO record. */ + void ReadTxo8( XclImpStream& rStrm ); + + inline sal_uInt8 GetHorAlign() const { return ::extract_value< sal_uInt8 >( mnFlags, 1, 3 ); } + inline sal_uInt8 GetVerAlign() const { return ::extract_value< sal_uInt8 >( mnFlags, 4, 3 ); } +}; + +// ============================================================================ + +enum XclTbxEventType +{ + EXC_TBX_EVENT_ACTION, /// XActionListener.actionPerformed + EXC_TBX_EVENT_MOUSE, /// XMouseListener.mouseReleased + EXC_TBX_EVENT_TEXT, /// XTextListener.textChanged + EXC_TBX_EVENT_VALUE, /// XAdjustmentListener.adjustmentValueChanged + EXC_TBX_EVENT_CHANGE /// XChangeListener.changed +}; + +// ---------------------------------------------------------------------------- + +/** Provides static helper functions for form controls. */ +class XclControlHelper +{ +public: + /** Returns the API control model from the passed API shape object. */ + static ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > + GetControlModel( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + + /** Fills the macro descriptor according to the passed macro name. */ + static bool FillMacroDescriptor( + ::com::sun::star::script::ScriptEventDescriptor& rDescriptor, + XclTbxEventType eEventType, + const String& rXclMacroName, + SfxObjectShell* pDocShell = 0 ); + /** Tries to extract an Excel macro name from the passed macro descriptor. */ + static String ExtractFromMacroDescriptor( + const ::com::sun::star::script::ScriptEventDescriptor& rDescriptor, + XclTbxEventType eEventType ); +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlformula.hxx b/sc/source/filter/inc/xlformula.hxx new file mode 100644 index 000000000000..83bab2acd24a --- /dev/null +++ b/sc/source/filter/inc/xlformula.hxx @@ -0,0 +1,569 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLFORMULA_HXX +#define SC_XLFORMULA_HXX + +#include <map> +#include <formula/opcode.hxx> +#include "address.hxx" +#include "ftools.hxx" + +// Constants ================================================================== + +const size_t EXC_TOKARR_MAXLEN = 4096; /// Maximum size of a token array. + +// Token class flags ---------------------------------------------------------- + +const sal_uInt8 EXC_TOKCLASS_MASK = 0x60; +const sal_uInt8 EXC_TOKCLASS_NONE = 0x00; /// 00-1F: Base tokens. +const sal_uInt8 EXC_TOKCLASS_REF = 0x20; /// 20-3F: Reference class tokens. +const sal_uInt8 EXC_TOKCLASS_VAL = 0x40; /// 40-5F: Value class tokens. +const sal_uInt8 EXC_TOKCLASS_ARR = 0x60; /// 60-7F: Array class tokens. + +// Base tokens ---------------------------------------------------------------- + +const sal_uInt8 EXC_TOKID_MASK = 0x1F; + +const sal_uInt8 EXC_TOKID_NONE = 0x00; /// Placeholder for invalid token id. +const sal_uInt8 EXC_TOKID_EXP = 0x01; /// Array or shared formula reference. +const sal_uInt8 EXC_TOKID_TBL = 0x02; /// Multiple operation reference. +const sal_uInt8 EXC_TOKID_ADD = 0x03; /// Addition operator. +const sal_uInt8 EXC_TOKID_SUB = 0x04; /// Subtraction operator. +const sal_uInt8 EXC_TOKID_MUL = 0x05; /// Multiplication operator. +const sal_uInt8 EXC_TOKID_DIV = 0x06; /// Division operator. +const sal_uInt8 EXC_TOKID_POWER = 0x07; /// Power operator. +const sal_uInt8 EXC_TOKID_CONCAT = 0x08; /// String concatenation operator. +const sal_uInt8 EXC_TOKID_LT = 0x09; /// Less than operator. +const sal_uInt8 EXC_TOKID_LE = 0x0A; /// Less than or equal operator. +const sal_uInt8 EXC_TOKID_EQ = 0x0B; /// Equal operator. +const sal_uInt8 EXC_TOKID_GE = 0x0C; /// Greater than or equal operator. +const sal_uInt8 EXC_TOKID_GT = 0x0D; /// Greater than operator. +const sal_uInt8 EXC_TOKID_NE = 0x0E; /// Not equal operator. +const sal_uInt8 EXC_TOKID_ISECT = 0x0F; /// Intersection operator. +const sal_uInt8 EXC_TOKID_LIST = 0x10; /// List operator. +const sal_uInt8 EXC_TOKID_RANGE = 0x11; /// Range operator. +const sal_uInt8 EXC_TOKID_UPLUS = 0x12; /// Unary plus. +const sal_uInt8 EXC_TOKID_UMINUS = 0x13; /// Unary minus. +const sal_uInt8 EXC_TOKID_PERCENT = 0x14; /// Percent sign. +const sal_uInt8 EXC_TOKID_PAREN = 0x15; /// Parentheses. +const sal_uInt8 EXC_TOKID_MISSARG = 0x16; /// Missing argument. +const sal_uInt8 EXC_TOKID_STR = 0x17; /// String constant. +const sal_uInt8 EXC_TOKID_NLR = 0x18; /// Natural language reference (NLR). +const sal_uInt8 EXC_TOKID_ATTR = 0x19; /// Special attribute. +const sal_uInt8 EXC_TOKID_SHEET = 0x1A; /// Start of a sheet reference (BIFF2-BIFF4). +const sal_uInt8 EXC_TOKID_ENDSHEET = 0x1B; /// End of a sheet reference (BIFF2-BIFF4). +const sal_uInt8 EXC_TOKID_ERR = 0x1C; /// Error constant. +const sal_uInt8 EXC_TOKID_BOOL = 0x1D; /// Boolean constant. +const sal_uInt8 EXC_TOKID_INT = 0x1E; /// Integer constant. +const sal_uInt8 EXC_TOKID_NUM = 0x1F; /// Floating-point constant. + +// Base IDs of classified tokens ---------------------------------------------- + +const sal_uInt8 EXC_TOKID_ARRAY = 0x00; /// Array constant. +const sal_uInt8 EXC_TOKID_FUNC = 0x01; /// Function, fixed number of arguments. +const sal_uInt8 EXC_TOKID_FUNCVAR = 0x02; /// Function, variable number of arguments. +const sal_uInt8 EXC_TOKID_NAME = 0x03; /// Defined name. +const sal_uInt8 EXC_TOKID_REF = 0x04; /// 2D cell reference. +const sal_uInt8 EXC_TOKID_AREA = 0x05; /// 2D area reference. +const sal_uInt8 EXC_TOKID_MEMAREA = 0x06; /// Constant reference subexpression. +const sal_uInt8 EXC_TOKID_MEMERR = 0x07; /// Deleted reference subexpression. +const sal_uInt8 EXC_TOKID_MEMNOMEM = 0x08; /// Constant reference subexpression without result. +const sal_uInt8 EXC_TOKID_MEMFUNC = 0x09; /// Variable reference subexpression. +const sal_uInt8 EXC_TOKID_REFERR = 0x0A; /// Deleted 2D cell reference. +const sal_uInt8 EXC_TOKID_AREAERR = 0x0B; /// Deleted 2D area reference. +const sal_uInt8 EXC_TOKID_REFN = 0x0C; /// Relative 2D cell reference (in names). +const sal_uInt8 EXC_TOKID_AREAN = 0x0D; /// Relative 2D area reference (in names). +const sal_uInt8 EXC_TOKID_MEMAREAN = 0x0E; /// Reference subexpression (in names). +const sal_uInt8 EXC_TOKID_MEMNOMEMN = 0x0F; /// Reference subexpression (in names) without result. +const sal_uInt8 EXC_TOKID_FUNCCE = 0x18; +const sal_uInt8 EXC_TOKID_NAMEX = 0x19; /// External reference. +const sal_uInt8 EXC_TOKID_REF3D = 0x1A; /// 3D cell reference. +const sal_uInt8 EXC_TOKID_AREA3D = 0x1B; /// 3D area reference. +const sal_uInt8 EXC_TOKID_REFERR3D = 0x1C; /// Deleted 3D cell reference. +const sal_uInt8 EXC_TOKID_AREAERR3D = 0x1D; /// Deleted 3D area reference + +// specific token constants --------------------------------------------------- + +const sal_uInt16 EXC_TOK_STR_MAXLEN = 255; /// Maximum string length of a tStr token. + +const sal_uInt8 EXC_TOK_BOOL_FALSE = 0; /// FALSE value of a tBool token. +const sal_uInt8 EXC_TOK_BOOL_TRUE = 1; /// TRUE value of a tBool token. + +const sal_uInt8 EXC_TOK_ATTR_VOLATILE = 0x01; /// Volatile function. +const sal_uInt8 EXC_TOK_ATTR_IF = 0x02; /// Start of true condition in IF function. +const sal_uInt8 EXC_TOK_ATTR_CHOOSE = 0x04; /// Jump array of CHOOSE function. +const sal_uInt8 EXC_TOK_ATTR_GOTO = 0x08; /// Jump to token. +const sal_uInt8 EXC_TOK_ATTR_SUM = 0x10; /// SUM function with one parameter. +const sal_uInt8 EXC_TOK_ATTR_ASSIGN = 0x20; /// BASIC style assignment. +const sal_uInt8 EXC_TOK_ATTR_SPACE = 0x40; /// Spaces in formula representation. + +const sal_uInt8 EXC_TOK_ATTR_SPACE_SP = 0x00; /// Spaces before next token. +const sal_uInt8 EXC_TOK_ATTR_SPACE_BR = 0x01; /// Line breaks before next token. +const sal_uInt8 EXC_TOK_ATTR_SPACE_SP_OPEN = 0x02; /// Spaces before opening parenthesis. +const sal_uInt8 EXC_TOK_ATTR_SPACE_BR_OPEN = 0x03; /// Line breaks before opening parenthesis. +const sal_uInt8 EXC_TOK_ATTR_SPACE_SP_CLOSE = 0x04; /// Spaces before closing parenthesis. +const sal_uInt8 EXC_TOK_ATTR_SPACE_BR_CLOSE = 0x05; /// Line breaks before closing parenthesis. +const sal_uInt8 EXC_TOK_ATTR_SPACE_SP_PRE = 0x06; /// Spaces before formula (BIFF3). + +const sal_uInt16 EXC_TOK_FUNCVAR_CMD = 0x8000; /// Macro command. +const sal_uInt16 EXC_TOK_FUNCVAR_INDEXMASK = 0x7FFF; /// Mask for function/command index. +const sal_uInt8 EXC_TOK_FUNCVAR_PROMPT = 0x80; /// User prompt for macro commands. +const sal_uInt8 EXC_TOK_FUNCVAR_COUNTMASK = 0x7F; /// Mask for parameter count. + +const sal_uInt16 EXC_TOK_REF_COLREL = 0x4000; /// True = Column is relative. +const sal_uInt16 EXC_TOK_REF_ROWREL = 0x8000; /// True = Row is relative. + +const sal_uInt8 EXC_TOK_NLR_ERR = 0x01; /// NLR: Invalid/deleted. +const sal_uInt8 EXC_TOK_NLR_ROWR = 0x02; /// NLR: Row index. +const sal_uInt8 EXC_TOK_NLR_COLR = 0x03; /// NLR: Column index. +const sal_uInt8 EXC_TOK_NLR_ROWV = 0x06; /// NLR: Value in row. +const sal_uInt8 EXC_TOK_NLR_COLV = 0x07; /// NLR: Value in column. +const sal_uInt8 EXC_TOK_NLR_RANGE = 0x0A; /// NLR: Range. +const sal_uInt8 EXC_TOK_NLR_SRANGE = 0x0B; /// Stacked NLR: Range. +const sal_uInt8 EXC_TOK_NLR_SROWR = 0x0C; /// Stacked NLR: Row index. +const sal_uInt8 EXC_TOK_NLR_SCOLR = 0x0D; /// Stacked NLR: Column index. +const sal_uInt8 EXC_TOK_NLR_SROWV = 0x0E; /// Stacked NLR: Value in row. +const sal_uInt8 EXC_TOK_NLR_SCOLV = 0x0F; /// Stacked NLR: Value in column. +const sal_uInt8 EXC_TOK_NLR_RANGEERR = 0x10; /// NLR: Invalid/deleted range. +const sal_uInt8 EXC_TOK_NLR_SXNAME = 0x1D; /// NLR: Pivot table name. +const sal_uInt16 EXC_TOK_NLR_REL = 0x8000; /// True = Natural language ref is relative. + +const sal_uInt32 EXC_TOK_NLR_ADDREL = 0x80000000; /// NLR relative (in appended data). +const sal_uInt32 EXC_TOK_NLR_ADDMASK = 0x3FFFFFFF; /// Mask for number of appended ranges. + +// ---------------------------------------------------------------------------- + +/** Type of a formula. */ +enum XclFormulaType +{ + EXC_FMLATYPE_CELL, /// Simple cell formula, also used in change tracking. + EXC_FMLATYPE_MATRIX, /// Matrix (array) formula. + EXC_FMLATYPE_SHARED, /// Shared formula. + EXC_FMLATYPE_CONDFMT, /// Conditional format. + EXC_FMLATYPE_DATAVAL, /// Data validation. + EXC_FMLATYPE_NAME, /// Defined name. + EXC_FMLATYPE_CHART, /// Chart source ranges. + EXC_FMLATYPE_CONTROL, /// Spreadsheet links in form controls. + EXC_FMLATYPE_WQUERY, /// Web query source range. + EXC_FMLATYPE_LISTVAL /// List (cell range) validation. +}; + +// Function parameter info ==================================================== + +/** Enumerates validity modes for a function parameter. */ +enum XclFuncParamValidity +{ + EXC_PARAM_NONE = 0, /// Default for an unspecified entry in a C-array. + EXC_PARAM_REGULAR, /// Parameter supported by Calc and Excel. + EXC_PARAM_CALCONLY, /// Parameter supported by Calc only. + EXC_PARAM_EXCELONLY /// Parameter supported by Excel only. +}; + +/** Enumerates different types of token class conversion in function parameters. */ +enum XclFuncParamConv +{ + EXC_PARAMCONV_ORG, /// Use original class of current token. + EXC_PARAMCONV_VAL, /// Convert tokens to VAL class. + EXC_PARAMCONV_ARR, /// Convert tokens to ARR class. + EXC_PARAMCONV_RPT, /// Repeat parent conversion in VALTYPE parameters. + EXC_PARAMCONV_RPX, /// Repeat parent conversion in REFTYPE parameters. + EXC_PARAMCONV_RPO /// Repeat parent conversion in operands of operators. +}; + +/** Structure that contains all needed information for a parameter in a + function. + + The member meValid specifies which application supports the parameter. If + set to CALCONLY, import filters have to insert a default value for this + parameter, and export filters have to skip the parameter. If set to + EXCELONLY, import filters have to skip the parameter, and export filters + have to insert a default value for this parameter. + + The member mbValType specifies whether the parameter requires tokens to be + of value type (VAL or ARR class). + + If set to false, the parameter is called to be REFTYPE. Tokens with REF + default class can be inserted for the parameter (e.g. tAreaR tokens). + + If set to true, the parameter is called to be VALTYPE. Tokens with REF + class need to be converted to VAL tokens first (e.g. tAreaR will be + converted to tAreaV), and further conversion is done according to this + new token class. + + The member meConv specifies how to convert the current token class of the + token inserted for the parameter. If the token class is still REF this + means that the token has default REF class and the parameter is REFTYPE + (see member mbValType), the token will not be converted at all and remains + in REF class. Otherwise, token class conversion is depending on the actual + token class of the return value of the function containing this parameter. + The function may return REF class (tFuncR, tFuncVarR, tFuncCER), or it may + return VAL or ARR class (tFuncV, tFuncA, tFuncVarV, tFuncVarA, tFuncCEV, + tFuncCEA). Even if the function is able to return REF class, it may return + VAL or ARR class instead due to the VALTYPE data type of the parent + function parameter that calls the own function. Example: The INDIRECT + function returns REF class by default. But if called from a VALTYPE + function parameter, e.g. in the formula =ABS(INDIRECT("A1")), it returns + VAL or ARR class instead. Additionally, the repeating conversion types RPT + and RPX rely on the conversion executed for the function token class. + + 1) ORG: + Use the original class of the token (VAL or ARR), regardless of any + conversion done for the function return class. + + 2) VAL: + Convert ARR tokens to VAL class, regardless of any conversion done for + the function return class. + + 3) ARR: + Convert VAL tokens to ARR class, regardless of any conversion done for + the function return class. + + 4) RPT: + If the own function returns REF class (thus it is called from a REFTYPE + parameter, see above), and the parent conversion type (for the function + return class) was ORG, VAL, or ARR, ignore that conversion and always + use VAL conversion for the own token instead. If the parent conversion + type was RPT or RPX, repeat the conversion that would have been used if + the function would return value type. + If the own function returns value type (VAL or ARR class, see above), + and the parent conversion type (for the function return class) was ORG, + VAL, ARR, or RPT, repeat this conversion for the own token. If the + parent conversion type was RPX, always use ORG conversion type for the + own token instead. + + 5) RPX: + This type of conversion only occurs in functions returning VAL class by + default. If the own token is value type, and the VAL return class of + the own function has been changed to ARR class (due to direct ARR + conversion, or due to ARR conversion repeated by RPT or RPX), set the + own token to ARR type. Otherwise use the original token type (VAL + conversion from parent parameter will not be repeated at all). If + nested functions have RPT or value-type RPX parameters, they will not + repeat this conversion type, but will use ORG conversion instead (see + description of RPT above). + + 6) RPO: + This type of conversion is only used for the operands of all operators + (unary and binary arithmetic operators, comparison operators, and range + operators). It is not used for function parameters. On conversion, it + will be replaced by the last conversion type that was not the RPO + conversion. This leads to a slightly different behaviour than the RPT + conversion for operands in conjunction with a parent RPX conversion. + */ +struct XclFuncParamInfo +{ + XclFuncParamValidity meValid; /// Parameter validity. + XclFuncParamConv meConv; /// Token class conversion type. + bool mbValType; /// Data type (false = REFTYPE, true = VALTYPE). +}; + +// Function data ============================================================== + +const sal_uInt8 EXC_FUNC_MAXPARAM = 30; /// Maximum parameter count. + +const size_t EXC_FUNCINFO_PARAMINFO_COUNT = 5; /// Number of parameter info entries. + +const sal_uInt8 EXC_FUNCFLAG_VOLATILE = 0x01; /// Result is volatile (e.g. NOW() function). +const sal_uInt8 EXC_FUNCFLAG_IMPORTONLY = 0x02; /// Only used in import filter. +const sal_uInt8 EXC_FUNCFLAG_EXPORTONLY = 0x04; /// Only used in export filter. + +// selected function IDs +const sal_uInt16 EXC_FUNCID_IF = 1; +const sal_uInt16 EXC_FUNCID_SUM = 4; +const sal_uInt16 EXC_FUNCID_AND = 36; +const sal_uInt16 EXC_FUNCID_OR = 37; +const sal_uInt16 EXC_FUNCID_CHOOSE = 100; +const sal_uInt16 EXC_FUNCID_EXTERNCALL = 255; + +/** Represents information for a spreadsheet function for import and export. + + The member mpParamInfos points to an array of type information structures + for all parameters of the function. The last initialized structure + describing a regular parameter (member meValid == EXC_PARAMVALID_ALWAYS) in + this array is used repeatedly for all following parameters supported by a + function. + */ +struct XclFunctionInfo +{ + OpCode meOpCode; /// Calc function opcode. + sal_uInt16 mnXclFunc; /// Excel function index. + sal_uInt8 mnMinParamCount; /// Minimum number of parameters. + sal_uInt8 mnMaxParamCount; /// Maximum number of parameters. + sal_uInt8 mnRetClass; /// Token class of the return value. + XclFuncParamInfo mpParamInfos[ EXC_FUNCINFO_PARAMINFO_COUNT ]; /// Information for all parameters. + sal_uInt8 mnFlags; /// Additional flags (EXC_FUNCFLAG_* constants). + const sal_Char* mpcMacroName; /// Function name, if simulated by a macro call (UTF-8). + + /** Returns true, if the function is volatile. */ + inline bool IsVolatile() const { return ::get_flag( mnFlags, EXC_FUNCFLAG_VOLATILE ); } + /** Returns true, if the function parameter count is fixed. */ + inline bool IsFixedParamCount() const { return (mnXclFunc != EXC_FUNCID_EXTERNCALL) && (mnMinParamCount == mnMaxParamCount); } + /** Returns true, if the function is simulated by a macro call. */ + inline bool IsMacroFunc() const { return mpcMacroName != 0; } + /** Returns the name of the external function as string. */ + String GetMacroFuncName() const; +}; + +// ---------------------------------------------------------------------------- + +class XclRoot; + +/** Provides access to function info structs for all available functions. */ +class XclFunctionProvider +{ +public: + explicit XclFunctionProvider( const XclRoot& rRoot ); + + /** Returns the function data for an Excel function index, or 0 on error. */ + const XclFunctionInfo* GetFuncInfoFromXclFunc( sal_uInt16 nXclFunc ) const; + /** Returns the function data for an Excel function simulated by a macro call, or 0 on error. */ + const XclFunctionInfo* GetFuncInfoFromXclMacroName( const String& rXclMacroName ) const; + /** Returns the function data for a Calc opcode, or 0 on error. */ + const XclFunctionInfo* GetFuncInfoFromOpCode( OpCode eOpCode ) const; + +private: + void FillXclFuncMap( const XclFunctionInfo* pBeg, const XclFunctionInfo* pEnd ); + void FillScFuncMap( const XclFunctionInfo* pBeg, const XclFunctionInfo* pEnd ); + +private: + typedef ::std::map< sal_uInt16, const XclFunctionInfo* > XclFuncMap; + typedef ::std::map< String, const XclFunctionInfo* > XclMacroNameMap; + typedef ::std::map< OpCode, const XclFunctionInfo* > ScFuncMap; + + XclFuncMap maXclFuncMap; /// Maps Excel function indexes to function data. + XclMacroNameMap maXclMacroNameMap; /// Maps macro function names to function data. + ScFuncMap maScFuncMap; /// Maps Calc opcodes to function data. +}; + +// Token array ================================================================ + +class XclImpStream; +class XclExpStream; + +/** Binary representation of an Excel token array. */ +class XclTokenArray +{ +public: + /** Creates an empty token array. */ + explicit XclTokenArray( bool bVolatile = false ); + /** Creates a token array, swaps passed token vector into own data. */ + explicit XclTokenArray( ScfUInt8Vec& rTokVec, bool bVolatile = false ); + /** Creates a token array, swaps passed token vectors into own data. */ + explicit XclTokenArray( ScfUInt8Vec& rTokVec, ScfUInt8Vec& rExtDataVec, bool bVolatile = false ); + + /** Returns true, if the token array is empty. */ + inline bool Empty() const { return maTokVec.empty(); } + /** Returns the size of the token array in bytes. */ + sal_uInt16 GetSize() const; + /** Returns read-only access to the byte vector storing token data. */ + inline const sal_uInt8* GetData() const { return maTokVec.empty() ? 0 : &maTokVec.front(); } + /** Returns true, if the formula contains a volatile function. */ + inline bool IsVolatile() const { return mbVolatile; } + + /** Reads the size field of the token array. */ + void ReadSize( XclImpStream& rStrm ); + /** Reads the tokens of the token array (without size field). */ + void ReadArray( XclImpStream& rStrm ); + /** Reads size field and the tokens. */ + void Read( XclImpStream& rStrm ); + + /** Writes the size field of the token array. */ + void WriteSize( XclExpStream& rStrm ) const; + /** Writes the tokens of the token array (without size field). */ + void WriteArray( XclExpStream& rStrm ) const; + /** Writes size field and the tokens. */ + void Write( XclExpStream& rStrm ) const; + + /** Compares this token array with the passed. */ + bool operator==( const XclTokenArray& rTokArr ) const; + +private: + ScfUInt8Vec maTokVec; /// Byte vector containing token data. + ScfUInt8Vec maExtDataVec; /// Byte vector containing extended data (arrays, stacked NLRs). + bool mbVolatile; /// True = Formula contains volatile function. +}; + +typedef ScfRef< XclTokenArray > XclTokenArrayRef; + +/** Calls the Read() function at the passed token array. */ +XclImpStream& operator>>( XclImpStream& rStrm, XclTokenArray& rTokArr ); +/** Calls the Read() function at the passed token array. */ +XclImpStream& operator>>( XclImpStream& rStrm, XclTokenArrayRef& rxTokArr ); +/** Calls the Write() function at the passed token array. */ +XclExpStream& operator<<( XclExpStream& rStrm, const XclTokenArray& rTokArr ); +/** Calls the Write() function at the passed token array. */ +XclExpStream& operator<<( XclExpStream& rStrm, const XclTokenArrayRef& rxTokArr ); + +// ---------------------------------------------------------------------------- + +namespace formula { class FormulaToken; } +class ScTokenArray; + +/** Special token array iterator for the Excel filters. + + Iterates over a Calc token array without modifying it (therefore the + iterator can be used with constant token arrays). + + Usage: Construct a new iterator object and pass a Calc token array, or use + the Init() function to assign another Calc token array. As long as the Is() + function returns true, the accessor functions can be used to get the + current Calc token. + */ +class XclTokenArrayIterator +{ +public: + explicit XclTokenArrayIterator(); + explicit XclTokenArrayIterator( const ScTokenArray& rScTokArr, bool bSkipSpaces ); + /** Copy constructor that allows to change the skip-spaces mode. */ + explicit XclTokenArrayIterator( const XclTokenArrayIterator& rTokArrIt, bool bSkipSpaces ); + + void Init(); + void Init( const ScTokenArray& rScTokArr, bool bSkipSpaces ); + + inline bool Is() const { return mppScToken != 0; } + inline bool operator!() const { return !Is(); } + inline const ::formula::FormulaToken* Get() const { return mppScToken ? *mppScToken : 0; } + inline const ::formula::FormulaToken* operator->() const { return Get(); } + inline const ::formula::FormulaToken& operator*() const { return *Get(); } + + XclTokenArrayIterator& operator++(); + +private: + void NextRawToken(); + void SkipSpaces(); + +private: + const ::formula::FormulaToken*const* mppScTokenBeg; /// Pointer to first token pointer of token array. + const ::formula::FormulaToken*const* mppScTokenEnd; /// Pointer behind last token pointer of token array. + const ::formula::FormulaToken*const* mppScToken; /// Pointer to current token pointer of token array. + bool mbSkipSpaces; /// true = Skip whitespace tokens. +}; + +// ---------------------------------------------------------------------------- + +/** Contains all cell references that can be extracted from a multiple operations formula. */ +struct XclMultipleOpRefs +{ + ScAddress maFmlaScPos; /// Position of the (first) formula cell. + ScAddress maColFirstScPos; + ScAddress maColRelScPos; + ScAddress maRowFirstScPos; + ScAddress maRowRelScPos; + bool mbDblRefMode; /// true = One formula with row and column values. +}; + +// ---------------------------------------------------------------------------- + +/** A helper with Excel specific token array functions. + + The purpose to not add these functions to ScTokenArray is to prevent code + changes in low-level Calc headers and to keep the Excel specific source + code in the filter directory. Deriving from ScTokenArray is not viable + because that would need expensive copy-constructions of the token arrays. + */ +class XclTokenArrayHelper +{ +public: + // token identifiers ------------------------------------------------------ + + /** Returns the base token ID of the passed (classified) token ID. */ + inline static sal_uInt8 GetBaseTokenId( sal_uInt8 nTokenId ) { return nTokenId & EXC_TOKID_MASK; } + /** Returns the classified token ID from a base ID and the token class. */ + inline static sal_uInt8 GetTokenId( sal_uInt8 nBaseId, sal_uInt8 nTokenClass ); + + /** Returns the token class of the passed token ID. */ + inline static sal_uInt8 GetTokenClass( sal_uInt8 nTokenId ) { return nTokenId & EXC_TOKCLASS_MASK; } + /** Changes the token class in the passed classified token ID. */ + inline static void ChangeTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nTokenClass ); + + // strings and string lists ----------------------------------------------- + + /** Tries to extract a string from the passed token. + @param rString (out-parameter) The string contained in the token. + @return true = Passed token is a string token, rString parameter is valid. */ + static bool GetTokenString( String& rString, const ::formula::FormulaToken& rScToken ); + + /** Parses the passed formula and tries to find a single string token, i.e. "abc". + @param rString (out-parameter) The string contained in the formula. + @return true = String token found, rString parameter is valid. */ + static bool GetString( String& rString, const ScTokenArray& rScTokArr ); + + /** Parses the passed formula and tries to find a string token list, i.e. "abc";"def";"ghi". + @descr Returns the unquoted (!) strings in a single string, separated with the + passed character. If a comma is specified, the function will return abc,def,ghi from + the example above. + @param rStringList (out-parameter) All strings contained in the formula as list. + @param cSep List separator character. + @return true = String token list found, rString parameter is valid. */ + static bool GetStringList( String& rStringList, const ScTokenArray& rScTokArr, sal_Unicode cSep ); + + /** Tries to convert a formula that consists of a single string token to a list of strings. + @descr Example: The formula ="abc\ndef\nghi" will be converted to the formula + ="abc";"def";"ghi", if the LF character is specified as separator. + @param rScTokArr (in/out-parameter) The token array to modify. + @param cStringSep The separator in the source string. + @param bTrimLeadingSpaces true = remove leading spaces from each token. */ + static void ConvertStringToList( ScTokenArray& rScTokArr, sal_Unicode cStringSep, bool bTrimLeadingSpaces ); + + // shared formulas -------------------------------------------------------- + + /** Tries to extract the definition of a shared formula from the passed token array. + @descr Shared formulas are stored as hidden defined names in Calc. This + function looks if the passed token array consists of the reference to + such a hidden defined name and returns its definition on success. */ + static const ScTokenArray* GetSharedFormula( const XclRoot& rRoot, const ScTokenArray& rScTokArr ); + + // multiple operations ---------------------------------------------------- + + /** Parses the passed formula and tries to extract references of a multiple operation. + @descr Requires that the formula contains a single MULTIPLE.OPERATION function call. + Spaces in the formula are silently ignored. + @return true = Multiple operation found, and all references successfully extracted. */ + static bool GetMultipleOpRefs( XclMultipleOpRefs& rRefs, const ScTokenArray& rScTokArr ); +}; + +// ---------------------------------------------------------------------------- + +inline sal_uInt8 XclTokenArrayHelper::GetTokenId( sal_uInt8 nBaseId, sal_uInt8 nTokenClass ) +{ + DBG_ASSERT( !::get_flag( nBaseId, static_cast< sal_uInt8 >( ~EXC_TOKID_MASK ) ), "XclTokenArrayHelper::GetTokenId - invalid token ID" ); + DBG_ASSERT( !::get_flag( nTokenClass, static_cast< sal_uInt8 >( ~EXC_TOKCLASS_MASK ) ), "XclTokenArrayHelper::GetTokenId - invalid token class" ); + return nBaseId | nTokenClass; +} + +inline void XclTokenArrayHelper::ChangeTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nTokenClass ) +{ + DBG_ASSERT( !::get_flag( nTokenClass, static_cast< sal_uInt8 >( ~EXC_TOKCLASS_MASK ) ), "XclTokenArrayHelper::ChangeTokenClass - invalid token class" ); + ::set_flag( rnTokenId, EXC_TOKCLASS_MASK, false ); + ::set_flag( rnTokenId, nTokenClass ); +} + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xllink.hxx b/sc/source/filter/inc/xllink.hxx new file mode 100644 index 000000000000..3e41fb350acb --- /dev/null +++ b/sc/source/filter/inc/xllink.hxx @@ -0,0 +1,93 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLLINK_HXX +#define SC_XLLINK_HXX + +#include <sal/types.h> + +// Constants and Enumerations ================================================= + +const sal_uInt16 EXC_TAB_EXTERNAL = 0xFFFE; /// Special sheet index for external links. +const sal_uInt16 EXC_TAB_DELETED = 0xFFFF; /// Deleted sheet in a 3D reference. + +// (0x0016) EXTERNCOUNT ------------------------------------------------------- + +const sal_uInt16 EXC_ID_EXTERNCOUNT = 0x0016; + +// (0x0017) EXTERNSHEET ------------------------------------------------------- + +const sal_uInt16 EXC_ID_EXTERNSHEET = 0x0017; + +const sal_Unicode EXC_EXTSH_URL = '\x01'; +const sal_Unicode EXC_EXTSH_OWNTAB = '\x02'; +const sal_Unicode EXC_EXTSH_TABNAME = '\x03'; +const sal_Unicode EXC_EXTSH_OWNDOC = '\x04'; +const sal_Unicode EXC_EXTSH_ADDIN = '\x3A'; + +// (0x0023) EXTERNNAME -------------------------------------------------------- + +const sal_uInt16 EXC_ID_EXTERNNAME = 0x0023; + +const sal_uInt16 EXC_EXTN_BUILTIN = 0x0001; +const sal_uInt16 EXC_EXTN_OLE = 0x0010; +const sal_uInt16 EXC_EXTN_OLE_OR_DDE = 0xFFFE; + +const sal_uInt16 EXC_EXTN_EXPDDE_STDDOC = 0x7FEA; /// for export +const sal_uInt16 EXC_EXTN_EXPDDE = 0x7FE2; /// for export + +// (0x0059, 0x005A) XCT, CRN -------------------------------------------------- + +const sal_uInt16 EXC_ID_XCT = 0x0059; +const sal_uInt16 EXC_ID_CRN = 0x005A; + +// (0x013D) TABID ------------------------------------------------------------- + +const sal_uInt16 EXC_ID_TABID = 0x013D; + +// (0x01AE) SUPBOOK ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_SUPBOOK = 0x01AE; + +const sal_uInt16 EXC_SUPB_SELF = 0x0401; +const sal_uInt16 EXC_SUPB_ADDIN = 0x3A01; + +/** This enumeration specifies the type of a SUPBOOK record. */ +enum XclSupbookType +{ + EXC_SBTYPE_UNKNOWN, /// unknown SUPBOOK record type. + EXC_SBTYPE_SELF, /// SUPBOOK is used for internal references. + EXC_SBTYPE_EXTERN, /// SUPBOOK is used for external references. + EXC_SBTYPE_ADDIN, /// SUPBOOK contains add-in functions. + EXC_SBTYPE_SPECIAL, /// SUPBOOK is used for DDE or OLE links. + EXC_SBTYPE_EUROTOOL /// SUPBOOK is uesd for EUROCONVERT. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlname.hxx b/sc/source/filter/inc/xlname.hxx new file mode 100644 index 000000000000..5bfcf9164892 --- /dev/null +++ b/sc/source/filter/inc/xlname.hxx @@ -0,0 +1,75 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLNAME_HXX +#define SC_XLNAME_HXX + +#include <sal/types.h> + +// Constants and Enumerations ================================================= + +// (0x0018, 0x0218) NAME ------------------------------------------------------ + +const sal_uInt16 EXC_ID_NAME = 0x0018; +const sal_uInt16 EXC_ID34_NAME = 0x0218; + +// flags +const sal_uInt16 EXC_NAME_DEFAULT = 0x0000; +const sal_uInt16 EXC_NAME_HIDDEN = 0x0001; +const sal_uInt16 EXC_NAME_FUNC = 0x0002; +const sal_uInt16 EXC_NAME_VB = 0x0004; +const sal_uInt16 EXC_NAME_PROC = 0x0008; +const sal_uInt16 EXC_NAME_CALCEXP = 0x0010; +const sal_uInt16 EXC_NAME_BUILTIN = 0x0020; +const sal_uInt16 EXC_NAME_FGROUPMASK = 0x0FC0; +const sal_uInt16 EXC_NAME_BIG = 0x1000; + +const sal_uInt8 EXC_NAME2_FUNC = 0x02; /// BIFF2 function/command flag. + +const sal_uInt16 EXC_NAME_GLOBAL = 0; /// 0 = Globally defined name. + +// codes for built-in names +const sal_Unicode EXC_BUILTIN_CONSOLIDATEAREA = '\x00'; +const sal_Unicode EXC_BUILTIN_AUTOOPEN = '\x01'; +const sal_Unicode EXC_BUILTIN_AUTOCLOSE = '\x02'; +const sal_Unicode EXC_BUILTIN_EXTRACT = '\x03'; +const sal_Unicode EXC_BUILTIN_DATABASE = '\x04'; +const sal_Unicode EXC_BUILTIN_CRITERIA = '\x05'; +const sal_Unicode EXC_BUILTIN_PRINTAREA = '\x06'; +const sal_Unicode EXC_BUILTIN_PRINTTITLES = '\x07'; +const sal_Unicode EXC_BUILTIN_RECORDER = '\x08'; +const sal_Unicode EXC_BUILTIN_DATAFORM = '\x09'; +const sal_Unicode EXC_BUILTIN_AUTOACTIVATE = '\x0A'; +const sal_Unicode EXC_BUILTIN_AUTODEACTIVATE = '\x0B'; +const sal_Unicode EXC_BUILTIN_SHEETTITLE = '\x0C'; +const sal_Unicode EXC_BUILTIN_FILTERDATABASE = '\x0D'; +const sal_Unicode EXC_BUILTIN_UNKNOWN = '\x0E'; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlpage.hxx b/sc/source/filter/inc/xlpage.hxx new file mode 100644 index 000000000000..f6860595cd20 --- /dev/null +++ b/sc/source/filter/inc/xlpage.hxx @@ -0,0 +1,156 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLPAGE_HXX +#define SC_XLPAGE_HXX + +#include <tools/gen.hxx> +#include "xltools.hxx" + +// Constants and Enumerations ================================================= + +// (0x0014, 0x0015) HEADER, FOOTER -------------------------------------------- + +const sal_uInt16 EXC_ID_HEADER = 0x0014; +const sal_uInt16 EXC_ID_FOOTER = 0x0015; + +// (0x001A, 0x001B) VERTICAL-, HORIZONTALPAGEBREAKS --------------------------- + +const sal_uInt16 EXC_ID_VERPAGEBREAKS = 0x001A; +const sal_uInt16 EXC_ID_HORPAGEBREAKS = 0x001B; + +// (0x0026, 0x0027, 0x0028, 0x0029) LEFT-, RIGHT-, TOP-, BOTTOMMARGIN --------- + +const sal_uInt16 EXC_ID_LEFTMARGIN = 0x0026; +const sal_uInt16 EXC_ID_RIGHTMARGIN = 0x0027; +const sal_uInt16 EXC_ID_TOPMARGIN = 0x0028; +const sal_uInt16 EXC_ID_BOTTOMMARGIN = 0x0029; + +const sal_Int32 EXC_MARGIN_DEFAULT_LR = 1900; /// Left/right default margin in 1/100mm. +const sal_Int32 EXC_MARGIN_DEFAULT_TB = 2500; /// Top/bottom default margin in 1/100mm. +const sal_Int32 EXC_MARGIN_DEFAULT_HF = 1300; /// Header/footer default margin in 1/100mm. +const sal_Int32 EXC_MARGIN_DEFAULT_HLR = 1900; /// Left/right header default margin in 1/100mm. +const sal_Int32 EXC_MARGIN_DEFAULT_FLR = 1900; /// Left/right footer default margin in 1/100mm. + +// (0x002A, 0x002B) PRINTHEADERS, PRINTGRIDLINES ------------------------------ + +const sal_uInt16 EXC_ID_PRINTHEADERS = 0x002A; +const sal_uInt16 EXC_ID_PRINTGRIDLINES = 0x002B; + +// (0x0033) PRINTSIZE --------------------------------------------------------- + +const sal_uInt16 EXC_ID_PRINTSIZE = 0x0033; + +const sal_uInt16 EXC_PRINTSIZE_SCREEN = 1; +const sal_uInt16 EXC_PRINTSIZE_PAGE = 2; +const sal_uInt16 EXC_PRINTSIZE_FULL = 3; + +// (0x0082, 0x0083, 0x0084) GRIDSET, HCENTER, VCENTER ------------------------- + +const sal_uInt16 EXC_ID_GRIDSET = 0x0082; +const sal_uInt16 EXC_ID_HCENTER = 0x0083; +const sal_uInt16 EXC_ID_VCENTER = 0x0084; + +// (0x00A1) SETUP ------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SETUP = 0x00A1; + +const sal_uInt16 EXC_SETUP_INROWS = 0x0001; +const sal_uInt16 EXC_SETUP_PORTRAIT = 0x0002; +const sal_uInt16 EXC_SETUP_INVALID = 0x0004; +const sal_uInt16 EXC_SETUP_BLACKWHITE = 0x0008; +const sal_uInt16 EXC_SETUP_DRAFT = 0x0010; +const sal_uInt16 EXC_SETUP_PRINTNOTES = 0x0020; +const sal_uInt16 EXC_SETUP_STARTPAGE = 0x0080; +const sal_uInt16 EXC_SETUP_NOTES_END = 0x0200; + +const sal_uInt16 EXC_PAPERSIZE_DEFAULT = 0; + +// ============================================================================ + +// Page settings ============================================================== + +class SvxBrushItem; +class SfxPrinter; + +/** Contains all page (print) settings for a single sheet. */ +struct XclPageData : ScfNoCopy +{ + typedef ::std::auto_ptr< SvxBrushItem > SvxBrushItemPtr; + + ScfUInt16Vec maHorPageBreaks; /// Horizontal page breaks. + ScfUInt16Vec maVerPageBreaks; /// Vertical page breaks. + SvxBrushItemPtr mxBrushItem; /// Background bitmap. + String maHeader; /// Excel header string (empty = off). + String maFooter; /// Excel footer string (empty = off). + double mfLeftMargin; /// Left margin in inches. + double mfRightMargin; /// Right margin in inches. + double mfTopMargin; /// Top margin in inches. + double mfBottomMargin; /// Bottom margin in inches. + double mfHeaderMargin; /// Margin main page to header. + double mfFooterMargin; /// Margin main page to footer. + double mfHdrLeftMargin; /// Left margin to header. + double mfHdrRightMargin; /// Right margin to header. + double mfFtrLeftMargin; /// Left margin to footer. + double mfFtrRightMargin; /// Right margin to footer. + sal_uInt16 mnPaperSize; /// Index into paper size table. + sal_uInt16 mnCopies; /// Number of copies. + sal_uInt16 mnStartPage; /// Start page number. + sal_uInt16 mnScaling; /// Scaling in percent. + sal_uInt16 mnFitToWidth; /// Fit to number of pages in width. + sal_uInt16 mnFitToHeight; /// Fit to number of pages in height. + sal_uInt16 mnHorPrintRes; /// Horizontal printing resolution. + sal_uInt16 mnVerPrintRes; /// Vertical printing resolution. + bool mbValid; /// false = some of the values are not valid. + bool mbPortrait; /// true = portrait; false = landscape. + bool mbPrintInRows; /// true = in rows; false = in columns. + bool mbBlackWhite; /// true = black/white; false = colors. + bool mbDraftQuality; /// true = draft; false = default quality. + bool mbPrintNotes; /// true = print notes. + bool mbManualStart; /// true = mnStartPage valid; false = automatic. + bool mbFitToPages; /// true = fit to pages; false = scale in percent. + bool mbHorCenter; /// true = centered horizontally; false = left aligned. + bool mbVerCenter; /// true = centered vertically; false = top aligned. + bool mbPrintHeadings; /// true = print column and row headings. + bool mbPrintGrid; /// true = print grid lines. + + explicit XclPageData(); + ~XclPageData(); + + /** Sets Excel default page settings. */ + void SetDefaults(); + + /** Returns the real paper size (twips) from the paper size index and paper orientation. */ + Size GetScPaperSize() const; + /** Sets the Excel paper size index and paper orientation from Calc paper size (twips). */ + void SetScPaperSize( const Size& rSize, bool bPortrait ); +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlpivot.hxx b/sc/source/filter/inc/xlpivot.hxx new file mode 100644 index 000000000000..ad48c05a93f4 --- /dev/null +++ b/sc/source/filter/inc/xlpivot.hxx @@ -0,0 +1,817 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLPIVOT_HXX +#define SC_XLPIVOT_HXX + +#include <com/sun/star/sheet/GeneralFunction.hpp> +#include <com/sun/star/sheet/DataPilotFieldOrientation.hpp> +#include <com/sun/star/sheet/DataPilotFieldSortMode.hpp> +#include <com/sun/star/sheet/DataPilotFieldShowItemsMode.hpp> +#include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp> +#include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp> +#include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp> +#include <tools/datetime.hxx> +#include "ftools.hxx" +#include "xladdress.hxx" +#include "dpobject.hxx" + +#include <memory> + +class XclImpStream; +class XclExpStream; + +// Constants and Enumerations ================================================= + +// misc ----------------------------------------------------------------------- + +#define EXC_STORAGE_PTCACHE CREATE_STRING( "_SX_DB_CUR" ) + +// strings +const sal_uInt16 EXC_PT_NOSTRING = 0xFFFF; +const sal_uInt16 EXC_PT_MAXSTRLEN = 0xFFFE; + +// pivot cache fields +const size_t EXC_PC_MAXFIELDCOUNT = 0xFFFE; +const sal_uInt16 EXC_PC_NOFIELD = 0xFFFF; +const xub_StrLen EXC_PC_MAXSTRLEN = 255; + +// pivot cache items +const size_t EXC_PC_MAXITEMCOUNT = 32500; +const sal_uInt16 EXC_PC_NOITEM = 0xFFFF; + +// pivot table fields +const sal_uInt16 EXC_PT_MAXFIELDCOUNT = 0xFFFE; +const sal_uInt16 EXC_PT_MAXROWCOLCOUNT = EXC_PT_MAXFIELDCOUNT; +const sal_uInt16 EXC_PT_MAXPAGECOUNT = 256; +const sal_uInt16 EXC_PT_MAXDATACOUNT = 256; + +// pivot table items +const sal_uInt16 EXC_PT_MAXITEMCOUNT = 32500; + +const sal_uInt16 EXC_PT_AUTOFMT_HEADER = 0x810; +const sal_uInt16 EXC_PT_AUTOFMT_ZERO = 0; +const sal_uInt32 EXC_PT_AUTOFMT_FLAGS = 0x20; + +/** Data type of a pivot cache item. */ +enum XclPCItemType +{ + EXC_PCITEM_INVALID, /// Special state, not used in Excel files. + EXC_PCITEM_EMPTY, /// Empty cell. + EXC_PCITEM_TEXT, /// String data. + EXC_PCITEM_DOUBLE, /// Floating-point value. + EXC_PCITEM_DATETIME, /// Date/time. + EXC_PCITEM_INTEGER, /// 16-bit integer value. + EXC_PCITEM_BOOL, /// Boolean value. + EXC_PCITEM_ERROR /// Error code. +}; + +/** Specifies the type of a pivot cache field. */ +enum XclPCFieldType +{ + EXC_PCFIELD_STANDARD, /// Standard field without grouping. + EXC_PCFIELD_STDGROUP, /// Standard grouping field. + EXC_PCFIELD_NUMGROUP, /// Numeric grouping field. + EXC_PCFIELD_DATEGROUP, /// First date grouping field (opt. with child grouping field). + EXC_PCFIELD_DATECHILD, /// Additional date grouping field. + EXC_PCFIELD_CALCED, /// Calculated field. + EXC_PCFIELD_UNKNOWN /// Unknown field state, handled like standard field. +}; + +// (0x0051,0x0052) DCONREF, DCONNAME ------------------------------------------ + +const sal_uInt16 EXC_ID_DCONREF = 0x0051; +const sal_uInt16 EXC_ID_DCONNAME = 0x0052; + +// (0x00B0) SXVIEW ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_SXVIEW = 0x00B0; + +const sal_uInt16 EXC_SXVIEW_ROWGRAND = 0x0001; +const sal_uInt16 EXC_SXVIEW_COLGRAND = 0x0002; +const sal_uInt16 EXC_SXVIEW_DEFAULTFLAGS = 0x0208; + +const sal_uInt16 EXC_SXVIEW_DATALAST = 0xFFFF; +const sal_uInt16 EXC_SXVIEW_AUTOFMT = 0x0001; + +// (0x00B1) SXVD -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXVD = 0x00B1; + +const sal_uInt16 EXC_SXVD_AXIS_NONE = 0x0000; +const sal_uInt16 EXC_SXVD_AXIS_ROW = 0x0001; +const sal_uInt16 EXC_SXVD_AXIS_COL = 0x0002; +const sal_uInt16 EXC_SXVD_AXIS_PAGE = 0x0004; +const sal_uInt16 EXC_SXVD_AXIS_DATA = 0x0008; +const sal_uInt16 EXC_SXVD_AXIS_ROWCOL = EXC_SXVD_AXIS_ROW | EXC_SXVD_AXIS_COL; +const sal_uInt16 EXC_SXVD_AXIS_ROWCOLPAGE = EXC_SXVD_AXIS_ROWCOL | EXC_SXVD_AXIS_PAGE; + +const sal_uInt16 EXC_SXVD_SUBT_NONE = 0x0000; +const sal_uInt16 EXC_SXVD_SUBT_DEFAULT = 0x0001; +const sal_uInt16 EXC_SXVD_SUBT_SUM = 0x0002; +const sal_uInt16 EXC_SXVD_SUBT_COUNT = 0x0004; +const sal_uInt16 EXC_SXVD_SUBT_AVERAGE = 0x0008; +const sal_uInt16 EXC_SXVD_SUBT_MAX = 0x0010; +const sal_uInt16 EXC_SXVD_SUBT_MIN = 0x0020; +const sal_uInt16 EXC_SXVD_SUBT_PROD = 0x0040; +const sal_uInt16 EXC_SXVD_SUBT_COUNTNUM = 0x0080; +const sal_uInt16 EXC_SXVD_SUBT_STDDEV = 0x0100; +const sal_uInt16 EXC_SXVD_SUBT_STDDEVP = 0x0200; +const sal_uInt16 EXC_SXVD_SUBT_VAR = 0x0400; +const sal_uInt16 EXC_SXVD_SUBT_VARP = 0x0800; + +const sal_uInt16 EXC_SXVD_DEFAULT_CACHE = EXC_PC_NOFIELD; + +// (0x00B2) SXVI -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXVI = 0x00B2; + +const sal_uInt16 EXC_SXVI_TYPE_PAGE = 0x00FE; +const sal_uInt16 EXC_SXVI_TYPE_NULL = 0x00FF; +const sal_uInt16 EXC_SXVI_TYPE_DATA = 0x0000; +const sal_uInt16 EXC_SXVI_TYPE_DEFAULT = 0x0001; +const sal_uInt16 EXC_SXVI_TYPE_SUM = 0x0002; +const sal_uInt16 EXC_SXVI_TYPE_COUNT = 0x0003; +const sal_uInt16 EXC_SXVI_TYPE_AVERAGE = 0x0004; +const sal_uInt16 EXC_SXVI_TYPE_MAX = 0x0005; +const sal_uInt16 EXC_SXVI_TYPE_MIN = 0x0006; +const sal_uInt16 EXC_SXVI_TYPE_PROD = 0x0007; +const sal_uInt16 EXC_SXVI_TYPE_COUNTNUM = 0x0008; +const sal_uInt16 EXC_SXVI_TYPE_STDDEV = 0x0009; +const sal_uInt16 EXC_SXVI_TYPE_STDDEVP = 0x000A; +const sal_uInt16 EXC_SXVI_TYPE_VAR = 0x000B; +const sal_uInt16 EXC_SXVI_TYPE_VARP = 0x000C; +const sal_uInt16 EXC_SXVI_TYPE_GRAND = 0x000D; + +const sal_uInt16 EXC_SXVI_DEFAULTFLAGS = 0x0000; +const sal_uInt16 EXC_SXVI_HIDDEN = 0x0001; +const sal_uInt16 EXC_SXVI_HIDEDETAIL = 0x0002; +const sal_uInt16 EXC_SXVI_FORMULA = 0x0004; +const sal_uInt16 EXC_SXVI_MISSING = 0x0008; + +const sal_uInt16 EXC_SXVI_DEFAULT_CACHE = EXC_PC_NOFIELD; + +// (0x00B4) SXIVD ------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXIVD = 0x00B4; +const sal_uInt16 EXC_SXIVD_DATA = 0xFFFE; + +// (0x00B5) SXLI -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXLI = 0x00B5; +const sal_uInt16 EXC_SXLI_DEFAULTFLAGS = 0x0000; + +// (0x00B6) SXPI -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXPI = 0x00B6; +const sal_uInt16 EXC_SXPI_ALLITEMS = 0x7FFD; + +// (0x00C5) SXDI -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXDI = 0x00C5; + +const sal_uInt16 EXC_SXDI_FUNC_SUM = 0x0000; +const sal_uInt16 EXC_SXDI_FUNC_COUNT = 0x0001; +const sal_uInt16 EXC_SXDI_FUNC_AVERAGE = 0x0002; +const sal_uInt16 EXC_SXDI_FUNC_MAX = 0x0003; +const sal_uInt16 EXC_SXDI_FUNC_MIN = 0x0004; +const sal_uInt16 EXC_SXDI_FUNC_PRODUCT = 0x0005; +const sal_uInt16 EXC_SXDI_FUNC_COUNTNUM = 0x0006; +const sal_uInt16 EXC_SXDI_FUNC_STDDEV = 0x0007; +const sal_uInt16 EXC_SXDI_FUNC_STDDEVP = 0x0008; +const sal_uInt16 EXC_SXDI_FUNC_VAR = 0x0009; +const sal_uInt16 EXC_SXDI_FUNC_VARP = 0x000A; + +const sal_uInt16 EXC_SXDI_REF_NORMAL = 0x0000; +const sal_uInt16 EXC_SXDI_REF_DIFF = 0x0001; +const sal_uInt16 EXC_SXDI_REF_PERC = 0x0002; +const sal_uInt16 EXC_SXDI_REF_PERC_DIFF = 0x0003; +const sal_uInt16 EXC_SXDI_REF_RUN_TOTAL = 0x0004; +const sal_uInt16 EXC_SXDI_REF_PERC_ROW = 0x0005; +const sal_uInt16 EXC_SXDI_REF_PERC_COL = 0x0006; +const sal_uInt16 EXC_SXDI_REF_PERC_TOTAL = 0x0007; +const sal_uInt16 EXC_SXDI_REF_INDEX = 0x0008; + +const sal_uInt16 EXC_SXDI_PREVITEM = 0x7FFB; +const sal_uInt16 EXC_SXDI_NEXTITEM = 0x7FFC; + +// (0x00C6) SXDB -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXDB = 0x00C6; + +const sal_uInt16 EXC_SXDB_SAVEDATA = 0x0001; +const sal_uInt16 EXC_SXDB_INVALID = 0x0002; +const sal_uInt16 EXC_SXDB_REFRESH_LOAD = 0x0004; +const sal_uInt16 EXC_SXDB_OPT_CACHE = 0x0008; +const sal_uInt16 EXC_SXDB_BG_QUERY = 0x0010; +const sal_uInt16 EXC_SXDB_ENABLE_REFRESH = 0x0020; +const sal_uInt16 EXC_SXDB_DEFAULTFLAGS = EXC_SXDB_SAVEDATA | EXC_SXDB_ENABLE_REFRESH; + +const sal_uInt16 EXC_SXDB_BLOCKRECS = 0x1FFF; + +const sal_uInt16 EXC_SXDB_SRC_SHEET = 0x0001; +const sal_uInt16 EXC_SXDB_SRC_EXTERN = 0x0002; +const sal_uInt16 EXC_SXDB_SRC_CONSOLID = 0x0004; +const sal_uInt16 EXC_SXDB_SRC_SCENARIO = 0x0008; + +// (0x00C7) SXFIELD ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXFIELD = 0x00C7; + +const sal_uInt16 EXC_SXFIELD_HASITEMS = 0x0001; +const sal_uInt16 EXC_SXFIELD_POSTPONE = 0x0002; +const sal_uInt16 EXC_SXFIELD_CALCED = 0x0004; +const sal_uInt16 EXC_SXFIELD_HASCHILD = 0x0008; +const sal_uInt16 EXC_SXFIELD_NUMGROUP = 0x0010; +const sal_uInt16 EXC_SXFIELD_16BIT = 0x0200; + +const sal_uInt16 EXC_SXFIELD_DATA_MASK = 0x0DE0; +// known data types +const sal_uInt16 EXC_SXFIELD_DATA_NONE = 0x0000; /// Special state for groupings. +const sal_uInt16 EXC_SXFIELD_DATA_STR = 0x0480; /// Only strings, nothing else. +const sal_uInt16 EXC_SXFIELD_DATA_INT = 0x0520; /// Only integers, opt. with doubles. +const sal_uInt16 EXC_SXFIELD_DATA_DBL = 0x0560; /// Only doubles, nothing else. +const sal_uInt16 EXC_SXFIELD_DATA_STR_INT = 0x05A0; /// Only strings and integers, opt. with doubles. +const sal_uInt16 EXC_SXFIELD_DATA_STR_DBL = 0x05E0; /// Only strings and doubles, nothing else. +const sal_uInt16 EXC_SXFIELD_DATA_DATE = 0x0900; /// Only dates, nothing else. +const sal_uInt16 EXC_SXFIELD_DATA_DATE_EMP = 0x0980; /// Dates and empty strings, nothing else (?). +const sal_uInt16 EXC_SXFIELD_DATA_DATE_NUM = 0x0D00; /// Dates with integers or doubles without strings. +const sal_uInt16 EXC_SXFIELD_DATA_DATE_STR = 0x0D80; /// Dates and strings, opt. with integers or doubles. + +const sal_uInt16 EXC_SXFIELD_INDEX_MIN = 0; /// List index for minimum item in groupings. +const sal_uInt16 EXC_SXFIELD_INDEX_MAX = 1; /// List index for maximum item in groupings. +const sal_uInt16 EXC_SXFIELD_INDEX_STEP = 2; /// List index for step item in groupings. + +// (0x00C8) SXINDEXLIST ------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXINDEXLIST = 0x00C8; + +// (0x00C9) SXDOUBLE ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXDOUBLE = 0x00C9; + +// (0x00CA) SXBOOLEAN --------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXBOOLEAN = 0x00CA; + +// (0x00CB) SXERROR ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXERROR = 0x00CB; + +// (0x00CC) SXINTEGER --------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXINTEGER = 0x00CC; + +// (0x00CD) SXSTRING ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXSTRING = 0x00CD; + +// (0x00CE) SXDATETIME -------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXDATETIME = 0x00CE; + +// (0x00CF) SXEMPTY ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXEMPTY = 0x00CF; + +// (0x00D5) SXIDSTM ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXIDSTM = 0x00D5; + +// (0x00D8) SXNUMGROUP -------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXNUMGROUP = 0x00D8; + +const sal_uInt16 EXC_SXNUMGROUP_AUTOMIN = 0x0001; +const sal_uInt16 EXC_SXNUMGROUP_AUTOMAX = 0x0002; + +const sal_uInt16 EXC_SXNUMGROUP_TYPE_SEC = 1; +const sal_uInt16 EXC_SXNUMGROUP_TYPE_MIN = 2; +const sal_uInt16 EXC_SXNUMGROUP_TYPE_HOUR = 3; +const sal_uInt16 EXC_SXNUMGROUP_TYPE_DAY = 4; +const sal_uInt16 EXC_SXNUMGROUP_TYPE_MONTH = 5; +const sal_uInt16 EXC_SXNUMGROUP_TYPE_QUART = 6; +const sal_uInt16 EXC_SXNUMGROUP_TYPE_YEAR = 7; +const sal_uInt16 EXC_SXNUMGROUP_TYPE_NUM = 8; + +// (0x00D9) SXGROUPINFO ------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXGROUPINFO = 0x00D9; + +// (0x00DC) SXEXT ------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXEXT = 0x00DC; + +// (0x00E3) SXVS -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXVS = 0x00E3; + +const sal_uInt16 EXC_SXVS_UNKNOWN = 0x0000; +const sal_uInt16 EXC_SXVS_SHEET = 0x0001; +const sal_uInt16 EXC_SXVS_EXTERN = 0x0002; +const sal_uInt16 EXC_SXVS_CONSOLID = 0x0004; +const sal_uInt16 EXC_SXVS_PIVOTTAB = 0x0008; +const sal_uInt16 EXC_SXVS_SCENARIO = 0x0010; + +// (0x00F0) SXRULE ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_SXRULE = 0x00F0; + +// (0x00F1) SXEX -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXEX = 0x00F1; + +const sal_uInt32 EXC_SXEX_DRILLDOWN = 0x00020000; +const sal_uInt32 EXC_SXEX_DEFAULTFLAGS = 0x004F0200; + +// (0x00F2) SXFILT ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_SXFILT = 0x00F2; + +// (0x00F5) ------------------------------------------------------------------- + +const sal_uInt16 EXC_ID_00F5 = 0x00F5; /// Unknown record + +// (0x00F6) SXNAME ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_SXNAME = 0x00F6; + +// (0x00F8) SXPAIR ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_SXPAIR = 0x00F8; + +// (0x00F9) SXFMLA ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_SXFMLA = 0x00F9; + +// (0x0100) SXVDEX ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_SXVDEX = 0x0100; + +const sal_uInt32 EXC_SXVDEX_SHOWALL = 0x00000001; +const sal_uInt32 EXC_SXVDEX_SORT = 0x00000200; +const sal_uInt32 EXC_SXVDEX_SORT_ASC = 0x00000400; +const sal_uInt32 EXC_SXVDEX_AUTOSHOW = 0x00000800; +const sal_uInt32 EXC_SXVDEX_AUTOSHOW_ASC = 0x00001000; +const sal_uInt32 EXC_SXVDEX_LAYOUT_REPORT = 0x00200000; +const sal_uInt32 EXC_SXVDEX_LAYOUT_BLANK = 0x00400000; +const sal_uInt32 EXC_SXVDEX_LAYOUT_TOP = 0x00800000; +const sal_uInt32 EXC_SXVDEX_DEFAULTFLAGS = 0x0A00001E | EXC_SXVDEX_SORT_ASC | EXC_SXVDEX_AUTOSHOW_ASC; + +const sal_uInt16 EXC_SXVDEX_SORT_OWN = 0xFFFF; +const sal_uInt16 EXC_SXVDEX_SHOW_NONE = 0xFFFF; +const sal_uInt16 EXC_SXVDEX_FORMAT_NONE = 0x0000; + +// (0x0103) SXFORMULA --------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXFORMULA = 0x0103; + +// (0x0122) SXDBEX ------------------------------------------------------------ + +const sal_uInt16 EXC_ID_SXDBEX = 0x0122; +const double EXC_SXDBEX_CREATION_DATE = 51901.029652778; + +// (0x01BB) SXFDBTYPE --------------------------------------------------------- + +const sal_uInt16 EXC_ID_SXFDBTYPE = 0x01BB; +const sal_uInt16 EXC_SXFDBTYPE_DEFAULT = 0x0000; + +// (0x0810) SXVIEWEX9 --------------------------------------------------------- +const sal_uInt16 EXC_ID_SXVIEWEX9 = 0x0810; + +// ============================================================================ +// Pivot cache +// ============================================================================ + +/** Represents a data item of any type in a pivot cache. Supposed as base class for import and export. */ +class XclPCItem +{ +public: + explicit XclPCItem(); + virtual ~XclPCItem(); + + /** Sets the item to 'empty' type. */ + void SetEmpty(); + /** Sets the item to 'text' type and adds the passed text. */ + void SetText( const String& rText ); + /** Sets the item to 'double' type and adds the passed value. */ + void SetDouble( double fValue ); + /** Sets the item to 'date/time' type and adds the passed date. */ + void SetDateTime( const DateTime& rDateTime ); + /** Sets the item to 'integer' type and adds the passed value. */ + void SetInteger( sal_Int16 nValue ); + /** Sets the item to 'error' type and adds the passed Excel error code. */ + void SetError( sal_uInt16 nError ); + /** Sets the item to 'boolean' type and adds the passed Boolean value. */ + void SetBool( bool bValue ); + + /** Returns the current item type. */ + inline XclPCItemType GetType() const { return meType; } + /** Returns the text representation of the item. */ + inline const String& ConvertToText() const { return maText; } + + /** Returns true, if the passed iterm equals this item. */ + bool IsEqual( const XclPCItem& rItem ) const; + + /** Returns true, if the item type is 'empty'. */ + bool IsEmpty() const; + /** Returns pointer to text, if the item type is 'text', otherwise 0. */ + const String* GetText() const; + /** Returns pointer to value, if the item type is 'double', otherwise 0. */ + const double* GetDouble() const; + /** Returns pointer to date, if the item type is 'date/time', otherwise 0. */ + const DateTime* GetDateTime() const; + /** Returns pointer to integer, if the item type is 'integer', otherwise 0. */ + const sal_Int16* GetInteger() const; + /** Returns pointer to error code, if the item type is 'error', otherwise 0. */ + const sal_uInt16* GetError() const; + /** Returns pointer to Boolean value, if the item type is 'boolean', otherwise 0. */ + const bool* GetBool() const; + +private: + XclPCItemType meType; /// Type of the item. + String maText; /// Text representation of the item. + DateTime maDateTime; /// Value of a date/time item. + union + { + double mfValue; /// Value of a floating-point item. + sal_Int16 mnValue; /// Value of an integer item. + sal_uInt16 mnError; /// Error code of an error item. + bool mbValue; /// Value of a boolean item. + }; +}; + +inline bool operator==( const XclPCItem& rLeft, const XclPCItem& rRight ) { return rLeft.IsEqual( rRight ); } +inline bool operator!=( const XclPCItem& rLeft, const XclPCItem& rRight ) { return !(rLeft == rRight); } + +// Field settings ============================================================= + +/** Contains data for a pivot cache field (SXFIELD record). */ +struct XclPCFieldInfo +{ + String maName; /// Name of the pivot cache field. + sal_uInt16 mnFlags; /// Various flags. + sal_uInt16 mnGroupChild; /// Field containing grouping info for this field. + sal_uInt16 mnGroupBase; /// Base field if this field contains grouping info. + sal_uInt16 mnVisItems; /// Number of visible items for this field. + sal_uInt16 mnGroupItems; /// Number of special items in a grouping field. + sal_uInt16 mnBaseItems; /// Number of items in the base field. + sal_uInt16 mnOrigItems; /// Number of original source data items. + + explicit XclPCFieldInfo(); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPCFieldInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPCFieldInfo& rInfo ); + +// Numeric grouping field settings ============================================ + +/** Contains data for a numeric grouping field (SXNUMGROUP record). */ +struct XclPCNumGroupInfo +{ + sal_uInt16 mnFlags; /// Various flags. + + explicit XclPCNumGroupInfo(); + + void SetNumType(); + + sal_Int32 GetScDateType() const; + void SetScDateType( sal_Int32 nScType ); + + sal_uInt16 GetXclDataType() const; + void SetXclDataType( sal_uInt16 nXclType ); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPCNumGroupInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPCNumGroupInfo& rInfo ); + +// Base class for pivot cache fields ========================================== + +/** Represents a field in a pivot cache. Supposed as base class for import and export. */ +class XclPCField +{ +public: + explicit XclPCField( XclPCFieldType eFieldType, sal_uInt16 nFieldIdx ); + virtual ~XclPCField(); + + /** Returns the index of this field in the containing pivot cache. */ + inline sal_uInt16 GetFieldIndex() const { return mnFieldIdx; } + + /** Returns true, if the type of the field is supported by Calc. */ + bool IsSupportedField() const; + + /** Returns true, if this is a standard field build directly from source data. */ + bool IsStandardField() const; + +//UNUSED2008-05 /** Returns true, if the items of the field are calculated from a formula. */ +//UNUSED2008-05 bool IsCalculatedField() const; + + /** Returns true, if this field is a grouping field. */ + bool IsStdGroupField() const; + /** Returns true, if this field is a numeric grouping field. */ + bool IsNumGroupField() const; + /** Returns true, if this field is a date/time grouping field. */ + bool IsDateGroupField() const; + /** Returns true, if this field is a grouping field of any type. */ + bool IsGroupField() const; + + /** Returns true, if this field has a child field in a grouping. */ + bool IsGroupBaseField() const; + /** Returns true, if this field is a child field in a grouping (it has a base field). */ + bool IsGroupChildField() const; + /** Returns the index of the base field, if exists, otherwise the own index. */ + sal_uInt16 GetBaseFieldIndex() const; + + /** Returns true, if the field is based on a column in the source data area. */ + bool HasOrigItems() const; + /** Returns true, if any items are stored after the SXFIELD record. */ + bool HasInlineItems() const; + /** Returns true, if the items are stored separately after the last field. */ + bool HasPostponedItems() const; + /** Returns true, if the item indexes in the SXINDEXLIST record are stored as 16-bit values. */ + bool Has16BitIndexes() const; + +protected: + XclPCFieldInfo maFieldInfo; /// Pivot cache field info (SXFIELD record). + XclPCFieldType meFieldType; /// Type of this pivot cache field. + sal_uInt16 mnFieldIdx; /// Own field index in pivot cache. + ScfUInt16Vec maGroupOrder; /// Order of items in a grouping field (SXGROUPINFO record). + XclPCNumGroupInfo maNumGroupInfo; /// Info for numeric grouping (SXNUMGROUP record). +}; + +// Pivot cache settings ======================================================= + +/** Contains data for a pivot cache (SXDB record). */ +struct XclPCInfo +{ + sal_uInt32 mnSrcRecs; /// Records in source database. + sal_uInt16 mnStrmId; /// Stream identifier. + sal_uInt16 mnFlags; /// Flags for the cache. + sal_uInt16 mnBlockRecs; /// Records in a source database block. + sal_uInt16 mnStdFields; /// Number of standard pivot cache fields. + sal_uInt16 mnTotalFields; /// Number of all fields (standard, grouped, calculated). + sal_uInt16 mnSrcType; /// Database type. + String maUserName; /// Name of user who last modified the cache. + + explicit XclPCInfo(); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPCInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPCInfo& rInfo ); + +// ============================================================================ +// Pivot table +// ============================================================================ + +// cached name ================================================================ + +/** A name for various pivot table info structs. Includes 'use cache' state. */ +struct XclPTCachedName +{ + String maName; /// The visible name, if used. + bool mbUseCache; /// true = Use name in cache instead of maName. + + inline explicit XclPTCachedName() : mbUseCache( true ) {} +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPTCachedName& rCachedName ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPTCachedName& rCachedName ); + +// ---------------------------------------------------------------------------- + +/** Base struct for named info structs. Supports explicit naming and using the cache. */ +struct XclPTVisNameInfo +{ + XclPTCachedName maVisName; /// The displayed name of the item. + + /** Returns true, if the name is set explicitly (maVisName.mbUseCache is false). */ + inline bool HasVisName() const { return !maVisName.mbUseCache; } + /** Returns the name, if set explicitly (maVisName.mbUseCache is false). */ + const String* GetVisName() const; + /** Sets the visible name and enables usage of cache if name is empty. */ + void SetVisName( const String& rName ); +}; + +// Field item settings ======================================================== + +/** Contains data for a pivot table data item (SXVI record). */ +struct XclPTItemInfo : public XclPTVisNameInfo +{ + sal_uInt16 mnType; /// Type of the item (e.g. data, function, grand total). + sal_uInt16 mnFlags; /// Several flags. + sal_uInt16 mnCacheIdx; /// Index into cache for item name. + + explicit XclPTItemInfo(); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPTItemInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPTItemInfo& rInfo ); + +// General field settings ===================================================== + +typedef ::std::vector< USHORT > XclPTSubtotalVec; + +/** Contains data for a pivot table field (SXVD record). */ +struct XclPTFieldInfo : public XclPTVisNameInfo +{ + sal_uInt16 mnAxes; /// Flags for axes this field is part of. + sal_uInt16 mnSubtCount; /// Number of subtotal functions. + sal_uInt16 mnSubtotals; /// Bitfield for subtotal functions. + sal_uInt16 mnItemCount; /// Number of items of this field. + sal_uInt16 mnCacheIdx; /// Index into cache for field name (not part of record). + + explicit XclPTFieldInfo(); + + /** Returns the API enum representing the orientation (first of row/col/page/data). + @param nMask Restricts the axes taken into account. + @return The first found axis orientation, that is allowed in nMask parameter. */ + ::com::sun::star::sheet::DataPilotFieldOrientation GetApiOrient( sal_uInt16 nMask ) const; + /** Adds the axis orientation represented by the passed API enum. */ + void AddApiOrient( ::com::sun::star::sheet::DataPilotFieldOrientation eOrient ); + + /** Returns a vector of all set subtotal functions. */ + void GetSubtotals( XclPTSubtotalVec& rSubtotals ) const; + /** Sets the subtotal functions contained in the passed sequence. */ + void SetSubtotals( const XclPTSubtotalVec& rSubtotals ); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPTFieldInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPTFieldInfo& rInfo ); + +// Extended field settings ==================================================== + +/** Contains extended data for a pivot table field (SXVDEX record). */ +struct XclPTFieldExtInfo +{ + sal_uInt32 mnFlags; /// Several flags and number of items for AutoShow. + sal_uInt16 mnSortField; /// Index to data field sorting bases on. + sal_uInt16 mnShowField; /// Index to data field AutoShow bases on. + sal_uInt16 mnNumFmt; + ::std::auto_ptr<rtl::OUString> mpFieldTotalName; + + explicit XclPTFieldExtInfo(); + + /** Returns the API constant representing the sorting mode. */ + sal_Int32 GetApiSortMode() const; + /** Sets the sorting mode represented by the passed API constant. */ + void SetApiSortMode( sal_Int32 nSortMode ); + + /** Returns the API constant representing the AutoShow mode. */ + sal_Int32 GetApiAutoShowMode() const; + /** Sets the AutoShow mode represented by the passed API constant. */ + void SetApiAutoShowMode( sal_Int32 nShowMode ); + + /** Returns the number of items to be shown in AutoShow mode. */ + sal_Int32 GetApiAutoShowCount() const; + /** Sets the number of items to be shown in AutoShow mode. */ + void SetApiAutoShowCount( sal_Int32 nShowCount ); + + /** Returns the API constant representing the layout mode. */ + sal_Int32 GetApiLayoutMode() const; + /** Sets the layout mode represented by the passed API constant. */ + void SetApiLayoutMode( sal_Int32 nLayoutMode ); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPTFieldExtInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPTFieldExtInfo& rInfo ); + +// Page field settings ======================================================== + +/** Contains data for a pivot table page field (part of SXPI record). */ +struct XclPTPageFieldInfo +{ + sal_uInt16 mnField; /// Base field for this page info. + sal_uInt16 mnSelItem; /// Index to selected item. + sal_uInt16 mnObjId; /// Escher object ID of dropdown listbox. + + explicit XclPTPageFieldInfo(); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPTPageFieldInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPTPageFieldInfo& rInfo ); + +// Data field settings ======================================================== + +/** Contains data for a pivot table data field (SXDI record). */ +struct XclPTDataFieldInfo : public XclPTVisNameInfo +{ + sal_uInt16 mnField; /// Base field for this data info. + sal_uInt16 mnAggFunc; /// Data aggregation function. + sal_uInt16 mnRefType; /// Result reference type. + sal_uInt16 mnRefField; /// Index to SXVD of referred field used for the results. + sal_uInt16 mnRefItem; /// Index to SXVI of referred item of the used field. + sal_uInt16 mnNumFmt; /// Number format of the results. + + explicit XclPTDataFieldInfo(); + + /** Returns the API enum representing the aggregation function. */ + ::com::sun::star::sheet::GeneralFunction GetApiAggFunc() const; + /** Sets the aggregation function represented by the passed API enum. */ + void SetApiAggFunc( ::com::sun::star::sheet::GeneralFunction eAggFunc ); + + /** Returns the API constant representing the result reference type. */ + sal_Int32 GetApiRefType() const; + /** Sets the result reference type represented by the passed API constant. */ + void SetApiRefType( sal_Int32 nRefType ); + + /** Returns the API constant representing the result reference item type. */ + sal_Int32 GetApiRefItemType() const; + /** Sets the result reference item type represented by the passed API constant. */ + void SetApiRefItemType( sal_Int32 nRefItemType ); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPTDataFieldInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPTDataFieldInfo& rInfo ); + +// Pivot table settings ======================================================= + +/** Contains data for a pivot table (SXVIEW record). */ +struct XclPTInfo +{ + String maTableName; /// The name of the pivot table. + String maDataName; /// The visible name of the data field. + XclRange maOutXclRange; /// Output range. + XclAddress maDataXclPos; /// First cell containing data. + sal_uInt16 mnFirstHeadRow; /// First heading row. + sal_uInt16 mnCacheIdx; /// 0-based index of the pivot cache. + sal_uInt16 mnDataAxis; /// Orientation of data fields. + sal_uInt16 mnDataPos; /// Position of data fields. + sal_uInt16 mnFields; /// Number of all fields. + sal_uInt16 mnRowFields; /// Number of row fields. + sal_uInt16 mnColFields; /// Number of column fields. + sal_uInt16 mnPageFields; /// Number of page fields. + sal_uInt16 mnDataFields; /// Number of data fields. + sal_uInt16 mnDataRows; /// Number of rows containing data. + sal_uInt16 mnDataCols; /// Number of columns containing data. + sal_uInt16 mnFlags; /// Flags for the entire pivot table. + sal_uInt16 mnAutoFmtIdx; /// Index to pivot table autoformat. + + explicit XclPTInfo(); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPTInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPTInfo& rInfo ); + +// Extended pivot table settings ============================================== + +/** Extended information about a pivot table (SXEX record). */ +struct XclPTExtInfo +{ + sal_uInt16 mnSxformulaRecs; /// Number of SXFORMULA records. + sal_uInt16 mnSxselectRecs; /// Number of SXSELECT records. + sal_uInt16 mnPagePerRow; /// Number of page fields per row. + sal_uInt16 mnPagePerCol; /// Number of page fields per column. + sal_uInt32 mnFlags; /// Flags for the entire pivot table. + + explicit XclPTExtInfo(); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPTExtInfo& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPTExtInfo& rInfo ); + +// ============================================================================ + +// Pivot table autoformat settings ============================================== + +/** Pivot table autoformat settings (SXVIEWEX9 record). */ +struct XclPTViewEx9Info +{ + sal_uInt32 mbReport; /// 2 for report* fmts ? + sal_uInt8 mnAutoFormat; /// AutoFormat ID + sal_uInt8 mnGridLayout; /// 0 == gridlayout, 0x10 == modern + String maGrandTotalName; + + explicit XclPTViewEx9Info(); + void Init( const ScDPObject& rDPObj ); +}; + +XclImpStream& operator>>( XclImpStream& rStrm, XclPTViewEx9Info& rInfo ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclPTViewEx9Info& rInfo ); + +// ============================================================================ +#endif + diff --git a/sc/source/filter/inc/xlroot.hxx b/sc/source/filter/inc/xlroot.hxx new file mode 100644 index 000000000000..2f029c74baa9 --- /dev/null +++ b/sc/source/filter/inc/xlroot.hxx @@ -0,0 +1,289 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLROOT_HXX +#define SC_XLROOT_HXX + +#include <i18npool/lang.h> +#include <sot/storage.hxx> +#include "xlconst.hxx" +#include "xltools.hxx" + +namespace comphelper { class IDocPasswordVerifier; } + +// Forward declarations of objects in public use ============================== + +class DateTime; + +struct XclAddress; +struct XclRange; +class XclRangeList; +class XclTokenArray; + +// Global data ================================================================ + +#ifdef DBG_UTIL +/** Counts the number of created root objects. */ +struct XclDebugObjCounter +{ + sal_Int32 mnObjCnt; + inline explicit XclDebugObjCounter() : mnObjCnt( 0 ) {} + ~XclDebugObjCounter(); +}; +#endif + +// ---------------------------------------------------------------------------- + +class SfxMedium; +class ScEditEngineDefaulter; +class ScHeaderEditEngine; +class EditEngine; +class ScExtDocOptions; +class XclFontPropSetHelper; +class XclChPropSetHelper; +class XclTracer; + +struct RootData;//! + +/** Stores global buffers and data needed elsewhere in the Excel filters. */ +struct XclRootData +#ifdef DBG_UTIL + : public XclDebugObjCounter +#endif +{ + typedef ScfRef< ScEditEngineDefaulter > ScEEDefaulterRef; + typedef ScfRef< ScHeaderEditEngine > ScHeaderEERef; + typedef ScfRef< EditEngine > EditEngineRef; + typedef ScfRef< XclFontPropSetHelper > XclFontPropSetHlpRef; + typedef ScfRef< XclChPropSetHelper > XclChPropSetHlpRef; + typedef ScfRef< ScExtDocOptions > ScExtDocOptRef; + typedef ScfRef< XclTracer > XclTracerRef; + typedef ScfRef< RootData > RootDataRef; + + XclBiff meBiff; /// Current BIFF version. + XclOutput meOutput; /// Current Output format. + SfxMedium& mrMedium; /// The medium to import from. + SotStorageRef mxRootStrg; /// The root OLE storage of imported/exported file. + ScDocument& mrDoc; /// The source or destination document. + String maDocUrl; /// Document URL of imported/exported file. + String maBasePath; /// Base path of imported/exported file (path of maDocUrl). + String maUserName; /// Current user name. + const String maDefPassword; /// The default password used for stream encryption. + rtl_TextEncoding meTextEnc; /// Text encoding to import/export byte strings. + LanguageType meSysLang; /// System language. + LanguageType meDocLang; /// Document language (import: from file, export: from system). + LanguageType meUILang; /// UI language (import: from file, export: from system). + sal_Int16 mnDefApiScript; /// Default script type for blank cells (API constant). + ScAddress maScMaxPos; /// Highest Calc cell position. + ScAddress maXclMaxPos; /// Highest Excel cell position. + ScAddress maMaxPos; /// Highest position valid in Calc and Excel. + + ScEEDefaulterRef mxEditEngine; /// Edit engine for rich strings etc. + ScHeaderEERef mxHFEditEngine; /// Edit engine for header/footer. + EditEngineRef mxDrawEditEng; /// Edit engine for text boxes. + + XclFontPropSetHlpRef mxFontPropSetHlp; /// Property set helper for fonts. + XclChPropSetHlpRef mxChPropSetHlp; /// Property set helper for chart filter. + + ScExtDocOptRef mxExtDocOpt; /// Extended document options. + XclTracerRef mxTracer; /// Filter tracer. + RootDataRef mxRD; /// Old RootData struct. Will be removed. + + double mfScreenPixelX; /// Width of a screen pixel (1/100 mm). + double mfScreenPixelY; /// Height of a screen pixel (1/100 mm). + long mnCharWidth; /// Width of '0' in default font (twips). + SCTAB mnScTab; /// Current Calc sheet index. + const bool mbExport; /// false = Import, true = Export. + + explicit XclRootData( XclBiff eBiff, SfxMedium& rMedium, + SotStorageRef xRootStrg, ScDocument& rDoc, + rtl_TextEncoding eTextEnc, bool bExport ); + virtual ~XclRootData(); +}; + +// ---------------------------------------------------------------------------- + +class SfxObjectShell; +class ScModelObj; +class OutputDevice; +class SvNumberFormatter; +class SdrPage; +class ScDocumentPool; +class ScStyleSheetPool; +class ScRangeName; +class ScDBCollection; +struct XclFontData; + +/** Access to global data for a filter object (imported or exported document) from other classes. */ +class XclRoot +{ +public: + explicit XclRoot( XclRootData& rRootData ); + XclRoot( const XclRoot& rRoot ); + + virtual ~XclRoot(); + + XclRoot& operator=( const XclRoot& rRoot ); + + /** Returns this root instance - for code readability in derived classes. */ + inline const XclRoot& GetRoot() const { return *this; } + /** Returns old RootData struct. Deprecated. */ + inline RootData& GetOldRoot() const { return *mrData.mxRD; } + + /** Returns the current BIFF version of the importer/exporter. */ + inline XclBiff GetBiff() const { return mrData.meBiff; } + /** Returns the current output format of the importer/exporter. */ + inline XclOutput GetOutput() const { return mrData.meOutput; } + /** Returns true, if currently a document is imported. */ + inline bool IsImport() const { return !mrData.mbExport; } + /** Returns true, if currently a document is exported. */ + inline bool IsExport() const { return mrData.mbExport; } + /** Returns the text encoding to import/export byte strings. */ + inline rtl_TextEncoding GetTextEncoding() const { return mrData.meTextEnc; } + /** Returns the system language, i.e. for number formats. */ + inline LanguageType GetSysLanguage() const { return mrData.meSysLang; } + /** Returns the document language. */ + inline LanguageType GetDocLanguage() const { return mrData.meDocLang; } + /** Returns the UI language. */ + inline LanguageType GetUILanguage() const { return mrData.meUILang; } + /** Returns the default script type, e.g. for blank cells. */ + inline sal_Int16 GetDefApiScript() const { return mrData.mnDefApiScript; } + /** Returns the width of the '0' character (default font) for the current printer (twips). */ + inline long GetCharWidth() const { return mrData.mnCharWidth; } + /** Returns the current Calc sheet index. */ + inline bool IsInGlobals() const { return mrData.mnScTab == SCTAB_GLOBAL; } + /** Returns the current Calc sheet index. */ + inline SCTAB GetCurrScTab() const { return mrData.mnScTab; } + + /** Calculates the width of the passed number of pixels in 1/100 mm. */ + sal_Int32 GetHmmFromPixelX( double fPixelX ) const; + /** Calculates the height of the passed number of pixels in 1/100 mm. */ + sal_Int32 GetHmmFromPixelY( double fPixelY ) const; + + /** Returns the medium to import from. */ + inline SfxMedium& GetMedium() const { return mrData.mrMedium; } + /** Returns the document URL of the imported/exported file. */ + inline const String& GetDocUrl() const { return mrData.maDocUrl; } + /** Returns the base path of the imported/exported file. */ + inline const String& GetBasePath() const { return mrData.maBasePath; } + /** Returns the current user name. */ + inline const String& GetUserName() const { return mrData.maUserName; } + + /** Returns the default password used for stream encryption. */ + inline const String& GetDefaultPassword() const { return mrData.maDefPassword; } + /** Requests and verifies a password from the medium or the user. */ + String RequestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ) const; + + /** Returns the OLE2 root storage of the imported/exported file. + @return Pointer to root storage or 0, if the file is a simple stream. */ + inline SotStorageRef GetRootStorage() const { return mrData.mxRootStrg; } + /** Returns true, if the document contains a VBA storage. */ + bool HasVbaStorage() const; + + /** Tries to open a storage as child of the specified storage for reading or writing. */ + SotStorageRef OpenStorage( SotStorageRef xStrg, const String& rStrgName ) const; + /** Tries to open a storage as child of the root storage for reading or writing. */ + SotStorageRef OpenStorage( const String& rStrgName ) const; + /** Tries to open a new stream in the specified storage for reading or writing. */ + SotStorageStreamRef OpenStream( SotStorageRef xStrg, const String& rStrmName ) const; + /** Tries to open a new stream in the root storage for reading or writing. */ + SotStorageStreamRef OpenStream( const String& rStrmName ) const; + + /** Returns the destination document (import) or source document (export). */ + inline ScDocument& GetDoc() const { return mrData.mrDoc; } + /** Returns pointer to the destination document (import) or source document (export). */ + inline ScDocument* GetDocPtr() const { return &mrData.mrDoc; } + /** Returns the object shell of the Calc document. May be 0 (i.e. import from clipboard). */ + SfxObjectShell* GetDocShell() const; + /** Returns the object model of the Calc document. */ + ScModelObj* GetDocModelObj() const; + /** Returns pointer to the printer of the Calc document. */ + OutputDevice* GetPrinter() const; + /** Returns the style sheet pool of the Calc document. */ + ScStyleSheetPool& GetStyleSheetPool() const; + /** Returns the defined names container of the Calc document. */ + ScRangeName& GetNamedRanges() const; + /** Returns the database ranges container of the Calc document. */ + ScDBCollection& GetDatabaseRanges() const; + /** Returns the drawing layer page of the passed sheet, if present. */ + SdrPage* GetSdrPage( SCTAB nScTab ) const; + + /** Returns the number formatter of the Calc document. */ + SvNumberFormatter& GetFormatter() const; + /** Returns the null date of the current number formatter. */ + DateTime GetNullDate() const; + /** Converts a date/time value to a floating-point value. */ + double GetDoubleFromDateTime( const DateTime& rDateTime ) const; + /** Converts a floating-point value to a date/time value. */ + DateTime GetDateTimeFromDouble( double fValue ) const; + + /** Returns the edit engine for import/export of rich strings etc. */ + ScEditEngineDefaulter& GetEditEngine() const; + /** Returns the edit engine for import/export of headers/footers. */ + ScHeaderEditEngine& GetHFEditEngine() const; + /** Returns the edit engine for import/export of drawing text boxes. */ + EditEngine& GetDrawEditEngine() const; + + /** Returns the property set helper for fonts. */ + XclFontPropSetHelper& GetFontPropSetHelper() const; + /** Returns the property set helper for the chart filters. */ + XclChPropSetHelper& GetChartPropSetHelper() const; + + /** Returns the extended document options. */ + ScExtDocOptions& GetExtDocOptions() const; + /** Returns the filter tracer. */ + XclTracer& GetTracer() const; + + /** Returns the highest possible cell address in a Calc document. */ + inline const ScAddress& GetScMaxPos() const { return mrData.maScMaxPos; } + /** Returns the highest possible cell address in an Excel document (using current BIFF version). */ + inline const ScAddress& GetXclMaxPos() const { return mrData.maXclMaxPos; } + /** Returns the highest possible cell address valid in Calc and Excel (using current BIFF version). */ + inline const ScAddress& GetMaxPos() const { return mrData.maMaxPos; } + + /** Sets the document language. */ + inline void SetDocLanguage( LanguageType eLang ) { mrData.meDocLang = eLang; } + /** Sets the UI language, i.e. if it has been read from a file. */ + inline void SetUILanguage( LanguageType eLang ) { mrData.meUILang = eLang; } + /** Sets the text encoding to import/export byte strings. */ + void SetTextEncoding( rtl_TextEncoding eTextEnc ); + /** Sets the width of the '0' character (default font) for the current printer (twips). + @param rFontData The font used for the '0' character. */ + void SetCharWidth( const XclFontData& rFontData ); + /** Sets the current Calc sheet index. */ + inline void SetCurrScTab( SCTAB nScTab ) { mrData.mnScTab = nScTab; } + /** Increases the current Calc sheet index by 1. */ + inline void IncCurrScTab() { ++mrData.mnScTab; } + +private: + mutable XclRootData& mrData; /// Reference to the global data struct. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlstream.hxx b/sc/source/filter/inc/xlstream.hxx new file mode 100644 index 000000000000..0a9074371c33 --- /dev/null +++ b/sc/source/filter/inc/xlstream.hxx @@ -0,0 +1,53 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLSTREAM_HXX +#define SC_XLSTREAM_HXX + +#include <tools/stream.hxx> +#include <svx/svxerr.hxx> +#include "ftools.hxx" + +// Constants ================================================================== + +const sal_Size EXC_REC_SEEK_TO_BEGIN = 0; +const sal_Size EXC_REC_SEEK_TO_END = static_cast< sal_Size >( -1 ); + +const sal_uInt16 EXC_MAXRECSIZE_BIFF5 = 2080; +const sal_uInt16 EXC_MAXRECSIZE_BIFF8 = 8224; + +const ErrCode EXC_ENCR_ERROR_WRONG_PASS = ERRCODE_SVX_WRONGPASS; +const ErrCode EXC_ENCR_ERROR_UNSUPP_CRYPT = ERRCODE_SVX_READ_FILTER_CRYPT; +const sal_uInt16 EXC_ENCR_BLOCKSIZE = 1024; + +const sal_uInt16 EXC_ID_UNKNOWN = SAL_MAX_UINT16; +const sal_uInt16 EXC_ID_CONT = 0x003C; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlstring.hxx b/sc/source/filter/inc/xlstring.hxx new file mode 100644 index 000000000000..5ee505e25024 --- /dev/null +++ b/sc/source/filter/inc/xlstring.hxx @@ -0,0 +1,97 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLSTRING_HXX +#define SC_XLSTRING_HXX + +#include "ftools.hxx" + +// Constants and enumerations ================================================= + +/** Flags used to specify import/export mode of strings. */ +typedef sal_uInt16 XclStrFlags; + +const XclStrFlags EXC_STR_DEFAULT = 0x0000; /// Default string settings. +const XclStrFlags EXC_STR_FORCEUNICODE = 0x0001; /// Always use UCS-2 characters (default: try to compress). BIFF8 only. +const XclStrFlags EXC_STR_8BITLENGTH = 0x0002; /// 8-bit string length field (default: 16-bit). +const XclStrFlags EXC_STR_SMARTFLAGS = 0x0004; /// Omit flags on empty string (default: read/write always). BIFF8 only. +const XclStrFlags EXC_STR_SEPARATEFORMATS = 0x0008; /// Import: Keep old formats when reading unformatted string (default: clear formats); Export: Write unformatted string. +const XclStrFlags EXC_STR_NOHEADER = 0x0010; /// Export: Don't write the length and flag fields. + +// ---------------------------------------------------------------------------- + +const sal_uInt16 EXC_STR_MAXLEN_8BIT = 0x00FF; +const sal_uInt16 EXC_STR_MAXLEN = 0xFFFF; + +const sal_uInt8 EXC_STRF_16BIT = 0x01; +const sal_uInt8 EXC_STRF_FAREAST = 0x04; +const sal_uInt8 EXC_STRF_RICH = 0x08; +const sal_uInt8 EXC_STRF_UNKNOWN = 0xF2; + +// Fixed-size characters +const sal_uInt8 EXC_LF_C = '\x0A'; /// LF character (used for line break). +const sal_uInt16 EXC_LF = EXC_LF_C; /// LF character (unicode). +const sal_uInt8 EXC_NUL_C = '\x00'; /// NUL chararcter. +const sal_uInt16 EXC_NUL = EXC_NUL_C; /// NUL chararcter (unicode). + +// Rich-string formatting runs ================================================ + +/** Represents a formatting run for rich-strings. + + An Excel formatting run stores the first formatted character in a + rich-string and the index of a font used to format this and the following + characters. + */ +struct XclFormatRun +{ + sal_uInt16 mnChar; /// First character this format applies to. + sal_uInt16 mnFontIdx; /// Excel font index for the next characters. + + explicit inline XclFormatRun() : mnChar( 0 ), mnFontIdx( 0 ) {} + explicit inline XclFormatRun( sal_uInt16 nChar, sal_uInt16 nFontIdx ) : + mnChar( nChar ), mnFontIdx( nFontIdx ) {} +}; + +inline bool operator==( const XclFormatRun& rLeft, const XclFormatRun& rRight ) +{ + return (rLeft.mnChar == rRight.mnChar) && (rLeft.mnFontIdx == rRight.mnFontIdx); +} + +inline bool operator<( const XclFormatRun& rLeft, const XclFormatRun& rRight ) +{ + return (rLeft.mnChar < rRight.mnChar) || ((rLeft.mnChar == rRight.mnChar) && (rLeft.mnFontIdx < rRight.mnFontIdx)); +} + +// ---------------------------------------------------------------------------- + +/** A vector with all formatting runs for a rich-string. */ +typedef ::std::vector< XclFormatRun > XclFormatRunVec; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlstyle.hxx b/sc/source/filter/inc/xlstyle.hxx new file mode 100644 index 000000000000..604b53a1f8ff --- /dev/null +++ b/sc/source/filter/inc/xlstyle.hxx @@ -0,0 +1,619 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLSTYLE_HXX +#define SC_XLSTYLE_HXX + +#include <map> +#include <com/sun/star/awt/FontSlant.hpp> +#include <com/sun/star/awt/FontUnderline.hpp> +#include <com/sun/star/awt/FontStrikeout.hpp> +#include <tools/color.hxx> +#include <vcl/vclenum.hxx> +#include <editeng/svxenum.hxx> +#include <editeng/frmdir.hxx> +#include <svl/zforlist.hxx> +#include "fapihelper.hxx" + +class XclRoot; + +// Constants and Enumerations ================================================= + +// Line styles ---------------------------------------------------------------- + +const sal_uInt8 EXC_LINE_NONE = 0x00; +const sal_uInt8 EXC_LINE_THIN = 0x01; +const sal_uInt8 EXC_LINE_MEDIUM = 0x02; +const sal_uInt8 EXC_LINE_THICK = 0x05; +const sal_uInt8 EXC_LINE_DOUBLE = 0x06; +const sal_uInt8 EXC_LINE_HAIR = 0x07; + +// Background patterns -------------------------------------------------------- + +const sal_uInt8 EXC_PATT_NONE = 0x00; +const sal_uInt8 EXC_PATT_SOLID = 0x01; +const sal_uInt8 EXC_PATT_50_PERC = 0x02; +const sal_uInt8 EXC_PATT_75_PERC = 0x03; +const sal_uInt8 EXC_PATT_25_PERC = 0x04; +const sal_uInt8 EXC_PATT_12_5_PERC = 0x11; +const sal_uInt8 EXC_PATT_6_25_PERC = 0x12; + +// (0x001E, 0x041E) FORMAT ---------------------------------------------------- + +const sal_uInt16 EXC_ID2_FORMAT = 0x001E; +const sal_uInt16 EXC_ID4_FORMAT = 0x041E; + +const sal_uInt16 EXC_FORMAT_OFFSET5 = 164; +const sal_uInt16 EXC_FORMAT_OFFSET8 = 164; +const sal_uInt16 EXC_FORMAT_NOTFOUND = 0xFFFF; + +// (0x0031) FONT -------------------------------------------------------------- + +const sal_uInt16 EXC_ID2_FONT = 0x0031; +const sal_uInt16 EXC_ID3_FONT = 0x0231; + +const sal_uInt16 EXC_FONT_APP = 0; /// Application font index. +const sal_uInt16 EXC_FONT_NOTFOUND = 0xFFFF; + +const size_t EXC_FONT_MAXCOUNT4 = 0x00FF; +const size_t EXC_FONT_MAXCOUNT5 = 0x00FF; +const size_t EXC_FONT_MAXCOUNT8 = 0xFFFF; + +// families +const sal_uInt8 EXC_FONTFAM_DONTKNOW = 0x00; +const sal_uInt8 EXC_FONTFAM_ROMAN = 0x01; +const sal_uInt8 EXC_FONTFAM_SWISS = 0x02; +const sal_uInt8 EXC_FONTFAM_SYSTEM = EXC_FONTFAM_SWISS; +const sal_uInt8 EXC_FONTFAM_MODERN = 0x03; +const sal_uInt8 EXC_FONTFAM_SCRIPT = 0x04; +const sal_uInt8 EXC_FONTFAM_DECORATIVE = 0x05; + +// charsets +const sal_uInt8 EXC_FONTCSET_ANSI_LATIN = 0x00; + +// attributes +const sal_uInt16 EXC_FONTATTR_NONE = 0x0000; +const sal_uInt16 EXC_FONTATTR_BOLD = 0x0001; +const sal_uInt16 EXC_FONTATTR_ITALIC = 0x0002; +const sal_uInt16 EXC_FONTATTR_UNDERLINE = 0x0004; +const sal_uInt16 EXC_FONTATTR_STRIKEOUT = 0x0008; +const sal_uInt16 EXC_FONTATTR_OUTLINE = 0x0010; +const sal_uInt16 EXC_FONTATTR_SHADOW = 0x0020; + +// weight +const sal_uInt16 EXC_FONTWGHT_DONTKNOW = 0; +const sal_uInt16 EXC_FONTWGHT_THIN = 100; +const sal_uInt16 EXC_FONTWGHT_ULTRALIGHT = 200; +const sal_uInt16 EXC_FONTWGHT_LIGHT = 300; +const sal_uInt16 EXC_FONTWGHT_SEMILIGHT = 350; +const sal_uInt16 EXC_FONTWGHT_NORMAL = 400; +const sal_uInt16 EXC_FONTWGHT_MEDIUM = 500; +const sal_uInt16 EXC_FONTWGHT_SEMIBOLD = 600; +const sal_uInt16 EXC_FONTWGHT_BOLD = 700; +const sal_uInt16 EXC_FONTWGHT_ULTRABOLD = 800; +const sal_uInt16 EXC_FONTWGHT_BLACK = 900; + +// underline +const sal_uInt8 EXC_FONTUNDERL_NONE = 0x00; +const sal_uInt8 EXC_FONTUNDERL_SINGLE = 0x01; +const sal_uInt8 EXC_FONTUNDERL_DOUBLE = 0x02; +const sal_uInt8 EXC_FONTUNDERL_SINGLE_ACC = 0x21; +const sal_uInt8 EXC_FONTUNDERL_DOUBLE_ACC = 0x22; + +// escapement +const sal_uInt16 EXC_FONTESC_NONE = 0x00; +const sal_uInt16 EXC_FONTESC_SUPER = 0x01; +const sal_uInt16 EXC_FONTESC_SUB = 0x02; + +// (0x0043, 0x0243, 0x0443, 0x00E0) XF ---------------------------------------- + +const sal_uInt16 EXC_ID2_XF = 0x0043; +const sal_uInt16 EXC_ID3_XF = 0x0243; +const sal_uInt16 EXC_ID4_XF = 0x0443; +const sal_uInt16 EXC_ID5_XF = 0x00E0; + +const sal_uInt32 EXC_XF_MAXCOUNT = 4050; /// Maximum number of all XF records. +const sal_uInt32 EXC_XF_MAXSTYLECOUNT = 1536; /// Arbitrary maximum number of style XFs. +const sal_uInt16 EXC_XF_DEFAULTSTYLE = 0; /// Excel index to default style XF. +const sal_uInt16 EXC_XF_DEFAULTCELL = 15; /// Excel index to default cell XF. +const sal_uInt16 EXC_XF_NOTFOUND = 0xFFFF; /// Special index for "not found" state. + +const sal_uInt32 EXC_XFID_NOTFOUND = 0xFFFFFFFF; + +const sal_uInt16 EXC_XF_LOCKED = 0x0001; +const sal_uInt16 EXC_XF_HIDDEN = 0x0002; +const sal_uInt16 EXC_XF_STYLE = 0x0004; +const sal_uInt16 EXC_XF_STYLEPARENT = 0x0FFF; /// Syles don't have a parent. +const sal_uInt16 EXC_XF_LINEBREAK = 0x0008; /// Automatic line break. +const sal_uInt16 EXC_XF_SHRINK = 0x0010; /// Shrink to fit into cell. + +const sal_uInt8 EXC_XF_DIFF_VALFMT = 0x01; +const sal_uInt8 EXC_XF_DIFF_FONT = 0x02; +const sal_uInt8 EXC_XF_DIFF_ALIGN = 0x04; +const sal_uInt8 EXC_XF_DIFF_BORDER = 0x08; +const sal_uInt8 EXC_XF_DIFF_AREA = 0x10; +const sal_uInt8 EXC_XF_DIFF_PROT = 0x20; + +const sal_uInt8 EXC_XF_HOR_GENERAL = 0x00; +const sal_uInt8 EXC_XF_HOR_LEFT = 0x01; +const sal_uInt8 EXC_XF_HOR_CENTER = 0x02; +const sal_uInt8 EXC_XF_HOR_RIGHT = 0x03; +const sal_uInt8 EXC_XF_HOR_FILL = 0x04; +const sal_uInt8 EXC_XF_HOR_JUSTIFY = 0x05; +const sal_uInt8 EXC_XF_HOR_CENTER_AS = 0x06; +const sal_uInt8 EXC_XF_HOR_DISTRIB = 0x07; + +const sal_uInt8 EXC_XF_VER_TOP = 0x00; +const sal_uInt8 EXC_XF_VER_CENTER = 0x01; +const sal_uInt8 EXC_XF_VER_BOTTOM = 0x02; +const sal_uInt8 EXC_XF_VER_JUSTIFY = 0x03; +const sal_uInt8 EXC_XF_VER_DISTRIB = 0x04; + +const sal_uInt8 EXC_XF_TEXTDIR_CONTEXT = 0x00; +const sal_uInt8 EXC_XF_TEXTDIR_LTR = 0x01; +const sal_uInt8 EXC_XF_TEXTDIR_RTL = 0x02; + +const sal_uInt8 EXC_XF2_VALFMT_MASK = 0x3F; +const sal_uInt8 EXC_XF2_LOCKED = 0x40; +const sal_uInt8 EXC_XF2_HIDDEN = 0x80; +const sal_uInt8 EXC_XF2_LEFTLINE = 0x08; +const sal_uInt8 EXC_XF2_RIGHTLINE = 0x10; +const sal_uInt8 EXC_XF2_TOPLINE = 0x20; +const sal_uInt8 EXC_XF2_BOTTOMLINE = 0x40; +const sal_uInt8 EXC_XF2_BACKGROUND = 0x80; + +const sal_uInt16 EXC_XF8_SHRINK = 0x0010; /// Shrink to fit into cell. +const sal_uInt16 EXC_XF8_MERGE = 0x0020; + +const sal_uInt32 EXC_XF_DIAGONAL_TL_TO_BR = 0x40000000; /// Top-left to bottom-right. +const sal_uInt32 EXC_XF_DIAGONAL_BL_TO_TR = 0x80000000; /// Bottom-left to top-right. +const sal_uInt32 EXC_XF_DIAGONAL_BOTH = 0xC0000000; /// Both. + +// (0x0045) EFONT ------------------------------------------------------------- + +const sal_uInt16 EXC_ID_EFONT = 0x0045; + +// (0x0092) PALETTE ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_PALETTE = 0x0092; + +const sal_uInt16 EXC_COLOR_BIFF2_BLACK = 0; +const sal_uInt16 EXC_COLOR_BIFF2_WHITE = 1; + +const sal_uInt16 EXC_COLOR_USEROFFSET = 8; /// First user defined color. +const sal_uInt16 EXC_COLOR_WINDOWTEXT3 = 24; /// System window text color (BIFF3-BIFF4). +const sal_uInt16 EXC_COLOR_WINDOWBACK3 = 25; /// System window background color (BIFF3-BIFF4). +const sal_uInt16 EXC_COLOR_WINDOWTEXT = 64; /// System window text color (>=BIFF5). +const sal_uInt16 EXC_COLOR_WINDOWBACK = 65; /// System window background color (>=BIFF5). +const sal_uInt16 EXC_COLOR_BUTTONBACK = 67; /// System button background color (face color). +const sal_uInt16 EXC_COLOR_CHWINDOWTEXT = 77; /// System window text color (BIFF8 charts). +const sal_uInt16 EXC_COLOR_CHWINDOWBACK = 78; /// System window background color (BIFF8 charts). +const sal_uInt16 EXC_COLOR_CHBORDERAUTO = 79; /// Automatic frame border for series (BIFF8 charts). +const sal_uInt16 EXC_COLOR_NOTEBACK = 80; /// Note background color. +const sal_uInt16 EXC_COLOR_NOTETEXT = 81; /// Note text color. +const sal_uInt16 EXC_COLOR_FONTAUTO = 0x7FFF; /// Font auto color (system window text color). + +// (0x0293) STYLE ------------------------------------------------------------- + +const sal_uInt16 EXC_ID_STYLE = 0x0293; + +const sal_uInt16 EXC_STYLE_BUILTIN = 0x8000; +const sal_uInt16 EXC_STYLE_XFMASK = 0x0FFF; + +const sal_uInt8 EXC_STYLE_NORMAL = 0x00; /// "Normal" style. +const sal_uInt8 EXC_STYLE_ROWLEVEL = 0x01; /// "RowLevel_*" styles. +const sal_uInt8 EXC_STYLE_COLLEVEL = 0x02; /// "ColLevel_*" styles. +const sal_uInt8 EXC_STYLE_COMMA = 0x03; /// "Comma" style. +const sal_uInt8 EXC_STYLE_CURRENCY = 0x04; /// "Currency" style. +const sal_uInt8 EXC_STYLE_PERCENT = 0x05; /// "Percent" style. +const sal_uInt8 EXC_STYLE_COMMA_0 = 0x06; /// "Comma [0]" style. +const sal_uInt8 EXC_STYLE_CURRENCY_0 = 0x07; /// "Currency [0]" style. +const sal_uInt8 EXC_STYLE_HYPERLINK = 0x08; /// "Hyperlink" style. +const sal_uInt8 EXC_STYLE_FOLLOWED_HYPERLINK= 0x09; /// "Followed_Hyperlink" style. +const sal_uInt8 EXC_STYLE_USERDEF = 0xFF; /// No built-in style. + +const sal_uInt8 EXC_STYLE_LEVELCOUNT = 7; /// Number of outline level styles. +const sal_uInt8 EXC_STYLE_NOLEVEL = 0xFF; /// Default value for unused level. + +// (0x0892) STYLEEXT ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_STYLEEXT = 0x0892; + +const sal_uInt8 EXC_STYLEEXT_BUILTIN = 0x01; +const sal_uInt8 EXC_STYLEEXT_HIDDEN = 0x02; +const sal_uInt8 EXC_STYLEEXT_CUSTOM = 0x04; + +// Structs and classes ======================================================== + +// Color data ================================================================= + +/** Stores all default colors for a specific BIFF version. */ +class XclDefaultPalette +{ +public: + explicit XclDefaultPalette( const XclRoot& rRoot ); + + /** Returns the color count in the current palette. */ + inline sal_uInt32 GetColorCount() const { return mnTableSize - EXC_COLOR_USEROFFSET; } + + /** Returns the default RGB color data for a (non-zero-based) Excel color or COL_AUTO on error. */ + ColorData GetDefColorData( sal_uInt16 nXclIndex ) const; + /** Returns the default color for a (non-zero-based) Excel color or COL_AUTO on error. */ + inline Color GetDefColor( sal_uInt16 nXclIndex ) const + { return Color( GetDefColorData( nXclIndex ) ); } + + /** Returns true, if the passed Excel color index is a system color. */ + inline bool IsSystemColor( sal_uInt16 nXclIndex ) const { return nXclIndex >= mnTableSize; } + +private: + const ColorData* mpnColorTable; /// The table with RGB values. + ColorData mnWindowText; /// System window text color. + ColorData mnWindowBack; /// System window background color. + ColorData mnFaceColor; /// System button background color. + ColorData mnNoteText; /// Note text color. + ColorData mnNoteBack; /// Note background color. + sal_uInt32 mnTableSize; /// The color table size. +}; + +// Font data ================================================================== + +class Font; +class SvxFont; + +/** This struct helps reading and writing Excel fonts. + + It stores all Excel compatible properties of a font. In detail this is the + name, family, character set, height, color, boldness, posture, script, + underline, strikeout, outline and shadow of the font. + */ +struct XclFontData +{ + String maName; /// Font name. + String maStyle; /// String with styles (bold, italic). + Color maColor; /// Font color. + sal_uInt16 mnHeight; /// Font height in twips (1/20 of a point). + sal_uInt16 mnWeight; /// Boldness: 400=normal, 700=bold. + sal_uInt16 mnEscapem; /// Escapement type. + sal_uInt8 mnFamily; /// Windows font family. + sal_uInt8 mnCharSet; /// Windows character set. + sal_uInt8 mnUnderline; /// Underline style. + bool mbItalic; /// true = Italic. + bool mbStrikeout; /// true = Struck out. + bool mbOutline; /// true = Outlined. + bool mbShadow; /// true = Shadowed. + + /** Constructs an empty font data structure. */ + explicit XclFontData(); + /** Constructs a font data structure and fills it with the passed font attributes (except color). */ + explicit XclFontData( const Font& rFont ); + /** As directly above but also fills in the escapement member. */ + explicit XclFontData( const SvxFont& rFont ); + + /** Resets all members to default (empty) values. */ + void Clear(); + /** Fills all members (except color and escapement) from the passed font. */ + void FillFromVclFont( const Font& rFont ); + /** Fills all members (except color) from the passed SVX font. */ + void FillFromSvxFont( const SvxFont& rFont ); + +// *** conversion of VCL/SVX constants *** ------------------------------------ + + /** Returns the Calc font family. */ + FontFamily GetScFamily( rtl_TextEncoding eDefTextEnc ) const; + /** Returns the font text encoding. */ + rtl_TextEncoding GetFontEncoding() const; + /** Returns the Calc font posture. */ + FontItalic GetScPosture() const; + /** Returns the Calc font weight. */ + FontWeight GetScWeight() const; + /** Returns the Calc font underline style. */ + FontUnderline GetScUnderline() const; + /** Returns the Calc escapement style. */ + SvxEscapement GetScEscapement() const; + /** Returns the Calc strike-out style. */ + FontStrikeout GetScStrikeout() const; + + /** Sets the Calc font height (in twips). */ + void SetScHeight( sal_Int32 nTwips ); + /** Sets the Calc font family. */ + void SetScFamily( FontFamily eScFamily ); + /** Sets the font text encoding. */ + void SetFontEncoding( rtl_TextEncoding eFontEnc ); + /** Sets the Calc font posture. */ + void SetScPosture( FontItalic eScPosture ); + /** Sets the Calc font weight. */ + void SetScWeight( FontWeight eScWeight ); + /** Sets the Calc underline style. */ + void SetScUnderline( FontUnderline eScUnderl ); + /** Sets the Calc escapement style. */ + void SetScEscapement( short nScEscapem ); + /** Sets the Calc strike-out style. */ + void SetScStrikeout( FontStrikeout eScStrikeout ); + +// *** conversion of API constants *** ---------------------------------------- + + /** Returns the API font height. */ + float GetApiHeight() const; + /** Returns the API font family. */ + sal_Int16 GetApiFamily() const; + /** Returns the API font text encoding. */ + sal_Int16 GetApiFontEncoding() const; + /** Returns the API font posture. */ + ::com::sun::star::awt::FontSlant GetApiPosture() const; + /** Returns the API font weight. */ + float GetApiWeight() const; + /** Returns the API font underline style. */ + sal_Int16 GetApiUnderline() const; + /** Returns the API escapement style. */ + sal_Int16 GetApiEscapement() const; + /** Returns the API font strike-out style. */ + sal_Int16 GetApiStrikeout() const; + + /** Sets the API font height. */ + void SetApiHeight( float fPoint ); + /** Sets the API font family. */ + void SetApiFamily( sal_Int16 nApiFamily ); +//UNUSED2009-05 /** Sets the API font text encoding. */ +//UNUSED2009-05 void SetApiFontEncoding( sal_Int16 nApiFontEnc ); + /** Sets the API font posture. */ + void SetApiPosture( ::com::sun::star::awt::FontSlant eApiPosture ); + /** Sets the API font weight. */ + void SetApiWeight( float fApiWeight ); + /** Sets the API font underline style. */ + void SetApiUnderline( sal_Int16 nApiUnderl ); + /** Sets the API escapement style. */ + void SetApiEscapement( sal_Int16 nApiEscapem ); + /** Sets the API font strike-out style. */ + void SetApiStrikeout( sal_Int16 nApiStrikeout ); +}; + +bool operator==( const XclFontData& rLeft, const XclFontData& rRight ); + +// ---------------------------------------------------------------------------- + +/** Enumerates different types of Which-IDs for font items. */ +enum XclFontItemType +{ + EXC_FONTITEM_CELL, /// Use Calc Which-IDs (ATTR_*). + EXC_FONTITEM_EDITENG, /// Use edit engine Which-IDs (EE_CHAR_*). + EXC_FONTITEM_HF, /// Use header/footer edit engine Which-IDs (EE_CHAR_*). + EXC_FONTITEM_NOTE /// Use note edit engine Which-IDs (EE_CHAR_*), special font handling. +}; + +/** Enumerates different types for objects with font settings (using different property names). */ +enum XclFontPropSetType +{ + EXC_FONTPROPSET_CHART, /// All text objects in charts. + EXC_FONTPROPSET_CONTROL /// Text formatting in form controls. +}; + +// ---------------------------------------------------------------------------- + +/** Helper class for usage of property sets. */ +class XclFontPropSetHelper +{ +public: + explicit XclFontPropSetHelper(); + + /** Reads all font properties from the passed property set. */ + void ReadFontProperties( XclFontData& rFontData, + const ScfPropertySet& rPropSet, XclFontPropSetType eType, + sal_Int16 nScript = -1 ); + + /** Writes all font properties to the passed property set, uses passed color as font color. */ + void WriteFontProperties( + ScfPropertySet& rPropSet, XclFontPropSetType eType, + const XclFontData& rFontData, + bool bHasWstrn, bool bHasAsian, bool bHasCmplx, + const Color* pFontColor = 0 ); + +private: + /** Returns a chart property set helper according to the passed script type. */ + ScfPropSetHelper& GetChartHelper( sal_Int16 nScript ); + +private: + ScfPropSetHelper maHlpChCommon; /// Chart properties for all scripts. + ScfPropSetHelper maHlpChWstrn; /// Chart properties for Western script. + ScfPropSetHelper maHlpChAsian; /// Chart properties for Asian script. + ScfPropSetHelper maHlpChCmplx; /// Chart properties for Complex script. + ScfPropSetHelper maHlpChWstrnNoName; /// Chart properties for Western script, no font name. + ScfPropSetHelper maHlpChAsianNoName; /// Chart properties for Asian script, no font name. + ScfPropSetHelper maHlpChCmplxNoName; /// Chart properties for Complex script, no font name. + ScfPropSetHelper maHlpChEscapement; /// Chart properties for font escapement. + ScfPropSetHelper maHlpControl; /// Properties for form controls. +}; + +// Number formats ============================================================= + +struct XclNumFmt +{ + String maFormat; /// Format string, may be empty (meOffset used then). + NfIndexTableOffset meOffset; /// SvNumberFormatter format index, if maFormat is empty. + LanguageType meLanguage; /// Language type to be set with the number format. +}; + +// ---------------------------------------------------------------------------- + +class XclNumFmtBuffer +{ +public: + explicit XclNumFmtBuffer( const XclRoot& rRoot ); + + /** Returns the core index of the current standard number format. */ + inline ULONG GetStdScNumFmt() const { return mnStdScNumFmt; } + +protected: + typedef ::std::map< sal_uInt16, XclNumFmt > XclNumFmtMap; + + /** Clears all buffered data, used to set up for a new sheet. */ + void InitializeImport(); + + /** Returns the current number format map. */ + inline const XclNumFmtMap& GetFormatMap() const { return maFmtMap; } + +//UNUSED2008-05 /** Returns the number format with the specified Excel format index. */ +//UNUSED2008-05 const XclNumFmt* GetFormat( sal_uInt16 nXclNumFmt ) const; + + /** Inserts a new number format for the specified Excel format index. */ + void InsertFormat( sal_uInt16 nXclNumFmt, const String& rFormat ); + +private: + /** Inserts built-in number formats for the current system language. */ + void InsertBuiltinFormats(); + + XclNumFmtMap maFmtMap; /// Map containing all default and user-defined formats. + LanguageType meSysLang; /// Current system language. + ULONG mnStdScNumFmt; /// Calc format key for standard number format. +}; + +// Cell formatting data (XF) ================================================== + +/** Contains all cell protection attributes. */ +struct XclCellProt +{ + bool mbLocked; /// true = Locked against editing. + bool mbHidden; /// true = Formula is hidden. + + explicit XclCellProt(); +}; + +bool operator==( const XclCellProt& rLeft, const XclCellProt& rRight ); + +// ---------------------------------------------------------------------------- + +/** Contains all cell alignment attributes. */ +struct XclCellAlign +{ + sal_uInt8 mnHorAlign; /// Horizontal alignment. + sal_uInt8 mnVerAlign; /// Vertical alignment. + sal_uInt8 mnOrient; /// Text orientation. + sal_uInt8 mnTextDir; /// CTL text direction. + sal_uInt8 mnRotation; /// Text rotation angle. + sal_uInt8 mnIndent; /// Indentation. + bool mbLineBreak; /// true = Multi-line text. + bool mbShrink; /// true = Shrink to fit cell size. + + explicit XclCellAlign(); + + /** Returns the Calc horizontal alignment. */ + SvxCellHorJustify GetScHorAlign() const; + /** Returns the Calc vertical alignment. */ + SvxCellVerJustify GetScVerAlign() const; + /** Returns the Calc frame direction. */ + SvxFrameDirection GetScFrameDir() const; + + /** Sets the Calc horizontal alignment. */ + void SetScHorAlign( SvxCellHorJustify eHorJust ); + /** Sets the Calc vertical alignment. */ + void SetScVerAlign( SvxCellVerJustify eVerJust ); + /** Sets the Calc frame direction. */ + void SetScFrameDir( SvxFrameDirection eFrameDir ); +}; + +bool operator==( const XclCellAlign& rLeft, const XclCellAlign& rRight ); + +// ---------------------------------------------------------------------------- + +/** Contains color and line style for each cell border line. */ +struct XclCellBorder +{ + sal_uInt16 mnLeftColor; /// Palette index for left line. + sal_uInt16 mnRightColor; /// Palette index for right line. + sal_uInt16 mnTopColor; /// Palette index for top line. + sal_uInt16 mnBottomColor; /// Palette index for bottom line. + sal_uInt16 mnDiagColor; /// Palette index for diagonal line(s). + sal_uInt8 mnLeftLine; /// Style of left line. + sal_uInt8 mnRightLine; /// Style of right line. + sal_uInt8 mnTopLine; /// Style of top line. + sal_uInt8 mnBottomLine; /// Style of bottom line. + sal_uInt8 mnDiagLine; /// Style of diagonal line(s). + bool mbDiagTLtoBR; /// true = Top-left to bottom-right on. + bool mbDiagBLtoTR; /// true = Bottom-left to top-right on. + + explicit XclCellBorder(); +}; + +bool operator==( const XclCellBorder& rLeft, const XclCellBorder& rRight ); + +// ---------------------------------------------------------------------------- + +/** Contains background colors and pattern for a cell. */ +struct XclCellArea +{ + sal_uInt16 mnForeColor; /// Palette index to foreground color. + sal_uInt16 mnBackColor; /// Palette index to background color. + sal_uInt8 mnPattern; /// Fill pattern. + + explicit XclCellArea(); + + /** Returns true, if the area represents transparent state. */ + bool IsTransparent() const; +}; + +bool operator==( const XclCellArea& rLeft, const XclCellArea& rRight ); + +// ---------------------------------------------------------------------------- + +/** Contains base members for XF record import/export. + @descr In detail this class stores the XF type (cell/style), the index to the + parent style XF and all "attribute used" flags, which reflect the state of + specific attribute groups (true = user has changed the attributes). */ +class XclXFBase +{ +public: + explicit XclXFBase( bool bCellXF ); + virtual ~XclXFBase(); + + /** Sets all "attribute used" flags to the passed state. */ + void SetAllUsedFlags( bool bUsed ); + /** Returns true, if any "attribute used" flags are ste in this XF. */ + bool HasUsedFlags() const; + + /** Returns true, if this is a hard cell format. */ + inline bool IsCellXF() const { return mbCellXF; } + /** Returns true, if this is a cell style. */ + inline bool IsStyleXF() const { return !IsCellXF(); } + +protected: + /** Returns true, if this object is equal to the passed. */ + bool Equals( const XclXFBase& rCmp ) const; + +protected: + sal_uInt16 mnParent; /// Index to parent style XF. + bool mbCellXF; /// true = cell XF, false = style XF. + bool mbProtUsed; /// true = cell protection used. + bool mbFontUsed; /// true = font index used. + bool mbFmtUsed; /// true = number format used. + bool mbAlignUsed; /// true = alignment used. + bool mbBorderUsed; /// true = border data used. + bool mbAreaUsed; /// true = area data used. +}; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xltable.hxx b/sc/source/filter/inc/xltable.hxx new file mode 100644 index 000000000000..6b8f650568a9 --- /dev/null +++ b/sc/source/filter/inc/xltable.hxx @@ -0,0 +1,202 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLTABLE_HXX +#define SC_XLTABLE_HXX + +#include <sal/types.h> + +// Constants and Enumerations ================================================= + +// Specials for outlines ------------------------------------------------------ + +const sal_uInt8 EXC_OUTLINE_MAX = 7; +const sal_uInt8 EXC_OUTLINE_COUNT = EXC_OUTLINE_MAX + 1; + +// (0x0000, 0x0200) DIMENSIONS ------------------------------------------------ + +const sal_uInt16 EXC_ID2_DIMENSIONS = 0x0000; +const sal_uInt16 EXC_ID3_DIMENSIONS = 0x0200; + +// (0x0001, 0x0201) BLANK ----------------------------------------------------- + +const sal_uInt16 EXC_ID2_BLANK = 0x0001; +const sal_uInt16 EXC_ID3_BLANK = 0x0201; + +// (0x0002) INTEGER ----------------------------------------------------------- + +const sal_uInt16 EXC_ID2_INTEGER = 0x0002; + +// (0x0003, 0x0203) NUMBER ---------------------------------------------------- + +const sal_uInt16 EXC_ID2_NUMBER = 0x0003; +const sal_uInt16 EXC_ID3_NUMBER = 0x0203; + +// (0x0004, 0x0204) LABEL ----------------------------------------------------- + +const sal_uInt16 EXC_ID2_LABEL = 0x0004; +const sal_uInt16 EXC_ID3_LABEL = 0x0204; + +const sal_uInt8 EXC_LABEL_MAXLEN = 0xFF; + +// (0x0005, 0x0205) BOOLERR --------------------------------------------------- + +const sal_uInt16 EXC_ID2_BOOLERR = 0x0005; +const sal_uInt16 EXC_ID3_BOOLERR = 0x0205; + +const sal_uInt8 EXC_BOOLERR_BOOL = 0x00; +const sal_uInt8 EXC_BOOLERR_ERROR = 0x01; + +// (0x0006, 0x0206, 0x0406) FORMULA ------------------------------------------- + +const sal_uInt16 EXC_ID2_FORMULA = 0x0006; +const sal_uInt16 EXC_ID3_FORMULA = 0x0206; +const sal_uInt16 EXC_ID4_FORMULA = 0x0406; + +const sal_uInt16 EXC_FORMULA_RECALC_ALWAYS = 0x0001; +const sal_uInt16 EXC_FORMULA_RECALC_ONLOAD = 0x0002; +const sal_uInt16 EXC_FORMULA_SHARED = 0x0008; +const sal_uInt16 EXC_FORMULA_DEFAULTFLAGS = EXC_FORMULA_RECALC_ONLOAD; + +const sal_uInt8 EXC_FORMULA_RES_STRING = 0x00; /// Result is a string. +const sal_uInt8 EXC_FORMULA_RES_BOOL = 0x01; /// Result is Boolean value. +const sal_uInt8 EXC_FORMULA_RES_ERROR = 0x02; /// Result is error code. +const sal_uInt8 EXC_FORMULA_RES_EMPTY = 0x03; /// Result is empty cell (BIFF8 only). + +// (0x0007, 0x0207) STRING ---------------------------------------------------- + +const sal_uInt16 EXC_ID2_STRING = 0x0007; +const sal_uInt16 EXC_ID3_STRING = 0x0207; + +// (0x0008, 0x0208) ROW ------------------------------------------------------- + +const sal_uInt16 EXC_ID2_ROW = 0x0008; +const sal_uInt16 EXC_ID3_ROW = 0x0208; + +const sal_uInt16 EXC_ROW_COLLAPSED = 0x0010; +const sal_uInt16 EXC_ROW_HIDDEN = 0x0020; +const sal_uInt16 EXC_ROW_UNSYNCED = 0x0040; +const sal_uInt16 EXC_ROW_USEDEFXF = 0x0080; +const sal_uInt16 EXC_ROW_DEFAULTFLAGS = 0x0100; + +const sal_uInt16 EXC_ROW_XFMASK = 0x0FFF; + +const sal_uInt16 EXC_ROW_DEFAULTHEIGHT = 255; +const sal_uInt16 EXC_ROW_FLAGDEFHEIGHT = 0x8000; +const sal_uInt16 EXC_ROW_HEIGHTMASK = 0x7FFF; + +const sal_uInt16 EXC_ROW_ROWBLOCKSIZE = 32; /// Number of rows in a row block. + +// (0x0020) COLUMNDEFAULT ----------------------------------------------------- + +const sal_uInt16 EXC_ID_COLUMNDEFAULT = 0x0020; + +// (0x0021, 0x0221) ARRAY ----------------------------------------------------- + +const sal_uInt16 EXC_ID2_ARRAY = 0x0021; +const sal_uInt16 EXC_ID3_ARRAY = 0x0221; + +const sal_uInt16 EXC_ARRAY_RECALC_ALWAYS = 0x0001; +const sal_uInt16 EXC_ARRAY_RECALC_ONLOAD = 0x0002; +const sal_uInt16 EXC_ARRAY_DEFAULTFLAGS = EXC_ARRAY_RECALC_ONLOAD; + +// (0x0024) COLWIDTH ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_COLWIDTH = 0x0024; + +// (0x0025, 0x0225) DEFAULTROWHEIGHT ------------------------------------------ + +const sal_uInt16 EXC_ID2_DEFROWHEIGHT = 0x0025; +const sal_uInt16 EXC_ID3_DEFROWHEIGHT = 0x0225; + +const sal_uInt16 EXC_DEFROW_UNSYNCED = 0x0001; +const sal_uInt16 EXC_DEFROW_HIDDEN = 0x0002; +const sal_uInt16 EXC_DEFROW_SPACEABOVE = 0x0004; +const sal_uInt16 EXC_DEFROW_SPACEBELOW = 0x0008; +const sal_uInt16 EXC_DEFROW_DEFAULTFLAGS = 0x0000; + +const sal_uInt16 EXC_DEFROW_DEFAULTHEIGHT = 255; + +// (0x0036, 0x0236) TABLEOP --------------------------------------------------- + +const sal_uInt16 EXC_ID2_TABLEOP = 0x0036; +const sal_uInt16 EXC_ID3_TABLEOP = 0x0236; + +const sal_uInt16 EXC_TABLEOP_RECALC_ALWAYS = 0x0001; +const sal_uInt16 EXC_TABLEOP_RECALC_ONLOAD = 0x0002; +const sal_uInt16 EXC_TABLEOP_ROW = 0x0004; +const sal_uInt16 EXC_TABLEOP_BOTH = 0x0008; +const sal_uInt16 EXC_TABLEOP_DEFAULTFLAGS = EXC_TABLEOP_RECALC_ONLOAD; + +// (0x0037) TABLEOP2 ---------------------------------------------------------- + +const sal_uInt16 EXC_ID2_TABLEOP2 = 0x0037; + +// (0x0055) DEFCOLWIDTH ------------------------------------------------------- + +const sal_uInt16 EXC_ID_DEFCOLWIDTH = 0x0055; +const sal_uInt16 EXC_DEFCOLWIDTH_DEF = 10; + +// (0x007D) COLINFO ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_COLINFO = 0x007D; + +const sal_uInt16 EXC_COLINFO_HIDDEN = 0x0001; +const sal_uInt16 EXC_COLINFO_COLLAPSED = 0x1000; + +// (0x0080) GUTS -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_GUTS = 0x0080; + +// (0x00BD) MULRK ------------------------------------------------------------- + +const sal_uInt16 EXC_ID_MULRK = 0x00BD; + +// (0x00BE) MULBLANK ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_MULBLANK = 0x00BE; + +// (0x00D6) RSTRING ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_RSTRING = 0x00D6; + +// (0x00FD) LABELSST ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_LABELSST = 0x00FD; + +// (0x027E) RK ---------------------------------------------------------------- + +const sal_uInt16 EXC_ID_RK = 0x027E; + +// (0x04BC) SHRFMLA ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_SHRFMLA = 0x04BC; + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xltools.hxx b/sc/source/filter/inc/xltools.hxx new file mode 100644 index 000000000000..efe20a583104 --- /dev/null +++ b/sc/source/filter/inc/xltools.hxx @@ -0,0 +1,267 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLTOOLS_HXX +#define SC_XLTOOLS_HXX + +#include "address.hxx" +#include "ftools.hxx" + +class SfxObjectShell; + +// BIFF versions ============================================================== + +#define DBG_ERROR_BIFF() DBG_ERRORFILE( "Unknown BIFF type!" ) +#define DBG_ASSERT_BIFF( c ) DBG_ASSERT( c, "Unknown BIFF type!" ) + +// Enumerations =============================================================== + +/** An enumeration for all Excel error codes and the values true and false. */ +enum XclBoolError +{ + xlErrNull, /// The error code #NULL! + xlErrDiv0, /// The error code #DIV/0! + xlErrValue, /// The error code #VALUE! + xlErrRef, /// The error code #REF! + xlErrName, /// The error code #NAME? + xlErrNum, /// The error code #NUM! + xlErrNA, /// The error code #N/A! + xlErrTrue, /// The Boolean value true. + xlErrFalse, /// The Boolean value false. + xlErrUnknown /// For unknown codes and values. +}; + +// GUID import/export ========================================================= + +class XclImpStream; +class XclExpStream; + +/** This struct stores a GUID (class ID) and supports reading, writing and comparison. */ +struct XclGuid +{ + sal_uInt8 mpnData[ 16 ]; /// Stores GUID always in little endian. + + explicit XclGuid(); + explicit XclGuid( + sal_uInt32 nData1, + sal_uInt16 nData2, sal_uInt16 nData3, + sal_uInt8 nData41, sal_uInt8 nData42, + sal_uInt8 nData43, sal_uInt8 nData44, + sal_uInt8 nData45, sal_uInt8 nData46, + sal_uInt8 nData47, sal_uInt8 nData48 ); +}; + +bool operator==( const XclGuid& rCmp1, const XclGuid& rCmp2 ); +inline bool operator!=( const XclGuid& rCmp1, const XclGuid& rCmp2 ) { return !(rCmp1 == rCmp2); } +bool operator<( const XclGuid& rCmp1, const XclGuid& rCmp2 ); + +XclImpStream& operator>>( XclImpStream& rStrm, XclGuid& rGuid ); +XclExpStream& operator<<( XclExpStream& rStrm, const XclGuid& rGuid ); + +// Excel Tools ================================================================ + +class SvStream; +class ScDocument; + +/** This class contains static helper methods for the Excel import and export filters. */ +class XclTools : ScfNoInstance +{ +public: + // GUID's ----------------------------------------------------------------- + + static const XclGuid maGuidStdLink; /// GUID of StdLink (HLINK record). + static const XclGuid maGuidUrlMoniker; /// GUID of URL moniker (HLINK record). + static const XclGuid maGuidFileMoniker; /// GUID of file moniker (HLINK record). + + // numeric conversion ----------------------------------------------------- + + /** Calculates the double value from an RK value (encoded integer or double). */ + static double GetDoubleFromRK( sal_Int32 nRKValue ); + /** Calculates an RK value (encoded integer or double) from a double value. + @param rnRKValue Returns the calculated RK value. + @param fValue The double value. + @return true = An RK value could be created. */ + static bool GetRKFromDouble( sal_Int32& rnRKValue, double fValue ); + + /** Calculates an angle (in 1/100 of degrees) from an Excel angle value. + @param nRotForStacked This value will be returned, if nXclRot contains 'stacked'. */ + static sal_Int32 GetScRotation( sal_uInt16 nXclRot, sal_Int32 nRotForStacked ); + /** Calculates the Excel angle value from an angle in 1/100 of degrees. */ + static sal_uInt8 GetXclRotation( sal_Int32 nScRot ); + + /** Calculates BIFF8 rotation angle from BIFF2-BIFF5 text orientation. */ + static sal_uInt8 GetXclRotFromOrient( sal_uInt8 nXclOrient ); + /** Calculates BIFF2-BIFF5 text orientation from BIFF8 rotation angle. */ + static sal_uInt8 GetXclOrientFromRot( sal_uInt16 nXclRot ); + + /** Converts a Calc error code to an Excel error code. */ + static sal_uInt8 GetXclErrorCode( USHORT nScError ); + /** Converts an Excel error code to a Calc error code. */ + static USHORT GetScErrorCode( sal_uInt8 nXclError ); + + /** Converts the passed BIFF error to a double containing the respective Calc error code. */ + static double ErrorToDouble( sal_uInt8 nXclError ); + /** Gets a translated error code or Boolean value from Excel error codes. + @param rfDblValue Returns 0.0 for error codes or the value of a Boolean (0.0 or 1.0). + @param bErrorOrBool false = nError is a Boolean value; true = is an error value. + @param nValue The error code or Boolean value. */ + static XclBoolError ErrorToEnum( double& rfDblValue, sal_uInt8 bErrOrBool, sal_uInt8 nValue ); + + /** Returns the length in twips calculated from a length in inches. */ + static sal_uInt16 GetTwipsFromInch( double fInches ); + /** Returns the length in twips calculated from a length in 1/100 mm. */ + static sal_uInt16 GetTwipsFromHmm( sal_Int32 nHmm ); + + /** Returns the length in inches calculated from a length in twips. */ + static double GetInchFromTwips( sal_Int32 nTwips ); + /** Returns the length in inches calculated from a length in 1/100 mm. */ + static double GetInchFromHmm( sal_Int32 nHmm ); + + /** Returns the length in 1/100 mm calculated from a length in inches. */ + static sal_Int32 GetHmmFromInch( double fInches ); + /** Returns the length in 1/100 mm calculated from a length in twips. */ + static sal_Int32 GetHmmFromTwips( sal_Int32 nTwips ); + + /** Returns the Calc column width (twips) for the passed Excel width. + @param nScCharWidth Width of the '0' character in Calc (twips). */ + static USHORT GetScColumnWidth( sal_uInt16 nXclWidth, long nScCharWidth ); + /** Returns the Excel column width for the passed Calc width (twips). + @param nScCharWidth Width of the '0' character in Calc (twips). */ + static sal_uInt16 GetXclColumnWidth( USHORT nScWidth, long nScCharWidth ); + + /** Returns a correction value to convert column widths from/to default column widths. + @param nXclDefFontHeight Excel height of application default font. */ + static double GetXclDefColWidthCorrection( long nXclDefFontHeight ); + + // formatting ------------------------------------------------------------- + + /** Returns the best fitting color for an Excel pattern area format. */ + static Color GetPatternColor( const Color& rPattColor, const Color& rBackColor, sal_uInt16 nXclPattern ); + + // text encoding ---------------------------------------------------------- + + /** Returns a text encoding from an Excel code page. + @return The corresponding text encoding or RTL_TEXTENCODING_DONTKNOW. */ + static rtl_TextEncoding GetTextEncoding( sal_uInt16 nCodePage ); + + /** Returns an Excel code page from a text encoding. */ + static sal_uInt16 GetXclCodePage( rtl_TextEncoding eTextEnc ); + + // font names ------------------------------------------------------------- + + /** Returns the matching Excel font name for a passed Calc font name. */ + static String GetXclFontName( const String& rFontName ); + + // built-in defined names ------------------------------------------------- + + /** Returns the raw English UI representation of a built-in defined name used in NAME records. + @param cBuiltIn Excel index of the built-in name. */ + static String GetXclBuiltInDefName( sal_Unicode cBuiltIn ); + /** Returns the Calc UI representation of a built-in defined name used in NAME records. + @descr Adds a prefix to the representation returned by GetXclBuiltInDefName(). + @param cBuiltIn Excel index of the built-in name. */ + static String GetBuiltInDefName( sal_Unicode cBuiltIn ); + /** Returns the Excel built-in name index of the passed defined name from Calc. + @descr Ignores any characters following a valid representation of a built-in name. + @param pcBuiltIn (out-param) If not 0, the index of the built-in name will be returned here. + @return true = passed string is a built-in name; false = user-defined name. */ + static sal_Unicode GetBuiltInDefNameIndex( const String& rDefName ); + + // built-in style names --------------------------------------------------- + + /** Returns the specified built-in cell style name. + @param nStyleId The identifier of the built-in style. + @param rName Default name for unknown styles. + @param nLevel The zero-based outline level for RowLevel and ColLevel styles. + @return The style name or an empty string, if the parameters are not valid. */ + static String GetBuiltInStyleName( sal_uInt8 nStyleId, const String& rName, sal_uInt8 nLevel ); + /** Returns the passed style name with a special built-in prefix. */ + static String GetBuiltInStyleName( const String& rStyleName ); + /** Returns true, if the passed string is a name of an Excel built-in style. + @param pnStyleId If not 0, the found style identifier will be returned here. + @param pnNextChar If not 0, the index of the char after the evaluated substring will be returned here. */ + static bool IsBuiltInStyleName( const String& rStyleName, sal_uInt8* pnStyleId = 0, xub_StrLen* pnNextChar = 0 ); + /** Returns the Excel built-in style identifier of a passed style name. + @param rnStyleId The style identifier is returned here. + @param rnLevel The zero-based outline level for RowLevel and ColLevel styles is returned here. + @param rStyleName The style name to examine. + @return true = passed string is a built-in style name, false = user style. */ + static bool GetBuiltInStyleId( + sal_uInt8& rnStyleId, sal_uInt8& rnLevel, + const String& rStyleName ); + + // conditional formatting style names ------------------------------------- + + /** Returns the style name for a single condition of a conditional formatting. + @param nScTab The current Calc sheet index. + @param nFormat The zero-based index of the conditional formatting. + @param nCondition The zero-based index of the condition. + @return A style sheet name in the form "Excel_CondFormat_<sheet>_<format>_<condition>". */ + static String GetCondFormatStyleName( SCTAB nScTab, sal_Int32 nFormat, sal_uInt16 nCondition ); + /** Returns true, if the passed string is a name of a conditional format style created by Excel import. + @param pnNextChar If not 0, the index of the char after the evaluated substring will be returned here. */ + static bool IsCondFormatStyleName( const String& rStyleName, xub_StrLen* pnNextChar = 0 ); + + // stream handling -------------------------------------------------------- + + /** Skips a substream (BOF/EOF record block). Includes all embedded substreams. */ + static void SkipSubStream( XclImpStream& rStrm ); + + // Basic macro names ------------------------------------------------------ + + /** Returns the full StarBasic macro URL from an Excel macro name. */ + static ::rtl::OUString GetSbMacroUrl( const String& rMacroName, SfxObjectShell* pDocShell = 0 ); + /** Returns the full StarBasic macro URL from an Excel module and macro name. */ + static ::rtl::OUString GetSbMacroUrl( const String& rModuleName, const String& rMacroName, SfxObjectShell* pDocShell = 0 ); + /** Returns the Excel macro name from a full StarBasic macro URL. */ + static String GetXclMacroName( const ::rtl::OUString& rSbMacroUrl ); + +// ------------------------------------------------------------------------ +private: + static const String maDefNamePrefix; /// Prefix for built-in defined names. + static const String maStyleNamePrefix1; /// Prefix for built-in cell style names. + static const String maStyleNamePrefix2; /// Prefix for built-in cell style names from OOX filter. + static const String maCFStyleNamePrefix1; /// Prefix for cond. formatting style names. + static const String maCFStyleNamePrefix2; /// Prefix for cond. formatting style names from OOX filter. + static const ::rtl::OUString maSbMacroPrefix; /// Prefix for StarBasic macros. + static const ::rtl::OUString maSbMacroSuffix; /// Suffix for StarBasic macros. +}; + +// read/write colors ---------------------------------------------------------- + +/** Reads a color from the passed stream. + @descr The color has the format (all values 8-bit): Red, Green, Blue, 0. */ +XclImpStream& operator>>( XclImpStream& rStrm, Color& rColor ); + +/** Reads a color to the passed stream. + @descr The color has the format (all values 8-bit): Red, Green, Blue, 0. */ +XclExpStream& operator<<( XclExpStream& rStrm, const Color& rColor ); + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xltracer.hxx b/sc/source/filter/inc/xltracer.hxx new file mode 100644 index 000000000000..73ed3d0502c3 --- /dev/null +++ b/sc/source/filter/inc/xltracer.hxx @@ -0,0 +1,148 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// ============================================================================ + +#ifndef SC_XLTRACER_HXX +#define SC_XLTRACER_HXX + +#include "global.hxx" // ScAddress +#include "xltools.hxx" + +// As Trace features become implemented, we can safely delete the enum entry as +// we use the member mnID to keep track of the actual trace tag ID value. +enum XclTracerId +{ + eUnKnown , /// unused but allows us to set the correct index + eRowLimitExceeded , + eTabLimitExceeded , + ePassword , + ePrintRange , + eShortDate , + eBorderLineStyle , + eFillPattern , + eInvisibleGrid , + eFormattedNote , + eFormulaExtName , + eFormulaMissingArg , + ePivotDataSource , + ePivotChartExists , + eChartUnKnownType , + eChartTrendLines , + eChartErrorBars , + eChartOnlySheet , + eChartRange , + eChartDSName, + eChartDataTable, + eChartLegendPosition, + eChartTextFormatting, + eChartEmbeddedObj, + eChartAxisAuto, + eChartAxisManual, + eChartInvalidXY, + eUnsupportedObject , + eObjectNotPrintable , + eDVType, + eTraceLength /// this *should* always be the final entry +}; + +struct XclTracerDetails +{ + XclTracerId meProblemId; /// Excel Import Trace index. + sal_uInt32 mnID; /// actual ID Index trace tag Value + const sal_Char* mpContext; /// Context for problem e.g. Limits + const sal_Char* mpDetail; /// Context Detail e.g. SheetX + const sal_Char* mpProblem; /// Description of problem +}; + + +// ============================================================================ + +class MSFilterTracer; + +/** This class wraps an MSFilterTracer to create trace logs for import/export filters. */ +class XclTracer +{ +public: + explicit XclTracer( const String& rDocUrl, const ::rtl::OUString& rConfigPath ); + virtual ~XclTracer(); + + /** Returns true, if tracing is enabled. */ + inline bool IsEnabled() const { return mbEnabled; } + + /** Adds an attribute to be traced with the next Trace() call. */ + void AddAttribute( const ::rtl::OUString& rName, const ::rtl::OUString& rValue ); + + /** Creates an element including all attributes set up to this call. + @descr Removes all attributes after the element is traced. */ + void Trace( const ::rtl::OUString& rElementID, const ::rtl::OUString& rMessage ); + + /** Calls Trace() with a known document properties problem. */ + void TraceLog( XclTracerId eProblem, sal_Int32 nValue = 0 ); + + /** Calls AddAttribute() to create the Context & Detail for known problems. */ + void Context( XclTracerId eProblem, SCTAB nTab = 0 ); + + /** Ensure that particular traces are logged once per document. */ + void ProcessTraceOnce(XclTracerId eProblem, SCTAB nTab = 0); + + void TraceInvalidAddress(const ScAddress& rPos, const ScAddress& rMaxPos); + void TraceInvalidRow( SCTAB nTab, sal_uInt32 nRow, sal_uInt32 nMaxrow ); + void TraceInvalidTab( SCTAB nTab, SCTAB nMaxTab); + void TracePrintRange(); + void TraceDates(sal_uInt16 nNumFmt); + void TraceBorderLineStyle(bool bBorderLineStyle); + void TraceFillPattern(bool bFillPattern); + void TraceFormulaMissingArg(); + void TracePivotDataSource(bool bExternal); + void TracePivotChartExists(); + void TraceChartUnKnownType(); + void TraceChartOnlySheet(); + void TraceChartDataTable(); + void TraceChartLegendPosition(); + void TraceChartEmbeddedObj(); + void TraceUnsupportedObjects(); + void TraceObjectNotPrintable(); + void TraceDVType(bool bType); + + /** Returns the SVX filter tracer for usage in external code (i.e. Escher). */ + inline MSFilterTracer& GetBaseTracer() { return *mpTracer; } + +private: + typedef ::std::auto_ptr< MSFilterTracer > MSFilterTracerPtr; + MSFilterTracerPtr mpTracer; + bool mbEnabled; + typedef ::std::vector< bool > BoolVec; + /** array of flags corresponding to each entry in the XclTracerDetails table. */ + BoolVec maFirstTimes; +}; + + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/inc/xlview.hxx b/sc/source/filter/inc/xlview.hxx new file mode 100644 index 000000000000..c0c9d4b3d6e1 --- /dev/null +++ b/sc/source/filter/inc/xlview.hxx @@ -0,0 +1,178 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLVIEW_HXX +#define SC_XLVIEW_HXX + +#include <map> +#include <tools/color.hxx> +#include "ftools.hxx" +#include "xladdress.hxx" + +// Constants and enumerations ================================================= + +const sal_uInt16 EXC_ZOOM_MIN = 10; +const sal_uInt16 EXC_ZOOM_MAX = 400; + +// (0x001D) SELECTION --------------------------------------------------------- + +const sal_uInt16 EXC_ID_SELECTION = 0x001D; + +// (0x003D) WINDOW1 ----------------------------------------------------------- + +const sal_uInt16 EXC_ID_WINDOW1 = 0x003D; + +const sal_uInt16 EXC_WIN1_HIDDEN = 0x0001; +const sal_uInt16 EXC_WIN1_MINIMIZED = 0x0002; +const sal_uInt16 EXC_WIN1_HOR_SCROLLBAR = 0x0008; +const sal_uInt16 EXC_WIN1_VER_SCROLLBAR = 0x0010; +const sal_uInt16 EXC_WIN1_TABBAR = 0x0020; + +// (0x003E, 0x023E) WINDOW2 --------------------------------------------------- + +const sal_uInt16 EXC_ID2_WINDOW2 = 0x003E; +const sal_uInt16 EXC_ID_WINDOW2 = 0x023E; + +const sal_uInt16 EXC_WIN2_SHOWFORMULAS = 0x0001; +const sal_uInt16 EXC_WIN2_SHOWGRID = 0x0002; +const sal_uInt16 EXC_WIN2_SHOWHEADINGS = 0x0004; +const sal_uInt16 EXC_WIN2_FROZEN = 0x0008; +const sal_uInt16 EXC_WIN2_SHOWZEROS = 0x0010; +const sal_uInt16 EXC_WIN2_DEFGRIDCOLOR = 0x0020; +const sal_uInt16 EXC_WIN2_MIRRORED = 0x0040; +const sal_uInt16 EXC_WIN2_SHOWOUTLINE = 0x0080; +const sal_uInt16 EXC_WIN2_FROZENNOSPLIT = 0x0100; +const sal_uInt16 EXC_WIN2_SELECTED = 0x0200; +const sal_uInt16 EXC_WIN2_DISPLAYED = 0x0400; +const sal_uInt16 EXC_WIN2_PAGEBREAKMODE = 0x0800; + +const sal_uInt16 EXC_WIN2_NORMALZOOM_DEF = 100; /// Default zoom for normal view. +const sal_uInt16 EXC_WIN2_PAGEZOOM_DEF = 60; /// Default zoom for pagebreak preview. + +// (0x0041) PANE -------------------------------------------------------------- + +const sal_uInt16 EXC_ID_PANE = 0x0041; + +const sal_uInt8 EXC_PANE_BOTTOMRIGHT = 0; /// Bottom-right pane. +const sal_uInt8 EXC_PANE_TOPRIGHT = 1; /// Right, or top-right pane. +const sal_uInt8 EXC_PANE_BOTTOMLEFT = 2; /// Bottom, or bottom-left pane. +const sal_uInt8 EXC_PANE_TOPLEFT = 3; /// Single, top, left, or top-left pane. + +// (0x00A0) SCL --------------------------------------------------------------- + +const sal_uInt16 EXC_ID_SCL = 0x00A0; + +// (0x0862) SHEETEXT ---------------------------------------------------------- + +const sal_uInt16 EXC_ID_SHEETEXT = 0x0862; /// header id for sheetext +const sal_uInt8 EXC_SHEETEXT_TABCOLOR = 0x7F; /// mask for tab color +const sal_uInt16 EXC_COLOR_NOTABBG = 0x7F; /// Excel ignores Tab color when set to this value... +// Structs ==================================================================== + +/** Contains all view settings for the entire document. */ +struct XclDocViewData +{ + sal_uInt16 mnWinX; /// X position of the document window (twips). + sal_uInt16 mnWinY; /// Y position of the document window (twips). + sal_uInt16 mnWinWidth; /// Width of the document window (twips). + sal_uInt16 mnWinHeight; /// Height of the document window (twips). + sal_uInt16 mnFlags; /// Additional flags. + sal_uInt16 mnDisplXclTab; /// Displayed (active) sheet. + sal_uInt16 mnFirstVisXclTab; /// First visible sheet. + sal_uInt16 mnXclSelectCnt; /// Number of selected sheets. + sal_uInt16 mnTabBarWidth; /// Width of sheet tabbar (1/1000 of window width). + + explicit XclDocViewData(); +}; + +// ---------------------------------------------------------------------------- + +/** Contains all settings for a selection in a single pane of a sheet. */ +struct XclSelectionData +{ + XclAddress maXclCursor; /// Cell cursor position. + XclRangeList maXclSelection; /// Selected cell ranges. + sal_uInt16 mnCursorIdx; /// Index of cursor in selection list. + + inline explicit XclSelectionData() : mnCursorIdx( 0 ) {} +}; + +typedef ScfRef< XclSelectionData > XclSelectionDataRef; + +// ---------------------------------------------------------------------------- + +/** Contains all view settings for a single sheet. */ +struct XclTabViewData +{ + typedef ::std::map< sal_uInt8, XclSelectionDataRef > XclSelectionMap; + + XclSelectionMap maSelMap; /// Selections of all panes. + Color maGridColor; /// Grid color. + XclAddress maFirstXclPos; /// First visible cell. + XclAddress maSecondXclPos; /// First visible cell in additional panes. + sal_uInt16 mnSplitX; /// Split X position, or number of frozen columns. + sal_uInt16 mnSplitY; /// Split Y position, or number of frozen rows. + sal_uInt16 mnNormalZoom; /// Zoom factor for normal view. + sal_uInt16 mnPageZoom; /// Zoom factor for pagebreak preview. + sal_uInt16 mnCurrentZoom; /// Zoom factor for current view. + sal_uInt8 mnActivePane; /// Active pane (with cell cursor). + bool mbSelected; /// true = Sheet is selected. + bool mbDisplayed; /// true = Sheet is displayed (active). + bool mbMirrored; /// true = Mirrored (right-to-left) sheet. + bool mbFrozenPanes; /// true = Frozen panes; false = split window. + bool mbPageMode; /// true = Pagebreak preview; false = Normal view. + bool mbDefGridColor; /// true = Default grid color. + bool mbShowFormulas; /// true = Show formulas instead of results. + bool mbShowGrid; /// true = Show cell grid. + bool mbShowHeadings; /// true = Show column/row headings. + bool mbShowZeros; /// true = Show zero value zells. + bool mbShowOutline; /// true = Show outlines. + Color maTabBgColor; /// Tab Color default = (COL_AUTO ) + bool IsDefaultTabBgColor() const { return maTabBgColor == Color(COL_AUTO) ? TRUE : FALSE; }; + sal_uInt32 mnTabBgColorId; /// pallette color id + + explicit XclTabViewData(); + ~XclTabViewData(); + + /** Sets Excel default view settings. */ + void SetDefaults(); + + /** Returns true, if the window is split in any direction. */ + bool IsSplit() const; + /** Returns true, if the specified pane (EXC_PANE_*) is available. */ + bool HasPane( sal_uInt8 nPaneId ) const; + + /** Returns the selection data, if available, otherwise 0. */ + const XclSelectionData* GetSelectionData( sal_uInt8 nPane ) const; + /** Returns read/write access to the selection data of the specified pane. */ + XclSelectionData& CreateSelectionData( sal_uInt8 nPane ); +}; + +// ============================================================================ + +#endif + |