sw/inc/unofieldcoll.hxx                              |    3 +
 sw/inc/unotxdoc.hxx                                  |    3 +
 sw/source/core/inc/unofield.hxx                      |    2 -
 sw/source/core/unocore/unofield.cxx                  |   11 ++++--
 sw/source/uibase/uno/unotxdoc.cxx                    |   19 +++++++++++
 sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx |   32 ++++++++-----------
 sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx |    3 +
 sw/source/writerfilter/dmapper/SettingsTable.cxx     |   10 +++--
 8 files changed, 56 insertions(+), 27 deletions(-)

New commits:
commit 85b2d335a4ec0af84ca4801ba04f45f0ed5a7c10
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Mon Aug 5 21:50:27 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Wed Aug 7 18:47:40 2024 +0200

    use more concrete UNO type in writerfilter
    
    Change-Id: Ib9b78a7759b783d207fcd0f6db86ca8f95d2e7f7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171518
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/inc/unofieldcoll.hxx b/sw/inc/unofieldcoll.hxx
index a7bfda4bcbfe..7989cb52b919 100644
--- a/sw/inc/unofieldcoll.hxx
+++ b/sw/inc/unofieldcoll.hxx
@@ -61,8 +61,9 @@ public:
             const OUString& rName) override;
     virtual css::uno::Sequence< OUString > SAL_CALL
         getElementNames() override;
-    virtual sal_Bool SAL_CALL hasByName(const OUString& rName) override;
+    SW_DLLPUBLIC virtual sal_Bool SAL_CALL hasByName(const OUString& rName) 
override;
 
+    SW_DLLPUBLIC rtl::Reference<SwXFieldMaster> getFieldMasterByName(const 
OUString& rName);
 };
 
 typedef ::cppu::WeakImplHelper
diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx
index abc6b3130ac7..b7494d2f0c98 100644
--- a/sw/inc/unotxdoc.hxx
+++ b/sw/inc/unotxdoc.hxx
@@ -120,6 +120,7 @@ class SwXContentControl;
 class SwXTextEmbeddedObject;
 class SvXMLEmbeddedObjectHelper;
 class SwXFieldmark;
+class SwXFieldMaster;
 namespace com::sun::star::container { class XNameContainer; }
 namespace com::sun::star::frame { class XController; }
 namespace com::sun::star::lang { struct Locale; }
@@ -521,6 +522,8 @@ public:
 
     SwDocShell*                 GetDocShell() {return m_pDocShell;}
 
+    rtl::Reference<SwXTextFieldMasters> getSwXTextFieldMasters();
+    rtl::Reference<SwXFieldMaster> createFieldMaster(std::u16string_view 
sServiceName);
     rtl::Reference<SwXTextField> createTextField(std::u16string_view 
sServiceName);
     rtl::Reference<SwXFieldmark> createFieldmark(std::u16string_view 
sServiceName);
     rtl::Reference<SwXDocumentSettings> createDocumentSettings();
diff --git a/sw/source/core/inc/unofield.hxx b/sw/source/core/inc/unofield.hxx
index 924ff0ec358c..dde5ccb4c505 100644
--- a/sw/source/core/inc/unofield.hxx
+++ b/sw/source/core/inc/unofield.hxx
@@ -41,7 +41,7 @@ typedef ::cppu::WeakImplHelper
 ,   css::lang::XComponent
 > SwXFieldMaster_Base;
 
-class SwXFieldMaster final
+class SW_DLLPUBLIC SwXFieldMaster final
     : public SwXFieldMaster_Base
 {
 
diff --git a/sw/source/core/unocore/unofield.cxx 
b/sw/source/core/unocore/unofield.cxx
index 1ba6b6d53de4..f40b7fbbaf2a 100644
--- a/sw/source/core/unocore/unofield.cxx
+++ b/sw/source/core/unocore/unofield.cxx
@@ -2742,6 +2742,11 @@ static SwFieldIds lcl_GetIdByName( OUString& rName, 
OUString& rTypeName )
 }
 
 uno::Any SwXTextFieldMasters::getByName(const OUString& rName)
+{
+    return 
uno::Any(uno::Reference<beans::XPropertySet>(getFieldMasterByName(rName)));
+}
+
+rtl::Reference<SwXFieldMaster> SwXTextFieldMasters::getFieldMasterByName(const 
OUString& rName)
 {
     SolarMutexGuard aGuard;
 
@@ -2760,9 +2765,9 @@ uno::Any SwXTextFieldMasters::getByName(const OUString& 
rName)
             "SwXTextFieldMasters::getByName(" + rName + ")",
             css::uno::Reference<css::uno::XInterface>());
 
-    uno::Reference<beans::XPropertySet> const xRet(
-            SwXFieldMaster::CreateXFieldMaster(&rDoc, pType));
-    return uno::Any(xRet);
+    rtl::Reference<SwXFieldMaster> const xRet =
+            SwXFieldMaster::CreateXFieldMaster(&rDoc, pType);
+    return xRet;
 }
 
 bool SwXTextFieldMasters::getInstanceName(
diff --git a/sw/source/uibase/uno/unotxdoc.cxx 
b/sw/source/uibase/uno/unotxdoc.cxx
index 3ba2601eba1c..300f7b81bb61 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -1173,6 +1173,11 @@ Reference< XEnumerationAccess >  
SwXTextDocument::getTextFields()
 }
 
 Reference< XNameAccess >  SwXTextDocument::getTextFieldMasters()
+{
+    return getSwXTextFieldMasters();
+}
+
+rtl::Reference< SwXTextFieldMasters >  
SwXTextDocument::getSwXTextFieldMasters()
 {
     SolarMutexGuard aGuard;
     ThrowIfInvalid();
@@ -1653,6 +1658,20 @@ rtl::Reference<SwXFieldmark> 
SwXTextDocument::createFieldmark(
     return xTextField;
 }
 
+rtl::Reference<SwXFieldMaster> SwXTextDocument::createFieldMaster(
+    std::u16string_view rServiceName)
+{
+    SolarMutexGuard aGuard;
+    ThrowIfInvalid();
+
+    const SwServiceType nType = 
SwXServiceProvider::GetProviderType(rServiceName);
+    assert(nType != SwServiceType::Invalid);
+    uno::Reference<uno::XInterface> xTmp = 
SwXServiceProvider::MakeInstance(nType, GetDocOrThrow());
+    rtl::Reference<SwXFieldMaster> xTextField = 
dynamic_cast<SwXFieldMaster*>(xTmp.get());
+    assert(xTextField);
+    return xTextField;
+}
+
 rtl::Reference< SwXDocumentSettings > SwXTextDocument::createDocumentSettings()
 {
     SolarMutexGuard aGuard;
diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx 
b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
index fa999ff51f13..9f4920657a03 100644
--- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
+++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
@@ -142,6 +142,7 @@
 #include <unobookmark.hxx>
 #include <unosection.hxx>
 #include <unofield.hxx>
+#include <unofieldcoll.hxx>
 #include <unolinebreak.hxx>
 #include <unoframe.hxx>
 #include <unoxstyle.hxx>
@@ -6082,13 +6083,13 @@ void 
DomainMapper_Impl::AttachTextBoxContentToShape(css::uno::Reference<css::dra
     }
 }
 
-uno::Reference<beans::XPropertySet> 
DomainMapper_Impl::FindOrCreateFieldMaster(const char* pFieldMasterService, 
const OUString& rFieldMasterName)
+rtl::Reference<SwXFieldMaster> 
DomainMapper_Impl::FindOrCreateFieldMaster(const char* pFieldMasterService, 
const OUString& rFieldMasterName)
 {
     // query master, create if not available
     if (!m_xTextDocument)
         throw uno::RuntimeException();
-    uno::Reference< container::XNameAccess > xFieldMasterAccess = 
m_xTextDocument->getTextFieldMasters();
-    uno::Reference< beans::XPropertySet > xMaster;
+    rtl::Reference< SwXTextFieldMasters > xFieldMasterAccess = 
m_xTextDocument->getSwXTextFieldMasters();
+    rtl::Reference< SwXFieldMaster > xMaster;
     OUString sFieldMasterService( 
OUString::createFromAscii(pFieldMasterService) );
     OUStringBuffer aFieldMasterName;
     OUString sDatabaseDataSourceName = 
GetSettingsTable()->GetCurrentDatabaseDataSource();
@@ -6104,12 +6105,12 @@ uno::Reference<beans::XPropertySet> 
DomainMapper_Impl::FindOrCreateFieldMaster(c
     if(xFieldMasterAccess->hasByName(sFieldMasterName))
     {
         //get the master
-        xMaster.set(xFieldMasterAccess->getByName(sFieldMasterName), 
uno::UNO_QUERY_THROW);
+        xMaster = xFieldMasterAccess->getFieldMasterByName(sFieldMasterName);
     }
     else if( m_xTextDocument )
     {
         //create the master
-        xMaster.set( m_xTextDocument->createInstance(sFieldMasterService), 
uno::UNO_QUERY_THROW);
+        xMaster = m_xTextDocument->createFieldMaster(sFieldMasterService);
         if ( !bIsMergeField || sDatabaseDataSourceName.isEmpty() )
         {
             //set the master's name
@@ -6541,9 +6542,8 @@ void DomainMapper_Impl::handleFieldSet
     }
 
     // determine field master name
-    uno::Reference< beans::XPropertySet > xMaster =
-        FindOrCreateFieldMaster
-        ("com.sun.star.text.FieldMaster.SetExpression", sVariable);
+    rtl::Reference<SwXFieldMaster> xMaster = FindOrCreateFieldMaster(
+        "com.sun.star.text.FieldMaster.SetExpression", sVariable);
 
     // a set field is a string
     xMaster->setPropertyValue(getPropertyName(PROP_SUB_TYPE), 
uno::Any(text::SetVariableType::STRING));
@@ -6572,9 +6572,8 @@ void DomainMapper_Impl::handleFieldAsk
     if(!sVariable.isEmpty())
     {
         // determine field master name
-        uno::Reference< beans::XPropertySet > xMaster =
-            FindOrCreateFieldMaster
-            ("com.sun.star.text.FieldMaster.SetExpression", sVariable );
+        rtl::Reference<SwXFieldMaster> xMaster = FindOrCreateFieldMaster(
+                "com.sun.star.text.FieldMaster.SetExpression", sVariable );
         // An ASK field is always a string of characters
         xMaster->setPropertyValue(getPropertyName(PROP_SUB_TYPE), 
uno::Any(text::SetVariableType::STRING));
 
@@ -6803,9 +6802,8 @@ void DomainMapper_Impl::handleAutoNum
     rtl::Reference< SwXTextField > const & xFieldInterface)
 {
     //create a sequence field master "AutoNr"
-    uno::Reference< beans::XPropertySet > xMaster =
-    FindOrCreateFieldMaster
-        ("com.sun.star.text.FieldMaster.SetExpression",
+    rtl::Reference<SwXFieldMaster> xMaster = FindOrCreateFieldMaster(
+        "com.sun.star.text.FieldMaster.SetExpression",
         u"AutoNr"_ustr);
 
     xMaster->setPropertyValue( getPropertyName(PROP_SUB_TYPE),
@@ -7870,7 +7868,7 @@ void DomainMapper_Impl::CloseFieldCommand()
                     if (bCreateField)
                     {
                         //create a user field and type
-                        uno::Reference<beans::XPropertySet> xMaster = 
FindOrCreateFieldMaster(
+                        rtl::Reference<SwXFieldMaster> xMaster = 
FindOrCreateFieldMaster(
                             "com.sun.star.text.FieldMaster.User", sFirstParam);
                         xFieldInterface->attachTextFieldMaster(xMaster);
                         pContext->m_bSetUserFieldContent = true;
@@ -8149,7 +8147,7 @@ void DomainMapper_Impl::CloseFieldCommand()
                 {
                     //todo: create a database field and fieldmaster pointing 
to a column, only
                     //create a user field and type
-                    uno::Reference< beans::XPropertySet > xMaster =
+                    rtl::Reference<SwXFieldMaster> xMaster =
                         
FindOrCreateFieldMaster("com.sun.star.text.FieldMaster.Database", sFirstParam);
 
 //                    xFieldInterface->setPropertyValue(
@@ -8294,7 +8292,7 @@ void DomainMapper_Impl::CloseFieldCommand()
                     sSeqName = o3tl::trim(sSeqName);
 
                     // create a sequence field master using the sequence name
-                    uno::Reference< beans::XPropertySet > xMaster = 
FindOrCreateFieldMaster(
+                    rtl::Reference<SwXFieldMaster> xMaster = 
FindOrCreateFieldMaster(
                                 "com.sun.star.text.FieldMaster.SetExpression",
                                 OUString(sSeqName));
 
diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx 
b/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx
index c1f1d1563df7..6c2123b743c7 100644
--- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx
+++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx
@@ -63,6 +63,7 @@ class SwXTextFrame;
 class SwXTextEmbeddedObject;
 class SwXText;
 class SwXStyleFamily;
+class SwXFieldMaster;
 namespace com::sun::star{
         namespace awt{
             struct Size;
@@ -682,7 +683,7 @@ private:
 
     void SetNumberFormat(const OUString& rCommand, 
css::uno::Reference<css::beans::XPropertySet> const& xPropertySet, bool 
bDetectFormat = false);
     /// @throws css::uno::Exception
-    css::uno::Reference<css::beans::XPropertySet> 
FindOrCreateFieldMaster(const char* pFieldMasterService, const OUString& 
rFieldMasterName);
+    rtl::Reference<SwXFieldMaster> FindOrCreateFieldMaster(const char* 
pFieldMasterService, const OUString& rFieldMasterName);
     rtl::Reference<SwXDocumentSettings> const & GetDocumentSettings();
 
     SmartTagHandler m_aSmartTagHandler;
diff --git a/sw/source/writerfilter/dmapper/SettingsTable.cxx 
b/sw/source/writerfilter/dmapper/SettingsTable.cxx
index 0c7cc0140907..9b918015d9de 100644
--- a/sw/source/writerfilter/dmapper/SettingsTable.cxx
+++ b/sw/source/writerfilter/dmapper/SettingsTable.cxx
@@ -46,6 +46,8 @@
 #include <SwXDocumentSettings.hxx>
 #include <unotxdoc.hxx>
 #include <unostyle.hxx>
+#include <unofield.hxx>
+#include <unofieldcoll.hxx>
 
 using namespace com::sun::star;
 
@@ -667,20 +669,20 @@ void 
SettingsTable::ApplyProperties(rtl::Reference<SwXTextDocument> const& xDoc)
     // Create or overwrite DocVars based on found in settings
     if (m_pImpl->m_aDocVars.size())
     {
-        uno::Reference< container::XNameAccess > xFieldMasterAccess = 
xDoc->getTextFieldMasters();
+        rtl::Reference< SwXTextFieldMasters > xFieldMasterAccess = 
xDoc->getSwXTextFieldMasters();
         for (const auto& docVar : m_pImpl->m_aDocVars)
         {
-            uno::Reference< beans::XPropertySet > xMaster;
+            rtl::Reference< SwXFieldMaster > xMaster;
             OUString sFieldMasterService("com.sun.star.text.FieldMaster.User." 
+ docVar.first);
 
             // Find or create Field Master
             if (xFieldMasterAccess->hasByName(sFieldMasterService))
             {
-                
xMaster.set(xFieldMasterAccess->getByName(sFieldMasterService), 
uno::UNO_QUERY_THROW);
+                xMaster = 
xFieldMasterAccess->getFieldMasterByName(sFieldMasterService);
             }
             else
             {
-                
xMaster.set(xDoc->createInstance(u"com.sun.star.text.FieldMaster.User"_ustr), 
uno::UNO_QUERY_THROW);
+                xMaster = 
xDoc->createFieldMaster(u"com.sun.star.text.FieldMaster.User");
                 xMaster->setPropertyValue(getPropertyName(PROP_NAME), 
uno::Any(docVar.first));
                 uno::Reference<text::XDependentTextField> xField(
                     
xDoc->createInstance(u"com.sun.star.text.TextField.User"_ustr),

Reply via email to