[Libreoffice-commits] core.git: cui/source

Yusuf Keten (via logerrit) logerrit at kemper.freedesktop.org
Fri Aug 7 05:24:50 UTC 2020


 cui/source/dialogs/AdditionsDialog.cxx |   83 +++++++++++++++++++++++++++++++++
 cui/source/inc/AdditionsDialog.hxx     |   31 +++++++++---
 2 files changed, 107 insertions(+), 7 deletions(-)

New commits:
commit 4e31468ce84951a8789f5bcd229145d6dcd55c5e
Author:     Yusuf Keten <ketenyusuf at gmail.com>
AuthorDate: Thu Jul 30 19:31:28 2020 +0300
Commit:     Muhammet Kara <muhammet.kara at collabora.com>
CommitDate: Fri Aug 7 07:24:09 2020 +0200

    tdf#133026: Additions: Disable install buttons of the existing extensions
    
    If the extension exists, the install button will be disabled.
    
    Change-Id: Ide88faeabe86d9cdb6a3cb99257710d92e3b4769
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99809
    Tested-by: Jenkins
    Reviewed-by: Muhammet Kara <muhammet.kara at collabora.com>

diff --git a/cui/source/dialogs/AdditionsDialog.cxx b/cui/source/dialogs/AdditionsDialog.cxx
index 61a45329cbee..71f7fb1f09c4 100644
--- a/cui/source/dialogs/AdditionsDialog.cxx
+++ b/cui/source/dialogs/AdditionsDialog.cxx
@@ -47,6 +47,13 @@
 #include <ucbhelper/content.hxx>
 #include <comphelper/simplefileaccessinteraction.hxx>
 
+#include <com/sun/star/deployment/DeploymentException.hpp>
+#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
+#include <com/sun/star/frame/TerminationVetoException.hpp>
+#include <com/sun/star/ucb/CommandAbortedException.hpp>
+#include <com/sun/star/ucb/CommandFailedException.hpp>
+
+//cURL
 #include <curl/curl.h>
 #include <orcus/json_document_tree.hpp>
 #include <orcus/config.hpp>
@@ -341,6 +348,7 @@ void SearchAndParseThread::LoadInfo(const AdditionInfo& additionInfo, AdditionsI
     rCurrentItem.m_xLinkButtonComments->set_uri(additionInfo.sCommentURL);
     rCurrentItem.m_xLabelDownloadNumber->set_label(additionInfo.sDownloadNumber);
     rCurrentItem.m_pParentDialog = m_pAdditionsDialog;
+    rCurrentItem.m_sDownloadURL = additionInfo.sDownloadURL;
 }
 
 void SearchAndParseThread::Append(const AdditionInfo& additionInfo)
@@ -409,6 +417,48 @@ void SearchAndParseThread::Search()
             nIteration++;
         }
     }
+    CheckInstalledExtensions();
+}
+
+void SearchAndParseThread::CheckInstalledExtensions()
+{
+    uno::Sequence<uno::Sequence<uno::Reference<deployment::XPackage>>> xAllPackages
+        = m_pAdditionsDialog->getInstalledExtensions();
+
+    if (!xAllPackages.hasElements())
+        return;
+
+    OUString currentExtensionName;
+
+    for (auto& package : xAllPackages)
+    {
+        for (auto& extensionVersion : package)
+        {
+            if (extensionVersion.is())
+            {
+                currentExtensionName = extensionVersion->getName();
+                if (currentExtensionName.isEmpty())
+                    continue;
+
+                m_pAdditionsDialog->m_searchOptions.searchString = currentExtensionName;
+                utl::TextSearch textSearch(m_pAdditionsDialog->m_searchOptions);
+
+                for (auto& rInfo : m_pAdditionsDialog->m_aAdditionsItems)
+                {
+                    OUString sExtensionDownloadURL = rInfo.m_sDownloadURL;
+
+                    if (!textSearch.searchForward(sExtensionDownloadURL))
+                    {
+                        continue;
+                    }
+                    else
+                    {
+                        rInfo.m_xButtonInstall->set_sensitive(false);
+                    }
+                }
+            }
+        }
+    }
 }
 
 void SearchAndParseThread::execute()
@@ -479,6 +529,9 @@ AdditionsDialog::AdditionsDialog(weld::Window* pParent, const OUString& sAdditio
     OString rURL = sPrefixURL + m_sTag + sSuffixURL;
     m_sURL = rURL;
 
+    m_xExtensionManager
+        = deployment::ExtensionManager::get(::comphelper::getProcessComponentContext());
+
     //Initialize search util
     m_searchOptions.AlgorithmType2 = css::util::SearchAlgorithms2::ABSOLUTE;
     m_searchOptions.transliterateFlags |= TransliterationFlags::IGNORE_CASE;
@@ -501,6 +554,36 @@ AdditionsDialog::~AdditionsDialog()
     }
 }
 
+uno::Sequence<uno::Sequence<uno::Reference<deployment::XPackage>>>
+AdditionsDialog::getInstalledExtensions()
+{
+    uno::Sequence<uno::Sequence<uno::Reference<deployment::XPackage>>> xAllPackages;
+
+    try
+    {
+        xAllPackages = m_xExtensionManager->getAllExtensions(
+            uno::Reference<task::XAbortChannel>(), uno::Reference<ucb::XCommandEnvironment>());
+    }
+    catch (const deployment::DeploymentException&)
+    {
+        SAL_WARN("cui.dialogs", "Deployment Exception");
+    }
+    catch (const ucb::CommandFailedException&)
+    {
+        SAL_WARN("cui.dialogs", "Command Failed Exception");
+    }
+    catch (const ucb::CommandAbortedException&)
+    {
+        SAL_WARN("cui.dialogs", "Command Aborted Exception");
+    }
+    catch (const lang::IllegalArgumentException& e)
+    {
+        css::uno::Any anyEx = cppu::getCaughtException();
+        throw css::lang::WrappedTargetRuntimeException(e.Message, e.Context, anyEx);
+    }
+    return xAllPackages;
+}
+
 void AdditionsDialog::SetProgress(const OUString& rProgress)
 {
     if (rProgress.isEmpty())
diff --git a/cui/source/inc/AdditionsDialog.hxx b/cui/source/inc/AdditionsDialog.hxx
index 7b082a1b5230..7a688516fa1a 100644
--- a/cui/source/inc/AdditionsDialog.hxx
+++ b/cui/source/inc/AdditionsDialog.hxx
@@ -13,10 +13,19 @@
 #include <vcl/svapp.hxx>
 #include <salhelper/thread.hxx>
 #include <rtl/ref.hxx>
-#include <vcl/timer.hxx>
 #include <vcl/weld.hxx>
+
+// Detect changes on the UI
+#include <vcl/timer.hxx>
+
+// Search and filter
 #include <i18nutil/searchopt.hxx>
 
+// Extension Manager Connection
+#include <com/sun/star/deployment/XExtensionManager.hpp>
+#include <com/sun/star/deployment/ExtensionManager.hpp>
+#include <com/sun/star/deployment/XPackageManager.hpp>
+
 class AdditionsDialog;
 class SearchAndParseThread;
 
@@ -40,6 +49,7 @@ struct AdditionsItem
         , m_xLabelDownloadNumber(m_xBuilder->weld_label("labelDownloadNumber"))
         , m_xButtonShowMore(m_xBuilder->weld_button("buttonShowMore"))
         , m_pParentDialog(nullptr)
+        , m_sDownloadURL("")
     {
         m_xButtonShowMore->connect_clicked(LINK(this, AdditionsItem, ShowMoreHdl));
     }
@@ -63,6 +73,7 @@ struct AdditionsItem
     std::unique_ptr<weld::Label> m_xLabelDownloadNumber;
     std::unique_ptr<weld::Button> m_xButtonShowMore;
     AdditionsDialog* m_pParentDialog;
+    OUString m_sDownloadURL;
 };
 
 struct AdditionInfo
@@ -89,6 +100,8 @@ class AdditionsDialog : public weld::GenericDialogController
 private:
     Timer m_aSearchDataTimer;
 
+    css::uno::Reference<css::deployment::XExtensionManager> m_xExtensionManager;
+
     DECL_LINK(SearchUpdateHdl, weld::Entry&, void);
     DECL_LINK(ImplUpdateDataHdl, Timer*, void);
     DECL_LINK(FocusOut_Impl, weld::Widget&, void);
@@ -116,6 +129,8 @@ public:
 
     AdditionsDialog(weld::Window* pParent, const OUString& sAdditionsTag);
     ~AdditionsDialog() override;
+    css::uno::Sequence<css::uno::Sequence<css::uno::Reference<css::deployment::XPackage>>>
+    getInstalledExtensions();
     void SetProgress(const OUString& rProgress);
     void ClearList();
 };
@@ -127,12 +142,6 @@ private:
     std::atomic<bool> m_bExecute;
     bool m_bIsFirstLoading;
 
-    virtual ~SearchAndParseThread() override;
-    virtual void execute() override;
-
-public:
-    SearchAndParseThread(AdditionsDialog* pDialog, const bool& bIsFirstLoading);
-
     void LoadInfo(const AdditionInfo& additionInfo, AdditionsItem& rCurrentItem);
     void Search();
 
@@ -140,6 +149,14 @@ public:
 
     void AppendAllExtensions();
 
+    void CheckInstalledExtensions();
+
+    virtual ~SearchAndParseThread() override;
+    virtual void execute() override;
+
+public:
+    SearchAndParseThread(AdditionsDialog* pDialog, const bool& bIsFirstLoading);
+
     void StopExecution() { m_bExecute = false; }
 };
 


More information about the Libreoffice-commits mailing list