[Libreoffice-commits] core.git: Branch 'feature/orcus-update' - 2 commits - sc/source

Kohei Yoshida kohei.yoshida at gmail.com
Tue Apr 9 16:50:32 PDT 2013


 sc/source/filter/inc/orcusinterface.hxx |   36 +++++++++++--
 sc/source/filter/orcus/interface.cxx    |   85 ++++++++++++++++++++++----------
 2 files changed, 89 insertions(+), 32 deletions(-)

New commits:
commit 2a3585c261550947e050939029d4d18196eb24a1
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Tue Apr 9 19:50:21 2013 -0400

    Correctly implement add() and append() of shared strings interface.
    
    Change-Id: I9c1d0e904464ff2489678972aa5c6b6e4246cd81

diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx
index 313331c..de07b75 100644
--- a/sc/source/filter/inc/orcusinterface.hxx
+++ b/sc/source/filter/inc/orcusinterface.hxx
@@ -16,6 +16,7 @@
 #include <orcus/spreadsheet/import_interface.hpp>
 
 #include <boost/ptr_container/ptr_vector.hpp>
+#include <boost/unordered_map.hpp>
 
 #include <map>
 
@@ -26,10 +27,10 @@ class ScRangeData;
 
 class ScOrcusSharedStrings : public orcus::spreadsheet::iface::import_shared_strings
 {
-    std::vector<OUString>& mrStrings;
+    ScOrcusFactory& mrFactory;
 
 public:
-    ScOrcusSharedStrings(std::vector<OUString>& rStrings);
+    ScOrcusSharedStrings(ScOrcusFactory& rFactory);
 
     virtual size_t append(const char* s, size_t n);
     virtual size_t add(const char* s, size_t n);
@@ -161,10 +162,14 @@ class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory
         StringCellCache(const ScAddress& rPos, size_t nIndex);
     };
 
+    typedef boost::unordered_map<OUString, size_t, OUStringHash> StringHashType;
     typedef std::vector<StringCellCache> StringCellCaches;
 
     ScDocument& mrDoc;
+
     std::vector<OUString> maStrings;
+    StringHashType maStringHash;
+
     StringCellCaches maStringCells;
     ScOrcusSharedStrings maSharedStrings;
     boost::ptr_vector<ScOrcusSheet> maSheets;
@@ -179,6 +184,9 @@ public:
     virtual orcus::spreadsheet::iface::import_styles* get_styles();
     virtual void finalize();
 
+    size_t appendString(const OUString& rStr);
+    size_t addString(const OUString& rStr);
+
     void pushStringCell(const ScAddress& rPos, size_t nStrIndex);
 };
 
diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx
index 45f2304..73b4d0b 100644
--- a/sc/source/filter/orcus/interface.cxx
+++ b/sc/source/filter/orcus/interface.cxx
@@ -24,7 +24,7 @@ using orcus::spreadsheet::formula_grammar_t;
 ScOrcusFactory::StringCellCache::StringCellCache(const ScAddress& rPos, size_t nIndex) :
     maPos(rPos), mnIndex(nIndex) {}
 
-ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : mrDoc(rDoc), maSharedStrings(maStrings) {}
+ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : mrDoc(rDoc), maSharedStrings(*this) {}
 
 orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet(const char* sheet_name, size_t sheet_name_length)
 {
@@ -95,6 +95,25 @@ void ScOrcusFactory::finalize()
     }
 }
 
+size_t ScOrcusFactory::appendString(const OUString& rStr)
+{
+    size_t nPos = maStrings.size();
+    maStrings.push_back(rStr);
+    maStringHash.insert(StringHashType::value_type(rStr, nPos));
+
+    return nPos;
+}
+
+size_t ScOrcusFactory::addString(const OUString& rStr)
+{
+    // Add only if the string is not yet present in the string pool.
+    StringHashType::iterator it = maStringHash.find(rStr);
+    if (it != maStringHash.end())
+        return it->second;
+
+    return appendString(rStr);
+}
+
 void ScOrcusFactory::pushStringCell(const ScAddress& rPos, size_t nStrIndex)
 {
     maStringCells.push_back(StringCellCache(rPos, nStrIndex));
@@ -241,23 +260,19 @@ void ScOrcusSheet::set_bool(row_t row, col_t col, bool value)
     mrDoc.SetValue(col, row, mnTab, value ? 1.0 : 0.0);
 }
 
