sc/source/filter/inc/orcusinterface.hxx | 22 +++++ sc/source/filter/orcus/interface.cxx | 118 +++++++++++++++++++++++--------- 2 files changed, 107 insertions(+), 33 deletions(-)
New commits: commit ca625b897e971c9ab704c4afdf2ff1b4297f8d3f Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Sat Dec 9 13:38:27 2017 -0500 Implement a reference resolver for orcus. Orcus uses this to resolve cell addresses for some ops. Change-Id: I6ee9667ad994fb830e545ba3368004866a048c25 diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx index 465014b0caf4..5bc3951e7c35 100644 --- a/sc/source/filter/inc/orcusinterface.hxx +++ b/sc/source/filter/inc/orcusinterface.hxx @@ -47,6 +47,8 @@ class XStatusIndicator; class ScOrcusGlobalSettings : public orcus::spreadsheet::iface::import_global_settings { ScDocumentImport& mrDoc; + formula::FormulaGrammar::Grammar meCalcGrammar; + orcus::spreadsheet::formula_grammar_t meOrcusGrammar; public: ScOrcusGlobalSettings(ScDocumentImport& rDoc); @@ -55,6 +57,23 @@ public: virtual void set_default_formula_grammar(orcus::spreadsheet::formula_grammar_t grammar) override; virtual orcus::spreadsheet::formula_grammar_t get_default_formula_grammar() const override; + + formula::FormulaGrammar::Grammar getCalcGrammar() const + { + return meCalcGrammar; + } +}; + +class ScOrcusRefResolver : public orcus::spreadsheet::iface::import_reference_resolver +{ + const ScDocumentImport& mrDoc; + const ScOrcusGlobalSettings& mrGlobalSettings; + +public: + ScOrcusRefResolver( const ScDocumentImport& rDoc, const ScOrcusGlobalSettings& rGS ); + + orcus::spreadsheet::address_t resolve_address(const char* p, size_t n); + orcus::spreadsheet::range_t resolve_range(const char* p, size_t n); }; class ScOrcusSharedStrings : public orcus::spreadsheet::iface::import_shared_strings @@ -202,7 +221,7 @@ class ScOrcusSheet : public orcus::spreadsheet::iface::import_sheet public: ScOrcusSheet(ScDocumentImport& rDoc, SCTAB nTab, ScOrcusFactory& rFactory); - virtual orcus::spreadsheet::iface::import_auto_filter* get_auto_filter() override { return &maAutoFilter; } + virtual orcus::spreadsheet::iface::import_auto_filter* get_auto_filter() override; virtual orcus::spreadsheet::iface::import_table* get_table() override; virtual orcus::spreadsheet::iface::import_sheet_properties* get_sheet_properties() override; virtual orcus::spreadsheet::iface::import_conditional_format* get_conditional_format() override; @@ -497,6 +516,7 @@ class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory StringCellCaches maStringCells; ScOrcusGlobalSettings maGlobalSettings; + ScOrcusRefResolver maRefResolver; ScOrcusSharedStrings maSharedStrings; std::vector< std::unique_ptr<ScOrcusSheet> > maSheets; ScOrcusStyles maStyles; diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx index c31eb3720ff8..1e917963ccc2 100644 --- a/sc/source/filter/orcus/interface.cxx +++ b/sc/source/filter/orcus/interface.cxx @@ -58,20 +58,97 @@ using namespace com::sun::star; namespace os = orcus::spreadsheet; -ScOrcusGlobalSettings::ScOrcusGlobalSettings(ScDocumentImport& rDoc) : mrDoc(rDoc) {} +namespace { + +formula::FormulaGrammar::Grammar getCalcGrammarFromOrcus( os::formula_grammar_t grammar ) +{ + formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_ODFF; + switch(grammar) + { + case orcus::spreadsheet::formula_grammar_t::ods: + eGrammar = formula::FormulaGrammar::GRAM_ODFF; + break; + case orcus::spreadsheet::formula_grammar_t::xlsx_2007: + case orcus::spreadsheet::formula_grammar_t::xlsx_2010: + eGrammar = formula::FormulaGrammar::GRAM_OOXML; + break; + case orcus::spreadsheet::formula_grammar_t::gnumeric: + eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1; + break; + case orcus::spreadsheet::formula_grammar_t::xls_xml: + eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_R1C1; + break; + case orcus::spreadsheet::formula_grammar_t::unknown: + break; + } + + return eGrammar; +} + +} + +ScOrcusGlobalSettings::ScOrcusGlobalSettings(ScDocumentImport& rDoc) : + mrDoc(rDoc), meOrcusGrammar(os::formula_grammar_t::unknown) {} void ScOrcusGlobalSettings::set_origin_date(int year, int month, int day) { mrDoc.setOriginDate(year, month, day); } -void ScOrcusGlobalSettings::set_default_formula_grammar(orcus::spreadsheet::formula_grammar_t /*grammar*/) +void ScOrcusGlobalSettings::set_default_formula_grammar(os::formula_grammar_t grammar) { + meCalcGrammar = getCalcGrammarFromOrcus(grammar); + meOrcusGrammar = grammar; } orcus::spreadsheet::formula_grammar_t ScOrcusGlobalSettings::get_default_formula_grammar() const { - return orcus::spreadsheet::formula_grammar_t::unknown; + return meOrcusGrammar; +} + +ScOrcusRefResolver::ScOrcusRefResolver( const ScDocumentImport& rDoc, const ScOrcusGlobalSettings& rGS ) : + mrDoc(rDoc), mrGlobalSettings(rGS) {} + +os::address_t ScOrcusRefResolver::resolve_address(const char* p, size_t n) +{ + OUString aStr(p, n, RTL_TEXTENCODING_UTF8); + + ScAddress aAddr; + aAddr.Parse(aStr, nullptr, + formula::FormulaGrammar::extractRefConvention( + mrGlobalSettings.getCalcGrammar())); + + os::address_t ret; + + if (aAddr.IsValid()) + { + ret.column = aAddr.Col(); + ret.row = aAddr.Row(); + } + + return ret; +} + +os::range_t ScOrcusRefResolver::resolve_range(const char* p, size_t n) +{ + OUString aStr(p, n, RTL_TEXTENCODING_UTF8); + + ScRange aRange; + aRange.Parse(aStr, nullptr, + formula::FormulaGrammar::extractRefConvention( + mrGlobalSettings.getCalcGrammar())); + + os::range_t ret; + + if (aRange.IsValid()) + { + ret.first.column = aRange.aStart.Col(); + ret.first.row = aRange.aStart.Row(); + ret.last.column = aRange.aEnd.Col(); + ret.last.row = aRange.aEnd.Row(); + } + + return ret; } ScOrcusFactory::StringCellCache::StringCellCache(const ScAddress& rPos, size_t nIndex) : @@ -80,6 +157,7 @@ ScOrcusFactory::StringCellCache::StringCellCache(const ScAddress& rPos, size_t n ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : maDoc(rDoc), maGlobalSettings(maDoc), + maRefResolver(maDoc, maGlobalSettings), maSharedStrings(*this), maStyles(rDoc), mnProgress(0) {} @@ -487,6 +565,11 @@ void ScOrcusSheet::cellInserted() } } +os::iface::import_auto_filter* ScOrcusSheet::get_auto_filter() +{ + return &maAutoFilter; +} + os::iface::import_table* ScOrcusSheet::get_table() { return nullptr; @@ -569,35 +652,6 @@ void ScOrcusSheet::set_format(os::row_t row_start, os::col_t col_start, mrDoc.getDoc().ApplyPatternAreaTab(col_start, row_start, col_end, row_end, mnTab, aPattern); } -namespace { - -formula::FormulaGrammar::Grammar getCalcGrammarFromOrcus( os::formula_grammar_t grammar ) -{ - formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_ODFF; - switch(grammar) - { - case orcus::spreadsheet::formula_grammar_t::ods: - eGrammar = formula::FormulaGrammar::GRAM_ODFF; - break; - case orcus::spreadsheet::formula_grammar_t::xlsx_2007: - case orcus::spreadsheet::formula_grammar_t::xlsx_2010: - eGrammar = formula::FormulaGrammar::GRAM_OOXML; - break; - case orcus::spreadsheet::formula_grammar_t::gnumeric: - eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1; - break; - case orcus::spreadsheet::formula_grammar_t::xls_xml: - eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_R1C1; - break; - case orcus::spreadsheet::formula_grammar_t::unknown: - break; - } - - return eGrammar; -} - -} - void ScOrcusSheet::set_formula( os::row_t row, os::col_t col, os::formula_grammar_t grammar, const char* p, size_t n) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits