/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef SC_FORMEL_HXX #define SC_FORMEL_HXX #include #include #include #include "tokstack.hxx" #include "root.hxx" #include #include // ----- 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, FT_Conditional }; //--------------------------------------------------------- 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 sal_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 sal_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: sal_Bool bHasRanges; _ScRangeList** ppTabLists; _ScRangeList* pAct; sal_uInt16 nAct; public: _ScRangeListTabs( void ); virtual ~_ScRangeListTabs(); void Append( ScSingleRefData aSRD, const sal_Bool bLimit = sal_True ); void Append( ScComplexRefData aCRD, const sal_Bool bLimit = sal_True ); inline sal_Bool HasRanges( void ) const; const ScRange* First( const sal_uInt16 nTab = 0 ); const ScRange* Next( void ); // const ScRange* NextContinue( void ); inline const _ScRangeList* GetActList( void ) const; }; inline sal_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 sal_uInt16 nBufferSize; // ...und seine Groesse ConverterBase( sal_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( sal_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; sal_Int32 nBytesLeft; inline void Ignore( const long nSeekRel ); inline void Read( sal_Char& nByte ); inline void Read( sal_uInt8& nByte ); inline void Read( sal_uInt16& nUINT16 ); inline void Read( sal_Int16& nINT16 ); inline void Read( double& fDouble ); inline void Read( sal_uInt32& nUINT32 ); LotusConverterBase( SvStream& rStr, sal_uInt16 nNewBuffer ); virtual ~LotusConverterBase(); public: //UNUSED2008-05 void Reset( sal_Int32 nLen ); //UNUSED2008-05 void Reset( sal_Int32 nLen, const ScAddress& rEingPos ); void Reset( const ScAddress& rEingPos ); virtual ConvErr Convert( const ScTokenArray*& rpErg, sal_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( sal_uInt8& nByte ) { aIn >> nByte; nBytesLeft--; } inline void LotusConverterBase::Read( sal_uInt16& nUINT16 ) { aIn >> nUINT16; nBytesLeft -= 2; } inline void LotusConverterBase::Read( sal_Int16& nINT16 ) { aIn >> nINT16; nBytesLeft -= 2; } inline void LotusConverterBase::Read( double& fDouble ) { aIn >> fDouble; nBytesLeft -= 8; } inline void LotusConverterBase::Read( sal_uInt32& nUINT32 ) { aIn >> nUINT32; nBytesLeft -= 4; } #endif