sc/Library_scfilt.mk | 1 sc/inc/rangenam.hxx | 2 sc/source/core/data/formulacell.cxx | 4 sc/source/core/tool/compiler.cxx | 7 - sc/source/filter/excel/xename.cxx | 4 sc/source/filter/excel/xlformula.cxx | 12 -- sc/source/filter/ftools/sharedformulagroups.cxx | 49 ++++++++ sc/source/filter/inc/orcusinterface.hxx | 4 sc/source/filter/inc/sharedformulagroups.hxx | 50 ++++++++ sc/source/filter/inc/sheetdatabuffer.hxx | 9 - sc/source/filter/oox/formulabuffer.cxx | 58 --------- sc/source/filter/oox/sheetdatabuffer.cxx | 32 ----- sc/source/filter/oox/sheetdatacontext.cxx | 9 - sc/source/filter/orcus/interface.cxx | 143 +++++++++++++++++------- sc/source/ui/docshell/docfunc.cxx | 8 - sc/source/ui/namedlg/namemgrtable.cxx | 2 sc/source/ui/unoobj/nameuno.cxx | 15 -- 17 files changed, 230 insertions(+), 179 deletions(-)
New commits: commit 776129ca13ee3ab67fd6610b1c931bf5a56aaeef Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Wed Aug 7 19:04:53 2013 -0400 No more RT_SHARED and RT_SHAREDMOD named range types. Change-Id: Ic8d98b62747ae29cc968ce926e2ae42537023840 diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx index 4a56ea1..e2731b5 100644 --- a/sc/inc/rangenam.hxx +++ b/sc/inc/rangenam.hxx @@ -51,8 +51,6 @@ typedef sal_uInt16 RangeType; #define RT_ABSAREA ((RangeType)0x0020) #define RT_REFAREA ((RangeType)0x0040) #define RT_ABSPOS ((RangeType)0x0080) -#define RT_SHARED ((RangeType)0x0100) -#define RT_SHAREDMOD ((RangeType)0x0200) class ScRangeData { diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index c3ab5cd..d6254c2 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -2825,8 +2825,6 @@ void ScFormulaCell::UpdateTranspose( const ScRange& rSource, const ScAddress& rD { if (pName->IsModified()) bRefChanged = true; - if (pName->HasType(RT_SHAREDMOD)) - pShared = pName; } } else if( t->GetType() != svIndex ) @@ -2902,8 +2900,6 @@ void ScFormulaCell::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY { if (pName->IsModified()) bRefChanged = true; - if (pName->HasType(RT_SHAREDMOD)) - pShared = pName; } } else if( t->GetType() != svIndex ) diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 6391690..547daa6 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -4302,12 +4302,7 @@ void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pT { ScRangeData* pData = GetRangeData( *_pTokenP); if (pData) - { - if (pData->HasType(RT_SHARED)) - pData->UpdateSymbol( aBuffer, aPos, GetGrammar()); - else - aBuffer.append(pData->GetName()); - } + aBuffer.append(pData->GetName()); } break; case ocDBArea: diff --git a/sc/source/filter/excel/xename.cxx b/sc/source/filter/excel/xename.cxx index 276624c..54f2e8d 100644 --- a/sc/source/filter/excel/xename.cxx +++ b/sc/source/filter/excel/xename.cxx @@ -657,7 +657,7 @@ void XclExpNameManagerImpl::CreateUserNames() for (; itr != itrEnd; ++itr) { // skip definitions of shared formulas - if (!itr->second->HasType(RT_SHARED) && !FindNamedExpIndex(SCTAB_GLOBAL, itr->second->GetIndex())) + if (!FindNamedExpIndex(SCTAB_GLOBAL, itr->second->GetIndex())) CreateName(SCTAB_GLOBAL, *itr->second); } //look at every sheet for local range names @@ -670,7 +670,7 @@ void XclExpNameManagerImpl::CreateUserNames() for (; itr != itrEnd; ++itr) { // skip definitions of shared formulas - if (!itr->second->HasType(RT_SHARED) && !FindNamedExpIndex(tabIt->first, itr->second->GetIndex())) + if (!FindNamedExpIndex(tabIt->first, itr->second->GetIndex())) CreateName(tabIt->first, *itr->second); } } diff --git a/sc/source/filter/excel/xlformula.cxx b/sc/source/filter/excel/xlformula.cxx index 94d9594..2eff911 100644 --- a/sc/source/filter/excel/xlformula.cxx +++ b/sc/source/filter/excel/xlformula.cxx @@ -765,15 +765,9 @@ void XclTokenArrayHelper::ConvertStringToList( ScTokenArray& rScTokArr, sal_Unic // shared formulas ------------------------------------------------------------ -const ScTokenArray* XclTokenArrayHelper::GetSharedFormula( const XclRoot& rRoot, const ScTokenArray& rScTokArr ) -{ - if( rScTokArr.GetLen() == 1 ) - if( const FormulaToken* pScToken = rScTokArr.GetArray()[ 0 ] ) - if( pScToken->GetOpCode() == ocName ) - if( ScRangeData* pData = rRoot.GetNamedRanges().findByIndex( pScToken->GetIndex() ) ) - if( pData->HasType( RT_SHARED ) ) - return pData->GetCode(); - return 0; +const ScTokenArray* XclTokenArrayHelper::GetSharedFormula( const XclRoot& /*rRoot*/, const ScTokenArray& /*rScTokArr*/ ) +{ + return NULL; } // multiple operations -------------------------------------------------------- diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index 2b26a73..f1b3491 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -5069,7 +5069,7 @@ sal_Bool ScDocFunc::InsertNameList( const ScAddress& rStartPos, sal_Bool bApi ) for (ScRangeName::iterator itr = itrLocalBeg; itr != itrLocalEnd; ++itr) { const ScRangeData& r = *itr->second; - if (!r.HasType(RT_DATABASE) && !r.HasType(RT_SHARED)) + if (!r.HasType(RT_DATABASE)) ++nValidCount; } ScRangeName* pList = pDoc->GetRangeName(); @@ -5077,7 +5077,7 @@ sal_Bool ScDocFunc::InsertNameList( const ScAddress& rStartPos, sal_Bool bApi ) for (ScRangeName::iterator itr = itrBeg; itr != itrEnd; ++itr) { const ScRangeData& r = *itr->second; - if (!r.HasType(RT_DATABASE) && !r.HasType(RT_SHARED) && !pLocalList->findByUpperName(r.GetUpperName())) + if (!r.HasType(RT_DATABASE) && !pLocalList->findByUpperName(r.GetUpperName())) ++nValidCount; } @@ -5106,13 +5106,13 @@ sal_Bool ScDocFunc::InsertNameList( const ScAddress& rStartPos, sal_Bool bApi ) for (ScRangeName::iterator itr = itrLocalBeg; itr != itrLocalEnd; ++itr) { ScRangeData& r = *itr->second; - if (!r.HasType(RT_DATABASE) && !r.HasType(RT_SHARED)) + if (!r.HasType(RT_DATABASE)) ppSortArray[j++] = &r; } for (ScRangeName::iterator itr = itrBeg; itr != itrEnd; ++itr) { ScRangeData& r = *itr->second; - if (!r.HasType(RT_DATABASE) && !r.HasType(RT_SHARED) && !pLocalList->findByUpperName(itr->first)) + if (!r.HasType(RT_DATABASE) && !pLocalList->findByUpperName(itr->first)) ppSortArray[j++] = &r; } #ifndef ICC diff --git a/sc/source/ui/namedlg/namemgrtable.cxx b/sc/source/ui/namedlg/namemgrtable.cxx index fd315c0..0fee2be 100644 --- a/sc/source/ui/namedlg/namemgrtable.cxx +++ b/sc/source/ui/namedlg/namemgrtable.cxx @@ -143,7 +143,7 @@ void ScRangeManagerTable::Init() for (ScRangeName::const_iterator it = pLocalRangeName->begin(); it != pLocalRangeName->end(); ++it) { - if (!it->second->HasType(RT_DATABASE) && !it->second->HasType(RT_SHARED)) + if (!it->second->HasType(RT_DATABASE)) { aLine.aName = it->second->GetName(); addEntry(aLine, false); diff --git a/sc/source/ui/unoobj/nameuno.cxx b/sc/source/ui/unoobj/nameuno.cxx index 0ec46ba..ae7a342 100644 --- a/sc/source/ui/unoobj/nameuno.cxx +++ b/sc/source/ui/unoobj/nameuno.cxx @@ -82,7 +82,7 @@ static bool lcl_UserVisibleName(const ScRangeData& rData) { //! als Methode an ScRangeData - return !rData.HasType(RT_DATABASE) && !rData.HasType(RT_SHARED); + return !rData.HasType(RT_DATABASE); } ScNamedRangeObj::ScNamedRangeObj( rtl::Reference< ScNamedRangesObj > xParent, ScDocShell* pDocSh, const String& rNm, Reference<container::XNamed> xSheet): @@ -378,7 +378,7 @@ uno::Reference<beans::XPropertySetInfo> SAL_CALL ScNamedRangeObj::getPropertySet } void SAL_CALL ScNamedRangeObj::setPropertyValue( - const OUString& rPropertyName, const uno::Any& aValue ) + const OUString& rPropertyName, const uno::Any& /*aValue*/ ) throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) @@ -386,12 +386,7 @@ void SAL_CALL ScNamedRangeObj::setPropertyValue( SolarMutexGuard aGuard; if ( rPropertyName == SC_UNONAME_ISSHAREDFMLA ) { - bool bIsShared = false; - if( aValue >>= bIsShared ) - { - sal_uInt16 nNewType = bIsShared ? RT_SHARED : RT_NAME; - Modify_Impl( NULL, NULL, NULL, NULL, &nNewType,formula::FormulaGrammar::GRAM_PODF_A1 ); - } + // Ignore this. } } @@ -417,8 +412,8 @@ uno::Any SAL_CALL ScNamedRangeObj::getPropertyValue( const OUString& rPropertyNa } else if ( rPropertyName == SC_UNONAME_ISSHAREDFMLA ) { - if( ScRangeData* pData = GetRangeData_Impl() ) - aRet <<= static_cast< bool >( pData->HasType( RT_SHARED ) ); + if (GetRangeData_Impl()) + aRet <<= false; } return aRet; } commit d57a934e1dcfd8f3f176d279a2f6fa9dab8fe411 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Wed Aug 7 18:46:57 2013 -0400 Rework shared formula import in orcus handler. Change-Id: I3a6ed347565fff7cc984960929c66997e3a18f1e diff --git a/sc/Library_scfilt.mk b/sc/Library_scfilt.mk index 89b96ed..75ee0fe 100644 --- a/sc/Library_scfilt.mk +++ b/sc/Library_scfilt.mk @@ -133,6 +133,7 @@ $(eval $(call gb_Library_add_exception_objects,scfilt,\ sc/source/filter/ftools/fapihelper \ sc/source/filter/ftools/fprogressbar \ sc/source/filter/ftools/ftools \ + sc/source/filter/ftools/sharedformulagroups \ sc/source/filter/html/htmlexp \ sc/source/filter/html/htmlexp2 \ sc/source/filter/html/htmlimp \ diff --git a/sc/source/filter/ftools/sharedformulagroups.cxx b/sc/source/filter/ftools/sharedformulagroups.cxx new file mode 100644 index 0000000..77da587 --- /dev/null +++ b/sc/source/filter/ftools/sharedformulagroups.cxx @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sharedformulagroups.hxx" + +namespace sc { + +SharedFormulaGroups::Key::Key(size_t nId, SCCOL nCol) : mnId(nId), mnCol(nCol) {} + +bool SharedFormulaGroups::Key::operator== ( const Key& rOther ) const +{ + return mnId == rOther.mnId && mnCol == rOther.mnCol; +} + +bool SharedFormulaGroups::Key::operator!= ( const Key& rOther ) const +{ + return !operator==(rOther); +} + +size_t SharedFormulaGroups::KeyHash::operator ()( const Key& rKey ) const +{ + double nVal = rKey.mnId; + nVal *= 256.0; + nVal += rKey.mnCol; + return static_cast<size_t>(nVal); +} + +void SharedFormulaGroups::set( size_t nSharedId, SCCOL nCol, const ScFormulaCellGroupRef& xGroup ) +{ + Key aKey(nSharedId, nCol); + maStore.insert(StoreType::value_type(aKey, xGroup)); +} + +ScFormulaCellGroupRef SharedFormulaGroups::get( size_t nSharedId, SCCOL nCol ) const +{ + Key aKey(nSharedId, nCol); + StoreType::const_iterator it = maStore.find(aKey); + return it == maStore.end() ? ScFormulaCellGroupRef() : it->second; +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx index 6e6f2db..75b49f4 100644 --- a/sc/source/filter/inc/orcusinterface.hxx +++ b/sc/source/filter/inc/orcusinterface.hxx @@ -12,6 +12,9 @@ #include "address.hxx" #include "documentimport.hxx" + +#include "sharedformulagroups.hxx" + #include "rtl/strbuf.hxx" #define __ORCUS_STATIC_LIB @@ -68,6 +71,7 @@ class ScOrcusSheet : public orcus::spreadsheet::iface::import_sheet ScDocumentImport& mrDoc; SCTAB mnTab; ScOrcusFactory& mrFactory; + sc::SharedFormulaGroups maFormulaGroups; typedef std::map<size_t, ScRangeData*> SharedFormulaContainer; SharedFormulaContainer maSharedFormulas; diff --git a/sc/source/filter/inc/sharedformulagroups.hxx b/sc/source/filter/inc/sharedformulagroups.hxx new file mode 100644 index 0000000..c6058fc --- /dev/null +++ b/sc/source/filter/inc/sharedformulagroups.hxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef SC_FILTER_SHAREDFORMULAGROUPS_HXX +#define SC_FILTER_SHAREDFORMULAGROUPS_HXX + +#include "address.hxx" +#include "formulacell.hxx" + +#include <boost/unordered_map.hpp> + +namespace sc { + +class SharedFormulaGroups +{ + struct Key + { + size_t mnId; + SCCOL mnCol; + + Key(size_t nId, SCCOL nCol); + + bool operator== ( const Key& rOther ) const; + bool operator!= ( const Key& rOther ) const; + }; + + struct KeyHash + { + size_t operator() ( const Key& rKey ) const; + }; + + typedef boost::unordered_map<Key, ScFormulaCellGroupRef, KeyHash> StoreType; + StoreType maStore; +public: + + void set( size_t nSharedId, SCCOL nCol, const ScFormulaCellGroupRef& xGroup ); + ScFormulaCellGroupRef get( size_t nSharedId, SCCOL nCol ) const; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/oox/formulabuffer.cxx b/sc/source/filter/oox/formulabuffer.cxx index 66d15ea..59518bc 100644 --- a/sc/source/filter/oox/formulabuffer.cxx +++ b/sc/source/filter/oox/formulabuffer.cxx @@ -22,6 +22,7 @@ #include "autonamecache.hxx" #include "tokenuno.hxx" #include "tokenarray.hxx" +#include "sharedformulagroups.hxx" #include "oox/token/tokens.hxx" using namespace com::sun::star; @@ -137,59 +138,6 @@ void FormulaBuffer::applyCellFormulaValues( const std::vector< ValueAddressPair } } -namespace { - -class SharedFormulaGroups -{ - struct Key - { - sal_Int32 mnId; - sal_Int32 mnCol; - - Key(sal_Int32 nId, sal_Int32 nCol) : mnId(nId), mnCol(nCol) {} - - bool operator== ( const Key& rOther ) const - { - return mnId == rOther.mnId && mnCol == rOther.mnCol; - } - - bool operator!= ( const Key& rOther ) const - { - return !operator==(rOther); - } - }; - - struct KeyHash - { - size_t operator() ( const Key& rKey ) const - { - double nVal = rKey.mnId; - nVal *= 256.0; - nVal += rKey.mnCol; - return static_cast<size_t>(nVal); - } - }; - - typedef boost::unordered_map<Key, ScFormulaCellGroupRef, KeyHash> StoreType; - StoreType maStore; -public: - - void set( sal_Int32 nSharedId, sal_Int32 nCol, const ScFormulaCellGroupRef& xGroup ) - { - Key aKey(nSharedId, nCol); - maStore.insert(StoreType::value_type(aKey, xGroup)); - } - - ScFormulaCellGroupRef get( sal_Int32 nSharedId, sal_Int32 nCol ) const - { - Key aKey(nSharedId, nCol); - StoreType::const_iterator it = maStore.find(aKey); - return it == maStore.end() ? ScFormulaCellGroupRef() : it->second; - } -}; - -} - void FormulaBuffer::applySharedFormulas( sal_Int32 nTab ) { SheetToFormulaEntryMap::const_iterator itShared = sharedFormulas.find(nTab); @@ -207,7 +155,7 @@ void FormulaBuffer::applySharedFormulas( sal_Int32 nTab ) ScDocument& rDoc = getScDocument(); - SharedFormulaGroups aGroups; + sc::SharedFormulaGroups aGroups; { // Process shared formulas first. std::vector<SharedFormulaEntry>::const_iterator it = rSharedFormulas.begin(), itEnd = rSharedFormulas.end(); @@ -231,7 +179,7 @@ void FormulaBuffer::applySharedFormulas( sal_Int32 nTab ) // shared formulas across multiple columns. ScFormulaCellGroupRef xNewGroup(new ScFormulaCellGroup); xNewGroup->mnStart = rRange.StartRow; - xNewGroup->mnLength = rRange.EndRow - rRange.StartRow; + xNewGroup->mnLength = rRange.EndRow - rRange.StartRow + 1; xNewGroup->setCode(*pArray); aGroups.set(nId, nCol, xNewGroup); } diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx index a3c1e6d..495715f 100644 --- a/sc/source/filter/orcus/interface.cxx +++ b/sc/source/filter/orcus/interface.cxx @@ -16,6 +16,7 @@ #include "globalnames.hxx" #include "docoptio.hxx" #include "globstr.hrc" +#include "compiler.hxx" #include "formula/token.hxx" #include "tools/datetime.hxx" @@ -256,7 +257,7 @@ formula::FormulaGrammar::Grammar getCalcGrammarFromOrcus( os::formula_grammar_t break; case orcus::spreadsheet::xlsx_2007: case orcus::spreadsheet::xlsx_2010: - eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1; + eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_OOX; break; case orcus::spreadsheet::gnumeric: eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1; @@ -266,6 +267,55 @@ formula::FormulaGrammar::Grammar getCalcGrammarFromOrcus( os::formula_grammar_t return eGrammar; } +class SharedFormulaGroups +{ + struct Key + { + sal_Int32 mnId; + sal_Int32 mnCol; + + Key(sal_Int32 nId, sal_Int32 nCol) : mnId(nId), mnCol(nCol) {} + + bool operator== ( const Key& rOther ) const + { + return mnId == rOther.mnId && mnCol == rOther.mnCol; + } + + bool operator!= ( const Key& rOther ) const + { + return !operator==(rOther); + } + }; + + struct KeyHash + { + size_t operator() ( const Key& rKey ) const + { + double nVal = rKey.mnId; + nVal *= 256.0; + nVal += rKey.mnCol; + return static_cast<size_t>(nVal); + } + }; + + typedef boost::unordered_map<Key, ScFormulaCellGroupRef, KeyHash> StoreType; + StoreType maStore; +public: + + void set( sal_Int32 nSharedId, sal_Int32 nCol, const ScFormulaCellGroupRef& xGroup ) + { + Key aKey(nSharedId, nCol); + maStore.insert(StoreType::value_type(aKey, xGroup)); + } + + ScFormulaCellGroupRef get( sal_Int32 nSharedId, sal_Int32 nCol ) const + { + Key aKey(nSharedId, nCol); + StoreType::const_iterator it = maStore.find(aKey); + return it == maStore.end() ? ScFormulaCellGroupRef() : it->second; + } +}; + } void ScOrcusSheet::set_formula( @@ -291,57 +341,76 @@ void ScOrcusSheet::set_formula_result(os::row_t row, os::col_t col, const char* } void ScOrcusSheet::set_shared_formula( - os::row_t row, os::col_t col, os::formula_grammar_t grammar, size_t sindex, - const char* p_formula, size_t n_formula) + os::row_t /*row*/, os::col_t /*col*/, os::formula_grammar_t /*grammar*/, size_t /*sindex*/, + const char* /*p_formula*/, size_t /*n_formula*/) { - OUString aFormula( p_formula, n_formula, RTL_TEXTENCODING_UTF8 ); - formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus( grammar ); - ScRangeName* pRangeName = mrDoc.getDoc().GetRangeName(); - - OUString aName("shared_"); - aName += OUString::valueOf(sal_Int32(pRangeName->size())); - ScRangeData* pSharedFormula = new ScRangeData(&mrDoc.getDoc(), aName, aFormula, ScAddress(col, row, mnTab), RT_SHARED, eGrammar); - if(pRangeName->insert(pSharedFormula)) - { - maSharedFormulas.insert( std::pair<size_t, ScRangeData*>(sindex, pSharedFormula) ); - ScTokenArray aArr; - aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) ); - mrDoc.setFormulaCell(ScAddress(col,row,mnTab), aArr); - cellInserted(); - } + // TODO: We need to revise this interface in orcus. } void ScOrcusSheet::set_shared_formula( os::row_t row, os::col_t col, os::formula_grammar_t grammar, size_t sindex, - const char* p_formula, size_t n_formula, const char* /*p_range*/, size_t /*n_range*/) -{ - OUString aFormula( p_formula, n_formula, RTL_TEXTENCODING_UTF8 ); - formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus( grammar ); - ScRangeName* pRangeName = mrDoc.getDoc().GetRangeName(); + const char* p_formula, size_t n_formula, const char* p_range, size_t n_range) +{ + ScAddress aPos(col, row, mnTab); + OUString aFormula(p_formula, n_formula, RTL_TEXTENCODING_UTF8); + OUString aRangeStr(p_range, n_range, RTL_TEXTENCODING_UTF8); + formula::FormulaGrammar::Grammar eGram = getCalcGrammarFromOrcus(grammar); + formula::FormulaGrammar::AddressConvention eConv = formula::FormulaGrammar::extractRefConvention(eGram); + + // Convert the shared formula range. + ScRange aRange; + sal_uInt16 nRes = aRange.Parse(aRangeStr, &mrDoc.getDoc(), eConv); + if (!(nRes & SCA_VALID)) + // Conversion failed. + return; + + // Compile the formula expression into tokens. + ScCompiler aComp(&mrDoc.getDoc(), aPos); + aComp.SetGrammar(eGram); + ScTokenArray* pArray = aComp.CompileString(aFormula); + if (!pArray) + // Tokenization failed. + return; - OUString aName("shared_"); - aName += OUString::valueOf(sal_Int32(pRangeName->size())); - ScRangeData* pSharedFormula = new ScRangeData(&mrDoc.getDoc(), aName, aFormula, ScAddress(col, row, mnTab), RT_SHARED, eGrammar); - if(pRangeName->insert(pSharedFormula)) + for (sal_Int32 nCol = aRange.aStart.Col(); nCol <= aRange.aEnd.Col(); ++nCol) { - maSharedFormulas.insert( std::pair<size_t, ScRangeData*>(sindex, pSharedFormula) ); - ScTokenArray aArr; - aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) ); - mrDoc.setFormulaCell(ScAddress(col,row,mnTab), aArr); - cellInserted(); + // Create one group per column, since Calc doesn't support shared + // formulas across multiple columns. + ScFormulaCellGroupRef xNewGroup(new ScFormulaCellGroup); + xNewGroup->mnStart = aRange.aStart.Row(); + xNewGroup->mnLength = aRange.aEnd.Row() - aRange.aStart.Row() + 1; + xNewGroup->setCode(*pArray); + maFormulaGroups.set(sindex, nCol, xNewGroup); } + + ScFormulaCellGroupRef xGroup = maFormulaGroups.get(sindex, aPos.Col()); + if (!xGroup) + return; + + ScFormulaCell* pCell = new ScFormulaCell(&mrDoc.getDoc(), aPos, xGroup); + mrDoc.setFormulaCell(aPos, pCell); + cellInserted(); + + // For now, orcus doesn't support setting cached result. Mark it for re-calculation. + pCell->SetDirty(true); + pCell->StartListeningTo(&mrDoc.getDoc()); } void ScOrcusSheet::set_shared_formula(os::row_t row, os::col_t col, size_t sindex) { - if(maSharedFormulas.find(sindex) == maSharedFormulas.end()) + ScAddress aPos(col, row, mnTab); + + ScFormulaCellGroupRef xGroup = maFormulaGroups.get(sindex, aPos.Col()); + if (!xGroup) return; - ScRangeData* pSharedFormula = maSharedFormulas.find(sindex)->second; - ScTokenArray aArr; - aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) ); - mrDoc.setFormulaCell(ScAddress(col,row,mnTab), aArr); + ScFormulaCell* pCell = new ScFormulaCell(&mrDoc.getDoc(), aPos, xGroup); + mrDoc.setFormulaCell(aPos, pCell); cellInserted(); + + // For now, orcus doesn't support setting cached result. Mark it for re-calculation. + pCell->SetDirty(true); + pCell->StartListeningTo(&mrDoc.getDoc()); } void ScOrcusSheet::set_array_formula( commit 98139353aa40d7bb0c0202ba5b3f588348eea36f Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Wed Aug 7 17:30:20 2013 -0400 This code is no longer needed. Change-Id: I319aae9d58fe1798e6add168f5a3613bceef7c26 diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx index 563145e..e826bd2 100644 --- a/sc/source/filter/inc/sheetdatabuffer.hxx +++ b/sc/source/filter/inc/sheetdatabuffer.hxx @@ -143,12 +143,6 @@ public: const ::com::sun::star::table::CellRangeAddress& rRange, const DataTableModel& rModel ); - /** Creates a named range with a special name for a shared formula with the - specified base address and formula definition (BIFF only). */ - void createSharedFormula( - const ::com::sun::star::table::CellAddress& rCellAddr, - const ApiTokenSequence& rTokens ); - /** Sets default cell formatting for the specified range of rows. */ void setRowFormat( sal_Int32 nRow, sal_Int32 nXfId, bool bCustomFormat ); /** Merges the cells in the passed cell range. */ @@ -173,9 +167,6 @@ private: const ::com::sun::star::table::CellAddress& rCellAddr, const ApiTokenSequence& rTokens ); - /** Creates a named range with a special name for a shared formula with the - specified base address and formula definition. */ - void createSharedFormula( const BinAddress& rMapKey, const ApiTokenSequence& rTokens ); /** Creates a formula token array representing the shared formula with the passed identifier. */ ApiTokenSequence resolveSharedFormula( const BinAddress& rMapKey ) const; diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx index 174842a..99e8054 100644 --- a/sc/source/filter/oox/sheetdatabuffer.cxx +++ b/sc/source/filter/oox/sheetdatabuffer.cxx @@ -276,11 +276,6 @@ void SheetDataBuffer::createTableOperation( const CellRangeAddress& rRange, cons maTableOperations.push_back( TableOperation( rRange, rModel ) ); } -void SheetDataBuffer::createSharedFormula( const CellAddress& rCellAddr, const ApiTokenSequence& rTokens ) -{ - createSharedFormula( BinAddress( rCellAddr ), rTokens ); -} - void SheetDataBuffer::setRowFormat( sal_Int32 nRow, sal_Int32 nXfId, bool bCustomFormat ) { // set row formatting @@ -554,33 +549,6 @@ void SheetDataBuffer::setCellFormula( const CellAddress& rCellAddr, const ApiTok } } -void SheetDataBuffer::createSharedFormula( const BinAddress& rMapKey, const ApiTokenSequence& rTokens ) -{ - // create the defined name that will represent the shared formula - OUString aName = OUStringBuffer().appendAscii( RTL_CONSTASCII_STRINGPARAM( "__shared_" ) ). - append( static_cast< sal_Int32 >( getSheetIndex() + 1 ) ). - append( sal_Unicode( '_' ) ).append( rMapKey.mnRow ). - append( sal_Unicode( '_' ) ).append( rMapKey.mnCol ).makeStringAndClear(); - ScRangeData* pScRangeData = createNamedRangeObject( aName, rTokens, 0 ); - pScRangeData->SetType(RT_SHARED); - - // get and store the token index of the defined name - OSL_ENSURE( maSharedFormulas.count( rMapKey ) == 0, "SheetDataBuffer::createSharedFormula - shared formula exists already" ); - sal_Int32 nTokenIndex = static_cast< sal_Int32 >( pScRangeData->GetIndex() ); - if( nTokenIndex >= 0 ) try - { - // store the token index in the map - maSharedFormulas[ rMapKey ] = nTokenIndex; - // retry to insert a pending shared formula cell - if( mbPendingSharedFmla ) - setCellFormula( maSharedFmlaAddr, resolveSharedFormula( maSharedBaseAddr ) ); - } - catch( Exception& ) - { - } - mbPendingSharedFmla = false; -} - ApiTokenSequence SheetDataBuffer::resolveSharedFormula( const BinAddress& rMapKey ) const { sal_Int32 nTokenIndex = ContainerHelper::getMapElement( maSharedFormulas, rMapKey, -1 ); diff --git a/sc/source/filter/oox/sheetdatacontext.cxx b/sc/source/filter/oox/sheetdatacontext.cxx index 24be4d7..3aaaaac 100644 --- a/sc/source/filter/oox/sheetdatacontext.cxx +++ b/sc/source/filter/oox/sheetdatacontext.cxx @@ -578,17 +578,10 @@ void SheetDataContext::importDataTable( SequenceInputStream& rStrm ) } } -void SheetDataContext::importSharedFmla( SequenceInputStream& rStrm ) +void SheetDataContext::importSharedFmla( SequenceInputStream& /*rStrm*/ ) { - if( readFormulaRef( rStrm ) && maFmlaData.isValidSharedRef( maCellData.maCellAddr ) ) - { - ApiTokenSequence aTokens = mrFormulaParser.importFormula( maCellData.maCellAddr, FORMULATYPE_SHAREDFORMULA, rStrm ); - mrSheetData.createSharedFormula( maCellData.maCellAddr, aTokens ); - } } -// ============================================================================ - } // namespace xls } // namespace oox _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits