[Libreoffice-commits] core.git: filter/source

Armin Le Grand alg at apache.org
Tue Apr 8 07:22:30 PDT 2014


 filter/source/svg/svgexport.cxx |   33 ++++++++++++++++++++++---
 filter/source/svg/svgfilter.cxx |   51 +++++++++++++++++++++++++++++++++++-----
 filter/source/svg/svgfilter.hxx |    3 +-
 3 files changed, 76 insertions(+), 11 deletions(-)

New commits:
commit de37aa18faf03da14dc453e843b1419edbedbfa9
Author: Armin Le Grand <alg at apache.org>
Date:   Mon Apr 7 14:58:01 2014 +0000

    Resolves: #i124608# functionality to export only selected objects...
    
    in SVG export
    
    (cherry picked from commit 42c2b0cecfae5845439e0392a399497062238b15)
    
    Conflicts:
    	filter/source/svg/svgexport.cxx
    	filter/source/svg/svgfilter.cxx
    	filter/source/svg/svgfilter.hxx
    
    Change-Id: Iac4fe6d93c95cc5ab25185245cf642703a02d0ed

diff --git a/filter/source/svg/svgexport.cxx b/filter/source/svg/svgexport.cxx
index 9223bfe..5402ad4 100644
--- a/filter/source/svg/svgexport.cxx
+++ b/filter/source/svg/svgexport.cxx
@@ -816,7 +816,11 @@ sal_Bool SVGFilter::implExportDocument()
                 implEmbedBulletGlyphs();
                 implExportTextEmbeddedBitmaps();
             }
-            implExportMasterPages( mMasterPageTargets, 0, mMasterPageTargets.getLength() - 1 );
+
+            bool bSelection = mbSinglePage && maShapeSelection.is() && maShapeSelection->getCount();
+            // #i124608# export a given object selection, so no MasterPage export at all
+            if (!bSelection)
+                implExportMasterPages( mMasterPageTargets, 0, mMasterPageTargets.getLength() - 1 );
             implExportDrawPages( mSelectedPages, 0, nLastPage );
 
             if( !mbSinglePage )
@@ -1401,7 +1405,7 @@ sal_Bool SVGFilter::implExportMasterPages( const SVGFilter::XDrawPageSequence &
                                            sal_Int32 nFirstPage, sal_Int32 nLastPage )
 {
     DBG_ASSERT( nFirstPage <= nLastPage,
-                "SVGFilter::implExportPages: nFirstPage > nLastPage" );
+                "SVGFilter::implExportMasterPages: nFirstPage > nLastPage" );
 
     // When the exported slides are more than one we wrap master page elements
     // with a svg <defs> element.
@@ -1434,7 +1438,7 @@ sal_Bool SVGFilter::implExportDrawPages( const SVGFilter::XDrawPageSequence & rx
                                            sal_Int32 nFirstPage, sal_Int32 nLastPage )
 {
     DBG_ASSERT( nFirstPage <= nLastPage,
-                "SVGFilter::implExportPages: nFirstPage > nLastPage" );
+                "SVGFilter::implExportDrawPages: nFirstPage > nLastPage" );
 
     // We wrap all slide in a group element with class name "SlideGroup".
     mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "class", "SlideGroup" );
@@ -1443,7 +1447,17 @@ sal_Bool SVGFilter::implExportDrawPages( const SVGFilter::XDrawPageSequence & rx
     sal_Bool bRet = sal_False;
     for( sal_Int32 i = nFirstPage; i <= nLastPage; ++i )
     {
-        Reference< XShapes > xShapes( rxPages[i], UNO_QUERY );
+        Reference< XShapes > xShapes;
+
+        if (maShapeSelection.is() && maShapeSelection->getCount())
+        {
+            // #i124608# export a given object selection
+            xShapes = maShapeSelection;
+        }
+        else
+        {
+            xShapes = Reference< XShapes >( rxPages[i], UNO_QUERY );
+        }
 
         if( xShapes.is() )
         {
@@ -1780,6 +1794,17 @@ sal_Bool SVGFilter::implExportShape( const Reference< XShape >& rxShape,
 
 sal_Bool SVGFilter::implCreateObjects()
 {
+    if (maShapeSelection.is() && maShapeSelection->getCount())
+    {
+        // #i124608# export a given object selection
+        if (mSelectedPages.getLength() && mSelectedPages[0].is())
+        {
+            implCreateObjectsFromShapes(mSelectedPages[0], maShapeSelection);
+            return sal_True;
+        }
+        return sal_False;
+    }
+
     sal_Int32 i, nCount;
 
     for( i = 0, nCount = mMasterPageTargets.getLength(); i < nCount; ++i )
diff --git a/filter/source/svg/svgfilter.cxx b/filter/source/svg/svgfilter.cxx
index d8703da..fc70d83 100644
--- a/filter/source/svg/svgfilter.cxx
+++ b/filter/source/svg/svgfilter.cxx
@@ -66,7 +66,6 @@ SVGFilter::SVGFilter( const Reference< XComponentContext >& rxCtx ) :
     mpDefaultSdrPage( NULL ),
     mpSdrModel( NULL ),
     mbPresentation( sal_False ),
-    mbExportAll( sal_False ),
     mbSinglePage( sal_False ),
     mnVisiblePage( -1 ),
     mpObjects( NULL )
@@ -97,13 +96,27 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto
 #ifndef DISABLE_EXPORT
     else if( mxSrcDoc.is() )
     {
-        if( !mbExportAll && !mSelectedPages.hasElements() )
+        // #i124608# detext selection
+        sal_Bool bSelectionOnly = sal_False;
+        bool bGotSelection(false);
+
+        // #i124608# extract Single selection wanted from dialog return values
+        for ( sal_Int32 nInd = 0; nInd < rDescriptor.getLength(); nInd++ )
         {
-            uno::Reference< frame::XDesktop2 >                           xDesktop(frame::Desktop::create(mxContext));
-            uno::Reference< frame::XFrame >                              xFrame(xDesktop->getCurrentFrame(),
-                                                                                uno::UNO_QUERY_THROW);
-            uno::Reference<frame::XController >                          xController(xFrame->getController(),
+            if ( rDescriptor[nInd].Name == "SelectionOnly" )
+            {
+                rDescriptor[nInd].Value >>= bSelectionOnly;
+            }
+        }
+
+        uno::Reference< frame::XDesktop2 >                           xDesktop(frame::Desktop::create(mxContext));
+        uno::Reference< frame::XFrame >                              xFrame(xDesktop->getCurrentFrame(),
+                                                                            uno::UNO_QUERY_THROW);
+        uno::Reference<frame::XController >                          xController(xFrame->getController(),
                                                                                      uno::UNO_QUERY_THROW);
+
+        if( !mSelectedPages.hasElements() )
+        {
             uno::Reference<drawing::XDrawView >                          xDrawView(xController,
                                                                                    uno::UNO_QUERY_THROW);
             uno::Reference<drawing::framework::XControllerManager>       xManager(xController,
@@ -211,6 +224,31 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto
             }
         }
 
+        if (bSelectionOnly)
+        {
+            // #i124608# when selection only is wanted, get the current object selection
+            // from the DrawView
+            Reference< view::XSelectionSupplier > xSelection (xController, UNO_QUERY);
+
+            if (xSelection.is())
+            {
+                uno::Any aSelection;
+
+                if (xSelection->getSelection() >>= aSelection)
+                {
+                    bGotSelection = (sal_True == ( aSelection >>= maShapeSelection ));
+                }
+            }
+        }
+
+        if(bSelectionOnly && bGotSelection && 0 == maShapeSelection->getCount())
+        {
+            // #i124608# export selection, got maShapeSelection but no shape selected -> nothing
+            // to export, we are done (maybe return true, but a hint that nothing was done
+            // may be useful; it may have happened by error)
+            bRet = sal_False;
+        }
+        else {
         /*
          *  We get all master page that are targeted by at least one draw page.
          *  The master page are put in an unordered set.
@@ -234,6 +272,7 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto
         }
 
         bRet = implExport( rDescriptor );
+        }
     }
 #endif
     else
diff --git a/filter/source/svg/svgfilter.hxx b/filter/source/svg/svgfilter.hxx
index 7fdf8f7..c0f6f9d0 100644
--- a/filter/source/svg/svgfilter.hxx
+++ b/filter/source/svg/svgfilter.hxx
@@ -242,7 +242,6 @@ private:
     SdrPage*                            mpDefaultSdrPage;
     SdrModel*                           mpSdrModel;
     sal_Bool                            mbPresentation;
-    sal_Bool                            mbExportAll;
     sal_Bool                            mbSinglePage;
     sal_Int32                           mnVisiblePage;
     PagePropertySet                     mVisiblePagePropSet;
@@ -259,6 +258,8 @@ private:
     Reference< XComponent >             mxDstDoc;
     Reference< XDrawPage >              mxDefaultPage;
     Sequence< PropertyValue >           maFilterData;
+    // #i124608# explicit ShapeSelection for export when export of the selection is wanted
+    Reference< XShapes >                maShapeSelection;
     XDrawPageSequence                   mSelectedPages;
     XDrawPageSequence                   mMasterPageTargets;
 


More information about the Libreoffice-commits mailing list