-ScOrcusSharedStrings::ScOrcusSharedStrings(std::vector<OUString>& rStrings) :
-    mrStrings(rStrings) {}
+ScOrcusSharedStrings::ScOrcusSharedStrings(ScOrcusFactory& rFactory) :
+    mrFactory(rFactory) {}
 
 size_t ScOrcusSharedStrings::append(const char* s, size_t n)
 {
     OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
-    mrStrings.push_back(aNewString);
-
-    return mrStrings.size() - 1;
+    return mrFactory.appendString(aNewString);
 }
 
 size_t ScOrcusSharedStrings::add(const char* s, size_t n)
 {
     OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
-    mrStrings.push_back(aNewString);
-
-    return mrStrings.size() - 1;
+    return mrFactory.addString(aNewString);
 }
 
 void ScOrcusSharedStrings::set_segment_bold(bool /*b*/)
commit d4e5e19c2b95f75dda2b4fe2a9d79921c9b66e34
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Tue Apr 9 19:17:03 2013 -0400

    Defer string cell import until the end when importing via orcus.
    
    This is because orcus imports cells before it imports the string table.
    
    Change-Id: I1b85be2d9832b9a9a52961ece735de8cd980b893

diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx
index 0de1fcc..313331c 100644
--- a/sc/source/filter/inc/orcusinterface.hxx
+++ b/sc/source/filter/inc/orcusinterface.hxx
@@ -21,13 +21,16 @@
 
 class ScDocument;
 class ScOrcusSheet;
+class ScOrcusFactory;
 class ScRangeData;
 
 class ScOrcusSharedStrings : public orcus::spreadsheet::iface::import_shared_strings
 {
-    std::vector<OUString> maSharedStrings;
+    std::vector<OUString>& mrStrings;
 
 public:
+    ScOrcusSharedStrings(std::vector<OUString>& rStrings);
+
     virtual size_t append(const char* s, size_t n);
     virtual size_t add(const char* s, size_t n);
 
@@ -38,20 +41,18 @@ public:
     virtual void append_segment(const char* s, size_t n);
 
     virtual size_t commit_segments();
-
-    const OUString& getByIndex(size_t index) const;
 };
 
 class ScOrcusSheet : public orcus::spreadsheet::iface::import_sheet
 {
     ScDocument& mrDoc;
     SCTAB mnTab;
-    ScOrcusSharedStrings& mrSharedStrings;
+    ScOrcusFactory& mrFactory;
 
     typedef std::map<size_t, ScRangeData*> SharedFormulaContainer;
     SharedFormulaContainer maSharedFormulas;
 public:
-    ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusSharedStrings& rSharedStrings);
+    ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusFactory& rFactory);
 
     // Orcus import interface
     virtual void set_auto(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, const char* p, size_t n);
@@ -152,9 +153,21 @@ public:
 
 class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory
 {
+    struct StringCellCache
+    {
+        ScAddress maPos;
+        size_t mnIndex;
+
+        StringCellCache(const ScAddress& rPos, size_t nIndex);
+    };
+
+    typedef std::vector<StringCellCache> StringCellCaches;
+
     ScDocument& mrDoc;
-    boost::ptr_vector<ScOrcusSheet> maSheets;
+    std::vector<OUString> maStrings;
+    StringCellCaches maStringCells;
     ScOrcusSharedStrings maSharedStrings;
+    boost::ptr_vector<ScOrcusSheet> maSheets;
     ScOrcusStyles maStyles;
 
 public:
@@ -164,6 +177,9 @@ public:
     virtual orcus::spreadsheet::iface::import_sheet* get_sheet(const char *sheet_name, size_t sheet_name_length);
     virtual orcus::spreadsheet::iface::import_shared_strings* get_shared_strings();
     virtual orcus::spreadsheet::iface::import_styles* get_styles();
+    virtual void finalize();
+
+    void pushStringCell(const ScAddress& rPos, size_t nStrIndex);
 };
 
 #endif
diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx
index 5e48208..45f2304 100644
--- a/sc/source/filter/orcus/interface.cxx
+++ b/sc/source/filter/orcus/interface.cxx
@@ -13,14 +13,18 @@
 #include "formulacell.hxx"
 #include "rangenam.hxx"
 #include "tokenarray.hxx"
-#include <formula/token.hxx>
+#include "stringutil.hxx"
 
+#include <formula/token.hxx>
 
 using orcus::spreadsheet::row_t;
 using orcus::spreadsheet::col_t;
 using orcus::spreadsheet::formula_grammar_t;
 
-ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : mrDoc(rDoc) {}
+ScOrcusFactory::StringCellCache::StringCellCache(const ScAddress& rPos, size_t nIndex) :
+    maPos(rPos), mnIndex(nIndex) {}
+
+ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : mrDoc(rDoc), maSharedStrings(maStrings) {}
 
 orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet(const char* sheet_name, size_t sheet_name_length)
 {
@@ -29,7 +33,7 @@ orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet(const char
         return NULL;
 
     SCTAB nTab = mrDoc.GetTableCount() - 1;
-    maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, maSharedStrings));
+    maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, *this));
     return &maSheets.back();
 }
 
@@ -61,7 +65,7 @@ orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::get_sheet(const char* s
         return &(*it);
 
     // Create a new orcus sheet instance for this.
-    maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, maSharedStrings));
+    maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, *this));
     return &maSheets.back();
 }
 
@@ -76,8 +80,28 @@ orcus::spreadsheet::iface::import_styles* ScOrcusFactory::get_styles()
     return &maStyles;
 }
 
-ScOrcusSheet::ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusSharedStrings& rSharedStrings) :
-    mrDoc(rDoc), mnTab(nTab), mrSharedStrings(rSharedStrings) {}
+void ScOrcusFactory::finalize()
+{
+    ScSetStringParam aParam;
+    aParam.setTextInput();
+    StringCellCaches::const_iterator it = maStringCells.begin(), itEnd = maStringCells.end();
+    for (; it != itEnd; ++it)
+    {
+        if (it->mnIndex >= maStrings.size())
+            // String index out-of-bound!  Something is up.
+            continue;
+
+        mrDoc.SetString(it->maPos, maStrings[it->mnIndex], &aParam);
+    }
+}
+
+void ScOrcusFactory::pushStringCell(const ScAddress& rPos, size_t nStrIndex)
+{
+    maStringCells.push_back(StringCellCache(rPos, nStrIndex));
+}
+
+ScOrcusSheet::ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusFactory& rFactory) :
+    mrDoc(rDoc), mnTab(nTab), mrFactory(rFactory) {}
 
 void ScOrcusSheet::set_auto(row_t row, col_t col, const char* p, size_t n)
 {
@@ -199,13 +223,12 @@ void ScOrcusSheet::set_array_formula(
 
 void ScOrcusSheet::set_string(row_t row, col_t col, size_t sindex)
 {
-    // Calc does not yet support shared strings so we have to
-    // workaround by importing shared strings into a temporary
-    // shared string container and writing into calc model as
-    // normal string
+    // We need to defer string cells since the shared string pool is not yet
+    // populated at the time this method is called.  Orcus imports string
+    // table after the cells get imported.  We won't need to do this once we
+    // implement true shared strings in Calc core.
 
-    const OUString& rSharedString = mrSharedStrings.getByIndex(sindex);
-    mrDoc.SetTextCell(ScAddress(col,row,mnTab), rSharedString);
+    mrFactory.pushStringCell(ScAddress(col, row, mnTab), sindex);
 }
 
 void ScOrcusSheet::set_value(row_t row, col_t col, double value)
@@ -218,28 +241,23 @@ void ScOrcusSheet::set_bool(row_t row, col_t col, bool value)
     mrDoc.SetValue(col, row, mnTab, value ? 1.0 : 0.0);
 }
 
+ScOrcusSharedStrings::ScOrcusSharedStrings(std::vector<OUString>& rStrings) :
+    mrStrings(rStrings) {}
+
 size_t ScOrcusSharedStrings::append(const char* s, size_t n)
 {
     OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
-    maSharedStrings.push_back(aNewString);
+    mrStrings.push_back(aNewString);
 
-    return maSharedStrings.size() - 1;
+    return mrStrings.size() - 1;
 }
 
 size_t ScOrcusSharedStrings::add(const char* s, size_t n)
 {
     OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
-    maSharedStrings.push_back(aNewString);
-
-    return maSharedStrings.size() - 1;
-}
-
-const OUString& ScOrcusSharedStrings::getByIndex(size_t nIndex) const
-{
-    if(nIndex < maSharedStrings.size())
-        return maSharedStrings[nIndex];
+    mrStrings.push_back(aNewString);
 
-    return EMPTY_OUSTRING;
+    return mrStrings.size() - 1;
 }
 
 void ScOrcusSharedStrings::set_segment_bold(bool /*b*/)


More information about the Libreoffice-commits mailing list