sw/source/core/unocore/unoframe.cxx | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-)
New commits: commit d6e31132de073ecb91334f3f4b7c5eecae090f1b Author: Miklos Vajna <vmik...@collabora.co.uk> AuthorDate: Wed Oct 31 22:24:57 2018 +0100 Commit: Miklos Vajna <vmik...@collabora.co.uk> CommitDate: Wed Oct 31 22:41:28 2018 +0100 sw: fix import of OLE object preview bitmaps xmloff sets these using package URLs (on this branch, LO >= 6.1 got rid of URLs for setting graphics), but SwXFrame::setPropertyValue() only expects graphic object URLs, so the preview is lost on import. Normally this is not noticeable as a fresh preview will be created, but in the situation described by commit 13162d054d628380bf488acd7971170212af005e (svtools: fix lost replacement grpahic when updating it via OLE fails, 2018-10-30) this leads for the loss of preview on export (e.g. HTML). Fix the problem by explicitly looking up the graphic stream (of the OLE object) in the embedded object container, so the preview from the input (ODT) file is kept during conversion. Change-Id: I91fd23e4db9e39be6153748207b3c0bfb9f58901 diff --git a/sw/source/core/unocore/unoframe.cxx b/sw/source/core/unocore/unoframe.cxx index 35641d6762cd..64c0a7c443ca 100644 --- a/sw/source/core/unocore/unoframe.cxx +++ b/sw/source/core/unocore/unoframe.cxx @@ -122,6 +122,8 @@ #include <calbck.hxx> #include <comphelper/servicehelper.hxx> #include <cppuhelper/supportsservice.hxx> +#include <unotools/ucbstreamhelper.hxx> +#include <vcl/graphicfilter.hxx> #include <svx/unobrushitemhelper.hxx> #include <svx/xbtmpit.hxx> @@ -1651,6 +1653,8 @@ void SwXFrame::setPropertyValue(const OUString& rPropertyName, const ::uno::Any& { bool bURL = FN_UNO_REPLACEMENT_GRAPHIC_URL == pEntry->nWID; bool bApply = false; + // If this is a package URL. + bool bPackage = false; Graphic aGraphic; if( bURL ) { @@ -1670,6 +1674,8 @@ void SwXFrame::setPropertyValue(const OUString& rPropertyName, const ::uno::Any& aGraphic = pGrfObj->GetGraphic(); bApply = true; } + else if (aGrfUrl.startsWith(sPackageProtocol)) + bPackage = true; } else { @@ -1682,7 +1688,7 @@ void SwXFrame::setPropertyValue(const OUString& rPropertyName, const ::uno::Any& } } - if ( bApply ) + if ( bApply || bPackage ) { const ::SwFormatContent* pCnt = &pFormat->GetContent(); if ( pCnt->GetContentIdx() && pDoc->GetNodes()[ pCnt->GetContentIdx()->GetIndex() + 1 ] ) @@ -1693,6 +1699,26 @@ void SwXFrame::setPropertyValue(const OUString& rPropertyName, const ::uno::Any& { svt::EmbeddedObjectRef &rObj = pOleNode->GetOLEObj().GetObject(); + if (bPackage) + { + // Package URL case: look up the stream of the + // graphic in the object container and initialize + // aGraphic from that stream. + comphelper::EmbeddedObjectContainer* pContainer = rObj.GetContainer(); + uno::Reference<embed::XEmbeddedObject> xObj = rObj.GetObject(); + if (pContainer) + { + OUString aMediaType; + uno::Reference <io::XInputStream> xStream = pContainer->GetGraphicStream(xObj, &aMediaType); + if (xStream.is()) + { + std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xStream)); + GraphicFilter& rGF = GraphicFilter::GetGraphicFilter(); + rGF.ImportGraphic(aGraphic, OUString(), *pStream); + } + } + } + OUString aMediaType; rObj.SetGraphic( aGraphic, aMediaType ); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits