[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - include/svtools sfx2/source svtools/source

Muhammet Kara (via logerrit) logerrit at kemper.freedesktop.org
Mon Jun 17 18:51:04 UTC 2019


 include/svtools/DocumentToGraphicRenderer.hxx       |   16 ++++-
 sfx2/source/doc/objserv.cxx                         |   36 +++++++++++-
 svtools/source/filter/DocumentToGraphicRenderer.cxx |   58 ++++++++++++++++++--
 3 files changed, 99 insertions(+), 11 deletions(-)

New commits:
commit efd8813bb88ff3f3fd8c523d2f39ae595292163e
Author:     Muhammet Kara <muhammet.kara at collabora.com>
AuthorDate: Fri Jan 18 14:07:56 2019 +0300
Commit:     Muhammet Kara <muhammet.kara at collabora.com>
CommitDate: Mon Jun 17 20:50:20 2019 +0200

    Redaction: Adjust offset for multiple Calc pages
    
    * Add an enum and some methods to DocumentToGraphicRenderer
      to differentiate between the doc/module types:
        isWriter(), isCalc(), isImpress()
    * Put some checks for module/doc type
    * The result seems ok for a Calc document of multiple sheets
      with hundreds of pages
    
    Change-Id: Idf3e1966d4239df30a48a947a95c9085c25ee1bb
    Reviewed-on: https://gerrit.libreoffice.org/66605
    Tested-by: Jenkins
    Reviewed-by: Muhammet Kara <muhammet.kara at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/69815
    Reviewed-by: Andras Timar <andras.timar at collabora.com>
    Tested-by: Andras Timar <andras.timar at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/74195
    Tested-by: Muhammet Kara <muhammet.kara at collabora.com>

diff --git a/include/svtools/DocumentToGraphicRenderer.hxx b/include/svtools/DocumentToGraphicRenderer.hxx
index e547caacf38a..70837b4505a3 100644
--- a/include/svtools/DocumentToGraphicRenderer.hxx
+++ b/include/svtools/DocumentToGraphicRenderer.hxx
@@ -46,12 +46,19 @@ class SVT_DLLPUBLIC DocumentToGraphicRenderer
 {
     const css::uno::Reference<css::lang::XComponent>& mxDocument;
 
+    enum DocType {
+            WRITER,
+            CALC,
+            IMPRESS,
+            UNKNOWN
+        };
+
     css::uno::Reference<css::frame::XModel>         mxModel;
     css::uno::Reference<css::frame::XController>    mxController;
     css::uno::Reference<css::view::XRenderable>     mxRenderable;
     css::uno::Reference<css::awt::XToolkit>         mxToolkit;
     css::uno::Any                                   maSelection;
-    bool                                            mbIsWriter;
+    DocType                                         meDocType;
     std::vector<OUString>                           maChapterNames;
 
     bool hasSelection() const;
@@ -79,7 +86,8 @@ public:
 
     Size getDocumentSizeInPixels( sal_Int32 nCurrentPage );
 
-    Size getDocumentSizeIn100mm(sal_Int32 nCurrentPage, Point* pDocumentPosition = nullptr);
+    Size getDocumentSizeIn100mm(sal_Int32 nCurrentPage, Point* pDocumentPosition = nullptr,
+                                Point* pCalcPagePosition = nullptr, Size *pCalcPageSize = nullptr);
 
     Graphic renderToGraphic( sal_Int32 nCurrentPage, Size aDocumentSizePixel,
                             Size aTargetSizePixel, Color aPageColor, bool bExtOutDevData);
@@ -94,6 +102,10 @@ public:
             css::uno::Reference< css::drawing::XShapes > & rxShapes,
             css::uno::Reference< css::drawing::XShape > & rxShape,
             const css::uno::Reference< css::frame::XController > & rxController );
+
+    bool isWriter() const;
+    bool isCalc() const;
+    bool isImpress() const;
 };
 
 #endif
diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx
index 666d1ec25252..53ce5ad2f03e 100644
--- a/sfx2/source/doc/objserv.cxx
+++ b/sfx2/source/doc/objserv.cxx
@@ -547,7 +547,16 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
 
             uno::Reference< lang::XComponent > xSourceDoc( xModel );
 
