diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-11-15 10:37:26 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-11-18 17:25:37 -0500 |
commit | b8d4d3a59d022ee56b37a835ddb3a282344814e6 (patch) | |
tree | 8412075a484fd589b30a35bfd741094bf877ca75 /sc/source | |
parent | b7fd06bf98fea63aab368b4d0968811bdec395c6 (diff) |
Handle global range names and use CreateString() during xlsx import.
This makes the load speed slightly faster.
Change-Id: I64e4d4b8c42a68577350539f3812cafdc0433f96
Diffstat (limited to 'sc/source')
-rw-r--r-- | sc/source/core/tool/token.cxx | 43 | ||||
-rw-r--r-- | sc/source/core/tool/tokenstringcontext.cxx | 18 | ||||
-rw-r--r-- | sc/source/filter/oox/formulabuffer.cxx | 12 |
3 files changed, 50 insertions, 23 deletions
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 5dc92e61b984..60b4fb3be475 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -3262,7 +3262,22 @@ void appendTokenByType( sc::TokenStringContext& rCxt, OUStringBuffer& rBuf, cons // TODO : Implement this. break; case svIndex: - // TODO : Implement this. + { + sal_uInt16 nIndex = rToken.GetIndex(); + switch (eOp) + { + case ocName: + { + sc::TokenStringContext::IndexNameMapType::const_iterator it = rCxt.maGlobalRangeNames.find(nIndex); + if (it != rCxt.maGlobalRangeNames.end()) + rBuf.append(it->second); + } + break; + // TODO : Handle other name types. + default: + ; + } + } break; case svExternal: // TODO : Implement this. @@ -3324,23 +3339,19 @@ OUString ScTokenArray::CreateString( sc::TokenStringContext& rCxt, const ScAddre { const FormulaToken* pToken = *p; OpCode eOp = pToken->GetOpCode(); - switch (eOp) + bool bCheckType = true; + if (eOp == ocSpaces) { - case ocPush: - appendTokenByType(rCxt, aBuf, *pToken, rPos); - break; - case ocSpaces: - // TODO : Handle intersection operator '!!'. - aBuf.append(sal_Unicode(' ')); - break; - default: - { - if (eOp < rCxt.mxOpCodeMap->getSymbolCount()) - aBuf.append(rCxt.mxOpCodeMap->getSymbol(eOp)); - else - return OUString(); - } + // TODO : Handle intersection operator '!!'. + aBuf.append(' '); + continue; } + + if (eOp < rCxt.mxOpCodeMap->getSymbolCount()) + aBuf.append(rCxt.mxOpCodeMap->getSymbol(eOp)); + + if (bCheckType) + appendTokenByType(rCxt, aBuf, *pToken, rPos); } return aBuf.makeStringAndClear(); diff --git a/sc/source/core/tool/tokenstringcontext.cxx b/sc/source/core/tool/tokenstringcontext.cxx index 5fea0a9837d9..b26d338df278 100644 --- a/sc/source/core/tool/tokenstringcontext.cxx +++ b/sc/source/core/tool/tokenstringcontext.cxx @@ -9,12 +9,13 @@ #include "tokenstringcontext.hxx" #include "compiler.hxx" +#include "document.hxx" using namespace com::sun::star; namespace sc { -TokenStringContext::TokenStringContext( formula::FormulaGrammar::Grammar eGram ) : +TokenStringContext::TokenStringContext( const ScDocument* pDoc, formula::FormulaGrammar::Grammar eGram ) : meGram(eGram), mpRefConv(ScCompiler::GetRefConvention(formula::FormulaGrammar::extractRefConvention(eGram))) { @@ -22,6 +23,21 @@ TokenStringContext::TokenStringContext( formula::FormulaGrammar::Grammar eGram ) mxOpCodeMap = aComp.GetOpCodeMap(formula::FormulaGrammar::extractFormulaLanguage(eGram)); if (mxOpCodeMap) maErrRef = mxOpCodeMap->getSymbol(ocErrRef); + + if (pDoc) + { + maTabNames = pDoc->GetAllTableNames(); + const ScRangeName* pNames = pDoc->GetRangeName(); + if (pNames) + { + ScRangeName::const_iterator it = pNames->begin(), itEnd = pNames->end(); + for (; it != itEnd; ++it) + { + const ScRangeData* pData = it->second; + maGlobalRangeNames.insert(IndexNameMapType::value_type(pData->GetIndex(), pData->GetName())); + } + } + } } } diff --git a/sc/source/filter/oox/formulabuffer.cxx b/sc/source/filter/oox/formulabuffer.cxx index 7472d3d78255..d1cf118d13d2 100644 --- a/sc/source/filter/oox/formulabuffer.cxx +++ b/sc/source/filter/oox/formulabuffer.cxx @@ -25,6 +25,7 @@ #include "tokenarray.hxx" #include "sharedformulagroups.hxx" #include "externalrefmgr.hxx" +#include "tokenstringcontext.hxx" #include "oox/token/tokens.hxx" using namespace com::sun::star; @@ -56,7 +57,8 @@ public: Item() : mnRow(-1), mpCell(NULL) {} }; - CachedTokenArray( ScDocument& rDoc ) : mrDoc(rDoc) {} + CachedTokenArray( ScDocument& rDoc ) : + mrDoc(rDoc), maCxt(&rDoc, formula::FormulaGrammar::GRAM_OOXML) {} ~CachedTokenArray() { @@ -73,11 +75,8 @@ public: return NULL; Item& rCached = *it->second; - ScCompiler aComp(&mrDoc, rPos, *rCached.mpCell->GetCode()); - aComp.SetGrammar(formula::FormulaGrammar::GRAM_OOXML); - OUStringBuffer aBuf; - aComp.CreateStringFromTokenArray(aBuf); - OUString aPredicted = aBuf.makeStringAndClear(); + const ScTokenArray& rCode = *rCached.mpCell->GetCode(); + OUString aPredicted = rCode.CreateString(maCxt, rPos); if (rFormula == aPredicted) return &rCached; @@ -108,6 +107,7 @@ private: typedef boost::unordered_map<SCCOL, Item*> ColCacheType; ColCacheType maCache; ScDocument& mrDoc; + sc::TokenStringContext maCxt; }; void applySharedFormulas( |