diff options
-rw-r--r-- | sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 20 | ||||
-rw-r--r-- | writerfilter/inc/ooxml/OOXMLDocument.hxx | 3 | ||||
-rw-r--r-- | writerfilter/source/filter/ImportFilter.cxx | 33 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLDocumentImpl.cxx | 52 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLDocumentImpl.hxx | 7 |
5 files changed, 113 insertions, 2 deletions
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 9a0a10cbe805..a76086552101 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -539,6 +539,25 @@ void Test::testN764005() void Test::testSmartart() { + uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xTextDocumentPropertySet(xTextDocument, uno::UNO_QUERY); + uno::Sequence<beans::PropertyValue> aGrabBag(0); + xTextDocumentPropertySet->getPropertyValue(OUString("InteropGrabBag")) >>= aGrabBag; + CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty + + sal_Bool bTheme = sal_False; + for(int i = 0; i < aGrabBag.getLength(); ++i) + { + if (aGrabBag[i].Name == OUString("OOXTheme")) + { + bTheme = sal_True; + uno::Reference<xml::dom::XDocument> aThemeDom; + CPPUNIT_ASSERT(aGrabBag[i].Value >>= aThemeDom); // PropertyValue of proper type + CPPUNIT_ASSERT(aThemeDom.get()); // Reference not empty + } + } + CPPUNIT_ASSERT(bTheme); // Grab Bag has all the expected elements + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY); uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDraws->getCount()); // One groupshape in the doc @@ -547,7 +566,6 @@ void Test::testSmartart() CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xGroup->getCount()); // 3 rectangles and an arrow in the group uno::Reference<beans::XPropertySet> xGroupPropertySet(getShape(1), uno::UNO_QUERY); - uno::Sequence<beans::PropertyValue> aGrabBag(0); xGroupPropertySet->getPropertyValue(OUString::createFromAscii("InteropGrabBag")) >>= aGrabBag; CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty diff --git a/writerfilter/inc/ooxml/OOXMLDocument.hxx b/writerfilter/inc/ooxml/OOXMLDocument.hxx index c97e2b2b08c0..1f4930b692e3 100644 --- a/writerfilter/inc/ooxml/OOXMLDocument.hxx +++ b/writerfilter/inc/ooxml/OOXMLDocument.hxx @@ -28,6 +28,7 @@ #include <com/sun/star/xml/sax/XFastParser.hpp> #include <com/sun/star/xml/sax/XFastTokenHandler.hpp> #include <com/sun/star/xml/sax/XFastShapeContextHandler.hpp> +#include <com/sun/star/xml/dom/XDocument.hpp> #include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/drawing/XDrawPage.hpp> @@ -239,6 +240,8 @@ public: virtual const OUString & getTarget() const = 0; virtual uno::Reference<xml::sax::XFastShapeContextHandler> getShapeContext( ) = 0; virtual void setShapeContext( uno::Reference<xml::sax::XFastShapeContextHandler> xContext ) = 0; + virtual uno::Reference<xml::dom::XDocument> getThemeDom( ) = 0; + virtual void setThemeDom( uno::Reference<xml::dom::XDocument> xThemeDom ) = 0; }; diff --git a/writerfilter/source/filter/ImportFilter.cxx b/writerfilter/source/filter/ImportFilter.cxx index e56cbca4dff6..df5604b74a77 100644 --- a/writerfilter/source/filter/ImportFilter.cxx +++ b/writerfilter/source/filter/ImportFilter.cxx @@ -116,6 +116,39 @@ sal_Bool WriterFilter::filter( const uno::Sequence< beans::PropertyValue >& aDes pDocument->setDrawPage(xDrawPage); pDocument->resolve(*pStream); + + // Adding the saved Theme DOM to the document's grab bag + try + { + uno::Reference<beans::XPropertySet> xDocProps(m_xDstDoc, uno::UNO_QUERY); + if (xDocProps.is()) + { + uno::Reference<beans::XPropertySetInfo> xPropsInfo = xDocProps->getPropertySetInfo(); + + const OUString& aGrabBagPropName = OUString("InteropGrabBag"); + if( xPropsInfo.is() && xPropsInfo->hasPropertyByName( aGrabBagPropName ) ) + { + uno::Sequence<beans::PropertyValue> aGrabBag; + + // We want to keep the previous items + xDocProps->getPropertyValue( aGrabBagPropName ) >>= aGrabBag; + sal_Int32 length = aGrabBag.getLength(); + aGrabBag.realloc(length+1); + + uno::Reference<xml::dom::XDocument> aThemeDom = pDocument->getThemeDom(); + + beans::PropertyValue* pValue = aGrabBag.getArray(); + pValue[length].Name = OUString("OOXTheme"); + pValue[length].Value = uno::makeAny( aThemeDom ); + + xDocProps->setPropertyValue( aGrabBagPropName, uno::Any( aGrabBag ) ); + } + } + } + catch(const uno::Exception&) + { + } + writerfilter::ooxml::OOXMLStream::Pointer_t pVBAProjectStream(writerfilter::ooxml::OOXMLDocumentFactory::createStream( pDocStream, writerfilter::ooxml::OOXMLStream::VBAPROJECT )); oox::StorageRef xVbaPrjStrg( new ::oox::ole::OleStorage( m_xContext, pVBAProjectStream->getDocumentStream(), false ) ); if( xVbaPrjStrg.get() && xVbaPrjStrg->isStorage() ) diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx index b64c28a10e4c..c77cebbad70c 100644 --- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx +++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx @@ -20,6 +20,7 @@ #include <com/sun/star/xml/sax/XParser.hpp> #include <com/sun/star/xml/sax/SAXException.hpp> +#include <com/sun/star/xml/dom/DocumentBuilder.hpp> #include <doctok/resourceids.hxx> #include <ooxml/resourceids.hxx> #include "OOXMLDocumentImpl.hxx" @@ -43,7 +44,7 @@ using namespace ::std; OOXMLDocumentImpl::OOXMLDocumentImpl (OOXMLStream::Pointer_t pStream) -: mpStream(pStream), mXNoteType(0), mbIsSubstream( false ) +: mpStream(pStream), mXNoteType(0), mxThemeDom(0), mbIsSubstream( false ) { } @@ -109,6 +110,44 @@ void OOXMLDocumentImpl::resolveFastSubStreamWithId(Stream & rStream, rStream.substream(nId, pStream); } +uno::Reference<xml::dom::XDocument> OOXMLDocumentImpl::importSubStream(OOXMLStream::StreamType_t nType) +{ + uno::Reference<xml::dom::XDocument> xRet; + + OOXMLStream::Pointer_t pStream; + try + { + pStream = OOXMLDocumentFactory::createStream(mpStream, nType); + } + catch (uno::Exception const& e) + { + SAL_INFO("writerfilter", "importSubStream: exception while " + "importing stream " << nType << " : " << e.Message); + return xRet; + } + + uno::Reference<io::XInputStream> xInputStream = + pStream->getDocumentStream(); + + if (xInputStream.is()) + { + try + { + uno::Reference<uno::XComponentContext> xContext(mpStream->getContext()); + uno::Reference<xml::dom::XDocumentBuilder> xDomBuilder(xml::dom::DocumentBuilder::create(xContext)); + xRet = xDomBuilder->parse(xInputStream); + } + catch (uno::Exception const& e) + { + SAL_INFO("writerfilter", "importSubStream: exception while " + "parsing stream " << nType << " : " << e.Message); + return xRet; + } + } + + return xRet; +} + void OOXMLDocumentImpl::setXNoteId(const sal_Int32 nId) { mnXNoteId = nId; @@ -333,6 +372,7 @@ void OOXMLDocumentImpl::resolve(Stream & rStream) (mpStream->getFastTokenHandler(xContext)); resolveFastSubStream(rStream, OOXMLStream::SETTINGS); + mxThemeDom = importSubStream(OOXMLStream::THEME); resolveFastSubStream(rStream, OOXMLStream::THEME); resolveFastSubStream(rStream, OOXMLStream::FONTTABLE); resolveFastSubStream(rStream, OOXMLStream::STYLES); @@ -411,6 +451,16 @@ uno::Reference<xml::sax::XFastShapeContextHandler> OOXMLDocumentImpl::getShapeCo return mxShapeContext; } +void OOXMLDocumentImpl::setThemeDom( uno::Reference<xml::dom::XDocument> xThemeDom ) +{ + mxThemeDom = xThemeDom; +} + +uno::Reference<xml::dom::XDocument> OOXMLDocumentImpl::getThemeDom( ) +{ + return mxThemeDom; +} + OOXMLDocument * OOXMLDocumentFactory::createDocument (OOXMLStream::Pointer_t pStream) diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx index f23725d64399..bf185041ea1a 100644 --- a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx +++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx @@ -22,6 +22,7 @@ #include <ooxml/OOXMLDocument.hxx> #include <com/sun/star/xml/sax/XFastTokenHandler.hpp> +#include <com/sun/star/xml/dom/XDocument.hpp> #include "OOXMLPropertySet.hxx" @@ -40,6 +41,7 @@ class OOXMLDocumentImpl : public OOXMLDocument uno::Reference<frame::XModel> mxModel; uno::Reference<drawing::XDrawPage> mxDrawPage; uno::Reference<xml::sax::XFastShapeContextHandler> mxShapeContext; + uno::Reference<xml::dom::XDocument> mxThemeDom; bool mbIsSubstream; @@ -51,6 +53,8 @@ protected: writerfilter::Reference<Stream>::Pointer_t pStream, sal_uInt32 nId); + uno::Reference<xml::dom::XDocument> importSubStream(OOXMLStream::StreamType_t nType); + writerfilter::Reference<Stream>::Pointer_t getSubStream(const OUString & rId); @@ -104,6 +108,9 @@ public: virtual const OUString & getTarget() const; virtual uno::Reference<xml::sax::XFastShapeContextHandler> getShapeContext( ); virtual void setShapeContext( uno::Reference<xml::sax::XFastShapeContextHandler> xContext ); + virtual void setThemeDom(uno::Reference<xml::dom::XDocument> xThemeDom); + virtual uno::Reference<xml::dom::XDocument> getThemeDom(); + }; }} #endif // OOXML_DOCUMENT_IMPL_HXX |