-            DocumentToGraphicRenderer aRenderer(xSourceDoc, /*bSelectionOnly=*/false);
+            DocumentToGraphicRenderer aRenderer(xSourceDoc, false);
+
+            bool bIsWriter = aRenderer.isWriter();
+            bool bIsCalc = aRenderer.isCalc();
+
+            if (!bIsWriter && !bIsCalc)
+            {
+                SAL_WARN( "sfx.doc", "Redaction is supported only for Writer and Calc! (for now...)");
+                return;
+            }
 
             sal_Int32 nPages = aRenderer.getPageCount();
 
@@ -557,7 +566,9 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
             {
                 ::Size aDocumentSizePixel = aRenderer.getDocumentSizeInPixels(nPage);
                 ::Point aLogicPos;
-                ::Size aLogic = aRenderer.getDocumentSizeIn100mm(nPage, &aLogicPos);
+                ::Point aCalcPageLogicPos;
+                ::Size aCalcPageContentSize;
+                ::Size aLogic = aRenderer.getDocumentSizeIn100mm(nPage, &aLogicPos, &aCalcPageLogicPos, &aCalcPageContentSize);
                 // FIXME: This is a temporary hack. Need to figure out a proper way to derive this scale factor.
                 ::Size aTargetSize(aDocumentSizePixel.Width() * 1.23, aDocumentSizePixel.Height() * 1.23);
 
@@ -570,9 +581,21 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
                 MapMode aMapMode;
                 aMapMode.SetMapUnit(MapUnit::Map100thMM);
                 // FIXME: This is a temporary hack. Need to figure out a proper way to derive these magic numbers.
-                aMapMode.SetOrigin(::Point(-(aLogicPos.getX() - 512) * 1.53, -((aLogicPos.getY() - 501)* 1.53 + (nPage-1)*740 )));
+                if (bIsWriter)
+                    aMapMode.SetOrigin(::Point(-(aLogicPos.getX() - 512) * 1.53, -((aLogicPos.getY() - 501)* 1.53 + (nPage-1)*740 )));
+                else if (bIsCalc)
+                    rGDIMetaFile.Scale(0.566, 0.566);
+
                 rGDIMetaFile.SetPrefMapMode(aMapMode);
-                rGDIMetaFile.SetPrefSize(aLogic);
+
+                if (bIsCalc)
+                {
+                    double aWidthRatio = static_cast<double>(aCalcPageContentSize.Width()) / aLogic.Width();
+                    // FIXME: Get rid of these magic numbers. Also watch for floating point rounding errors
+                    rGDIMetaFile.Move(-2400 + aCalcPageLogicPos.X() * (aWidthRatio - 0.0887), -3300 + aCalcPageLogicPos.Y() * 0.64175);
+                }
+
+                rGDIMetaFile.SetPrefSize( bIsCalc ? aCalcPageContentSize : aLogic );
 
                 aMetaFiles.push_back(rGDIMetaFile);
             }
@@ -606,6 +629,11 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
                 xShape->setSize(awt::Size(rGDIMetaFile.GetPrefSize().Width(),rGDIMetaFile.GetPrefSize().Height()) );
 
                 xPage->add(xShape);
+
+                // Shapes from Calc have the size of the content instead of the whole standard page (like A4)
+                // so it needs positioning on the draw page
+                if (bIsCalc)
+                    xShape->setPosition(awt::Point(1000,1000));
             }
 
             // Remove the extra page at the beginning
diff --git a/svtools/source/filter/DocumentToGraphicRenderer.cxx b/svtools/source/filter/DocumentToGraphicRenderer.cxx
index 9d1becf178f8..27852455c44f 100644
--- a/svtools/source/filter/DocumentToGraphicRenderer.cxx
+++ b/svtools/source/filter/DocumentToGraphicRenderer.cxx
@@ -48,7 +48,7 @@ DocumentToGraphicRenderer::DocumentToGraphicRenderer( const Reference<XComponent
     mxController( mxModel->getCurrentController() ),
     mxRenderable (mxDocument, uno::UNO_QUERY ),
     mxToolkit( VCLUnoHelper::CreateToolkit() ),
-    mbIsWriter( false )
+    meDocType( UNKNOWN )
 {
     try
     {
@@ -56,7 +56,13 @@ DocumentToGraphicRenderer::DocumentToGraphicRenderer( const Reference<XComponent
         if (xServiceInfo.is())
         {
             if (xServiceInfo->supportsService("com.sun.star.text.TextDocument"))
-                mbIsWriter = true;
+                meDocType = WRITER;
+            else if (xServiceInfo->supportsService("com.sun.star.sheet.SpreadsheetDocument"))
+                meDocType = CALC;
+            else if (xServiceInfo->supportsService("com.sun.star.presentation.PresentationDocument"))
+                meDocType = IMPRESS;
+            else
+                meDocType = UNKNOWN;
         }
     }
     catch (const uno::Exception&)
@@ -79,7 +85,7 @@ DocumentToGraphicRenderer::DocumentToGraphicRenderer( const Reference<XComponent
                  * XRenderable::render() it always renders an empty page.
                  * So disable the selection already here. The current page
                  * the cursor is on is rendered. */
-                if (!mbIsWriter)
+                if (!isWriter())
                     maSelection = aViewSelection;
             }
         }
@@ -115,7 +121,7 @@ uno::Any DocumentToGraphicRenderer::getSelection() const
 }
 
 Size DocumentToGraphicRenderer::getDocumentSizeIn100mm(sal_Int32 nCurrentPage,
-                                                       Point* pDocumentPosition)
+                                                       Point* pDocumentPosition, Point* pCalcPagePosition, Size* pCalcPageSize)
 {
     Reference< awt::XDevice > xDevice(mxToolkit->createScreenCompatibleDevice( 32, 32 ) );
 
@@ -134,7 +140,9 @@ Size DocumentToGraphicRenderer::getDocumentSizeIn100mm(sal_Int32 nCurrentPage,
     renderProperties[3].Value <<= true;
 
     awt::Size aSize;
+    awt::Size aCalcPageSize;
     awt::Point aPos;
+    awt::Point aCalcPos;
 
     sal_Int32 nPages = mxRenderable->getRendererCount( selection, renderProperties );
     if (nPages >= nCurrentPage)
@@ -150,6 +158,14 @@ Size DocumentToGraphicRenderer::getDocumentSizeIn100mm(sal_Int32 nCurrentPage,
             {
                 aResult[nProperty].Value >>= aPos;
             }
+            else if (aResult[nProperty].Name == "CalcPagePos")
+            {
+                aResult[nProperty].Value >>= aCalcPos;
+            }
+            else if (aResult[nProperty].Name == "CalcPageContentSize")
+            {
+                aResult[nProperty].Value >>= aCalcPageSize;
+            }
         }
     }
 
@@ -157,6 +173,14 @@ Size DocumentToGraphicRenderer::getDocumentSizeIn100mm(sal_Int32 nCurrentPage,
     {
         *pDocumentPosition = Point(aPos.X, aPos.Y);
     }
+    if (pCalcPagePosition)
+    {
+        *pCalcPagePosition = Point(aCalcPos.X, aCalcPos.Y);
+    }
+    if (pCalcPageSize)
+    {
+        *pCalcPageSize = Size(aCalcPageSize.Width, aCalcPageSize.Height);
+    }
 
     return Size( aSize.Width, aSize.Height );
 }
@@ -245,7 +269,7 @@ sal_Int32 DocumentToGraphicRenderer::getCurrentPage()
     if (hasSelection())
         return 1;
 
-    if (mbIsWriter)
+    if (isWriter())
         return getCurrentPageWriter();
 
     /* TODO: other application specific page detection? */
@@ -306,4 +330,28 @@ bool DocumentToGraphicRenderer::isShapeSelected(
     return bShape;
 }
 
+bool DocumentToGraphicRenderer::isWriter() const
+{
+    if (meDocType == WRITER)
+        return true;
+    else
+        return false;
+}
+
+bool DocumentToGraphicRenderer::isCalc() const
+{
+    if (meDocType == CALC)
+        return true;
+    else
+        return false;
+}
+
+bool DocumentToGraphicRenderer::isImpress() const
+{
+    if (meDocType == IMPRESS)
+        return true;
+    else
+        return false;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list