sw/inc/unoframe.hxx | 2 sw/inc/unotxdoc.hxx | 2 sw/source/uibase/uno/unotxdoc.cxx | 7 + sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx | 99 +++++++++---------- sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx | 3 5 files changed, 60 insertions(+), 53 deletions(-)
New commits: commit da3913a70cd133478add296b63d0e7e28c2374bf Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Thu Apr 25 10:20:55 2024 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Tue Apr 30 13:13:48 2024 +0200 use more concrete UNO classes in writerfilter (SwXTextEmbeddedObject) Change-Id: I410bdf51539b2752e95e3dafe8a1513b7bb19626 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166809 Tested-by: Noel Grandin <noel.gran...@collabora.co.uk> Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sw/inc/unoframe.hxx b/sw/inc/unoframe.hxx index 4ddb08e92baf..e94d99434bc2 100644 --- a/sw/inc/unoframe.hxx +++ b/sw/inc/unoframe.hxx @@ -266,7 +266,7 @@ typedef cppu::ImplInheritanceHelper css::document::XEventsSupplier > SwXTextEmbeddedObjectBaseClass; -class SwXTextEmbeddedObject final : public SwXTextEmbeddedObjectBaseClass +class SW_DLLPUBLIC SwXTextEmbeddedObject final : public SwXTextEmbeddedObjectBaseClass { css::uno::Reference<css::util::XModifyListener> m_xOLEListener; diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx index bd6903b14882..b4a84c62029b 100644 --- a/sw/inc/unotxdoc.hxx +++ b/sw/inc/unotxdoc.hxx @@ -117,6 +117,7 @@ class SwXTextFrame; class SwXTextGraphicObject; class SwXPageStyle; class SwXContentControl; +class SwXTextEmbeddedObject; namespace com::sun::star::container { class XNameContainer; } namespace com::sun::star::frame { class XController; } namespace com::sun::star::lang { struct Locale; } @@ -533,6 +534,7 @@ public: SW_DLLPUBLIC rtl::Reference<SwXContentControl> createContentControl(); SW_DLLPUBLIC rtl::Reference<SwXFootnote> createFootnote(); SW_DLLPUBLIC rtl::Reference<SwXFootnote> createEndnote(); + SW_DLLPUBLIC rtl::Reference<SwXTextEmbeddedObject> createTextEmbeddedObject(); }; class SwXLinkTargetSupplier final : public cppu::WeakImplHelper diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx index 5532c67c05a6..c06ea2b32a0e 100644 --- a/sw/source/uibase/uno/unotxdoc.cxx +++ b/sw/source/uibase/uno/unotxdoc.cxx @@ -1757,6 +1757,13 @@ rtl::Reference< SwXFootnote > SwXTextDocument::createEndnote() return SwXFootnote::CreateXFootnote(GetDocOrThrow(), nullptr, true); } +rtl::Reference< SwXTextEmbeddedObject > SwXTextDocument::createTextEmbeddedObject() +{ + SolarMutexGuard aGuard; + ThrowIfInvalid(); + return SwXTextEmbeddedObject::CreateXTextEmbeddedObject(GetDocOrThrow(), nullptr); +} + Reference< XInterface > SwXTextDocument::createInstance(const OUString& rServiceName) { return create(rServiceName, nullptr); diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx index 14c9ebae3946..a0f0af0831f5 100644 --- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx +++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx @@ -3382,40 +3382,39 @@ void DomainMapper_Impl::appendOLE( const OUString& rStreamName, const std::share { try { - uno::Reference< text::XTextContent > xOLE( m_xTextDocument->createInstance("com.sun.star.text.TextEmbeddedObject"), uno::UNO_QUERY_THROW ); - uno::Reference< beans::XPropertySet > xOLEProperties(xOLE, uno::UNO_QUERY_THROW); + rtl::Reference<SwXTextEmbeddedObject> xOLE = m_xTextDocument->createTextEmbeddedObject(); OUString aCLSID = pOLEHandler->getCLSID(); if (aCLSID.isEmpty()) - xOLEProperties->setPropertyValue(getPropertyName( PROP_STREAM_NAME ), + xOLE->setPropertyValue(getPropertyName( PROP_STREAM_NAME ), uno::Any( rStreamName )); else - xOLEProperties->setPropertyValue("CLSID", uno::Any(aCLSID)); + xOLE->setPropertyValue("CLSID", uno::Any(aCLSID)); OUString aDrawAspect = pOLEHandler->GetDrawAspect(); if(!aDrawAspect.isEmpty()) - xOLEProperties->setPropertyValue("DrawAspect", uno::Any(aDrawAspect)); + xOLE->setPropertyValue("DrawAspect", uno::Any(aDrawAspect)); awt::Size aSize = pOLEHandler->getSize(); if( !aSize.Width ) aSize.Width = 1000; if( !aSize.Height ) aSize.Height = 1000; - xOLEProperties->setPropertyValue(getPropertyName( PROP_WIDTH ), + xOLE->setPropertyValue(getPropertyName( PROP_WIDTH ), uno::Any(aSize.Width)); - xOLEProperties->setPropertyValue(getPropertyName( PROP_HEIGHT ), + xOLE->setPropertyValue(getPropertyName( PROP_HEIGHT ), uno::Any(aSize.Height)); OUString aVisAreaWidth = pOLEHandler->GetVisAreaWidth(); if(!aVisAreaWidth.isEmpty()) - xOLEProperties->setPropertyValue("VisibleAreaWidth", uno::Any(aVisAreaWidth)); + xOLE->setPropertyValue("VisibleAreaWidth", uno::Any(aVisAreaWidth)); OUString aVisAreaHeight = pOLEHandler->GetVisAreaHeight(); if(!aVisAreaHeight.isEmpty()) - xOLEProperties->setPropertyValue("VisibleAreaHeight", uno::Any(aVisAreaHeight)); + xOLE->setPropertyValue("VisibleAreaHeight", uno::Any(aVisAreaHeight)); uno::Reference< graphic::XGraphic > xGraphic = pOLEHandler->getReplacement(); - xOLEProperties->setPropertyValue(getPropertyName( PROP_GRAPHIC ), + xOLE->setPropertyValue(getPropertyName( PROP_GRAPHIC ), uno::Any(xGraphic)); uno::Reference<beans::XPropertySet> xReplacementProperties(pOLEHandler->getShape(), uno::UNO_QUERY); if (xReplacementProperties.is()) @@ -3427,10 +3426,10 @@ void DomainMapper_Impl::appendOLE( const OUString& rStreamName, const std::share if (aBorderProps.LineStyle) // Set line props only if LineStyle is set { - xOLEProperties->setPropertyValue("RightBorder", uno::Any(aBorderProps)); - xOLEProperties->setPropertyValue("TopBorder", uno::Any(aBorderProps)); - xOLEProperties->setPropertyValue("LeftBorder", uno::Any(aBorderProps)); - xOLEProperties->setPropertyValue("BottomBorder", uno::Any(aBorderProps)); + xOLE->setPropertyValue("RightBorder", uno::Any(aBorderProps)); + xOLE->setPropertyValue("TopBorder", uno::Any(aBorderProps)); + xOLE->setPropertyValue("LeftBorder", uno::Any(aBorderProps)); + xOLE->setPropertyValue("BottomBorder", uno::Any(aBorderProps)); } OUString pProperties[] = { "AnchorType", @@ -3450,24 +3449,24 @@ void DomainMapper_Impl::appendOLE( const OUString& rStreamName, const std::share for (const OUString& s : pProperties) { const uno::Any aVal = xReplacementProperties->getPropertyValue(s); - xOLEProperties->setPropertyValue(s, aVal); + xOLE->setPropertyValue(s, aVal); } if (xReplacementProperties->getPropertyValue("FillStyle").get<css::drawing::FillStyle>() != css::drawing::FillStyle::FillStyle_NONE) // Apply fill props if style is set { - xOLEProperties->setPropertyValue( + xOLE->setPropertyValue( "FillStyle", xReplacementProperties->getPropertyValue("FillStyle")); - xOLEProperties->setPropertyValue( + xOLE->setPropertyValue( "FillColor", xReplacementProperties->getPropertyValue("FillColor")); - xOLEProperties->setPropertyValue( + xOLE->setPropertyValue( "FillColor2", xReplacementProperties->getPropertyValue("FillColor2")); } } else // mimic the treatment of graphics here... it seems anchoring as character // gives a better ( visually ) result - xOLEProperties->setPropertyValue(getPropertyName( PROP_ANCHOR_TYPE ), uno::Any( text::TextContentAnchorType_AS_CHARACTER ) ); + xOLE->setPropertyValue(getPropertyName( PROP_ANCHOR_TYPE ), uno::Any( text::TextContentAnchorType_AS_CHARACTER ) ); // remove ( if valid ) associated shape ( used for graphic replacement ) SAL_WARN_IF(m_aAnchoredStack.empty(), "writerfilter.dmapper", "no anchor stack"); if (!m_aAnchoredStack.empty()) @@ -3499,19 +3498,18 @@ void DomainMapper_Impl::appendStarMath( const Value& val ) try { - uno::Reference< text::XTextContent > xStarMath( m_xTextDocument->createInstance("com.sun.star.text.TextEmbeddedObject"), uno::UNO_QUERY_THROW ); - uno::Reference< beans::XPropertySet > xStarMathProperties(xStarMath, uno::UNO_QUERY_THROW); + rtl::Reference<SwXTextEmbeddedObject> xStarMath = m_xTextDocument->createTextEmbeddedObject(); - xStarMathProperties->setPropertyValue(getPropertyName( PROP_EMBEDDED_OBJECT ), + xStarMath->setPropertyValue(getPropertyName( PROP_EMBEDDED_OBJECT ), val.getAny()); // tdf#66405: set zero margins for embedded object - xStarMathProperties->setPropertyValue(getPropertyName( PROP_LEFT_MARGIN ), + xStarMath->setPropertyValue(getPropertyName( PROP_LEFT_MARGIN ), uno::Any(sal_Int32(0))); - xStarMathProperties->setPropertyValue(getPropertyName( PROP_RIGHT_MARGIN ), + xStarMath->setPropertyValue(getPropertyName( PROP_RIGHT_MARGIN ), uno::Any(sal_Int32(0))); - xStarMathProperties->setPropertyValue(getPropertyName( PROP_TOP_MARGIN ), + xStarMath->setPropertyValue(getPropertyName( PROP_TOP_MARGIN ), uno::Any(sal_Int32(0))); - xStarMathProperties->setPropertyValue(getPropertyName( PROP_BOTTOM_MARGIN ), + xStarMath->setPropertyValue(getPropertyName( PROP_BOTTOM_MARGIN ), uno::Any(sal_Int32(0))); uno::Reference< uno::XInterface > xInterface( formula->getComponent(), uno::UNO_QUERY ); @@ -3528,11 +3526,11 @@ void DomainMapper_Impl::appendStarMath( const Value& val ) Size size( 1000, 1000 ); if( oox::FormulaImExportBase* formulaimport = dynamic_cast< oox::FormulaImExportBase* >( xInterface.get())) size = formulaimport->getFormulaSize(); - xStarMathProperties->setPropertyValue(getPropertyName( PROP_WIDTH ), + xStarMath->setPropertyValue(getPropertyName( PROP_WIDTH ), uno::Any( sal_Int32(size.Width()))); - xStarMathProperties->setPropertyValue(getPropertyName( PROP_HEIGHT ), + xStarMath->setPropertyValue(getPropertyName( PROP_HEIGHT ), uno::Any( sal_Int32(size.Height()))); - xStarMathProperties->setPropertyValue(getPropertyName(PROP_ANCHOR_TYPE), + xStarMath->setPropertyValue(getPropertyName(PROP_ANCHOR_TYPE), uno::Any(text::TextContentAnchorType_AS_CHARACTER)); // mimic the treatment of graphics here... it seems anchoring as character // gives a better ( visually ) result @@ -4719,10 +4717,10 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape m_aAnchoredStack.push(AnchoredContext(xTextContent)); uno::Reference<beans::XPropertySet> xShapePropertySet(xShape, uno::UNO_QUERY); - m_StreamStateStack.top().xEmbedded.set(m_xTextDocument->createInstance("com.sun.star.text.TextEmbeddedObject"), uno::UNO_QUERY_THROW); - uno::Reference<beans::XPropertySet> xEmbeddedProperties(m_StreamStateStack.top().xEmbedded, uno::UNO_QUERY_THROW); - xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_EMBEDDED_OBJECT), xShapePropertySet->getPropertyValue(getPropertyName(PROP_EMBEDDED_OBJECT))); - xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_ANCHOR_TYPE), uno::Any(text::TextContentAnchorType_AS_CHARACTER)); + rtl::Reference<SwXTextEmbeddedObject> xEmbedded = m_xTextDocument->createTextEmbeddedObject(); + m_StreamStateStack.top().xEmbedded = xEmbedded; + xEmbedded->setPropertyValue(getPropertyName(PROP_EMBEDDED_OBJECT), xShapePropertySet->getPropertyValue(getPropertyName(PROP_EMBEDDED_OBJECT))); + xEmbedded->setPropertyValue(getPropertyName(PROP_ANCHOR_TYPE), uno::Any(text::TextContentAnchorType_AS_CHARACTER)); // So that the original bitmap-only shape will be replaced by the embedded object. m_aAnchoredStack.top().bToRemove = true; m_aTextAppendStack.pop(); @@ -4871,24 +4869,23 @@ void DomainMapper_Impl::UpdateEmbeddedShapeProps(const uno::Reference< drawing:: if (!xShape.is()) return; - uno::Reference<beans::XPropertySet> const xEmbeddedProperties(m_StreamStateStack.top().xEmbedded, uno::UNO_QUERY_THROW); + rtl::Reference<SwXTextEmbeddedObject> const xEmbedded(m_StreamStateStack.top().xEmbedded); awt::Size aSize = xShape->getSize( ); - xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_WIDTH), uno::Any(sal_Int32(aSize.Width))); - xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_HEIGHT), uno::Any(sal_Int32(aSize.Height))); + xEmbedded->setPropertyValue(getPropertyName(PROP_WIDTH), uno::Any(sal_Int32(aSize.Width))); + xEmbedded->setPropertyValue(getPropertyName(PROP_HEIGHT), uno::Any(sal_Int32(aSize.Height))); uno::Reference<beans::XPropertySet> const xShapeProps(xShape, uno::UNO_QUERY); // tdf#130782 copy a11y related properties - xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_DESCRIPTION), + xEmbedded->setPropertyValue(getPropertyName(PROP_DESCRIPTION), xShapeProps->getPropertyValue(getPropertyName(PROP_DESCRIPTION))); - xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_TITLE), + xEmbedded->setPropertyValue(getPropertyName(PROP_TITLE), xShapeProps->getPropertyValue(getPropertyName(PROP_TITLE))); - uno::Reference<container::XNamed> const xEmbedName(m_StreamStateStack.top().xEmbedded, uno::UNO_QUERY); uno::Reference<container::XNamed> const xShapeName(xShape, uno::UNO_QUERY); OUString const name(xShapeName->getName()); if (!name.isEmpty()) // setting empty name will throw { try { - xEmbedName->setName(name); + xEmbedded->setName(name); } catch (uno::RuntimeException const&) { @@ -9213,21 +9210,21 @@ void DomainMapper_Impl::ImportGraphic(const writerfilter::Reference<Properties> UpdateEmbeddedShapeProps(xShape); if (m_eGraphicImportType == IMPORT_AS_DETECTED_ANCHOR) { - uno::Reference<beans::XPropertySet> const xEmbeddedProps(m_StreamStateStack.top().xEmbedded, uno::UNO_QUERY); - xEmbeddedProps->setPropertyValue("AnchorType", uno::Any(text::TextContentAnchorType_AT_CHARACTER)); - xEmbeddedProps->setPropertyValue("IsFollowingTextFlow", uno::Any(m_pGraphicImport->GetLayoutInCell())); + rtl::Reference<SwXTextEmbeddedObject> const xEmbedded(m_StreamStateStack.top().xEmbedded); + xEmbedded->setPropertyValue("AnchorType", uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xEmbedded->setPropertyValue("IsFollowingTextFlow", uno::Any(m_pGraphicImport->GetLayoutInCell())); uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY); - xEmbeddedProps->setPropertyValue("HoriOrient", xShapeProps->getPropertyValue("HoriOrient")); - xEmbeddedProps->setPropertyValue("HoriOrientPosition", xShapeProps->getPropertyValue("HoriOrientPosition")); - xEmbeddedProps->setPropertyValue("HoriOrientRelation", xShapeProps->getPropertyValue("HoriOrientRelation")); - xEmbeddedProps->setPropertyValue("VertOrient", xShapeProps->getPropertyValue("VertOrient")); - xEmbeddedProps->setPropertyValue("VertOrientPosition", xShapeProps->getPropertyValue("VertOrientPosition")); - xEmbeddedProps->setPropertyValue("VertOrientRelation", xShapeProps->getPropertyValue("VertOrientRelation")); + xEmbedded->setPropertyValue("HoriOrient", xShapeProps->getPropertyValue("HoriOrient")); + xEmbedded->setPropertyValue("HoriOrientPosition", xShapeProps->getPropertyValue("HoriOrientPosition")); + xEmbedded->setPropertyValue("HoriOrientRelation", xShapeProps->getPropertyValue("HoriOrientRelation")); + xEmbedded->setPropertyValue("VertOrient", xShapeProps->getPropertyValue("VertOrient")); + xEmbedded->setPropertyValue("VertOrientPosition", xShapeProps->getPropertyValue("VertOrientPosition")); + xEmbedded->setPropertyValue("VertOrientRelation", xShapeProps->getPropertyValue("VertOrientRelation")); //tdf123873 fix missing textwrap import - xEmbeddedProps->setPropertyValue("TextWrap", xShapeProps->getPropertyValue("TextWrap")); + xEmbedded->setPropertyValue("TextWrap", xShapeProps->getPropertyValue("TextWrap")); // GraphicZOrderHelper::findZOrder() was called already, so can just copy it over. - xEmbeddedProps->setPropertyValue("ZOrder", xShapeProps->getPropertyValue("ZOrder")); + xEmbedded->setPropertyValue("ZOrder", xShapeProps->getPropertyValue("ZOrder")); } } //insert it into the document at the current cursor position diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx b/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx index 8623c28e55d9..052a0a62c156 100644 --- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx +++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx @@ -60,6 +60,7 @@ class SwXDocumentSettings; class SwXTextSection; class SwXTextField; class SwXTextFrame; +class SwXTextEmbeddedObject; namespace com::sun::star{ namespace awt{ struct Size; @@ -249,7 +250,7 @@ struct SubstreamContext bool bCheckFirstFootnoteTab = false; std::optional<sal_Int16> oLineBreakClear; bool bIsInTextBox = false; - css::uno::Reference<css::text::XTextContent> xEmbedded; + rtl::Reference<SwXTextEmbeddedObject> xEmbedded; /// If we want to set "sdt end" on the next character context. bool bSdtEndDeferred = false; /// If we want to set "paragraph sdt end" on the next paragraph context.