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;

Reply via email to