diff options
author | Justin Luth <justin.luth@collabora.com> | 2018-10-18 11:44:11 +0300 |
---|---|---|
committer | Justin Luth <justin_luth@sil.org> | 2018-10-31 05:00:21 +0100 |
commit | 3955e5efc225b184b9507db94c226c031a602168 (patch) | |
tree | 7154c64e3f0518d583e01528fb55ff5acb62b289 /writerfilter/source/dmapper/PropertyMap.cxx | |
parent | dc2509bca4f503c11cdde16779363a5aae67185f (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/source/dmapper/PropertyMap.cxx')
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.cxx | 37 |
1 files changed, 35 insertions, 2 deletions
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 ); |