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 189f4d3b3ee5807e1140b6c417a3b2687dfdd2a3
Author:     Muhammet Kara <muhammet.k...@collabora.com>
AuthorDate: Fri Jan 18 14:07:56 2019 +0300
Commit:     Muhammet Kara <muhammet.k...@collabora.com>
CommitDate: Sat Jan 19 08:21:09 2019 +0100

    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.k...@collabora.com>

diff --git a/include/svtools/DocumentToGraphicRenderer.hxx 
b/include/svtools/DocumentToGraphicRenderer.hxx
index 4ce5cb4d41fa..49a3ab0b347e 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;
@@ -77,7 +84,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);
@@ -92,6 +100,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 ff6755257000..defa5ea0e483 100644
--- a/sfx2/source/doc/objserv.cxx
+++ b/sfx2/source/doc/objserv.cxx
@@ -549,7 +549,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();
 
@@ -559,7 +568,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);
 
@@ -572,9 +583,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);
             }
@@ -608,6 +631,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 5ea3982d0e00..192d84e7c869 100644
--- a/svtools/source/filter/DocumentToGraphicRenderer.cxx
+++ b/svtools/source/filter/DocumentToGraphicRenderer.cxx
@@ -49,7 +49,7 @@ DocumentToGraphicRenderer::DocumentToGraphicRenderer( const 
Reference<XComponent
     mxController( mxModel->getCurrentController() ),
     mxRenderable (mxDocument, uno::UNO_QUERY ),
     mxToolkit( VCLUnoHelper::CreateToolkit() ),
-    mbIsWriter( false )
+    meDocType( UNKNOWN )
 {
     try
     {
@@ -57,7 +57,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&)
@@ -80,7 +86,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;
             }
         }
@@ -116,7 +122,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 ) );
 
@@ -135,7 +141,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)
@@ -151,6 +159,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;
+            }
         }
     }
 
@@ -158,6 +174,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 );
 }
@@ -246,7 +270,7 @@ sal_Int32 DocumentToGraphicRenderer::getCurrentPage()
     if (hasSelection())
         return 1;
 
-    if (mbIsWriter)
+    if (isWriter())
         return getCurrentPageWriter();
 
     /* TODO: other application specific page detection? */
@@ -307,4 +331,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: */
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to