Kaydet (Commit) ad32e6a6 authored tarafından Muhammet Kara's avatar Muhammet Kara Kaydeden (comit) Andras Timar

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: 's avatarMuhammet Kara <muhammet.kara@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/69815Reviewed-by: 's avatarAndras Timar <andras.timar@collabora.com>
Tested-by: 's avatarAndras Timar <andras.timar@collabora.com>
üst d132d220
......@@ -44,6 +44,13 @@ 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;
......@@ -51,6 +58,7 @@ class SVT_DLLPUBLIC DocumentToGraphicRenderer
css::uno::Any maSelection;
bool mbSelectionOnly;
bool mbIsWriter;
DocType meDocType;
bool hasSelection() const;
......@@ -70,7 +78,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);
......@@ -85,6 +94,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
......
......@@ -534,7 +534,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();
......@@ -544,7 +553,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);
......@@ -556,9 +567,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);
}
......@@ -591,6 +614,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
......
......@@ -48,7 +48,7 @@ DocumentToGraphicRenderer::DocumentToGraphicRenderer( const Reference<XComponent
mxRenderable (mxDocument, uno::UNO_QUERY ),
mxToolkit( VCLUnoHelper::CreateToolkit() ),
mbSelectionOnly( bSelectionOnly ),
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 );
}
......@@ -224,7 +248,7 @@ sal_Int32 DocumentToGraphicRenderer::getCurrentPage()
if (hasSelection())
return 1;
if (mbIsWriter)
if (isWriter())
return getCurrentPageWriter();
/* TODO: other application specific page detection? */
......@@ -285,4 +309,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: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment