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),