summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorJustin Luth <justin.luth@collabora.com>2018-10-18 11:44:11 +0300
committerJustin Luth <justin_luth@sil.org>2018-10-31 05:00:21 +0100
commit3955e5efc225b184b9507db94c226c031a602168 (patch)
tree7154c64e3f0518d583e01528fb55ff5acb62b289 /writerfilter
parentdc2509bca4f503c11cdde16779363a5aae67185f (diff)
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@sil.org>
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx6
-rw-r--r--writerfilter/source/dmapper/PropertyIds.cxx1
-rw-r--r--writerfilter/source/dmapper/PropertyIds.hxx1
-rw-r--r--writerfilter/source/dmapper/PropertyMap.cxx37
-rw-r--r--writerfilter/source/dmapper/PropertyMap.hxx3
5 files changed, 45 insertions, 3 deletions
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);