filter/source/pdf/impdialog.cxx | 79 ++++++++++++++++++++++++++------- include/vcl/FilterConfigItem.hxx | 2 vcl/source/filter/FilterConfigItem.cxx | 14 +++++ 3 files changed, 80 insertions(+), 15 deletions(-)
New commits: commit ba07ae10e765cb135097dceefd94346ff43bf472 Author: Justin Luth <jl...@mail.com> AuthorDate: Fri Sep 29 11:01:28 2023 -0400 Commit: Justin Luth <jl...@mail.com> CommitDate: Sat Sep 30 11:56:49 2023 +0200 pdf-dialog general-tab: set_sensitive if config not read-only Disable (gray out) Export as PDF options that are enforced (unchangeable) in the settings, similar to how optsave does it for tools - options. It is possible for an config extension to set oor:finalized="true", which needs to prevent the user from changing the value. Noticed during the LibreOffice conference in Bucharest, RO. mxCbExportBookmarks == Export Outlines Change-Id: I27f28107d1c1dc5d46fc6e2b8a8a83933e30d6ca Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157408 Tested-by: Jenkins Reviewed-by: Justin Luth <jl...@mail.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> diff --git a/filter/source/pdf/impdialog.cxx b/filter/source/pdf/impdialog.cxx index 755f530eee27..a444f69891c6 100644 --- a/filter/source/pdf/impdialog.cxx +++ b/filter/source/pdf/impdialog.cxx @@ -593,9 +593,12 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) mbIsWriter = pParent->mbIsWriter; mbIsSpreadsheet = pParent->mbIsSpreadsheet; - mxCbExportNotesInMargin->set_sensitive( mbIsWriter ); - mxCbExportEmptyPages->set_sensitive( mbIsWriter ); - mxCbExportPlaceholders->set_sensitive( mbIsWriter ); + mxCbExportNotesInMargin->set_sensitive( + mbIsWriter && !pParent->maConfigItem.IsReadOnly("ExportNotesInMargin")); + mxCbExportEmptyPages->set_sensitive( + mbIsWriter && !pParent->maConfigItem.IsReadOnly("IsSkipEmptyPages")); + mxCbExportPlaceholders->set_sensitive( + mbIsWriter && !pParent->maConfigItem.IsReadOnly("ExportPlaceholders")); mxRbLosslessCompression->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleCompressionHdl ) ); const bool bUseLosslessCompression = pParent->mbUseLosslessCompression; @@ -603,16 +606,24 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) mxRbLosslessCompression->set_active(true); else mxRbJPEGCompression->set_active(true); + const bool bReadOnlyCompression = !pParent->maConfigItem.IsReadOnly("UseLosslessCompression"); + mxRbLosslessCompression->set_sensitive(bReadOnlyCompression); + mxRbJPEGCompression->set_sensitive(bReadOnlyCompression); mxNfQuality->set_value( pParent->mnQuality, FieldUnit::PERCENT ); - mxQualityFrame->set_sensitive(!bUseLosslessCompression); + mxQualityFrame->set_sensitive( + !bUseLosslessCompression && !pParent->maConfigItem.IsReadOnly("Quality")); mxCbReduceImageResolution->connect_toggled(LINK(this, ImpPDFTabGeneralPage, ToggleReduceImageResolutionHdl)); const bool bReduceImageResolution = pParent->mbReduceImageResolution; mxCbReduceImageResolution->set_active( bReduceImageResolution ); + mxCbReduceImageResolution->set_sensitive( + !pParent->maConfigItem.IsReadOnly("ReduceImageResolution")); OUString aStrRes = OUString::number( pParent->mnMaxImageResolution ) + " DPI"; mxCoReduceImageResolution->set_entry_text(aStrRes); - mxCoReduceImageResolution->set_sensitive( bReduceImageResolution ); + mxCoReduceImageResolution->set_sensitive( + bReduceImageResolution && !pParent->maConfigItem.IsReadOnly("MaxImageResolution")); + mxCbWatermark->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleWatermarkHdl ) ); mxFtWatermark->set_sensitive(false ); mxEdWatermark->set_sensitive( false ); @@ -637,6 +648,7 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) const bool bIsPDFUA = pParent->mbPDFUACompliance; mxCbPDFUA->set_active(bIsPDFUA); mxCbPDFUA->connect_toggled(LINK(this, ImpPDFTabGeneralPage, TogglePDFVersionOrUniversalAccessibilityHandle)); + mxCbPDFUA->set_sensitive(!pParent->maConfigItem.IsReadOnly("PDFUACompliance")); // the TogglePDFVersionOrUniversalAccessibilityHandle handler will read or write the *UserSelection based // on the mxCbPDFA (= bIsPDFA) state, so we have to prepare the correct input state. @@ -644,15 +656,25 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) mxCbTaggedPDF->set_active(pParent->mbUseTaggedPDFUserSelection); else mbUseTaggedPDFUserSelection = pParent->mbUseTaggedPDFUserSelection; + mxCbExportBookmarks->set_active(pParent->mbExportBookmarksUserSelection); TogglePDFVersionOrUniversalAccessibilityHandle(*mxCbPDFA); mxCbExportFormFields->set_active(pParent->mbExportFormFields); mxCbExportFormFields->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleExportFormFieldsHdl ) ); + mxCbExportFormFields->set_sensitive(!pParent->maConfigItem.IsReadOnly("ExportFormFields")); mxLbFormsFormat->set_active(static_cast<sal_uInt16>(pParent->mnFormsType)); mxCbAllowDuplicateFieldNames->set_active( pParent->mbAllowDuplicateFieldNames ); + // FormsFrame contains (and thus sets_sensitive) FormsFormat and AllowDuplicateFieldNames mxFormsFrame->set_sensitive(pParent->mbExportFormFields); + if (pParent->mbExportFormFields) + { + if (pParent->maConfigItem.IsReadOnly("FormsType")) + mxLbFormsFormat->set_sensitive(false); + if (pParent->maConfigItem.IsReadOnly("AllowDuplicateFieldNames")) + mxCbAllowDuplicateFieldNames->set_sensitive(false); + } mxCbExportNotes->set_active( pParent->mbExportNotes ); @@ -665,6 +687,7 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) else { mxCbViewPDF->set_active(pParent->mbViewPDF); + mxCbViewPDF->set_sensitive(!pParent->maConfigItem.IsReadOnly("ViewPDFAfterExport")); } if ( mbIsPresentation ) @@ -673,12 +696,16 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) mxCbExportNotesPages->show(); mxCbExportNotesPages->set_active(pParent->mbExportNotesPages); mxCbExportNotesPages->connect_toggled( LINK(this, ImpPDFTabGeneralPage, ToggleExportNotesPagesHdl ) ); + mxCbExportNotesPages->set_sensitive(!pParent->maConfigItem.IsReadOnly("ExportNotesPages")); mxCbExportOnlyNotesPages->show(); mxCbExportOnlyNotesPages->set_active(pParent->mbExportOnlyNotesPages); // tdf#116473 Initially enable Export only note pages option depending on the checked state of Export notes pages option - mxCbExportOnlyNotesPages->set_sensitive(mxCbExportNotesPages->get_active()); + mxCbExportOnlyNotesPages->set_sensitive( + mxCbExportNotesPages->get_active() && !pParent->maConfigItem.IsReadOnly("ExportOnlyNotesPages")); mxCbExportHiddenSlides->show(); mxCbExportHiddenSlides->set_active(pParent->mbExportHiddenSlides); + mxCbExportHiddenSlides->set_sensitive( + !pParent->maConfigItem.IsReadOnly("ExportHiddenSlides")); } else { @@ -698,6 +725,7 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) mxCbSinglePageSheets->show(); mxCbSinglePageSheets->set_active(pParent->mbSinglePageSheets); + mxCbSinglePageSheets->set_sensitive(!pParent->maConfigItem.IsReadOnly("SinglePageSheets")); } else { @@ -716,6 +744,7 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) mxCbAddStream->show(); mxCbAddStream->set_active(pParent->mbAddStream); + mxCbAddStream->set_sensitive(!pParent->maConfigItem.IsReadOnly("IsAddStream")); mxCbAddStream->connect_toggled(LINK(this, ImpPDFTabGeneralPage, ToggleAddStreamHdl)); ToggleAddStreamHdl(*mxCbAddStream); // init addstream dependencies @@ -833,29 +862,46 @@ void ImpPDFTabGeneralPage::EnableExportNotesPages() { if ( mbIsPresentation ) { - mxCbExportNotesPages->set_sensitive( !mxRbSelection->get_active() ); - mxCbExportOnlyNotesPages->set_sensitive( !mxRbSelection->get_active() && mxCbExportNotesPages->get_active() ); + mxCbExportNotesPages->set_sensitive( + !mxRbSelection->get_active() && !mpParent->maConfigItem.IsReadOnly("ExportNotesPages")); + mxCbExportOnlyNotesPages->set_sensitive( + !mxRbSelection->get_active() && mxCbExportNotesPages->get_active() + && !mpParent->maConfigItem.IsReadOnly("ExportOnlyNotesPages")); } } IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleExportFormFieldsHdl, weld::Toggleable&, void) { - mxFormsFrame->set_sensitive(mxCbExportFormFields->get_active()); + const bool bExportFormFields = mxCbExportFormFields->get_active(); + // FormsFrame contains (and thus sets_sensitive) FormsFormat and AllowDuplicateFieldNames + mxFormsFrame->set_sensitive(bExportFormFields); + if (bExportFormFields) + { + if (mpParent->maConfigItem.IsReadOnly("FormsType")) + mxLbFormsFormat->set_sensitive(false); + if (mpParent->maConfigItem.IsReadOnly("AllowDuplicateFieldNames")) + mxCbAllowDuplicateFieldNames->set_sensitive(false); + } } IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleExportNotesPagesHdl, weld::Toggleable&, void) { - mxCbExportOnlyNotesPages->set_sensitive(mxCbExportNotesPages->get_active()); + mxCbExportOnlyNotesPages->set_sensitive( + mxCbExportNotesPages->get_active() + && !mpParent->maConfigItem.IsReadOnly("ExportOnlyNotesPages")); } IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleCompressionHdl, weld::Toggleable&, void) { - mxQualityFrame->set_sensitive(mxRbJPEGCompression->get_active()); + mxQualityFrame->set_sensitive( + mxRbJPEGCompression->get_active() && !mpParent->maConfigItem.IsReadOnly("Quality")); } IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleReduceImageResolutionHdl, weld::Toggleable&, void) { - mxCoReduceImageResolution->set_sensitive(mxCbReduceImageResolution->get_active()); + mxCoReduceImageResolution->set_sensitive( + mxCbReduceImageResolution->get_active() + && !mpParent->maConfigItem.IsReadOnly("MaxImageResolution")); } IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleWatermarkHdl, weld::Toggleable&, void) @@ -897,8 +943,10 @@ IMPL_LINK_NOARG(ImpPDFTabGeneralPage, TogglePDFVersionOrUniversalAccessibilityHa if (pSecPage) pSecPage->ImplPDFASecurityControl(!bIsPDFA); - mxCbTaggedPDF->set_sensitive(!bIsPDFA && !bIsPDFUA); - mxRbPDFAVersion->set_sensitive(bIsPDFA); + mxCbTaggedPDF->set_sensitive( + !bIsPDFA && !bIsPDFUA && !mpParent->maConfigItem.IsReadOnly("UseTaggedPDF")); + mxRbPDFAVersion->set_sensitive( + bIsPDFA && !mpParent->maConfigItem.IsReadOnly("SelectPdfVersion")); if (bIsPDFA || bIsPDFUA) { @@ -946,7 +994,8 @@ IMPL_LINK_NOARG(ImpPDFTabGeneralPage, TogglePDFVersionOrUniversalAccessibilityHa mxCbExportBookmarks->set_active(mpParent->mbExportBookmarksUserSelection); mxCbUseReferenceXObject->set_active(mpParent->mbUseReferenceXObjectUserSelection); } - mxCbExportBookmarks->set_sensitive(!bIsPDFUA); + mxCbExportBookmarks->set_sensitive( + !bIsPDFUA && !mpParent->maConfigItem.IsReadOnly("ExportBookmarks")); mxCbUseReferenceXObject->set_sensitive(!bIsPDFUA); ImpPDFTabOpnFtrPage *const pOpenPage(mpParent ? mpParent->getOpenPage() : nullptr); diff --git a/include/vcl/FilterConfigItem.hxx b/include/vcl/FilterConfigItem.hxx index 45692fedb01f..9a2bb1f51f04 100644 --- a/include/vcl/FilterConfigItem.hxx +++ b/include/vcl/FilterConfigItem.hxx @@ -69,6 +69,8 @@ public: /// Writes config and sets unmodified state again. void WriteModifiedConfig(); + bool IsReadOnly(const OUString& rPropName); + // all read methods are trying to return values in following order: // 1. FilterData PropertySequence // 2. configuration diff --git a/vcl/source/filter/FilterConfigItem.cxx b/vcl/source/filter/FilterConfigItem.cxx index 05acd96ae3aa..41eaac04e1d4 100644 --- a/vcl/source/filter/FilterConfigItem.cxx +++ b/vcl/source/filter/FilterConfigItem.cxx @@ -24,6 +24,7 @@ #include <comphelper/propertyvalue.hxx> #include <o3tl/string_view.hxx> #include <osl/diagnose.h> +#include <com/sun/star/beans/PropertyAttribute.hpp> #include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/configuration/theDefaultProvider.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> @@ -247,6 +248,19 @@ bool FilterConfigItem::WritePropertyValue( Sequence< PropertyValue >& rPropSeq, return bRet; } +bool FilterConfigItem::IsReadOnly(const OUString& rName) +{ + if (!xPropSet.is()) + return false; + + const Reference<XPropertySetInfo> xInfo(xPropSet->getPropertySetInfo()); + if (!xInfo.is() || !xInfo->hasPropertyByName(rName)) + return false; + + const css::beans::Property aProp(xInfo->getPropertyByName(rName)); + return (aProp.Attributes & PropertyAttribute::READONLY); +} + bool FilterConfigItem::ReadBool( const OUString& rKey, bool bDefault ) { Any aAny;