[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