framework/source/loadenv/loadenv.cxx | 24 ++ sc/inc/orcusfilters.hxx | 2 sc/source/filter/inc/orcusfiltersimpl.hxx | 1 sc/source/filter/inc/orcusinterface.hxx | 67 +++++++ sc/source/filter/orcus/interface.cxx | 242 ++++++++++++++++++++++++++-- sc/source/filter/orcus/orcusfiltersimpl.cxx | 21 ++ sc/source/ui/docshell/docsh.cxx | 2 7 files changed, 346 insertions(+), 13 deletions(-)
New commits: commit 9c2dfa9b41f82cfa763c500d34fe2a32a075f566 Author: Markus Mohrhard <[email protected]> Date: Tue Dec 4 07:50:20 2012 +0100 activate basic gnumeric support in experimental mode Please note that this is nothing mroe than a technical demo showing the great opportunities provided by orcus. It only imports some basic objects for now but provides the basis for the future calc filter framework. Change-Id: I6c6fb8d07e33482b2efdcbbe9a0f43224c5aa5a1 diff --git a/framework/source/loadenv/loadenv.cxx b/framework/source/loadenv/loadenv.cxx index c676fe4..78bc67c 100644 --- a/framework/source/loadenv/loadenv.cxx +++ b/framework/source/loadenv/loadenv.cxx @@ -32,6 +32,9 @@ #include <services.h> #include <comphelper/interaction.hxx> #include <framework/interaction.hxx> +#include <comphelper/processfactory.hxx> +#include <comphelper/configuration.hxx> +#include "officecfg/Office/Common.hxx" #include <com/sun/star/task/ErrorCodeRequest.hpp> #include <com/sun/star/uno/RuntimeException.hpp> @@ -703,15 +706,22 @@ LoadEnv::EContentType LoadEnv::classifyContent(const ::rtl::OUString& namespace { -#if 1 +#if 0 +// TODO: We will reinstate this function later, so don't remove this! bool queryOrcusTypeAndFilter(const uno::Sequence<beans::PropertyValue>&, OUString&, OUString&) { return false; } #else -// TODO: We will reinstate this function later, so don't remove this! bool queryOrcusTypeAndFilter(const uno::Sequence<beans::PropertyValue>& rDescriptor, OUString& rType, OUString& rFilter) { + // depending on the experimental mode + uno::Reference< uno::XComponentContext > xContext = comphelper::getProcessComponentContext(); + if (!xContext.is() || !officecfg::Office::Common::Misc::ExperimentalMode::get(xContext)) + { + return false; + } + OUString aURL; sal_Int32 nSize = rDescriptor.getLength(); for (sal_Int32 i = 0; i < nSize; ++i) @@ -727,13 +737,21 @@ bool queryOrcusTypeAndFilter(const uno::Sequence<beans::PropertyValue>& rDescrip if (aURL.isEmpty() || aURL.copy(0,8).equalsIgnoreAsciiCase("private:")) return false; - if (aURL.endsWith(".csv")) + if(aURL.endsWith(".gnumeric")) + { + rType = "generic_Text"; + rFilter = "orcus-gnumeric"; + return true; + } +#if 0 + else if (aURL.endsWith(".csv")) { // Use .csv as the first test file type. rType = "generic_Text"; rFilter = "orcus-test-filter"; return true; } +#endif return false; } diff --git a/sc/inc/orcusfilters.hxx b/sc/inc/orcusfilters.hxx index bcf8881..9f3ca13 100644 --- a/sc/inc/orcusfilters.hxx +++ b/sc/inc/orcusfilters.hxx @@ -29,6 +29,8 @@ public: virtual bool importCSV(ScDocument& rDoc, const rtl::OUString& rPath) const = 0; + virtual bool importGnumeric(ScDocument& rDoc, const rtl::OUString& rPath) const = 0; + /** * Create a context for XML file. The context object stores session * information for each unique XML file. You must create a new context diff --git a/sc/source/filter/inc/orcusfiltersimpl.hxx b/sc/source/filter/inc/orcusfiltersimpl.hxx index 2238b70..a97a50c 100644 --- a/sc/source/filter/inc/orcusfiltersimpl.hxx +++ b/sc/source/filter/inc/orcusfiltersimpl.hxx @@ -21,6 +21,7 @@ public: static rtl::OString toSystemPath(const rtl::OUString& rPath); virtual bool importCSV(ScDocument& rDoc, const rtl::OUString& rPath) const; + virtual bool importGnumeric(ScDocument& rDoc, const rtl::OUString& rPath) const; virtual ScOrcusXMLContext* createXMLContext(ScDocument& rDoc, const rtl::OUString& rPath) const; }; diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx index d800474..2f8380c 100644 --- a/sc/source/filter/inc/orcusinterface.hxx +++ b/sc/source/filter/inc/orcusinterface.hxx @@ -17,6 +17,8 @@ #include <boost/ptr_container/ptr_vector.hpp> +#include <map> + class ScDocument; class ScOrcusSheet; class ScRangeData; diff --git a/sc/source/filter/orcus/orcusfiltersimpl.cxx b/sc/source/filter/orcus/orcusfiltersimpl.cxx index 4e6c98b..ed33cc1 100644 --- a/sc/source/filter/orcus/orcusfiltersimpl.cxx +++ b/sc/source/filter/orcus/orcusfiltersimpl.cxx @@ -16,6 +16,7 @@ #include <orcus/spreadsheet/import_interface.hpp> #include <orcus/orcus_csv.hpp> +#include <orcus/orcus_gnumeric.hpp> #include <orcus/global.hpp> #ifdef WNT @@ -50,6 +51,26 @@ bool ScOrcusFiltersImpl::importCSV(ScDocument& rDoc, const OUString& rPath) cons return true; } +bool ScOrcusFiltersImpl::importGnumeric(ScDocument& rDoc, const OUString& rPath) const +{ + ScOrcusFactory aFactory(rDoc); + OString aSysPath = toSystemPath(rPath); + const char* path = aSysPath.getStr(); + + try + { + orcus::orcus_gnumeric filter(&aFactory); + filter.read_file(path); + } + catch (const std::exception& e) + { + SAL_WARN("sc", "Unable to load gnumeric file! " << e.what()); + return false; + } + + return true; +} + ScOrcusXMLContext* ScOrcusFiltersImpl::createXMLContext(ScDocument& rDoc, const rtl::OUString& rPath) const { return new ScOrcusXMLContextImpl(rDoc, rPath); diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx index 2fe4cad..52355d6 100644 --- a/sc/source/ui/docshell/docsh.cxx +++ b/sc/source/ui/docshell/docsh.cxx @@ -1426,7 +1426,7 @@ bool ScDocShell::LoadExternal(SfxMedium& rMed, const OUString& rProvider) if (!pOrcus) return false; - if (!pOrcus->importCSV(aDocument, rMed.GetName())) + if (!pOrcus->importGnumeric(aDocument, rMed.GetName())) return false; FinishedLoading(SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES); commit cb9cc446b39cafea018d2492fb4842a94aed7b77 Author: Markus Mohrhard <[email protected]> Date: Tue Dec 4 06:48:59 2012 +0100 shared formula import for orcus Change-Id: I97970c19d69263c34ed0cdb0ed789086608d4bf1 diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx index 6bf3311..d800474 100644 --- a/sc/source/filter/inc/orcusinterface.hxx +++ b/sc/source/filter/inc/orcusinterface.hxx @@ -19,6 +19,7 @@ class ScDocument; class ScOrcusSheet; +class ScRangeData; class ScOrcusSharedStrings : public orcus::spreadsheet::iface::import_shared_strings { @@ -59,6 +60,9 @@ class ScOrcusSheet : public orcus::spreadsheet::iface::import_sheet ScDocument& mrDoc; SCTAB mnTab; ScOrcusSharedStrings& mrSharedStrings; + + typedef std::map<size_t, ScRangeData*> SharedFormulaContainer; + SharedFormulaContainer maSharedFormulas; public: ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusSharedStrings& rSharedStrings); @@ -80,5 +84,66 @@ public: SCTAB getIndex() const { return mnTab; } }; +class ScOrcusStyles : public orcus::spreadsheet::iface::import_styles +{ + +public: + // font + + virtual void set_font_count(size_t n); + virtual void set_font_bold(bool b); + virtual void set_font_italic(bool b); + virtual void set_font_name(const char* s, size_t n); + virtual void set_font_size(double point); + virtual void set_font_underline(orcus::spreadsheet::underline_t e); + virtual size_t commit_font(); + + // fill + + virtual void set_fill_count(size_t n); + virtual void set_fill_pattern_type(const char* s, size_t n); + virtual void set_fill_fg_color(orcus::spreadsheet::color_elem_t alpha, orcus::spreadsheet::color_elem_t red, orcus::spreadsheet::color_elem_t green, orcus::spreadsheet::color_elem_t blue); + virtual void set_fill_bg_color(orcus::spreadsheet::color_elem_t alpha, orcus::spreadsheet::color_elem_t red, orcus::spreadsheet::color_elem_t green, orcus::spreadsheet::color_elem_t blue); + virtual size_t commit_fill(); + + // border + + virtual void set_border_count(size_t n); + virtual void set_border_style(orcus::spreadsheet::border_direction_t dir, const char* s, size_t n); + virtual size_t commit_border(); + + // cell protection + virtual void set_cell_hidden(bool b); + virtual void set_cell_locked(bool b); + virtual size_t commit_cell_protection(); + + // cell style xf + + virtual void set_cell_style_xf_count(size_t n); + virtual size_t commit_cell_style_xf(); + + // cell xf + + virtual void set_cell_xf_count(size_t n); + virtual size_t commit_cell_xf(); + + // xf (cell format) - used both by cell xf and cell style xf. + + virtual void set_xf_number_format(size_t index); + virtual void set_xf_font(size_t index); + virtual void set_xf_fill(size_t index); + virtual void set_xf_border(size_t index); + virtual void set_xf_protection(size_t index); + virtual void set_xf_style_xf(size_t index); + + // cell style entry + + virtual void set_cell_style_count(size_t n); + virtual void set_cell_style_name(const char* s, size_t n); + virtual void set_cell_style_xf(size_t index); + virtual void set_cell_style_builtin(size_t index); + virtual size_t commit_cell_style(); +}; + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx index 2e99eaa..b21e7e5 100644 --- a/sc/source/filter/orcus/interface.cxx +++ b/sc/source/filter/orcus/interface.cxx @@ -11,6 +11,10 @@ #include "document.hxx" #include "cell.hxx" +#include "rangenam.hxx" +#include "tokenarray.hxx" +#include <formula/token.hxx> + using orcus::spreadsheet::row_t; using orcus::spreadsheet::col_t; @@ -69,7 +73,7 @@ orcus::spreadsheet::iface::import_shared_strings* ScOrcusFactory::get_shared_str orcus::spreadsheet::iface::import_styles* ScOrcusFactory::get_styles() { // We don't support it yet. - return NULL; + return new ScOrcusStyles; } ScOrcusSheet::ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusSharedStrings& rSharedStrings) : @@ -85,10 +89,10 @@ void ScOrcusSheet::set_format(row_t /*row*/, col_t /*col*/, size_t /*xf_index*/) { } -void ScOrcusSheet::set_formula( - row_t row, col_t col, formula_grammar_t grammar, const char* p, size_t n) +namespace { + +formula::FormulaGrammar::Grammar getCalcGrammarFromOrcus( formula_grammar_t grammar ) { - OUString aFormula(p, n, RTL_TEXTENCODING_UTF8); formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_ODFF; switch(grammar) { @@ -104,6 +108,17 @@ void ScOrcusSheet::set_formula( break; } + return eGrammar; +} + +} + +void ScOrcusSheet::set_formula( + row_t row, col_t col, formula_grammar_t grammar, const char* p, size_t n) +{ + OUString aFormula(p, n, RTL_TEXTENCODING_UTF8); + formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus( grammar ); + ScFormulaCell* pCell = new ScFormulaCell(&mrDoc, ScAddress(col, row, mnTab), aFormula, eGrammar); mrDoc.PutCell(col, row, mnTab, pCell); } @@ -123,19 +138,57 @@ void ScOrcusSheet::set_formula_result(row_t row, col_t col, const char* p, size_ } void ScOrcusSheet::set_shared_formula( - row_t /*row*/, col_t /*col*/, formula_grammar_t /*grammar*/, size_t /*sindex*/, - const char* /*p_formula*/, size_t /*n_formula*/) + row_t row, col_t col, 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.GetRangeName(); + + OUString aName("shared_"); + aName += OUString::valueOf(sal_Int32(pRangeName->size())); + ScRangeData* pSharedFormula = new ScRangeData( &mrDoc, 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() ) ); + ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr ); + mrDoc.PutCell( col, row, mnTab, pCell ); + } } void ScOrcusSheet::set_shared_formula( - row_t /*row*/, col_t /*col*/, formula_grammar_t /*grammar*/, size_t /*sindex*/, - const char* /*p_formula*/, size_t /*n_formula*/, const char* /*p_range*/, size_t /*n_range*/) + row_t row, col_t col, 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.GetRangeName(); + + OUString aName("shared_"); + aName += OUString::valueOf(sal_Int32(pRangeName->size())); + ScRangeData* pSharedFormula = new ScRangeData( &mrDoc, 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() ) ); + ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr ); + mrDoc.PutCell( col, row, mnTab, pCell ); + } } -void ScOrcusSheet::set_shared_formula(row_t /*row*/, col_t /*col*/, size_t /*sindex*/) +void ScOrcusSheet::set_shared_formula(row_t row, col_t col, size_t sindex) { + if(maSharedFormulas.find(sindex) == maSharedFormulas.end()) + return; + + ScRangeData* pSharedFormula = maSharedFormulas.find(sindex)->second; + ScTokenArray aArr; + aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) ); + ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr ); + mrDoc.PutCell( col, row, mnTab, pCell ); } void ScOrcusSheet::set_string(row_t row, col_t col, size_t sindex) @@ -199,4 +252,175 @@ size_t ScOrcusSharedStrings::commit_segments() { return 0; } + +void ScOrcusStyles::set_font_count(size_t /*n*/) +{ + // needed at all? +} + +void ScOrcusStyles::set_font_bold(bool /*b*/) +{ +} + +void ScOrcusStyles::set_font_italic(bool /*b*/) +{ +} + +void ScOrcusStyles::set_font_name(const char* /*s*/, size_t /*n*/) +{ +} + +void ScOrcusStyles::set_font_size(double /*point*/) +{ +} + +void ScOrcusStyles::set_font_underline(orcus::spreadsheet::underline_t /*e*/) +{ +} + +size_t ScOrcusStyles::commit_font() +{ + return 0; +} + + +// fill + +void ScOrcusStyles::set_fill_count(size_t /*n*/) +{ + // needed at all? +} + +void ScOrcusStyles::set_fill_pattern_type(const char* /*s*/, size_t /*n*/) +{ +} + +void ScOrcusStyles::set_fill_fg_color(orcus::spreadsheet::color_elem_t /*alpha*/, orcus::spreadsheet::color_elem_t /*red*/, orcus::spreadsheet::color_elem_t /*green*/, orcus::spreadsheet::color_elem_t /*blue*/) +{ +} + +void ScOrcusStyles::set_fill_bg_color(orcus::spreadsheet::color_elem_t /*alpha*/, orcus::spreadsheet::color_elem_t /*red*/, orcus::spreadsheet::color_elem_t /*green*/, orcus::spreadsheet::color_elem_t /*blue*/) +{ +} + +size_t ScOrcusStyles::commit_fill() +{ + return 0; +} + + +// border + +void ScOrcusStyles::set_border_count(size_t /*n*/) +{ + // needed at all? +} + +void ScOrcusStyles::set_border_style(orcus::spreadsheet::border_direction_t /*dir*/, const char* /*s*/, size_t /*n*/) +{ + // implement later +} + +size_t ScOrcusStyles::commit_border() +{ + return 0; +} + + +// cell protection +void ScOrcusStyles::set_cell_hidden(bool /*b*/) +{ +} + +void ScOrcusStyles::set_cell_locked(bool /*b*/) +{ +} + +size_t ScOrcusStyles::commit_cell_protection() +{ + return 0; +} + + +// cell style xf + +void ScOrcusStyles::set_cell_style_xf_count(size_t /*n*/) +{ + // needed at all? +} + +size_t ScOrcusStyles::commit_cell_style_xf() +{ + return 0; +} + + +// cell xf + +void ScOrcusStyles::set_cell_xf_count(size_t /*n*/) +{ + // needed at all? +} + +size_t ScOrcusStyles::commit_cell_xf() +{ + return 0; +} + + +// xf (cell format) - used both by cell xf and cell style xf. + +void ScOrcusStyles::set_xf_number_format(size_t /*index*/) +{ + // no number format interfaces implemented yet +} + +void ScOrcusStyles::set_xf_font(size_t /*index*/) +{ +} + +void ScOrcusStyles::set_xf_fill(size_t /*index*/) +{ +} + +void ScOrcusStyles::set_xf_border(size_t /*index*/) +{ +} + +void ScOrcusStyles::set_xf_protection(size_t /*index*/) +{ +} + +void ScOrcusStyles::set_xf_style_xf(size_t /*index*/) +{ +} + + +// cell style entry +// not needed for now for gnumeric + +void ScOrcusStyles::set_cell_style_count(size_t /*n*/) +{ + // needed at all? +} + +void ScOrcusStyles::set_cell_style_name(const char* /*s*/, size_t /*n*/) +{ +} + +void ScOrcusStyles::set_cell_style_xf(size_t /*index*/) +{ +} + +void ScOrcusStyles::set_cell_style_builtin(size_t /*index*/) +{ + // not needed for gnumeric +} + +size_t ScOrcusStyles::commit_cell_style() +{ + return 0; +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
