[Libreoffice-commits] core.git: sw/qa writerfilter/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Wed Oct 31 04:00:47 UTC 2018
sw/qa/extras/ooxmlexport/ooxmlexport5.cxx | 7 +++++
sw/qa/extras/ooxmlexport/ooxmlexport8.cxx | 15 ++++++++++
writerfilter/source/dmapper/DomainMapper.cxx | 6 +++-
writerfilter/source/dmapper/PropertyIds.cxx | 1
writerfilter/source/dmapper/PropertyIds.hxx | 1
writerfilter/source/dmapper/PropertyMap.cxx | 37 +++++++++++++++++++++++++--
writerfilter/source/dmapper/PropertyMap.hxx | 3 ++
7 files changed, 67 insertions(+), 3 deletions(-)
New commits:
commit 3955e5efc225b184b9507db94c226c031a602168
Author: Justin Luth <justin.luth at collabora.com>
AuthorDate: Thu Oct 18 11:44:11 2018 +0300
Commit: Justin Luth <justin_luth at sil.org>
CommitDate: Wed Oct 31 05:00:21 2018 +0100
writerfilter: implement formprot
The document properly opens with all sections protected because
document protection (forms view) is enabled. However, when that
setting was toggled off, all sections wrongly became unprotected,
and remained unprotected when round-tripped
(including in Word - so loss of configuration).
Word does protection differently. It opens up in a forms only mode,
but upon enabling editing mode, the individual sections can
still be protected. Only when global enforcement is disabled
do all sections become editable.
So, if global enforcement is enabled, map the section protection to
LO native protection. On startup, the sections will all be protected
because of the global compatibility flag. If the flag is turned
off, then you enter a similar mode to Word's "Edit document" where
the sections are still protected. In LO, *each* section's protection
must be turned off individually to fully disable enforcement.
This patch keeps the same three-step process to fully edit the
entire document, but the meanings take on a different form.
"Compatability: Protect Form" changes from "enforcement" to
"edit document" in concept. BTW, that matches how export works,
where PROTECT_FORM is auto-enabled if any sections are protected.
Section protection in LO can be disabled through
Format - Sections - Write Protection.
Patch initially developed to support tdf#120499.
It depends on an earlier commit in order to round-trip.
Change-Id: I8a2399f79640115d689ae9093792eecef7dbaeec
Reviewed-on: https://gerrit.libreoffice.org/61918
Tested-by: Jenkins
Reviewed-by: Justin Luth <justin_luth at sil.org>
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx
index 401af06a6533..be20dd24b246 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx
@@ -995,6 +995,13 @@ DECLARE_OOXMLEXPORT_TEST(testSectionProtection, "sectionprot.odt")
assertXPath(pXmlSettings, "/w:settings/w:documentProtection", "enforcement", "true");
assertXPath(pXmlSettings, "/w:settings/w:documentProtection", "edit", "forms");
}
+
+ uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xSect(xSections->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("TextSection is protected", true, getProperty<bool>(xSect, "IsProtected"));
+ xSect.set(xSections->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Section1 is protected", false, getProperty<bool>(xSect, "IsProtected"));
}
DECLARE_OOXMLEXPORT_TEST(tdf66398_permissions, "tdf66398_permissions.docx")
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
index f460e384fd53..b42933eb3513 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
@@ -18,6 +18,7 @@
#include <swmodeltestbase.hxx>
+#include <IDocumentSettingAccess.hxx>
#include <com/sun/star/awt/XBitmap.hpp>
#include <com/sun/star/awt/FontUnderline.hpp>
#include <com/sun/star/awt/FontWeight.hpp>
@@ -798,6 +799,20 @@ DECLARE_OOXMLEXPORT_TEST(testFdo53985, "fdo53985.docx")
uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTables->getCount()); // Only 4 tables were imported.
+
+ SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
+ CPPUNIT_ASSERT(pTextDoc);
+ SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE("Compatibility: Protect form", pDoc->getIDocumentSettingAccess().get( DocumentSettingId::PROTECT_FORM ) );
+
+ uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xSections->getCount()); // The first paragraph wasn't counted as a section.
+
+ uno::Reference<beans::XPropertySet> xSect(xSections->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("TextSection is protected", true, getProperty<bool>(xSect, "IsProtected"));
+ xSect.set(xSections->getByIndex(3), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Section3 is protected", false, getProperty<bool>(xSect, "IsProtected"));
}
DECLARE_OOXMLEXPORT_TEST(testFdo59638, "fdo59638.docx")
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 1e942e3ae481..d88785b3196a 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2342,7 +2342,11 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext )
case NS_ooxml::LN_CT_PPrBase_mirrorIndents: // mirrorIndents
rContext->Insert(PROP_MIRROR_INDENTS, uno::makeAny( nIntValue != 0 ), true, PARA_GRAB_BAG);
break;
- case NS_ooxml::LN_EG_SectPrContents_formProt: //section protection, only form editing is enabled - unsupported
+ case NS_ooxml::LN_EG_SectPrContents_formProt: //section protection
+ {
+ if( pSectionContext )
+ pSectionContext->Insert( PROP_IS_PROTECTED, uno::makeAny( bool(nIntValue) ) );
+ }
break;
case NS_ooxml::LN_EG_SectPrContents_vAlign:
{
diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx
index f515d5118636..d8b99ada629e 100644
--- a/writerfilter/source/dmapper/PropertyIds.cxx
+++ b/writerfilter/source/dmapper/PropertyIds.cxx
@@ -234,6 +234,7 @@ OUString getPropertyName( PropertyIds eId )
case PROP_REDLINE_DATE_TIME : sName = "RedlineDateTime"; break;
case PROP_REDLINE_TYPE : sName = "RedlineType"; break;
case PROP_REDLINE_REVERT_PROPERTIES: sName = "RedlineRevertProperties"; break;
+ case PROP_IS_PROTECTED : sName = "IsProtected"; break;
case PROP_SIZE_PROTECTED : sName = "SizeProtected"; break;
case PROP_POSITION_PROTECTED : sName = "PositionProtected"; break;
case PROP_OPAQUE : sName = "Opaque"; break;
diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx
index 6d1d77bd743c..65ab06aa8321 100644
--- a/writerfilter/source/dmapper/PropertyIds.hxx
+++ b/writerfilter/source/dmapper/PropertyIds.hxx
@@ -217,6 +217,7 @@ enum PropertyIds
,PROP_PARENT_NUMBERING
,PROP_POSITION_AND_SPACE_MODE
,PROP_POSITION_PROTECTED
+ ,PROP_IS_PROTECTED
,PROP_PREFIX
,PROP_PRINTER_PAPER_TRAY_INDEX
,PROP_REDLINE_AUTHOR
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
index 41ad7869b1fd..1567865c4412 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -682,6 +682,31 @@ void SectionPropertyMap::DontBalanceTextColumns()
}
}
+void SectionPropertyMap::ApplyProtectionProperties( uno::Reference< beans::XPropertySet >& xSection, DomainMapper_Impl& rDM_Impl )
+{
+ try
+ {
+ // Word implements section protection differently than LO.
+ // PROP_IS_PROTECTED only applies if global setting GetProtectForm is enabled.
+ bool bIsProtected = rDM_Impl.GetSettingsTable()->GetProtectForm();
+ if ( bIsProtected )
+ {
+ // If form protection is enabled then section protection is enabled, unless explicitly disabled
+ if ( isSet(PROP_IS_PROTECTED) )
+ getProperty(PROP_IS_PROTECTED)->second >>= bIsProtected;
+ if ( !xSection.is() )
+ xSection = rDM_Impl.appendTextSectionAfter( m_xStartingRange );
+ if ( xSection.is() )
+ xSection->setPropertyValue( getPropertyName(PROP_IS_PROTECTED), uno::makeAny(bIsProtected) );
+ }
+ Erase(PROP_IS_PROTECTED);
+ }
+ catch ( uno::Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION("writerfilter", "ApplyProtectionProperties failed setting PROP_IS_PROTECTED");
+ }
+}
+
uno::Reference< text::XTextColumns > SectionPropertyMap::ApplyColumnProperties( const uno::Reference< beans::XPropertySet >& xColumnContainer,
DomainMapper_Impl& rDM_Impl )
{
@@ -1340,8 +1365,13 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
//todo: insert a section or access the already inserted section
uno::Reference< beans::XPropertySet > xSection =
rDM_Impl.appendTextSectionAfter( m_xStartingRange );
- if ( m_nColumnCount > 0 && xSection.is() )
- ApplyColumnProperties( xSection, rDM_Impl );
+ if ( xSection.is() )
+ {
+ if ( m_nColumnCount > 0 )
+ ApplyColumnProperties( xSection, rDM_Impl );
+
+ ApplyProtectionProperties( xSection, rDM_Impl );
+ }
try
{
@@ -1380,6 +1410,9 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
}
else
{
+ uno::Reference< beans::XPropertySet > xSection;
+ ApplyProtectionProperties( xSection, rDM_Impl );
+
//get the properties and create appropriate page styles
uno::Reference< beans::XPropertySet > xFollowPageStyle = GetPageStyle( rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), false );
diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx
index d5d2073ddb26..6f16de26fe0a 100644
--- a/writerfilter/source/dmapper/PropertyMap.hxx
+++ b/writerfilter/source/dmapper/PropertyMap.hxx
@@ -262,6 +262,9 @@ private:
void DontBalanceTextColumns();
+ /// Check if document is protected. If so, ensure a section exists, and apply its protected value.
+ void ApplyProtectionProperties( css::uno::Reference< css::beans::XPropertySet >& xSection, DomainMapper_Impl& rDM_Impl );
+
css::uno::Reference< css::text::XTextColumns > ApplyColumnProperties( const css::uno::Reference< css::beans::XPropertySet >& xFollowPageStyle,
DomainMapper_Impl& rDM_Impl);
More information about the Libreoffice-commits
mailing list