[Libreoffice-commits] core.git: sc/inc sc/source

Markus Mohrhard markus.mohrhard at googlemail.com
Thu Oct 12 00:27:06 UTC 2017


 sc/inc/datamapper.hxx                          |    9 +++
 sc/source/ui/dataprovider/csvdataprovider.cxx  |   30 ++++++-----
 sc/source/ui/dataprovider/dataprovider.cxx     |   63 ++++++++++++++++---------
 sc/source/ui/dataprovider/htmldataprovider.cxx |   34 +++++--------
 sc/source/ui/dataprovider/htmldataprovider.hxx |    8 ---
 sc/source/ui/inc/dataprovider.hxx              |   23 +++------
 6 files changed, 90 insertions(+), 77 deletions(-)

New commits:
commit 0448c3c9de5a5fe9f6bd7caa9b8502a276744df4
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sun Oct 8 17:50:39 2017 +0200

    adapt dataprovider to the requirements of the new UI
    
    Change-Id: If10a68a27591f3195ef85c21ea98324903819b36
    Reviewed-on: https://gerrit.libreoffice.org/43256
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/sc/inc/datamapper.hxx b/sc/inc/datamapper.hxx
index f872f50143b8..b935e2ac36cc 100644
--- a/sc/inc/datamapper.hxx
+++ b/sc/inc/datamapper.hxx
@@ -25,6 +25,7 @@ namespace sc {
 class ScDBDataManager;
 class DataProvider;
 class ScDBDataManager;
+class DataTransformation;
 
 class SC_DLLPUBLIC ExternalDataSource
 {
@@ -67,6 +68,8 @@ private:
     std::shared_ptr<DataProvider> mpDataProvider;
     std::shared_ptr<ScDBDataManager> mpDBDataManager;
 
+    std::vector<std::shared_ptr<sc::DataTransformation>> maDataTransformations;
+
     ScDocument* mpDoc;
 
 public:
@@ -79,6 +82,8 @@ public:
     void setUpdateFrequency(double nUpdateFrequency);
 
     void setID(const OUString& rID);
+    void setURL(const OUString& rURL);
+    void setProvider(const OUString& rProvider);
 
     const OUString& getURL() const;
     const OUString& getProvider() const;
@@ -86,8 +91,12 @@ public:
     double getUpdateFrequency() const;
     OUString getDBName() const;
     void setDBData(const ScDBData* pDBData);
+    ScDBDataManager* getDBManager();
 
     void refresh(ScDocument* pDoc, bool bDeterministic = false);
+
+    void AddDataTransformation(std::shared_ptr<sc::DataTransformation> mpDataTransformation);
+    const std::vector<std::shared_ptr<sc::DataTransformation>>& getDataTransformation() const;
 };
 
 class SC_DLLPUBLIC ExternalDataMapper
diff --git a/sc/source/ui/dataprovider/csvdataprovider.cxx b/sc/source/ui/dataprovider/csvdataprovider.cxx
index ed7302209896..28877c247b42 100644
--- a/sc/source/ui/dataprovider/csvdataprovider.cxx
+++ b/sc/source/ui/dataprovider/csvdataprovider.cxx
@@ -65,14 +65,14 @@ public:
 
 namespace sc {
 
-CSVFetchThread::CSVFetchThread(ScDocument& rDoc, const OUString& mrURL, Idle* pIdle,
+CSVFetchThread::CSVFetchThread(ScDocument& rDoc, const OUString& mrURL, std::function<void()> aImportFinishedHdl,
         const std::vector<std::shared_ptr<sc::DataTransformation>>& rDataTransformations):
         Thread("CSV Fetch Thread"),
         mrDocument(rDoc),
         maURL (mrURL),
         mbTerminate(false),
         maDataTransformations(rDataTransformations),
-        mpIdle(pIdle)
+        maImportFinishedHdl(aImportFinishedHdl)
 {
     maConfig.delimiters.push_back(',');
     maConfig.text_qualifier = '"';
@@ -116,16 +116,13 @@ void CSVFetchThread::execute()
     }
 
     SolarMutexGuard aGuard;
-    mpIdle->Start();
+    maImportFinishedHdl();
 }
 
-CSVDataProvider::CSVDataProvider(ScDocument* pDoc, const OUString& rURL, ScDBDataManager* pBDDataManager):
-    maURL(rURL),
-    mpDocument(pDoc),
-    mpDBDataManager(pBDDataManager),
-    maIdle("CSVDataProvider CopyHandler")
+CSVDataProvider::CSVDataProvider(ScDocument* pDoc, sc::ExternalDataSource& rDataSource):
+    DataProvider(rDataSource),
+    mpDocument(pDoc)
 {
-    maIdle.SetInvokeHandler(LINK(this, CSVDataProvider, ImportFinishedHdl));
 }
 
 CSVDataProvider::~CSVDataProvider()
@@ -145,7 +142,7 @@ void CSVDataProvider::Import()
 
     mpDoc.reset(new ScDocument(SCDOCMODE_CLIP));
     mpDoc->ResetClip(mpDocument, (SCTAB)0);
-    mxCSVFetchThread = new CSVFetchThread(*mpDoc, maURL, &maIdle, mpDBDataManager->getDataTransformation());
+    mxCSVFetchThread = new CSVFetchThread(*mpDoc, mrDataSource.getURL(), std::bind(&CSVDataProvider::ImportFinished, this), mrDataSource.getDataTransformation());
     mxCSVFetchThread->launch();
 
     if (mbDeterministic)
@@ -155,10 +152,9 @@ void CSVDataProvider::Import()
     }
 }
 
-IMPL_LINK_NOARG(CSVDataProvider, ImportFinishedHdl, Timer*, void)
+void CSVDataProvider::ImportFinished()
 {
-    mpDBDataManager->WriteToDoc(*mpDoc);
-    mxCSVFetchThread.clear();
+    mrDataSource.getDBManager()->WriteToDoc(*mpDoc);
     mpDoc.reset();
     Refresh();
 }
@@ -166,7 +162,13 @@ IMPL_LINK_NOARG(CSVDataProvider, ImportFinishedHdl, Timer*, void)
 void CSVDataProvider::Refresh()
 {
     ScDocShell* pDocShell = static_cast<ScDocShell*>(mpDocument->GetDocumentShell());
-    pDocShell->SetDocumentModified();
+    if (pDocShell)
+        pDocShell->SetDocumentModified();
+}
+
+const OUString& CSVDataProvider::GetURL() const
+{
+    return mrDataSource.getURL();
 }
 
 }
diff --git a/sc/source/ui/dataprovider/dataprovider.cxx b/sc/source/ui/dataprovider/dataprovider.cxx
index 924b3f109a30..d07edb78958c 100644
--- a/sc/source/ui/dataprovider/dataprovider.cxx
+++ b/sc/source/ui/dataprovider/dataprovider.cxx
@@ -74,6 +74,17 @@ void ExternalDataSource::setID(const OUString& rID)
     maID = rID;
 }
 
+void ExternalDataSource::setURL(const OUString& rURL)
+{
+    maURL = rURL;
+}
+
+void ExternalDataSource::setProvider(const OUString& rProvider)
+{
+    maProvider = rProvider;
+    mpDataProvider.reset();
+}
+
 const OUString& ExternalDataSource::getURL() const
 {
     return maURL;
@@ -117,6 +128,11 @@ double ExternalDataSource::getUpdateFrequency() const
     return mnUpdateFrequency;
 }
 
+ScDBDataManager* ExternalDataSource::getDBManager()
+{
+    return mpDBDataManager.get();
+}
+
 void ExternalDataSource::refresh(ScDocument* pDoc, bool bDeterministic)
 {
     // no DB data available
@@ -125,7 +141,7 @@ void ExternalDataSource::refresh(ScDocument* pDoc, bool bDeterministic)
 
     // if no data provider exists, try to create one
     if (!mpDataProvider)
-        mpDataProvider = DataProviderFactory::getDataProvider(pDoc, maProvider, maURL, maID, mpDBDataManager.get());
+        mpDataProvider = DataProviderFactory::getDataProvider(pDoc, *this);
 
     // if we still have not been able to create one, we can not refresh the data
     if (!mpDataProvider)
@@ -137,6 +153,16 @@ void ExternalDataSource::refresh(ScDocument* pDoc, bool bDeterministic)
     mpDataProvider->Import();
 }
 
+void ExternalDataSource::AddDataTransformation(std::shared_ptr<sc::DataTransformation> mpDataTransformation)
+{
+    maDataTransformations.push_back(mpDataTransformation);
+}
+
+const std::vector<std::shared_ptr<sc::DataTransformation>>& ExternalDataSource::getDataTransformation() const
+{
+    return maDataTransformations;
+}
+
 ExternalDataMapper::ExternalDataMapper(ScDocument* /*pDoc*/)
     //mpDoc(pDoc)
 {
@@ -161,8 +187,9 @@ std::vector<sc::ExternalDataSource>& ExternalDataMapper::getDataSources()
     return maDataSources;
 }
 
-DataProvider::DataProvider():
-    mbDeterministic(false)
+DataProvider::DataProvider(sc::ExternalDataSource& rDataSource):
+    mbDeterministic(false),
+    mrDataSource(rDataSource)
 {
 }
 
@@ -198,14 +225,15 @@ void ScDBDataManager::WriteToDoc(ScDocument& rDoc)
     SCCOL nColSize = std::min<SCCOL>(aDestRange.aEnd.Col() - aDestRange.aStart.Col(), nEndCol);
     aDestRange.aEnd.SetCol(aDestRange.aStart.Col() + nColSize);
 
-    SCROW nRowSize = std::min<SCCOL>(aDestRange.aEnd.Row() - aDestRange.aStart.Row(), nEndRow);
+    SCROW nRowSize = std::min<SCROW>(aDestRange.aEnd.Row() - aDestRange.aStart.Row(), nEndRow);
     aDestRange.aEnd.SetRow(aDestRange.aStart.Row() + nRowSize);
 
     ScMarkData aMark;
     aMark.SelectTable(0, true);
     mpDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, &rDoc);
     ScDocShell* pDocShell = static_cast<ScDocShell*>(mpDoc->GetDocumentShell());
-    pDocShell->PostPaint(aDestRange, PaintPartFlags::All);
+    if (pDocShell)
+        pDocShell->PostPaint(aDestRange, PaintPartFlags::All);
 }
 
 ScDBDataManager::ScDBDataManager(const OUString& rDBName,  bool /*bAllowResize*/, ScDocument* pDoc):
@@ -224,16 +252,6 @@ void ScDBDataManager::SetDatabase(const OUString& rDBName)
     maDBName = rDBName;
 }
 
-void ScDBDataManager::AddDataTransformation(std::shared_ptr<sc::DataTransformation> mpDataTransformation)
-{
-    maDataTransformations.push_back(std::move(mpDataTransformation));
-}
-
-const std::vector<std::shared_ptr<sc::DataTransformation>>& ScDBDataManager::getDataTransformation() const
-{
-    return maDataTransformations;
-}
-
 ScDBData* ScDBDataManager::getDBData()
 {
     ScDBData* pDBData = mpDoc->GetDBCollection()->getNamedDBs().findByUpperName(ScGlobal::pCharClass->uppercase(maDBName));
@@ -245,16 +263,17 @@ bool DataProviderFactory::isInternalDataProvider(const OUString& rProvider)
     return rProvider.startsWith("org.libreoffice.calc");
 }
 
-std::shared_ptr<DataProvider> DataProviderFactory::getDataProvider(ScDocument* pDoc, const OUString& rProvider,
-        const OUString& rURL, const OUString& rID, ScDBDataManager* pManager)
+std::shared_ptr<DataProvider> DataProviderFactory::getDataProvider(ScDocument* pDoc,
+        sc::ExternalDataSource& rDataSource)
 {
-    bool bInternal = DataProviderFactory::isInternalDataProvider(rProvider);
+    const OUString& rDataProvider = rDataSource.getProvider();
+    bool bInternal = DataProviderFactory::isInternalDataProvider(rDataProvider);
     if (bInternal)
     {
-        if (rProvider == "org.libreoffice.calc.csv")
-            return std::shared_ptr<DataProvider>(new CSVDataProvider(pDoc, rURL, pManager));
-        else if (rProvider == "org.libreoffice.calc.html")
-            return std::shared_ptr<DataProvider>(new HTMLDataProvider(pDoc, rURL, pManager, rID));
+        if (rDataProvider == "org.libreoffice.calc.csv")
+            return std::shared_ptr<DataProvider>(new CSVDataProvider(pDoc, rDataSource));
+        else if (rDataProvider == "org.libreoffice.calc.html")
+            return std::shared_ptr<DataProvider>(new HTMLDataProvider(pDoc, rDataSource));
     }
     else
     {
diff --git a/sc/source/ui/dataprovider/htmldataprovider.cxx b/sc/source/ui/dataprovider/htmldataprovider.cxx
index 090d6d73721f..890faf7d6bd0 100644
--- a/sc/source/ui/dataprovider/htmldataprovider.cxx
+++ b/sc/source/ui/dataprovider/htmldataprovider.cxx
@@ -27,8 +27,7 @@ class HTMLFetchThread : public salhelper::Thread
     OUString maURL;
     OUString maID;
     const std::vector<std::shared_ptr<sc::DataTransformation>> maDataTransformations;
-
-    Idle* mpIdle;
+    std::function<void()> maImportFinishedHdl;
 
     void handleTable(xmlNodePtr pTable);
     void handleRow(xmlNodePtr pRow, SCROW nRow);
@@ -36,20 +35,20 @@ class HTMLFetchThread : public salhelper::Thread
     void handleCell(xmlNodePtr pCell, SCROW nRow, SCCOL nCol);
 
 public:
-    HTMLFetchThread(ScDocument& rDoc, const OUString&, const OUString& rID, Idle* pIdle,
+    HTMLFetchThread(ScDocument& rDoc, const OUString&, const OUString& rID, std::function<void()> aImportFinishedHdl,
             const std::vector<std::shared_ptr<sc::DataTransformation>>& rTransformations);
 
     virtual void execute() override;
 };
 
-HTMLFetchThread::HTMLFetchThread(ScDocument& rDoc, const OUString& rURL, const OUString& rID, Idle* pIdle,
+HTMLFetchThread::HTMLFetchThread(ScDocument& rDoc, const OUString& rURL, const OUString& rID, std::function<void()> aImportFinishedHdl,
         const std::vector<std::shared_ptr<sc::DataTransformation>>& rTransformations):
     salhelper::Thread("HTML Fetch Thread"),
     mrDocument(rDoc),
     maURL(rURL),
     maID(rID),
     maDataTransformations(rTransformations),
-    mpIdle(pIdle)
+    maImportFinishedHdl(aImportFinishedHdl)
 {
 }
 
@@ -207,18 +206,13 @@ void HTMLFetchThread::execute()
     }
 
     SolarMutexGuard aGuard;
-    mpIdle->Start();
+    maImportFinishedHdl();
 }
 
-HTMLDataProvider::HTMLDataProvider(ScDocument* pDoc, const OUString& rURL, ScDBDataManager* pDBManager,
-        const OUString& rID):
-    maID(rID),
-    maURL(rURL),
-    mpDocument(pDoc),
-    mpDBDataManager(pDBManager),
-    maIdle("HTMLDataProvider CopyHandler")
+HTMLDataProvider::HTMLDataProvider(ScDocument* pDoc, sc::ExternalDataSource& rDataSource):
+    DataProvider(rDataSource),
+    mpDocument(pDoc)
 {
-    maIdle.SetInvokeHandler(LINK(this, HTMLDataProvider, ImportFinishedHdl));
 }
 
 HTMLDataProvider::~HTMLDataProvider()
@@ -238,8 +232,8 @@ void HTMLDataProvider::Import()
 
     mpDoc.reset(new ScDocument(SCDOCMODE_CLIP));
     mpDoc->ResetClip(mpDocument, (SCTAB)0);
-    mxHTMLFetchThread = new HTMLFetchThread(*mpDoc, maURL, maID, &maIdle,
-            mpDBDataManager->getDataTransformation());
+    mxHTMLFetchThread = new HTMLFetchThread(*mpDoc, mrDataSource.getURL(), mrDataSource.getID(),
+            std::bind(&HTMLDataProvider::ImportFinished, this), mrDataSource.getDataTransformation());
     mxHTMLFetchThread->launch();
 
     if (mbDeterministic)
@@ -254,7 +248,7 @@ std::map<OUString, OUString> HTMLDataProvider::getDataSourcesForURL(const OUStri
     std::map<OUString, OUString> aMap;
 
     OStringBuffer aBuffer(64000);
-    std::unique_ptr<SvStream> pStream = DataProvider::FetchStreamFromURL(maURL, aBuffer);
+    std::unique_ptr<SvStream> pStream = DataProvider::FetchStreamFromURL(mrDataSource.getURL(), aBuffer);
 
     if (aBuffer.isEmpty())
         return std::map<OUString, OUString>();
@@ -280,16 +274,16 @@ std::map<OUString, OUString> HTMLDataProvider::getDataSourcesForURL(const OUStri
     return aMap;
 }
 
-IMPL_LINK_NOARG(HTMLDataProvider, ImportFinishedHdl, Timer*, void)
+void HTMLDataProvider::ImportFinished()
 {
-    mpDBDataManager->WriteToDoc(*mpDoc);
+    mrDataSource.getDBManager()->WriteToDoc(*mpDoc);
     mxHTMLFetchThread.clear();
     mpDoc.reset();
 }
 
 const OUString& HTMLDataProvider::GetURL() const
 {
-    return maURL;
+    return mrDataSource.getURL();
 }
 
 }
diff --git a/sc/source/ui/dataprovider/htmldataprovider.hxx b/sc/source/ui/dataprovider/htmldataprovider.hxx
index 95bf9e0b3d36..69398632846f 100644
--- a/sc/source/ui/dataprovider/htmldataprovider.hxx
+++ b/sc/source/ui/dataprovider/htmldataprovider.hxx
@@ -21,18 +21,14 @@ class HTMLDataProvider : public DataProvider
 {
 private:
 
-    OUString maID;
-    OUString maURL;
     ScDocument* mpDocument;
-    ScDBDataManager* mpDBDataManager;
     rtl::Reference<HTMLFetchThread> mxHTMLFetchThread;
 
     std::unique_ptr<ScDocument> mpDoc;
-    Idle maIdle;
 
 public:
 
-    HTMLDataProvider(ScDocument* pDoc, const OUString& rURL, ScDBDataManager* pDBManager, const OUString& rID);
+    HTMLDataProvider(ScDocument* pDoc, sc::ExternalDataSource& rDataSource);
     virtual ~HTMLDataProvider() override;
 
     virtual void Import() override;
@@ -41,7 +37,7 @@ public:
 
     virtual std::map<OUString, OUString> getDataSourcesForURL(const OUString& rURL) override;
 
-    DECL_LINK( ImportFinishedHdl, Timer*, void );
+    void ImportFinished();
 };
 
 }
