include/oox/drawingml/shape.hxx                   |   23 ++++++++------
 oox/source/drawingml/shape.cxx                    |   35 +++++++++++++++-------
 oox/source/ppt/pptshape.cxx                       |    4 ++
 sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx |binary
 sd/qa/unit/import-tests-smartart.cxx              |   21 +++++++++++++
 5 files changed, 62 insertions(+), 21 deletions(-)

New commits:
commit dba1f992d0757b9c353dd41d55dd89ecafd70603
Author:     Grzegorz Araminowicz <grzegorz.araminow...@collabora.com>
AuthorDate: Fri Mar 8 12:45:24 2019 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Mon Mar 11 17:38:07 2019 +0100

    PPTX import: save SmartArt markup into InteropGrabBag
    
    it will allow to preserve SmartArt when saving PPTX files
    
    Change-Id: I9bb66c59d202b4ce426864599014d042d4aa04b0
    Reviewed-on: https://gerrit.libreoffice.org/68916
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx
index 0e3263179fa6..4b25aa49e223 100644
--- a/include/oox/drawingml/shape.hxx
+++ b/include/oox/drawingml/shape.hxx
@@ -229,6 +229,15 @@ public:
 
 protected:
 
+    enum FrameType
+    {
+        FRAMETYPE_GENERIC, ///< Generic shape, no special type.
+        FRAMETYPE_OLEOBJECT, ///< OLE object embedded in a shape.
+        FRAMETYPE_CHART, ///< Chart embedded in a shape.
+        FRAMETYPE_DIAGRAM, ///< Complex diagram drawing shape.
+        FRAMETYPE_TABLE ///< A table embedded in a shape.
+    };
+
     css::uno::Reference< css::drawing::XShape > const &
                         createAndInsert(
                             ::oox::core::XmlFilterBase& rFilterBase,
@@ -250,7 +259,8 @@ protected:
                             ShapeIdMap* pShapeMap,
                             const basegfx::B2DHomMatrix& aTransformation );
 
-    void                keepDiagramCompatibilityInfo( 
::oox::core::XmlFilterBase const & rFilterBase );
+    void                keepDiagramCompatibilityInfo();
+    void                convertSmartArtToMetafile( ::oox::core::XmlFilterBase 
const& rFilterBase );
 
     css::uno::Reference< css::drawing::XShape >
                         renderDiagramToGraphic( ::oox::core::XmlFilterBase 
const & rFilterBase );
@@ -310,20 +320,13 @@ protected:
     ::std::vector<OUString>     maExtDrawings;
     Color                       maFontRefColorForNodes;
 
+    FrameType                   meFrameType; ///< Type for graphic frame 
shapes.
+
 private:
-    enum FrameType
-    {
-        FRAMETYPE_GENERIC,          ///< Generic shape, no special type.
-        FRAMETYPE_OLEOBJECT,        ///< OLE object embedded in a shape.
-        FRAMETYPE_CHART,            ///< Chart embedded in a shape.
-        FRAMETYPE_DIAGRAM,          ///< Complex diagram drawing shape.
-        FRAMETYPE_TABLE             ///< A table embedded in a shape.
-    };
 
     typedef std::shared_ptr< ::oox::vml::OleObjectInfo >    OleObjectInfoRef;
     typedef std::shared_ptr< ChartShapeInfo >               ChartShapeInfoRef;
 
-    FrameType           meFrameType;        ///< Type for graphic frame shapes.
     OleObjectInfoRef    mxOleObjectInfo;    ///< Additional data for OLE 
objects.
     ChartShapeInfoRef   mxChartShapeInfo;   ///< Additional data for chart 
shapes.
 
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index e35a9b2e7703..0c522bdfe63e 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -283,8 +283,9 @@ void Shape::addShape(
 
             if( meFrameType == FRAMETYPE_DIAGRAM )
             {
+                keepDiagramCompatibilityInfo();
                 if( !SvtFilterOptions::Get().IsSmartArt2Shape() )
-                    keepDiagramCompatibilityInfo( rFilterBase );
+                    convertSmartArtToMetafile( rFilterBase );
             }
         }
     }
@@ -1387,7 +1388,7 @@ Reference< XShape > const & Shape::createAndInsert(
     return mxShape;
 }
 
-void Shape::keepDiagramCompatibilityInfo( XmlFilterBase const & rFilterBase )
+void Shape::keepDiagramCompatibilityInfo()
 {
     try
     {
@@ -1418,21 +1419,33 @@ void Shape::keepDiagramCompatibilityInfo( XmlFilterBase 
const & rFilterBase )
             xSet->setPropertyValue( aGrabBagPropName, Any( aGrabBag ) );
         } else
             xSet->setPropertyValue( aGrabBagPropName, Any( maDiagramDoms ) );
+    }
+    catch( const Exception& e )
+    {
+        SAL_WARN( "oox.drawingml", "Shape::keepDiagramCompatibilityInfo: " << 
e );
+    }
+}
 
-        xSet->setPropertyValue( "MoveProtect", Any( true ) );
-        xSet->setPropertyValue( "SizeProtect", Any( true ) );
+void Shape::convertSmartArtToMetafile(XmlFilterBase const & rFilterBase)
+{
+    try
+    {
+        Reference<XPropertySet> xSet(mxShape, UNO_QUERY_THROW);
+
+        xSet->setPropertyValue("MoveProtect", Any(true));
+        xSet->setPropertyValue("SizeProtect", Any(true));
 
         // Replace existing shapes with a new Graphic Object rendered
         // from them
-        Reference < XShape > xShape( renderDiagramToGraphic( rFilterBase ) );
-        Reference < XShapes > xShapes( mxShape, UNO_QUERY_THROW );
-        while( xShapes->hasElements() )
-            xShapes->remove( Reference < XShape > ( xShapes->getByIndex( 0 ),  
UNO_QUERY_THROW ) );
-        xShapes->add( xShape );
+        Reference<XShape> xShape(renderDiagramToGraphic(rFilterBase));
+        Reference<XShapes> xShapes(mxShape, UNO_QUERY_THROW);
+        while (xShapes->hasElements())
+            xShapes->remove(Reference<XShape>(xShapes->getByIndex(0), 
UNO_QUERY_THROW));
+        xShapes->add(xShape);
     }
-    catch( const Exception& e )
+    catch (const Exception& e)
     {
-        SAL_WARN( "oox.drawingml", "Shape::keepDiagramCompatibilityInfo: " << 
e );
+        SAL_WARN("oox.drawingml", "Shape::convertSmartArtToMetafile: " << e);
     }
 }
 
diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx
index 362801b8c438..52f9d5236612 100644
--- a/oox/source/ppt/pptshape.cxx
+++ b/oox/source/ppt/pptshape.cxx
@@ -33,6 +33,7 @@
 #include <sal/log.hxx>
 #include <oox/ppt/slidepersist.hxx>
 #include <oox/token/tokens.hxx>
+#include <unotools/fltrcfg.hxx>
 
 using namespace ::oox::core;
 using namespace ::oox::drawingml;
@@ -397,6 +398,9 @@ void PPTShape::addShape(
             Reference<XShapes> xShapes(xShape, UNO_QUERY);
             if (xShapes.is())
                 addChildren( rFilterBase, *this, pTheme, xShapes, pShapeMap, 
aTransformation );
+
+            if (meFrameType == FRAMETYPE_DIAGRAM)
+                keepDiagramCompatibilityInfo();
         }
     }
     catch (const Exception&)
diff --git a/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx 
b/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx
new file mode 100755
index 000000000000..ef678b6c3398
Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx 
differ
diff --git a/sd/qa/unit/import-tests-smartart.cxx 
b/sd/qa/unit/import-tests-smartart.cxx
index 22513adc312a..81474f2071ae 100644
--- a/sd/qa/unit/import-tests-smartart.cxx
+++ b/sd/qa/unit/import-tests-smartart.cxx
@@ -69,6 +69,7 @@ public:
     void testOrgChart();
     void testCycleMatrix();
     void testPictureStrip();
+    void testInteropGrabBag();
 
     CPPUNIT_TEST_SUITE(SdImportTestSmartArt);
 
@@ -102,6 +103,7 @@ public:
     CPPUNIT_TEST(testOrgChart);
     CPPUNIT_TEST(testCycleMatrix);
     CPPUNIT_TEST(testPictureStrip);
+    CPPUNIT_TEST(testInteropGrabBag);
 
     CPPUNIT_TEST_SUITE_END();
 };
@@ -990,6 +992,25 @@ void SdImportTestSmartArt::testPictureStrip()
     xDocShRef->DoClose();
 }
 
+void SdImportTestSmartArt::testInteropGrabBag()
+{
+    sd::DrawDocShellRef xDocShRef = loadURL(
+        
m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx"),
 PPTX);
+    uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xGroup.is());
+
+    uno::Reference<beans::XPropertySet> xPropertySet(xGroup, 
uno::UNO_QUERY_THROW);
+    uno::Sequence<beans::PropertyValue> aGrabBagSeq;
+    xPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBagSeq;
+    comphelper::SequenceAsHashMap aGrabBag(aGrabBagSeq);
+    CPPUNIT_ASSERT(aGrabBag.find("OOXData") != aGrabBag.end());
+    CPPUNIT_ASSERT(aGrabBag.find("OOXLayout") != aGrabBag.end());
+    CPPUNIT_ASSERT(aGrabBag.find("OOXStyle") != aGrabBag.end());
+    CPPUNIT_ASSERT(aGrabBag.find("OOXColor") != aGrabBag.end());
+
+    xDocShRef->DoClose();
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTestSmartArt);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to