Related: tdf#158004 - UI: Part 20 - Unify lockdown behavior of

Options dialog for Databases Page.

Change-Id: I573479df8048a9ff4d4aedc9780cbe0395900526
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159074
Tested-by: Jenkins
Reviewed-by: Balazs Varga <balazs.varga.extern@allotropia.de>
diff --git a/cui/source/options/doclinkdialog.cxx b/cui/source/options/doclinkdialog.cxx
index fac9900..f938399 100644
--- a/cui/source/options/doclinkdialog.cxx
+++ b/cui/source/options/doclinkdialog.cxx
@@ -20,7 +20,11 @@
#include "doclinkdialog.hxx"

#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <comphelper/processfactory.hxx>
#include <officecfg/Office/DataAccess.hxx>
#include <strings.hrc>
#include <svl/filenotation.hxx>
#include <vcl/svapp.hxx>
@@ -53,6 +57,9 @@ namespace svx
        m_xURL->DisableHistory();
        m_xURL->SetFilter(u"*.odb");

        css::uno::Reference < css::uno::XComponentContext > xContext(::comphelper::getProcessComponentContext());
        m_xReadWriteAccess = css::configuration::ReadWriteAccess::create(xContext, "*");

        m_xName->connect_changed( LINK(this, ODocumentLinkDialog, OnEntryModified) );
        m_xURL->connect_changed( LINK(this, ODocumentLinkDialog, OnComboBoxModified) );
        m_xBrowseFile->connect_clicked( LINK(this, ODocumentLinkDialog, OnBrowseFile) );
@@ -81,6 +88,44 @@ namespace svx
    void ODocumentLinkDialog::validate( )
    {
        m_xOK->set_sensitive((!m_xName->get_text().isEmpty()) && (!m_xURL->get_active_text().isEmpty()));

        if (m_xOK->get_sensitive())
        {
            Reference<container::XNameAccess> xItemList = officecfg::Office::DataAccess::RegisteredNames::get();
            Sequence< OUString > lNodeNames = xItemList->getElementNames();

            for (const OUString& sNodeName : lNodeNames)
            {
                Reference<css::beans::XPropertySet> xSet;
                xItemList->getByName(sNodeName) >>= xSet;

                OUString aDatabaseName;
                if (xSet->getPropertySetInfo()->hasPropertyByName("Name"))
                    xSet->getPropertyValue("Name") >>= aDatabaseName;

                if (!aDatabaseName.isEmpty() && m_xName->get_text() == aDatabaseName)
                {
                    const OUString aConfigPath = officecfg::Office::DataAccess::RegisteredNames::path() + "/" + sNodeName;
                    if (m_xReadWriteAccess->hasPropertyByHierarchicalName(aConfigPath + "/Name"))
                    {
                        css::beans::Property aProperty = m_xReadWriteAccess->getPropertyByHierarchicalName(aConfigPath + "/Name");
                        bool bReadOnly = (aProperty.Attributes & css::beans::PropertyAttribute::READONLY) != 0;

                        m_xURL->set_sensitive(!bReadOnly);
                        m_xBrowseFile->set_sensitive(!bReadOnly);
                    }

                    if (m_xReadWriteAccess->hasPropertyByHierarchicalName(aConfigPath + "/Location"))
                    {
                        css::beans::Property aProperty = m_xReadWriteAccess->getPropertyByHierarchicalName(aConfigPath + "/Location");
                        bool bReadOnly = (aProperty.Attributes & css::beans::PropertyAttribute::READONLY) != 0;

                        m_xName->set_sensitive(!bReadOnly);
                    }
                    break;
                }
            }
        }
    }

    IMPL_LINK_NOARG(ODocumentLinkDialog, OnOk, weld::Button&, void)
diff --git a/cui/source/options/doclinkdialog.hxx b/cui/source/options/doclinkdialog.hxx
index 371dc65..3ea0d50 100644
--- a/cui/source/options/doclinkdialog.hxx
+++ b/cui/source/options/doclinkdialog.hxx
@@ -21,6 +21,7 @@

#include <vcl/weld.hxx>
#include <svtools/inettbc.hxx>
#include <com/sun/star/configuration/ReadWriteAccess.hpp>

namespace svx
{
@@ -30,6 +31,8 @@ namespace svx
    {
        Link<const OUString&,bool>      m_aNameValidator;

        css::uno::Reference< css::configuration::XReadWriteAccess> m_xReadWriteAccess;

        std::unique_ptr<weld::Button> m_xBrowseFile;
        std::unique_ptr<weld::Entry> m_xName;
        std::unique_ptr<weld::Button> m_xOK;