diff --git a/sc/source/ui/inc/dataprovider.hxx b/sc/source/ui/inc/dataprovider.hxx
index df70c4099d2c..30e871ee6b0c 100644
--- a/sc/source/ui/inc/dataprovider.hxx
+++ b/sc/source/ui/inc/dataprovider.hxx
@@ -60,11 +60,11 @@ class CSVFetchThread : public salhelper::Thread
 
     std::vector<std::shared_ptr<sc::DataTransformation>> maDataTransformations;
 
-    Idle* mpIdle;
+    std::function<void()> maImportFinishedHdl;
 
 
 public:
-    CSVFetchThread(ScDocument& rDoc, const OUString&, Idle* pIdle,
+    CSVFetchThread(ScDocument& rDoc, const OUString&, std::function<void()> aImportFinishedHdl,
             const std::vector<std::shared_ptr<sc::DataTransformation>>& mrDataTransformations);
     virtual ~CSVFetchThread() override;
 
@@ -87,9 +87,10 @@ protected:
      * If true make the threaded import deterministic for the tests.
      */
     bool mbDeterministic;
+    sc::ExternalDataSource& mrDataSource;
 
 public:
-    DataProvider();
+    DataProvider(sc::ExternalDataSource& rDataSource);
 
     virtual ~DataProvider();
 
@@ -106,23 +107,20 @@ public:
 
 class CSVDataProvider : public DataProvider
 {
-    OUString maURL;
     rtl::Reference<CSVFetchThread> mxCSVFetchThread;
     ScDocument* mpDocument;
-    ScDBDataManager* mpDBDataManager;
     std::unique_ptr<ScDocument> mpDoc;
-    Idle maIdle;
 
     void Refresh();
 
 public:
-    CSVDataProvider (ScDocument* pDoc, const OUString& rURL, ScDBDataManager* pDBManager);
+    CSVDataProvider (ScDocument* pDoc, sc::ExternalDataSource& rDataSource);
     virtual ~CSVDataProvider() override;
 
     virtual void Import() override;
 
-    const OUString& GetURL() const override { return maURL; }
-    DECL_LINK( ImportFinishedHdl, Timer*, void );
+    const OUString& GetURL() const override;
+    void ImportFinished();
 };
 
 /**
@@ -140,17 +138,12 @@ class ScDBDataManager
     OUString maDBName;
     ScDocument* mpDoc;
 
-    std::vector<std::shared_ptr<sc::DataTransformation>> maDataTransformations;
-
 public:
     ScDBDataManager(const OUString& rDBName, bool bAllowResize, ScDocument* pDoc);
     ~ScDBDataManager();
 
     void SetDatabase(const OUString& rDBName);
 
-    void AddDataTransformation(std::shared_ptr<sc::DataTransformation> mpDataTransformation);
-    const std::vector<std::shared_ptr<sc::DataTransformation>>& getDataTransformation() const;
-
     ScDBData* getDBData();
 
     void WriteToDoc(ScDocument& rDoc);
@@ -164,7 +157,7 @@ private:
 
 public:
 
-    static std::shared_ptr<DataProvider> getDataProvider(ScDocument* pDoc, const OUString& rProvider, const OUString& rURL, const OUString& rID, ScDBDataManager* pManager);
+    static std::shared_ptr<DataProvider> getDataProvider(ScDocument* pDoc, sc::ExternalDataSource& rDataSource);
 
     static std::vector<OUString> getDataProviders();
 };


More information about the Libreoffice-commits mailing list