Kaydet (Commit) 17e68606 authored tarafından Caolán McNamara's avatar Caolán McNamara

fdo#84872 give each SheetDataContext a new FormulaParser

Change-Id: I120a9d0943db38571892defe1b5d3169158e3e42
üst b1e9163b
...@@ -36,7 +36,7 @@ namespace xls { ...@@ -36,7 +36,7 @@ namespace xls {
struct SheetDataContextBase struct SheetDataContextBase
{ {
AddressConverter& mrAddressConv; /// The address converter. AddressConverter& mrAddressConv; /// The address converter.
FormulaParser& mrFormulaParser; /// The formula parser. std::unique_ptr<FormulaParser> mxFormulaParser; /// The formula parser, different one for each SheetDataContext
SheetDataBuffer& mrSheetData; /// The sheet data buffer for cell content and formatting. SheetDataBuffer& mrSheetData; /// The sheet data buffer for cell content and formatting.
CellModel maCellData; /// Position, contents, formatting of current imported cell. CellModel maCellData; /// Position, contents, formatting of current imported cell.
CellFormulaModel maFmlaData; /// Settings for a cell formula. CellFormulaModel maFmlaData; /// Settings for a cell formula.
......
...@@ -244,8 +244,10 @@ public: ...@@ -244,8 +244,10 @@ public:
// converters ------------------------------------------------------------- // converters -------------------------------------------------------------
/** Returns the import formula parser (import filter only!). */ /** Returns a shared import formula parser (import filter only!). */
FormulaParser& getFormulaParser() const; FormulaParser& getFormulaParser() const;
/** Returns an unshared import formula parser (import filter only!). */
FormulaParser* createFormulaParser() const;
/** Returns the measurement unit converter. */ /** Returns the measurement unit converter. */
UnitConverter& getUnitConverter() const; UnitConverter& getUnitConverter() const;
/** Returns the converter for string to cell address/range conversion. */ /** Returns the converter for string to cell address/range conversion. */
......
...@@ -64,10 +64,10 @@ const sal_uInt8 BIFF12_ROW_SHOWPHONETIC = 0x01; ...@@ -64,10 +64,10 @@ const sal_uInt8 BIFF12_ROW_SHOWPHONETIC = 0x01;
SheetDataContextBase::SheetDataContextBase( const WorksheetHelper& rHelper ) : SheetDataContextBase::SheetDataContextBase( const WorksheetHelper& rHelper ) :
mrAddressConv( rHelper.getAddressConverter() ), mrAddressConv( rHelper.getAddressConverter() ),
mrFormulaParser( rHelper.getFormulaParser() ),
mrSheetData( rHelper.getSheetData() ), mrSheetData( rHelper.getSheetData() ),
mnSheet( rHelper.getSheetIndex() ) mnSheet( rHelper.getSheetIndex() )
{ {
mxFormulaParser.reset(rHelper.createFormulaParser());
} }
SheetDataContextBase::~SheetDataContextBase() SheetDataContextBase::~SheetDataContextBase()
...@@ -426,7 +426,7 @@ bool SheetDataContext::readCellHeader( SequenceInputStream& rStrm, CellType eCel ...@@ -426,7 +426,7 @@ bool SheetDataContext::readCellHeader( SequenceInputStream& rStrm, CellType eCel
ApiTokenSequence SheetDataContext::readCellFormula( SequenceInputStream& rStrm ) ApiTokenSequence SheetDataContext::readCellFormula( SequenceInputStream& rStrm )
{ {
rStrm.skip( 2 ); rStrm.skip( 2 );
return mrFormulaParser.importFormula( maCellData.maCellAddr, FORMULATYPE_CELL, rStrm ); return mxFormulaParser->importFormula( maCellData.maCellAddr, FORMULATYPE_CELL, rStrm );
} }
bool SheetDataContext::readFormulaRef( SequenceInputStream& rStrm ) bool SheetDataContext::readFormulaRef( SequenceInputStream& rStrm )
...@@ -536,7 +536,7 @@ void SheetDataContext::importArray( SequenceInputStream& rStrm ) ...@@ -536,7 +536,7 @@ void SheetDataContext::importArray( SequenceInputStream& rStrm )
if( readFormulaRef( rStrm ) && maFmlaData.isValidArrayRef( maCellData.maCellAddr ) ) if( readFormulaRef( rStrm ) && maFmlaData.isValidArrayRef( maCellData.maCellAddr ) )
{ {
rStrm.skip( 1 ); rStrm.skip( 1 );
ApiTokenSequence aTokens = mrFormulaParser.importFormula( maCellData.maCellAddr, FORMULATYPE_ARRAY, rStrm ); ApiTokenSequence aTokens = mxFormulaParser->importFormula( maCellData.maCellAddr, FORMULATYPE_ARRAY, rStrm );
mrSheetData.createArrayFormula( maFmlaData.maFormulaRef, aTokens ); mrSheetData.createArrayFormula( maFmlaData.maFormulaRef, aTokens );
} }
} }
......
...@@ -202,8 +202,10 @@ public: ...@@ -202,8 +202,10 @@ public:
// converters ------------------------------------------------------------- // converters -------------------------------------------------------------
/** Returns the import formula parser. */ /** Returns a shared import formula parser. */
inline FormulaParser& getFormulaParser() const { return *mxFmlaParser; } inline FormulaParser& getFormulaParser() const { return *mxFmlaParser; }
/** Returns an unshared import formula parser. */
inline FormulaParser* createFormulaParser() { return new FormulaParser(*this); }
/** Returns the measurement unit converter. */ /** Returns the measurement unit converter. */
inline UnitConverter& getUnitConverter() const { return *mxUnitConverter; } inline UnitConverter& getUnitConverter() const { return *mxUnitConverter; }
/** Returns the converter for string to cell address/range conversion. */ /** Returns the converter for string to cell address/range conversion. */
...@@ -590,7 +592,7 @@ void WorkbookGlobals::initialize( bool bWorkbookFile ) ...@@ -590,7 +592,7 @@ void WorkbookGlobals::initialize( bool bWorkbookFile )
mpDoc->EnableExecuteLink(false); mpDoc->EnableExecuteLink(false);
mxProgressBar.reset( new SegmentProgressBar( mrBaseFilter.getStatusIndicator(), ScGlobal::GetRscString(STR_LOAD_DOC) ) ); mxProgressBar.reset( new SegmentProgressBar( mrBaseFilter.getStatusIndicator(), ScGlobal::GetRscString(STR_LOAD_DOC) ) );
mxFmlaParser.reset( new FormulaParser( *this ) ); mxFmlaParser.reset( createFormulaParser() );
//prevent unnecessary broadcasts and "half way listeners" as //prevent unnecessary broadcasts and "half way listeners" as
//is done in ScDocShell::BeforeXMLLoading() for ods //is done in ScDocShell::BeforeXMLLoading() for ods
...@@ -958,6 +960,11 @@ FormulaParser& WorkbookHelper::getFormulaParser() const ...@@ -958,6 +960,11 @@ FormulaParser& WorkbookHelper::getFormulaParser() const
return mrBookGlob.getFormulaParser(); return mrBookGlob.getFormulaParser();
} }
FormulaParser* WorkbookHelper::createFormulaParser() const
{
return mrBookGlob.createFormulaParser();
}
UnitConverter& WorkbookHelper::getUnitConverter() const UnitConverter& WorkbookHelper::getUnitConverter() const
{ {
return mrBookGlob.getUnitConverter(); return mrBookGlob.getUnitConverter();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment