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.k...@collabora.com> AuthorDate: Fri Jan 18 14:07:56 2019 +0300 Commit: Muhammet Kara <muhammet.k...@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.k...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/69815 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/74195 Tested-by: Muhammet Kara <muhammet.k...@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: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits