blob: 4381bf1792767b9dc9d45f0d0a51e4ab0004f5f7 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SC_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,
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