[Libreoffice-commits] core.git: sfx2/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Tue Feb 19 16:41:13 UTC 2019
sfx2/source/doc/objserv.cxx | 175 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 174 insertions(+), 1 deletion(-)
New commits:
commit 4b4d7014b571d8f4bff431de3a9050b2d48db2a6
Author: Muhammet Kara <muhammet.kara at collabora.com>
AuthorDate: Thu Feb 7 22:07:09 2019 +0300
Commit: Muhammet Kara <muhammet.kara at collabora.com>
CommitDate: Tue Feb 19 17:40:46 2019 +0100
Handle redaction finalization: Black
Convert shapes on the document to black & opaque
before sending it to the pdfexport filter.
Convert them back to gray & transparent after
the export operation.
Change-Id: Iffe66e371710f16ef1c04f0da196fc5a561af344
Reviewed-on: https://gerrit.libreoffice.org/67517
Tested-by: Jenkins
Reviewed-by: Muhammet Kara <muhammet.kara at collabora.com>
diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx
index 41412c832fea..f333eaa35f42 100644
--- a/sfx2/source/doc/objserv.cxx
+++ b/sfx2/source/doc/objserv.cxx
@@ -119,6 +119,7 @@
#include <unotools/streamwrap.hxx>
#include <svx/unoshape.hxx>
+#include <com/sun/star/util/Color.hpp>
using namespace ::com::sun::star;
using namespace ::com::sun::star::lang;
@@ -402,6 +403,23 @@ uno::Sequence< document::CmisVersion > SfxObjectShell::GetCmisVersions( )
return uno::Sequence< document::CmisVersion > ( );
}
+namespace{
+
+/// Checks to see if the request has a parameter of IsRedactMode:bool=true
+bool isRedactMode(SfxRequest& rReq)
+{
+ const SfxItemSet *pArgs = rReq.GetArgs();
+ if (pArgs)
+ {
+ const SfxBoolItem* pIsRedactMode = rReq.GetArg<SfxBoolItem>(SID_IS_REDACT_MODE);
+ if (pIsRedactMode && pIsRedactMode->GetValue())
+ return true;
+ }
+
+ return false;
+}
+
+}
void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
{
@@ -675,8 +693,94 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- case SID_EXPORTDOCASPDF:
case SID_DIRECTEXPORTDOCASPDF:
+ {
+ uno::Reference< lang::XComponent > xComponent( GetCurrentComponent(), uno::UNO_QUERY );
+ if (!xComponent.is())
+ return;
+
+ uno::Reference< lang::XServiceInfo > xServiceInfo( xComponent, uno::UNO_QUERY);
+
+ // Redaction finalization takes place in Draw
+ if ( xServiceInfo.is() && xServiceInfo->supportsService("com.sun.star.drawing.DrawingDocument")
+ && isRedactMode(rReq) )
+ {
+ // Access the draw pages
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages();
+
+ sal_Int32 nPageCount = xDrawPages->getCount();
+ for (sal_Int32 nPageNum = 0; nPageNum < nPageCount; ++nPageNum)
+ {
+ // Get the page
+ uno::Reference< drawing::XDrawPage > xPage( xDrawPages->getByIndex( nPageNum ), uno::UNO_QUERY );
+
+ if (!xPage.is())
+ continue;
+
+ // Go through all shapes
+ sal_Int32 nShapeCount = xPage->getCount();
+ for (sal_Int32 nShapeNum = 0; nShapeNum < nShapeCount; ++nShapeNum)
+ {
+ uno::Reference< drawing::XShape > xCurrShape(xPage->getByIndex(nShapeNum), uno::UNO_QUERY);
+ if (!xCurrShape.is())
+ continue;
+
+ uno::Reference< beans::XPropertySet > xPropSet(xCurrShape, uno::UNO_QUERY);
+ if (!xPropSet.is())
+ continue;
+
+ uno::Reference< beans::XPropertySetInfo> xInfo = xPropSet->getPropertySetInfo();
+ if (!xInfo.is())
+ continue;
+
+ // Rectangle redaction
+ if (xInfo->hasPropertyByName("FillTransparence") && xInfo->hasPropertyByName("FillColor"))
+ {
+ uno::Any aAnyTransp = xPropSet->getPropertyValue("FillTransparence");
+ uno::Any aAnyColor = xPropSet->getPropertyValue("FillColor");
+
+ sal_Int16 nTransp = 0;
+ Color aColor;
+ const OUString sRectangleName("RectangleRedactionShape");
+
+ aAnyTransp >>= nTransp;
+ aAnyColor >>= aColor;
+
+ if (nTransp == 50 && aColor == COL_GRAY7)
+ {
+ xPropSet->setPropertyValue("FillTransparence", css::uno::makeAny(static_cast<sal_Int16>(0)));
+ xPropSet->setPropertyValue("FillColor", css::uno::makeAny(COL_BLACK));
+ xPropSet->setPropertyValue("Name", css::uno::makeAny(sRectangleName));
+ }
+ }
+ //FIXME: Turn this into an else-if when we have the name-check
+ // Freeform redaction
+ if (xInfo->hasPropertyByName("LineTransparence") && xInfo->hasPropertyByName("LineColor"))
+ {
+ uno::Any aAnyTransp = xPropSet->getPropertyValue("LineTransparence");
+ uno::Any aAnyColor = xPropSet->getPropertyValue("LineColor");
+
+ sal_Int16 nTransp = 0;
+ Color aColor;
+ const OUString sFreeformName("FreeformRedactionShape");
+
+ aAnyTransp >>= nTransp;
+ aAnyColor >>= aColor;
+
+ if (nTransp == 50 && aColor == COL_GRAY7)
+ {
+ xPropSet->setPropertyValue("LineTransparence", css::uno::makeAny(static_cast<sal_Int16>(0)));
+ xPropSet->setPropertyValue("LineColor", css::uno::makeAny(COL_BLACK));
+ xPropSet->setPropertyValue("Name", css::uno::makeAny(sFreeformName));
+ }
+ }
+ }
+ }
+ }
+ }
+ [[fallthrough]];
+ case SID_EXPORTDOCASPDF:
bIsPDFExport = true;
[[fallthrough]];
case SID_EXPORTDOCASEPUB:
@@ -871,6 +975,75 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
ErrorHandler::HandleError(lErr, pDialogParent);
}
+ if (nId == SID_DIRECTEXPORTDOCASPDF &&
+ isRedactMode(rReq))
+ {
+ // Return the finalized redaction shapes back to normal (gray & transparent)
+ uno::Reference< lang::XComponent > xComponent( GetCurrentComponent(), uno::UNO_QUERY );
+ if (!xComponent.is())
+ return;
+
+ uno::Reference< lang::XServiceInfo > xServiceInfo( xComponent, uno::UNO_QUERY);
+
+ // Redaction finalization takes place in Draw
+ if ( xServiceInfo.is() && xServiceInfo->supportsService("com.sun.star.drawing.DrawingDocument") )
+ {
+ // Access the draw pages
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages();
+
+ sal_Int32 nPageCount = xDrawPages->getCount();
+ for (sal_Int32 nPageNum = 0; nPageNum < nPageCount; ++nPageNum)
+ {
+ // Get the page
+ uno::Reference< drawing::XDrawPage > xPage( xDrawPages->getByIndex( nPageNum ), uno::UNO_QUERY );
+
+ if (!xPage.is())
+ continue;
+
+ // Go through all shapes
+ sal_Int32 nShapeCount = xPage->getCount();
+ for (sal_Int32 nShapeNum = 0; nShapeNum < nShapeCount; ++nShapeNum)
+ {
+ uno::Reference< drawing::XShape > xCurrShape(xPage->getByIndex(nShapeNum), uno::UNO_QUERY);
+ if (!xCurrShape.is())
+ continue;
+
+ uno::Reference< beans::XPropertySet > xPropSet(xCurrShape, uno::UNO_QUERY);
+ if (!xPropSet.is())
+ continue;
+
+ uno::Reference< beans::XPropertySetInfo> xInfo = xPropSet->getPropertySetInfo();
+ if (!xInfo.is())
+ continue;
+
+ // Not a shape we converted?
+ if (!xInfo->hasPropertyByName("Name"))
+ continue;
+
+ OUString sName;
+ uno::Any aAnyName = xPropSet->getPropertyValue("Name");
+ aAnyName >>= sName;
+
+ // Rectangle redaction
+ if (!sName.isEmpty() && sName == "RectangleRedactionShape")
+ {
+ xPropSet->setPropertyValue("FillTransparence", css::uno::makeAny(static_cast<sal_Int16>(50)));
+ xPropSet->setPropertyValue("FillColor", css::uno::makeAny(COL_GRAY7));
+ }
+ // Freeform redaction
+ else if (!sName.isEmpty() && sName == "FreeformRedactionShape")
+ {
+ xPropSet->setPropertyValue("LineTransparence", css::uno::makeAny(static_cast<sal_Int16>(50)));
+ xPropSet->setPropertyValue("LineColor", css::uno::makeAny(COL_GRAY7));
+ }
+ }
+ }
+
+
+ }
+ }
+
if ( nId == SID_EXPORTDOCASPDF )
{
// This function is used by the SendMail function that needs information if a export
More information about the Libreoffice-commits
mailing list