summaryrefslogtreecommitdiff
path: root/cui
diff options
context:
space:
mode:
authorYusuf Keten <ketenyusuf@gmail.com>2020-07-30 19:31:28 +0300
committerMuhammet Kara <muhammet.kara@collabora.com>2020-08-07 07:24:09 +0200
commit4e31468ce84951a8789f5bcd229145d6dcd55c5e (patch)
tree2dd1117337ff2141f9680497209fd6435cc77937 /cui
parentf52f86a3905fc099832187ad20fd29f0ab73b43f (diff)
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@collabora.com>
Diffstat (limited to 'cui')
-rw-r--r--cui/source/dialogs/AdditionsDialog.cxx83
-rw-r--r--cui/source/inc/AdditionsDialog.hxx31
2 files changed, 107 insertions, 7 deletions
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; }
};