Kaydet (Commit) 9c2dfa9b authored tarafından Markus Mohrhard's avatar Markus Mohrhard

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
üst cb9cc446
...@@ -32,6 +32,9 @@ ...@@ -32,6 +32,9 @@
#include <services.h> #include <services.h>
#include <comphelper/interaction.hxx> #include <comphelper/interaction.hxx>
#include <framework/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/task/ErrorCodeRequest.hpp>
#include <com/sun/star/uno/RuntimeException.hpp> #include <com/sun/star/uno/RuntimeException.hpp>
...@@ -703,15 +706,22 @@ LoadEnv::EContentType LoadEnv::classifyContent(const ::rtl::OUString& ...@@ -703,15 +706,22 @@ LoadEnv::EContentType LoadEnv::classifyContent(const ::rtl::OUString&
namespace { 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&) bool queryOrcusTypeAndFilter(const uno::Sequence<beans::PropertyValue>&, OUString&, OUString&)
{ {
return false; return false;
} }
#else #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) 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; OUString aURL;
sal_Int32 nSize = rDescriptor.getLength(); sal_Int32 nSize = rDescriptor.getLength();
for (sal_Int32 i = 0; i < nSize; ++i) for (sal_Int32 i = 0; i < nSize; ++i)
...@@ -727,13 +737,21 @@ bool queryOrcusTypeAndFilter(const uno::Sequence<beans::PropertyValue>& rDescrip ...@@ -727,13 +737,21 @@ bool queryOrcusTypeAndFilter(const uno::Sequence<beans::PropertyValue>& rDescrip
if (aURL.isEmpty() || aURL.copy(0,8).equalsIgnoreAsciiCase("private:")) if (aURL.isEmpty() || aURL.copy(0,8).equalsIgnoreAsciiCase("private:"))
return false; 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. // Use .csv as the first test file type.
rType = "generic_Text"; rType = "generic_Text";
rFilter = "orcus-test-filter"; rFilter = "orcus-test-filter";
return true; return true;
} }
#endif
return false; return false;
} }
......
...@@ -29,6 +29,8 @@ public: ...@@ -29,6 +29,8 @@ public:
virtual bool importCSV(ScDocument& rDoc, const rtl::OUString& rPath) const = 0; 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 * Create a context for XML file. The context object stores session
* information for each unique XML file. You must create a new context * information for each unique XML file. You must create a new context
......
...@@ -21,6 +21,7 @@ public: ...@@ -21,6 +21,7 @@ public:
static rtl::OString toSystemPath(const rtl::OUString& rPath); static rtl::OString toSystemPath(const rtl::OUString& rPath);
virtual bool importCSV(ScDocument& rDoc, const rtl::OUString& rPath) const; 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; virtual ScOrcusXMLContext* createXMLContext(ScDocument& rDoc, const rtl::OUString& rPath) const;
}; };
......
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
#include <boost/ptr_container/ptr_vector.hpp> #include <boost/ptr_container/ptr_vector.hpp>
#include <map>
class ScDocument; class ScDocument;
class ScOrcusSheet; class ScOrcusSheet;
class ScRangeData; class ScRangeData;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <orcus/spreadsheet/import_interface.hpp> #include <orcus/spreadsheet/import_interface.hpp>
#include <orcus/orcus_csv.hpp> #include <orcus/orcus_csv.hpp>
#include <orcus/orcus_gnumeric.hpp>
#include <orcus/global.hpp> #include <orcus/global.hpp>
#ifdef WNT #ifdef WNT
...@@ -50,6 +51,26 @@ bool ScOrcusFiltersImpl::importCSV(ScDocument& rDoc, const OUString& rPath) cons ...@@ -50,6 +51,26 @@ bool ScOrcusFiltersImpl::importCSV(ScDocument& rDoc, const OUString& rPath) cons
return true; 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 ScOrcusXMLContext* ScOrcusFiltersImpl::createXMLContext(ScDocument& rDoc, const rtl::OUString& rPath) const
{ {
return new ScOrcusXMLContextImpl(rDoc, rPath); return new ScOrcusXMLContextImpl(rDoc, rPath);
......
...@@ -1426,7 +1426,7 @@ bool ScDocShell::LoadExternal(SfxMedium& rMed, const OUString& rProvider) ...@@ -1426,7 +1426,7 @@ bool ScDocShell::LoadExternal(SfxMedium& rMed, const OUString& rProvider)
if (!pOrcus) if (!pOrcus)
return false; return false;
if (!pOrcus->importCSV(aDocument, rMed.GetName())) if (!pOrcus->importGnumeric(aDocument, rMed.GetName()))
return false; return false;
FinishedLoading(SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES); FinishedLoading(SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment