diff options
Diffstat (limited to 'filter/source/pdf/impdialog.cxx')
-rw-r--r-- | filter/source/pdf/impdialog.cxx | 1638 |
1 files changed, 1638 insertions, 0 deletions
diff --git a/filter/source/pdf/impdialog.cxx b/filter/source/pdf/impdialog.cxx new file mode 100644 index 000000000..bd8db8369 --- /dev/null +++ b/filter/source/pdf/impdialog.cxx @@ -0,0 +1,1638 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "impdialog.hxx" +#include <strings.hrc> +#include <officecfg/Office/Common.hxx> +#include <vcl/errinf.hxx> +#include <vcl/svapp.hxx> +#include <vcl/weld.hxx> +#include <sfx2/passwd.hxx> +#include <unotools/resmgr.hxx> +#include <tools/diagnose_ex.h> +#include <sfx2/objsh.hxx> +#include <svx/AccessibilityCheckDialog.hxx> + +#include <comphelper/propertyvalue.hxx> +#include <comphelper/sequence.hxx> +#include <comphelper/storagehelper.hxx> + +#include <com/sun/star/text/XTextRange.hpp> +#include <com/sun/star/drawing/XShapes.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/frame/XController.hpp> +#include <com/sun/star/view/XSelectionSupplier.hpp> +#include <com/sun/star/security/DocumentDigitalSignatures.hpp> +#include <com/sun/star/beans/XMaterialHolder.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> + +static OUString PDFFilterResId(TranslateId aId) +{ + return Translate::get(aId, Translate::Create("flt")); +} + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +/** Tabbed PDF dialog implementation + Please note: the default used here are the same as per specification, + They should be the same in PDFFilter::implExport and in PDFExport::PDFExport + */ +ImpPDFTabDialog::ImpPDFTabDialog(weld::Window* pParent, const Sequence< PropertyValue >& rFilterData, + const Reference< XComponent >& rxDoc) + : SfxTabDialogController(pParent, "filter/ui/pdfoptionsdialog.ui", "PdfOptionsDialog"), + mrDoc(rxDoc), + mpParent(pParent), + maConfigItem( u"Office.Common/Filter/PDF/Export/", &rFilterData ), + maConfigI18N( u"Office.Common/I18N/CTL/" ), + mbIsPresentation( false ), + mbIsSpreadsheet( false ), + mbIsWriter( false ), + + mbSelectionPresent( false ), + mbUseCTLFont( false ), + mbUseLosslessCompression( true ), + mnQuality( 90 ), + mbReduceImageResolution( false ), + mnMaxImageResolution( 300 ), + mbUseTaggedPDF( false ), + mbUseTaggedPDFUserSelection( false ), + mbExportNotes( true ), + mbViewPDF( false ), + mbUseReferenceXObject( false ), + mbExportNotesPages( false ), + mbExportOnlyNotesPages( false ), + mbUseTransitionEffects( false ), + mbIsSkipEmptyPages( true ), + mbIsExportPlaceholders( false ), + mbAddStream( false ), + mnFormsType( 0 ), + mbExportFormFields( true ), + mbAllowDuplicateFieldNames( false ), + mbExportBookmarks( true ), + mbExportHiddenSlides ( false ), + mbSinglePageSheets ( false ), + mnOpenBookmarkLevels( -1 ), + + mbHideViewerToolbar( false ), + mbHideViewerMenubar( false ), + mbHideViewerWindowControls( false ), + mbResizeWinToInit( false ), + mbCenterWindow( false ), + mbOpenInFullScreenMode( false ), + mbDisplayPDFDocumentTitle( false ), + mnMagnification( 0 ), + mnInitialView( 0 ), + mnZoom( 0 ), + mnInitialPage( 1 ), + mnPageLayout( 0 ), + mbFirstPageLeft( false ), + + mbEncrypt( false ), + mbRestrictPermissions( false ), + mnPrint( 0 ), + mnChangesAllowed( 0 ), + mbCanCopyOrExtract( false ), + mbCanExtractForAccessibility( true ), + + mbIsRangeChecked( false ), + msPageRange( ' ' ), + + mbSelectionIsChecked( false ), + mbExportRelativeFsysLinks( false ), + mnViewPDFMode( 0 ), + mbConvertOOoTargets( false ), + mbExportBmkToPDFDestination( false ), + + mbSignPDF( false ) +{ + // check for selection + try + { + Reference< frame::XController > xController( Reference< frame::XModel >( rxDoc, UNO_QUERY_THROW )->getCurrentController() ); + if( xController.is() ) + { + Reference< view::XSelectionSupplier > xView( xController, UNO_QUERY ); + if( xView.is() ) + maSelection = xView->getSelection(); + } + } + catch(const RuntimeException &) + { + } + mbSelectionPresent = maSelection.hasValue(); + if ( mbSelectionPresent ) + { + Reference< drawing::XShapes > xShapes; + if ( !( maSelection >>= xShapes ) ) // XShapes is always a selection + { + // even if nothing is selected in writer the selection is not empty + Reference< container::XIndexAccess > xIndexAccess; + if ( maSelection >>= xIndexAccess ) + { + sal_Int32 nLen = xIndexAccess->getCount(); + if ( !nLen ) + mbSelectionPresent = false; + else if ( nLen == 1 ) + { + Reference< text::XTextRange > xTextRange( xIndexAccess->getByIndex( 0 ), UNO_QUERY ); + if ( xTextRange.is() && ( xTextRange->getString().isEmpty() ) ) + mbSelectionPresent = false; + } + } + } + } + + // check if source document is a presentation or a spreadsheet or a textdocument + try + { + Reference< XServiceInfo > xInfo( rxDoc, UNO_QUERY ); + if ( xInfo.is() ) + { + if ( xInfo->supportsService( "com.sun.star.presentation.PresentationDocument" ) ) + mbIsPresentation = true; + if ( xInfo->supportsService( "com.sun.star.sheet.SpreadsheetDocument" ) ) + mbIsSpreadsheet = true; + if ( xInfo->supportsService( "com.sun.star.text.GenericTextDocument" ) ) + mbIsWriter = true; + } + } + catch(const RuntimeException &) + { + } + + // get the CTL (Complex Text Layout) from general options, returns sal_True if we have a CTL font on our hands. + mbUseCTLFont = maConfigI18N.ReadBool( "CTLFont", false ); + + mbUseLosslessCompression = maConfigItem.ReadBool( "UseLosslessCompression", false ); + mnQuality = maConfigItem.ReadInt32( "Quality", 90 ); + mbReduceImageResolution = maConfigItem.ReadBool( "ReduceImageResolution", false ); + mnMaxImageResolution = maConfigItem.ReadInt32( "MaxImageResolution", 300 ); + + // this is always the user selection, independent from the PDF/A forced selection + mbUseTaggedPDF = maConfigItem.ReadBool( "UseTaggedPDF", false ); + mbUseTaggedPDFUserSelection = mbUseTaggedPDF; + + mnPDFTypeSelection = maConfigItem.ReadInt32( "SelectPdfVersion", 0 ); + mbPDFUACompliance = maConfigItem.ReadBool("PDFUACompliance", false); + + if ( mbIsPresentation ) + { + mbExportNotesPages = maConfigItem.ReadBool( "ExportNotesPages", false ); + mbExportOnlyNotesPages = maConfigItem.ReadBool( "ExportOnlyNotesPages", false ); + } + mbExportNotes = maConfigItem.ReadBool( "ExportNotes", false ); + mbViewPDF = maConfigItem.ReadBool( "ViewPDFAfterExport", false ); + + mbExportBookmarks = maConfigItem.ReadBool( "ExportBookmarks", true ); + if ( mbIsPresentation ) + mbExportHiddenSlides = maConfigItem.ReadBool( "ExportHiddenSlides", false ); + if ( mbIsSpreadsheet ) + mbSinglePageSheets = maConfigItem.ReadBool( "SinglePageSheets", false ); + mnOpenBookmarkLevels = maConfigItem.ReadInt32( "OpenBookmarkLevels", -1 ); + mbUseTransitionEffects = maConfigItem.ReadBool( "UseTransitionEffects", true ); + mbIsSkipEmptyPages = maConfigItem.ReadBool( "IsSkipEmptyPages", false ); + mbIsExportPlaceholders = maConfigItem.ReadBool( "ExportPlaceholders", false ); + mbAddStream = maConfigItem.ReadBool( "IsAddStream", false ); + + mbExportFormFields = maConfigItem.ReadBool( "ExportFormFields", true ); + mnFormsType = maConfigItem.ReadInt32( "FormsType", 0 ); + if ( ( mnFormsType < 0 ) || ( mnFormsType > 3 ) ) + mnFormsType = 0; + mbAllowDuplicateFieldNames = maConfigItem.ReadBool( "AllowDuplicateFieldNames", false ); + + // prepare values for the Viewer tab page + mbHideViewerToolbar = maConfigItem.ReadBool( "HideViewerToolbar", false ); + mbHideViewerMenubar = maConfigItem.ReadBool( "HideViewerMenubar", false ); + mbHideViewerWindowControls = maConfigItem.ReadBool( "HideViewerWindowControls", false ); + mbResizeWinToInit = maConfigItem.ReadBool( "ResizeWindowToInitialPage", false ); + mbCenterWindow = maConfigItem.ReadBool( "CenterWindow", false ); + mbOpenInFullScreenMode = maConfigItem.ReadBool( "OpenInFullScreenMode", false ); + mbDisplayPDFDocumentTitle = maConfigItem.ReadBool( "DisplayPDFDocumentTitle", true ); + + mnInitialView = maConfigItem.ReadInt32( "InitialView", 0 ); + mnMagnification = maConfigItem.ReadInt32( "Magnification", 0 ); + mnZoom = maConfigItem.ReadInt32( "Zoom", 100 ); + mnPageLayout = maConfigItem.ReadInt32( "PageLayout", 0 ); + mbFirstPageLeft = maConfigItem.ReadBool( "FirstPageOnLeft", false ); + mnInitialPage = maConfigItem.ReadInt32( "InitialPage", 1 ); + if( mnInitialPage < 1 ) + mnInitialPage = 1; + + // prepare values for the security tab page + mnPrint = maConfigItem.ReadInt32( "Printing", 2 ); + mnChangesAllowed = maConfigItem.ReadInt32( "Changes", 4 ); + mbCanCopyOrExtract = maConfigItem.ReadBool( "EnableCopyingOfContent", true ); + mbCanExtractForAccessibility = maConfigItem.ReadBool( "EnableTextAccessForAccessibilityTools", true ); + + // prepare values for relative links + mbExportRelativeFsysLinks = maConfigItem.ReadBool( "ExportLinksRelativeFsys", false ); + + mnViewPDFMode = maConfigItem.ReadInt32( "PDFViewSelection", 0 ); + + mbConvertOOoTargets = maConfigItem.ReadBool( "ConvertOOoTargetToPDFTarget", false ); + mbExportBmkToPDFDestination = maConfigItem.ReadBool( "ExportBookmarksToPDFDestination", false ); + + // prepare values for digital signatures + mbSignPDF = maConfigItem.ReadBool( "SignPDF", false ); + + // queue the tab pages for later creation (created when first shown) + AddTabPage("general", ImpPDFTabGeneralPage::Create, nullptr ); + AddTabPage("digitalsignatures", ImpPDFTabSigningPage::Create, nullptr); + AddTabPage("security", ImpPDFTabSecurityPage::Create, nullptr); + AddTabPage("links", ImpPDFTabLinksPage::Create, nullptr); + AddTabPage("userinterface", ImpPDFTabViewerPage::Create, nullptr); + AddTabPage("initialview", ImpPDFTabOpnFtrPage::Create, nullptr); + + SetCurPageId("general"); + + // get the string property value (from sfx2/source/dialog/mailmodel.cxx) to overwrite the text for the Ok button + OUString sOkButtonText = maConfigItem.ReadString( "_OkButtonString", OUString() ); + + // change text on the Ok button: get the relevant string from resources, update it on the button + // according to the exported pdf file destination: send as e-mail or write to file? + if (!sOkButtonText.isEmpty()) + GetOKButton().set_label(sOkButtonText); + + GetCancelButton().connect_clicked(LINK(this, ImpPDFTabDialog, CancelHdl)); + GetOKButton().connect_clicked(LINK(this, ImpPDFTabDialog, OkHdl)); + + // remove the reset button, not needed in this tabbed dialog + RemoveResetButton(); +} + +ImpPDFTabSecurityPage* ImpPDFTabDialog::getSecurityPage() const +{ + SfxTabPage* pSecurityPage = GetTabPage("security"); + if (pSecurityPage) + { + return static_cast<ImpPDFTabSecurityPage*>(pSecurityPage); + } + return nullptr; +} + + +ImpPDFTabLinksPage* ImpPDFTabDialog::getLinksPage() const +{ + SfxTabPage* pLinksPage = GetTabPage("links"); + if (pLinksPage) + { + return static_cast<ImpPDFTabLinksPage*>(pLinksPage); + } + return nullptr; +} + + +ImpPDFTabGeneralPage* ImpPDFTabDialog::getGeneralPage() const +{ + SfxTabPage* pGeneralPage = GetTabPage("general"); + if (pGeneralPage) + { + return static_cast<ImpPDFTabGeneralPage*>(pGeneralPage); + } + return nullptr; +} + +IMPL_LINK_NOARG(ImpPDFTabDialog, CancelHdl, weld::Button&, void) +{ + m_xDialog->response(RET_CANCEL); +} + +IMPL_LINK_NOARG(ImpPDFTabDialog, OkHdl, weld::Button&, void) +{ + if (getGeneralPage()->IsPdfUaSelected()) + { + SfxObjectShell* pShell = SfxObjectShell::GetShellFromComponent(mrDoc); + if (pShell) + { + sfx::AccessibilityIssueCollection aCollection = pShell->runAccessibilityCheck(); + if (!aCollection.getIssues().empty()) + { + mpAccessibilityCheckDialog = std::make_shared<svx::AccessibilityCheckDialog>(mpParent, aCollection); + weld::DialogController::runAsync(mpAccessibilityCheckDialog, [this](sal_Int32 retValue){ + m_xDialog->response(retValue); + }); + } + else + { + m_xDialog->response(RET_OK); + } + } + else + { + m_xDialog->response(RET_OK); + } + } + else + { + m_xDialog->response(RET_OK); + } +} + +ImpPDFTabDialog::~ImpPDFTabDialog() +{ + maConfigItem.WriteModifiedConfig(); + maConfigI18N.WriteModifiedConfig(); + if (mpAccessibilityCheckDialog) + { + mpAccessibilityCheckDialog->response(RET_CANCEL); + } +} + +void ImpPDFTabDialog::PageCreated(const OString& rId, SfxTabPage& rPage) +{ + if (rId == "general") + static_cast<ImpPDFTabGeneralPage&>(rPage).SetFilterConfigItem(this); + else if (rId == "userinterface") + { + static_cast<ImpPDFTabViewerPage&>(rPage).SetFilterConfigItem(this); + } + else if (rId == "initialview") + { + static_cast<ImpPDFTabOpnFtrPage&>(rPage).SetFilterConfigItem(this); + } + else if (rId == "links") + { + static_cast<ImpPDFTabLinksPage&>(rPage).SetFilterConfigItem(this); + } + else if (rId == "security") + { + static_cast<ImpPDFTabSecurityPage&>(rPage).SetFilterConfigItem(this); + } + else if (rId == "digitalsignatures") + { + static_cast<ImpPDFTabSigningPage&>(rPage).SetFilterConfigItem(this); + } +} + + +Sequence< PropertyValue > ImpPDFTabDialog::GetFilterData() +{ + // updating the FilterData sequence and storing FilterData to configuration + if (ImpPDFTabGeneralPage* pPage = static_cast<ImpPDFTabGeneralPage*>(GetTabPage("general"))) + pPage->GetFilterConfigItem(this); + if (ImpPDFTabViewerPage* pPage = static_cast<ImpPDFTabViewerPage*>(GetTabPage("userinterface"))) + pPage->GetFilterConfigItem(this); + if (ImpPDFTabOpnFtrPage* pPage = static_cast<ImpPDFTabOpnFtrPage*>(GetTabPage("initialview"))) + pPage->GetFilterConfigItem(this); + if (ImpPDFTabLinksPage* pPage = static_cast<ImpPDFTabLinksPage*>(GetTabPage("links"))) + pPage->GetFilterConfigItem(this); + if (ImpPDFTabSecurityPage* pPage = static_cast<ImpPDFTabSecurityPage*>( GetTabPage("security"))) + pPage->GetFilterConfigItem(this); + if (ImpPDFTabSigningPage* pPage = static_cast<ImpPDFTabSigningPage*>(GetTabPage("digitalsignatures"))) + pPage->GetFilterConfigItem(this); + + // prepare the items to be returned + maConfigItem.WriteBool( "UseLosslessCompression", mbUseLosslessCompression ); + maConfigItem.WriteInt32("Quality", mnQuality ); + maConfigItem.WriteBool( "ReduceImageResolution", mbReduceImageResolution ); + maConfigItem.WriteInt32("MaxImageResolution", mnMaxImageResolution ); + + // always write the user selection, never the overridden value + const bool bIsPDFUA = mbPDFUACompliance; + const bool bIsPDFA = (1 == mnPDFTypeSelection) || (2 == mnPDFTypeSelection) || (3 == mnPDFTypeSelection); + const bool bUserSelectionTags = bIsPDFA || bIsPDFUA; + maConfigItem.WriteBool("UseTaggedPDF", bUserSelectionTags ? mbUseTaggedPDFUserSelection : mbUseTaggedPDF); + maConfigItem.WriteInt32("SelectPdfVersion", mnPDFTypeSelection ); + maConfigItem.WriteBool("PDFUACompliance", mbPDFUACompliance); + + if ( mbIsPresentation ) + { + maConfigItem.WriteBool( "ExportNotesPages", mbExportNotesPages ); + maConfigItem.WriteBool( "ExportOnlyNotesPages", mbExportOnlyNotesPages ); + } + maConfigItem.WriteBool( "ExportNotes", mbExportNotes ); + maConfigItem.WriteBool( "ViewPDFAfterExport", mbViewPDF ); + + maConfigItem.WriteBool( "ExportBookmarks", mbExportBookmarks ); + if ( mbIsPresentation ) + maConfigItem.WriteBool( "ExportHiddenSlides", mbExportHiddenSlides ); + if ( mbIsSpreadsheet ) + maConfigItem.WriteBool( "SinglePageSheets", mbSinglePageSheets ); + maConfigItem.WriteBool( "UseTransitionEffects", mbUseTransitionEffects ); + maConfigItem.WriteBool( "IsSkipEmptyPages", mbIsSkipEmptyPages ); + maConfigItem.WriteBool( "ExportPlaceholders", mbIsExportPlaceholders ); + maConfigItem.WriteBool( "IsAddStream", mbAddStream ); + + /* + * FIXME: the entries are only implicitly defined by the resource file. Should there + * ever be an additional form submit format this could get invalid. + */ + maConfigItem.WriteInt32( "FormsType", mnFormsType ); + maConfigItem.WriteBool( "ExportFormFields", mbExportFormFields ); + maConfigItem.WriteBool( "AllowDuplicateFieldNames", mbAllowDuplicateFieldNames ); + + maConfigItem.WriteBool( "HideViewerToolbar", mbHideViewerToolbar ); + maConfigItem.WriteBool( "HideViewerMenubar", mbHideViewerMenubar ); + maConfigItem.WriteBool( "HideViewerWindowControls", mbHideViewerWindowControls ); + maConfigItem.WriteBool( "ResizeWindowToInitialPage", mbResizeWinToInit ); + maConfigItem.WriteBool( "CenterWindow", mbCenterWindow ); + maConfigItem.WriteBool( "OpenInFullScreenMode", mbOpenInFullScreenMode ); + maConfigItem.WriteBool( "DisplayPDFDocumentTitle", mbDisplayPDFDocumentTitle ); + maConfigItem.WriteInt32( "InitialView", mnInitialView ); + maConfigItem.WriteInt32( "Magnification", mnMagnification); + maConfigItem.WriteInt32( "Zoom", mnZoom ); + maConfigItem.WriteInt32( "InitialPage", mnInitialPage ); + maConfigItem.WriteInt32( "PageLayout", mnPageLayout ); + maConfigItem.WriteBool( "FirstPageOnLeft", mbFirstPageLeft ); + maConfigItem.WriteInt32( "OpenBookmarkLevels", mnOpenBookmarkLevels ); + + maConfigItem.WriteBool( "ExportLinksRelativeFsys", mbExportRelativeFsysLinks ); + maConfigItem.WriteInt32("PDFViewSelection", mnViewPDFMode ); + maConfigItem.WriteBool( "ConvertOOoTargetToPDFTarget", mbConvertOOoTargets ); + maConfigItem.WriteBool( "ExportBookmarksToPDFDestination", mbExportBmkToPDFDestination ); + + maConfigItem.WriteBool( "SignPDF", mbSignPDF ); + + maConfigItem.WriteInt32( "Printing", mnPrint ); + maConfigItem.WriteInt32( "Changes", mnChangesAllowed ); + maConfigItem.WriteBool( "EnableCopyingOfContent", mbCanCopyOrExtract ); + maConfigItem.WriteBool( "EnableTextAccessForAccessibilityTools", mbCanExtractForAccessibility ); + + std::vector<beans::PropertyValue> aRet + { + comphelper::makePropertyValue("Watermark", maWatermarkText), + comphelper::makePropertyValue("EncryptFile", mbEncrypt), + comphelper::makePropertyValue("PreparedPasswords", mxPreparedPasswords), + comphelper::makePropertyValue("RestrictPermissions", mbRestrictPermissions), + comphelper::makePropertyValue("PreparedPermissionPassword", maPreparedOwnerPassword) + }; + if( mbIsRangeChecked ) + aRet.push_back(comphelper::makePropertyValue("PageRange", msPageRange)); + else if( mbSelectionIsChecked ) + aRet.push_back(comphelper::makePropertyValue("Selection", maSelection)); + + aRet.push_back(comphelper::makePropertyValue("SignatureLocation", msSignLocation)); + aRet.push_back(comphelper::makePropertyValue("SignatureReason", msSignReason)); + aRet.push_back(comphelper::makePropertyValue("SignatureContactInfo", msSignContact)); + aRet.push_back(comphelper::makePropertyValue("SignaturePassword", msSignPassword)); + aRet.push_back(comphelper::makePropertyValue("SignatureCertificate", maSignCertificate)); + aRet.push_back(comphelper::makePropertyValue("SignatureTSA", msSignTSA)); + aRet.push_back(comphelper::makePropertyValue("UseReferenceXObject", mbUseReferenceXObject)); + + return comphelper::concatSequences(maConfigItem.GetFilterData(), comphelper::containerToSequence(aRet)); +} + + +ImpPDFTabGeneralPage::ImpPDFTabGeneralPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet) + : SfxTabPage(pPage, pController, "filter/ui/pdfgeneralpage.ui", "PdfGeneralPage", &rCoreSet) + , mbUseTaggedPDFUserSelection(false) + , mbIsPresentation(false) + , mbIsSpreadsheet(false) + , mbIsWriter(false) + , mpParent(nullptr) + , mxRbAll(m_xBuilder->weld_radio_button("all")) + , mxRbRange(m_xBuilder->weld_radio_button("range")) + , mxRbSelection(m_xBuilder->weld_radio_button("selection")) + , mxEdPages(m_xBuilder->weld_entry("pages")) + , mxSelectedSheets(m_xBuilder->weld_label("selectedsheets")) + , mxRbLosslessCompression(m_xBuilder->weld_radio_button("losslesscompress")) + , mxRbJPEGCompression(m_xBuilder->weld_radio_button("jpegcompress")) + , mxQualityFrame(m_xBuilder->weld_widget("qualityframe")) + , mxNfQuality(m_xBuilder->weld_metric_spin_button("quality", FieldUnit::PERCENT)) + , mxCbReduceImageResolution(m_xBuilder->weld_check_button("reduceresolution")) + , mxCoReduceImageResolution(m_xBuilder->weld_combo_box("resolution")) + , mxCbPDFA(m_xBuilder->weld_check_button("pdfa")) + , mxCbPDFUA(m_xBuilder->weld_check_button("pdfua")) + , mxRbPDFAVersion(m_xBuilder->weld_combo_box("pdfaversion")) + , mxCbTaggedPDF(m_xBuilder->weld_check_button("tagged")) + , mxCbExportFormFields(m_xBuilder->weld_check_button("forms")) + , mxFormsFrame(m_xBuilder->weld_widget("formsframe")) + , mxLbFormsFormat(m_xBuilder->weld_combo_box("format")) + , mxCbAllowDuplicateFieldNames(m_xBuilder->weld_check_button("allowdups")) + , mxCbExportBookmarks(m_xBuilder->weld_check_button("bookmarks")) + , mxCbExportHiddenSlides(m_xBuilder->weld_check_button("hiddenpages")) + , mxCbSinglePageSheets(m_xBuilder->weld_check_button("singlepagesheets")) + , mxCbExportNotes(m_xBuilder->weld_check_button("comments")) + , mxCbViewPDF(m_xBuilder->weld_check_button("viewpdf")) + , mxCbUseReferenceXObject(m_xBuilder->weld_check_button("usereferencexobject")) + , mxCbExportNotesPages(m_xBuilder->weld_check_button("notes")) + , mxCbExportOnlyNotesPages(m_xBuilder->weld_check_button("onlynotes")) + , mxCbExportEmptyPages(m_xBuilder->weld_check_button("emptypages")) + , mxCbExportPlaceholders(m_xBuilder->weld_check_button("exportplaceholders")) + , mxCbAddStream(m_xBuilder->weld_check_button("embed")) + , mxCbWatermark(m_xBuilder->weld_check_button("watermark")) + , mxFtWatermark(m_xBuilder->weld_label("watermarklabel")) + , mxEdWatermark(m_xBuilder->weld_entry("watermarkentry")) + , mxSlidesFt(m_xBuilder->weld_label("slides")) + , mxSheetsFt(m_xBuilder->weld_label("selectedsheets")) +{ +} + +ImpPDFTabGeneralPage::~ImpPDFTabGeneralPage() +{ +} + +void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) +{ + mpParent = pParent; + + // init this class data + mxRbRange->connect_toggled( LINK( this, ImpPDFTabGeneralPage, TogglePagesHdl ) ); + + mxRbAll->set_active(true); + mxRbAll->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleAllHdl ) ); + TogglePagesHdl(); + + const bool bSelectionPresent = pParent->mbSelectionPresent; + mxRbSelection->set_sensitive( bSelectionPresent ); + if ( bSelectionPresent ) + mxRbSelection->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleSelectionHdl ) ); + mbIsPresentation = pParent->mbIsPresentation; + mbIsWriter = pParent->mbIsWriter; + mbIsSpreadsheet = pParent->mbIsSpreadsheet; + + mxCbExportEmptyPages->set_sensitive( mbIsWriter ); + mxCbExportPlaceholders->set_sensitive( mbIsWriter ); + + mxRbLosslessCompression->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleCompressionHdl ) ); + const bool bUseLosslessCompression = pParent->mbUseLosslessCompression; + if ( bUseLosslessCompression ) + mxRbLosslessCompression->set_active(true); + else + mxRbJPEGCompression->set_active(true); + + mxNfQuality->set_value( pParent->mnQuality, FieldUnit::PERCENT ); + mxQualityFrame->set_sensitive(!bUseLosslessCompression); + + mxCbReduceImageResolution->connect_toggled(LINK(this, ImpPDFTabGeneralPage, ToggleReduceImageResolutionHdl)); + const bool bReduceImageResolution = pParent->mbReduceImageResolution; + mxCbReduceImageResolution->set_active( bReduceImageResolution ); + OUString aStrRes = OUString::number( pParent->mnMaxImageResolution ) + " DPI"; + mxCoReduceImageResolution->set_entry_text(aStrRes); + mxCoReduceImageResolution->set_sensitive( bReduceImageResolution ); + mxCbWatermark->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleWatermarkHdl ) ); + mxFtWatermark->set_sensitive(false ); + mxEdWatermark->set_sensitive( false ); + mxCbPDFA->connect_toggled(LINK(this, ImpPDFTabGeneralPage, TogglePDFVersionOrUniversalAccessibilityHandle)); + + const bool bIsPDFA = (pParent->mnPDFTypeSelection>=1) && (pParent->mnPDFTypeSelection <= 3); + mxCbPDFA->set_active(bIsPDFA); + switch( pParent->mnPDFTypeSelection ) + { + case 1: // PDF/A-1 + mxRbPDFAVersion->set_active_id("1"); + break; + case 2: // PDF/A-2 + mxRbPDFAVersion->set_active_id("2"); + break; + case 3: // PDF/A-3 + default: // PDF 1.x + mxRbPDFAVersion->set_active_id("3"); + break; + } + + const bool bIsPDFUA = pParent->mbPDFUACompliance; + mxCbPDFUA->set_active(bIsPDFUA); + mxCbPDFUA->connect_toggled(LINK(this, ImpPDFTabGeneralPage, TogglePDFVersionOrUniversalAccessibilityHandle)); + + // the TogglePDFVersionOrUniversalAccessibilityHandle handler will read or write the *UserSelection based + // on the mxCbPDFA (= bIsPDFA) state, so we have to prepare the correct input state. + if (bIsPDFA || bIsPDFUA) + mxCbTaggedPDF->set_active(pParent->mbUseTaggedPDFUserSelection); + else + mbUseTaggedPDFUserSelection = pParent->mbUseTaggedPDFUserSelection; + TogglePDFVersionOrUniversalAccessibilityHandle(*mxCbPDFA); + + mxCbExportFormFields->set_active(pParent->mbExportFormFields); + mxCbExportFormFields->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleExportFormFieldsHdl ) ); + + mxLbFormsFormat->set_active(static_cast<sal_uInt16>(pParent->mnFormsType)); + mxCbAllowDuplicateFieldNames->set_active( pParent->mbAllowDuplicateFieldNames ); + mxFormsFrame->set_sensitive(pParent->mbExportFormFields); + + mxCbExportBookmarks->set_active( pParent->mbExportBookmarks ); + + mxCbExportNotes->set_active( pParent->mbExportNotes ); + mxCbViewPDF->set_active( pParent->mbViewPDF); + + if ( mbIsPresentation ) + { + mxRbRange->set_label(mxSlidesFt->get_label()); + mxCbExportNotesPages->show(); + mxCbExportNotesPages->set_active(pParent->mbExportNotesPages); + mxCbExportNotesPages->connect_toggled( LINK(this, ImpPDFTabGeneralPage, ToggleExportNotesPagesHdl ) ); + 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()); + mxCbExportHiddenSlides->show(); + mxCbExportHiddenSlides->set_active(pParent->mbExportHiddenSlides); + } + else + { + mxCbExportNotesPages->hide(); + mxCbExportNotesPages->set_active(false); + mxCbExportOnlyNotesPages->hide(); + mxCbExportOnlyNotesPages->set_active(false); + mxCbExportHiddenSlides->hide(); + mxCbExportHiddenSlides->set_active(false); + } + + if( mbIsSpreadsheet ) + { + mxRbSelection->set_label(mxSheetsFt->get_label()); + // tdf#105965 Make Selection/Selected sheets the default PDF export range setting for spreadsheets + mxRbSelection->set_active(true); + + mxCbSinglePageSheets->show(); + mxCbSinglePageSheets->set_active(pParent->mbSinglePageSheets); + } + else + { + mxCbSinglePageSheets->hide(); + mxCbSinglePageSheets->set_active(false); + } + + mxCbExportPlaceholders->set_visible(mbIsWriter); + if( mbIsWriter ) + { + // tdf#54908 Make selection active if there is a selection in Writer's version + mxRbSelection->set_active( bSelectionPresent ); + } + else + { + mxCbExportPlaceholders->set_active(false); + } + mxCbExportEmptyPages->set_active(!pParent->mbIsSkipEmptyPages); + mxCbExportPlaceholders->set_active(pParent->mbIsExportPlaceholders); + + mxCbAddStream->show(); + mxCbAddStream->set_active(pParent->mbAddStream); + + mxCbAddStream->connect_toggled(LINK(this, ImpPDFTabGeneralPage, ToggleAddStreamHdl)); + ToggleAddStreamHdl(*mxCbAddStream); // init addstream dependencies +} + +void ImpPDFTabGeneralPage::GetFilterConfigItem( ImpPDFTabDialog* pParent ) +{ + // updating the FilterData sequence and storing FilterData to configuration + pParent->mbUseLosslessCompression = mxRbLosslessCompression->get_active(); + pParent->mnQuality = static_cast<sal_Int32>(mxNfQuality->get_value(FieldUnit::PERCENT)); + pParent->mbReduceImageResolution = mxCbReduceImageResolution->get_active(); + pParent->mnMaxImageResolution = mxCoReduceImageResolution->get_active_text().toInt32(); + pParent->mbExportNotes = mxCbExportNotes->get_active(); + pParent->mbViewPDF = mxCbViewPDF->get_active(); + pParent->mbUseReferenceXObject = mxCbUseReferenceXObject->get_active(); + if ( mbIsPresentation ) + { + pParent->mbExportNotesPages = mxCbExportNotesPages->get_active(); + pParent->mbExportOnlyNotesPages = mxCbExportOnlyNotesPages->get_active(); + } + pParent->mbExportBookmarks = mxCbExportBookmarks->get_active(); + if ( mbIsPresentation ) + pParent->mbExportHiddenSlides = mxCbExportHiddenSlides->get_active(); + + if (mbIsSpreadsheet) + pParent->mbSinglePageSheets = mxCbSinglePageSheets->get_active(); + + pParent->mbIsSkipEmptyPages = !mxCbExportEmptyPages->get_active(); + pParent->mbIsExportPlaceholders = mxCbExportPlaceholders->get_active(); + pParent->mbAddStream = mxCbAddStream->get_visible() && mxCbAddStream->get_active(); + + pParent->mbIsRangeChecked = false; + if( mxRbRange->get_active() ) + { + pParent->mbIsRangeChecked = true; + pParent->msPageRange = mxEdPages->get_text(); //FIXME all right on other languages ? + } + else if( mxRbSelection->get_active() ) + { + pParent->mbSelectionIsChecked = mxRbSelection->get_active(); + } + + pParent->mnPDFTypeSelection = 0; + pParent->mbUseTaggedPDF = mxCbTaggedPDF->get_active(); + + const bool bIsPDFA = mxCbPDFA->get_active(); + const bool bIsPDFUA = mxCbPDFUA->get_active(); + + if (bIsPDFA) + { + pParent->mnPDFTypeSelection = 3; + OUString currentPDFAMode = mxRbPDFAVersion->get_active_id(); + if( currentPDFAMode == "1" ) + pParent->mnPDFTypeSelection = 1; + else if(currentPDFAMode == "2") + pParent->mnPDFTypeSelection = 2; + } + + pParent->mbPDFUACompliance = bIsPDFUA; + + if (!bIsPDFA && !bIsPDFUA) + mbUseTaggedPDFUserSelection = pParent->mbUseTaggedPDF; + + pParent->mbUseTaggedPDFUserSelection = mbUseTaggedPDFUserSelection; + pParent->mbExportFormFields = mxCbExportFormFields->get_active(); + + if( mxCbWatermark->get_active() ) + pParent->maWatermarkText = mxEdWatermark->get_text(); + + /* + * FIXME: the entries are only implicitly defined by the resource file. Should there + * ever be an additional form submit format this could get invalid. + */ + pParent->mnFormsType = mxLbFormsFormat->get_active(); + pParent->mbAllowDuplicateFieldNames = mxCbAllowDuplicateFieldNames->get_active(); +} + +std::unique_ptr<SfxTabPage> ImpPDFTabGeneralPage::Create( weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet* rAttrSet) +{ + return std::make_unique<ImpPDFTabGeneralPage>(pPage, pController, *rAttrSet); +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleAllHdl, weld::Toggleable&, void) +{ + EnableExportNotesPages(); +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, TogglePagesHdl, weld::Toggleable&, void) +{ + TogglePagesHdl(); + EnableExportNotesPages(); +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleSelectionHdl, weld::Toggleable&, void) +{ + EnableExportNotesPages(); +} + +void ImpPDFTabGeneralPage::TogglePagesHdl() +{ + mxEdPages->set_sensitive( mxRbRange->get_active() ); + if (mxRbRange->get_active()) + mxEdPages->grab_focus(); +} + +void ImpPDFTabGeneralPage::EnableExportNotesPages() +{ + if ( mbIsPresentation ) + { + mxCbExportNotesPages->set_sensitive( !mxRbSelection->get_active() ); + mxCbExportOnlyNotesPages->set_sensitive( !mxRbSelection->get_active() && mxCbExportNotesPages->get_active() ); + } +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleExportFormFieldsHdl, weld::Toggleable&, void) +{ + mxFormsFrame->set_sensitive(mxCbExportFormFields->get_active()); +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleExportNotesPagesHdl, weld::Toggleable&, void) +{ + mxCbExportOnlyNotesPages->set_sensitive(mxCbExportNotesPages->get_active()); +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleCompressionHdl, weld::Toggleable&, void) +{ + mxQualityFrame->set_sensitive(mxRbJPEGCompression->get_active()); +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleReduceImageResolutionHdl, weld::Toggleable&, void) +{ + mxCoReduceImageResolution->set_sensitive(mxCbReduceImageResolution->get_active()); +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleWatermarkHdl, weld::Toggleable&, void) +{ + mxEdWatermark->set_sensitive(mxCbWatermark->get_active()); + mxFtWatermark->set_sensitive(mxCbWatermark->get_active()); + if (mxCbWatermark->get_active()) + mxEdWatermark->grab_focus(); +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleAddStreamHdl, weld::Toggleable&, void) +{ + if (!mxCbAddStream->get_visible()) + return; + + if( mxCbAddStream->get_active() ) + { + mxRbAll->set_active(true); + mxRbRange->set_sensitive( false ); + mxRbSelection->set_sensitive( false ); + mxEdPages->set_sensitive( false ); + mxRbAll->set_sensitive( false ); + } + else + { + mxRbAll->set_sensitive(true); + mxRbRange->set_sensitive(true); + mxRbSelection->set_sensitive(true); + } +} + +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, TogglePDFVersionOrUniversalAccessibilityHandle, weld::Toggleable&, void) +{ + const bool bIsPDFA = mxCbPDFA->get_active(); + const bool bIsPDFUA = mxCbPDFUA->get_active(); + + // set the security page status (and its controls as well) + ImpPDFTabSecurityPage* pSecPage = mpParent ? mpParent->getSecurityPage() : nullptr; + if (pSecPage) + pSecPage->ImplPDFASecurityControl(!bIsPDFA); + + mxCbTaggedPDF->set_sensitive(!bIsPDFA && !bIsPDFUA); + mxRbPDFAVersion->set_sensitive(bIsPDFA); + + if (bIsPDFA || bIsPDFUA) + { + // store the users selection of subordinate controls and set required PDF/A values + mbUseTaggedPDFUserSelection = mxCbTaggedPDF->get_active(); + mxCbTaggedPDF->set_active(true); + + // if a password was set, inform the user that this will not be used + if (pSecPage && pSecPage->hasPassword()) + { + std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(m_xContainer.get(), + VclMessageType::Warning, VclButtonsType::Ok, + PDFFilterResId(STR_WARN_PASSWORD_PDFA))); + xBox->run(); + } + } + else + { + // restore the users values of subordinate controls + mxCbTaggedPDF->set_active(mbUseTaggedPDFUserSelection); + } + + // PDF/A doesn't allow launch action, so enable/disable the selection on the Link page + ImpPDFTabLinksPage* pLinksPage = mpParent ? mpParent->getLinksPage() : nullptr; + if (pLinksPage) + pLinksPage->ImplPDFALinkControl(!bIsPDFA); +} + +/// The option features tab page +ImpPDFTabOpnFtrPage::ImpPDFTabOpnFtrPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet) + : SfxTabPage(pPage, pController, "filter/ui/pdfviewpage.ui", "PdfViewPage", &rCoreSet) + , mbUseCTLFont(false) + , mxRbOpnPageOnly(m_xBuilder->weld_radio_button("pageonly")) + , mxRbOpnOutline(m_xBuilder->weld_radio_button("outline")) + , mxRbOpnThumbs(m_xBuilder->weld_radio_button("thumbs")) + , mxNumInitialPage(m_xBuilder->weld_spin_button("page")) + , mxRbMagnDefault(m_xBuilder->weld_radio_button("fitdefault")) + , mxRbMagnFitWin(m_xBuilder->weld_radio_button("fitwin")) + , mxRbMagnFitWidth(m_xBuilder->weld_radio_button("fitwidth")) + , mxRbMagnFitVisible(m_xBuilder->weld_radio_button("fitvis")) + , mxRbMagnZoom(m_xBuilder->weld_radio_button("fitzoom")) + , mxNumZoom(m_xBuilder->weld_spin_button("zoom")) + , mxRbPgLyDefault(m_xBuilder->weld_radio_button("defaultlayout")) + , mxRbPgLySinglePage(m_xBuilder->weld_radio_button("singlelayout")) + , mxRbPgLyContinue(m_xBuilder->weld_radio_button("contlayout")) + , mxRbPgLyContinueFacing(m_xBuilder->weld_radio_button("contfacinglayout")) + , mxCbPgLyFirstOnLeft(m_xBuilder->weld_check_button("firstonleft")) +{ + mxRbMagnDefault->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) ); + mxRbMagnFitWin->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) ); + mxRbMagnFitWidth->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) ); + mxRbMagnFitVisible->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) ); + mxRbMagnZoom->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) ); +} + +ImpPDFTabOpnFtrPage::~ImpPDFTabOpnFtrPage() +{ +} + +std::unique_ptr<SfxTabPage> ImpPDFTabOpnFtrPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rAttrSet) +{ + return std::make_unique<ImpPDFTabOpnFtrPage>(pPage, pController, *rAttrSet); +} + +void ImpPDFTabOpnFtrPage::GetFilterConfigItem( ImpPDFTabDialog* pParent ) +{ + pParent->mnInitialView = 0; + if( mxRbOpnOutline->get_active() ) + pParent->mnInitialView = 1; + else if( mxRbOpnThumbs->get_active() ) + pParent->mnInitialView = 2; + + pParent->mnMagnification = 0; + if( mxRbMagnFitWin->get_active() ) + pParent->mnMagnification = 1; + else if( mxRbMagnFitWidth->get_active() ) + pParent->mnMagnification = 2; + else if( mxRbMagnFitVisible->get_active() ) + pParent->mnMagnification = 3; + else if( mxRbMagnZoom->get_active() ) + { + pParent->mnMagnification = 4; + pParent->mnZoom = mxNumZoom->get_value(); + } + + pParent->mnInitialPage = mxNumInitialPage->get_value(); + + pParent->mnPageLayout = 0; + if( mxRbPgLySinglePage->get_active() ) + pParent->mnPageLayout = 1; + else if( mxRbPgLyContinue->get_active() ) + pParent->mnPageLayout = 2; + else if( mxRbPgLyContinueFacing->get_active() ) + pParent->mnPageLayout = 3; + + pParent->mbFirstPageLeft = mbUseCTLFont && mxCbPgLyFirstOnLeft->get_active(); +} + +void ImpPDFTabOpnFtrPage::SetFilterConfigItem( const ImpPDFTabDialog* pParent ) +{ + mbUseCTLFont = pParent->mbUseCTLFont; + switch( pParent->mnPageLayout ) + { + default: + case 0: + mxRbPgLyDefault->set_active(true); + break; + case 1: + mxRbPgLySinglePage->set_active(true); + break; + case 2: + mxRbPgLyContinue->set_active(true); + break; + case 3: + mxRbPgLyContinueFacing->set_active(true); + break; + } + + switch( pParent->mnInitialView ) + { + default: + case 0: + mxRbOpnPageOnly->set_active(true); + break; + case 1: + mxRbOpnOutline->set_active(true); + break; + case 2: + mxRbOpnThumbs->set_active(true); + break; + } + + switch( pParent->mnMagnification ) + { + default: + case 0: + mxRbMagnDefault->set_active(true); + mxNumZoom->set_sensitive(false); + break; + case 1: + mxRbMagnFitWin->set_active(true); + mxNumZoom->set_sensitive(false); + break; + case 2: + mxRbMagnFitWidth->set_active(true); + mxNumZoom->set_sensitive(false); + break; + case 3: + mxRbMagnFitVisible->set_active(true); + mxNumZoom->set_sensitive(false); + break; + case 4: + mxRbMagnZoom->set_active(true); + mxNumZoom->set_sensitive(true); + break; + } + + mxNumZoom->set_value(pParent->mnZoom); + mxNumInitialPage->set_value(pParent->mnInitialPage); + + if (!mbUseCTLFont) + mxCbPgLyFirstOnLeft->hide(); + else + { + mxRbPgLyContinueFacing->connect_toggled(LINK(this, ImpPDFTabOpnFtrPage, ToggleRbPgLyContinueFacingHdl)); + mxCbPgLyFirstOnLeft->set_active(pParent->mbFirstPageLeft); + ToggleRbPgLyContinueFacingHdl(); + } +} + +IMPL_LINK_NOARG(ImpPDFTabOpnFtrPage, ToggleRbPgLyContinueFacingHdl, weld::Toggleable&, void) +{ + ToggleRbPgLyContinueFacingHdl(); +} + +void ImpPDFTabOpnFtrPage::ToggleRbPgLyContinueFacingHdl() +{ + mxCbPgLyFirstOnLeft->set_sensitive(mxRbPgLyContinueFacing->get_active()); +} + +IMPL_LINK_NOARG( ImpPDFTabOpnFtrPage, ToggleRbMagnHdl, weld::Toggleable&, void ) +{ + mxNumZoom->set_sensitive(mxRbMagnZoom->get_active()); +} + +/// The Viewer preferences tab page +ImpPDFTabViewerPage::ImpPDFTabViewerPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet ) + : SfxTabPage(pPage, pController, "filter/ui/pdfuserinterfacepage.ui", "PdfUserInterfacePage", &rCoreSet) + , mbIsPresentation(false) + , m_xCbResWinInit(m_xBuilder->weld_check_button("resize")) + , m_xCbCenterWindow(m_xBuilder->weld_check_button("center")) + , m_xCbOpenFullScreen(m_xBuilder->weld_check_button("open")) + , m_xCbDispDocTitle(m_xBuilder->weld_check_button("display")) + , m_xCbHideViewerMenubar(m_xBuilder->weld_check_button("menubar")) + , m_xCbHideViewerToolbar(m_xBuilder->weld_check_button("toolbar")) + , m_xCbHideViewerWindowControls(m_xBuilder->weld_check_button("window")) + , m_xCbTransitionEffects(m_xBuilder->weld_check_button("effects")) + , m_xRbAllBookmarkLevels(m_xBuilder->weld_radio_button("allbookmarks")) + , m_xRbVisibleBookmarkLevels(m_xBuilder->weld_radio_button("visiblebookmark")) + , m_xNumBookmarkLevels(m_xBuilder->weld_spin_button("visiblelevel")) +{ + m_xRbAllBookmarkLevels->connect_toggled(LINK(this, ImpPDFTabViewerPage, ToggleRbBookmarksHdl)); + m_xRbVisibleBookmarkLevels->connect_toggled(LINK(this, ImpPDFTabViewerPage, ToggleRbBookmarksHdl)); +} + +ImpPDFTabViewerPage::~ImpPDFTabViewerPage() +{ +} + +IMPL_LINK_NOARG( ImpPDFTabViewerPage, ToggleRbBookmarksHdl, weld::Toggleable&, void ) +{ + m_xNumBookmarkLevels->set_sensitive(m_xRbVisibleBookmarkLevels->get_active()); +} + +std::unique_ptr<SfxTabPage> ImpPDFTabViewerPage::Create( weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet* rAttrSet) +{ + return std::make_unique<ImpPDFTabViewerPage>(pPage, pController, *rAttrSet); +} + +void ImpPDFTabViewerPage::GetFilterConfigItem( ImpPDFTabDialog* pParent ) +{ + pParent->mbHideViewerMenubar = m_xCbHideViewerMenubar->get_active(); + pParent->mbHideViewerToolbar = m_xCbHideViewerToolbar->get_active(); + pParent->mbHideViewerWindowControls = m_xCbHideViewerWindowControls->get_active(); + pParent->mbResizeWinToInit = m_xCbResWinInit->get_active(); + pParent->mbOpenInFullScreenMode = m_xCbOpenFullScreen->get_active(); + pParent->mbCenterWindow = m_xCbCenterWindow->get_active(); + pParent->mbDisplayPDFDocumentTitle = m_xCbDispDocTitle->get_active(); + pParent->mbUseTransitionEffects = m_xCbTransitionEffects->get_active(); + pParent->mnOpenBookmarkLevels = m_xRbAllBookmarkLevels->get_active() ? + -1 : static_cast<sal_Int32>(m_xNumBookmarkLevels->get_value()); +} + +void ImpPDFTabViewerPage::SetFilterConfigItem( const ImpPDFTabDialog* pParent ) +{ + m_xCbHideViewerMenubar->set_active( pParent->mbHideViewerMenubar ); + m_xCbHideViewerToolbar->set_active( pParent->mbHideViewerToolbar ); + m_xCbHideViewerWindowControls->set_active( pParent->mbHideViewerWindowControls ); + + m_xCbResWinInit->set_active( pParent->mbResizeWinToInit ); + m_xCbOpenFullScreen->set_active( pParent->mbOpenInFullScreenMode ); + m_xCbCenterWindow->set_active( pParent->mbCenterWindow ); + m_xCbDispDocTitle->set_active( pParent->mbDisplayPDFDocumentTitle ); + mbIsPresentation = pParent->mbIsPresentation; + m_xCbTransitionEffects->set_active( pParent->mbUseTransitionEffects ); + m_xCbTransitionEffects->set_sensitive( mbIsPresentation ); + if( pParent->mnOpenBookmarkLevels < 0 ) + { + m_xRbAllBookmarkLevels->set_active(true); + m_xNumBookmarkLevels->set_sensitive( false ); + } + else + { + m_xRbVisibleBookmarkLevels->set_active(true); + m_xNumBookmarkLevels->set_sensitive(true); + m_xNumBookmarkLevels->set_value(pParent->mnOpenBookmarkLevels); + } +} + +/// The Security preferences tab page +ImpPDFTabSecurityPage::ImpPDFTabSecurityPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& i_rCoreSet) + : SfxTabPage(pPage, pController, "filter/ui/pdfsecuritypage.ui", "PdfSecurityPage", &i_rCoreSet) + , msUserPwdTitle( PDFFilterResId( STR_PDF_EXPORT_UDPWD ) ) + , mbHaveOwnerPassword( false ) + , mbHaveUserPassword( false ) + , msOwnerPwdTitle( PDFFilterResId( STR_PDF_EXPORT_ODPWD ) ) + , mxPbSetPwd(m_xBuilder->weld_button("setpassword")) + , mxUserPwdSet(m_xBuilder->weld_widget("userpwdset")) + , mxUserPwdUnset(m_xBuilder->weld_widget("userpwdunset")) + , mxUserPwdPdfa(m_xBuilder->weld_widget("userpwdpdfa")) + , mxOwnerPwdSet(m_xBuilder->weld_widget("ownerpwdset")) + , mxOwnerPwdUnset(m_xBuilder->weld_widget("ownerpwdunset")) + , mxOwnerPwdPdfa(m_xBuilder->weld_widget("ownerpwdpdfa")) + , mxPrintPermissions(m_xBuilder->weld_widget("printing")) + , mxRbPrintNone(m_xBuilder->weld_radio_button("printnone")) + , mxRbPrintLowRes(m_xBuilder->weld_radio_button("printlow")) + , mxRbPrintHighRes(m_xBuilder->weld_radio_button("printhigh")) + , mxChangesAllowed(m_xBuilder->weld_widget("changes")) + , mxRbChangesNone(m_xBuilder->weld_radio_button("changenone")) + , mxRbChangesInsDel(m_xBuilder->weld_radio_button("changeinsdel")) + , mxRbChangesFillForm(m_xBuilder->weld_radio_button("changeform")) + , mxRbChangesComment(m_xBuilder->weld_radio_button("changecomment")) + , mxRbChangesAnyNoCopy(m_xBuilder->weld_radio_button("changeany")) + , mxContent(m_xBuilder->weld_widget("content")) + , mxCbEnableCopy(m_xBuilder->weld_check_button("enablecopy")) + , mxCbEnableAccessibility(m_xBuilder->weld_check_button("enablea11y")) + , mxPasswordTitle(m_xBuilder->weld_label("setpasswordstitle")) +{ + msStrSetPwd = mxPasswordTitle->get_label(); + mxPbSetPwd->connect_clicked(LINK(this, ImpPDFTabSecurityPage, ClickmaPbSetPwdHdl)); +} + +ImpPDFTabSecurityPage::~ImpPDFTabSecurityPage() +{ +} + +std::unique_ptr<SfxTabPage> ImpPDFTabSecurityPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rAttrSet) +{ + return std::make_unique<ImpPDFTabSecurityPage>(pPage, pController, *rAttrSet); +} + +void ImpPDFTabSecurityPage::GetFilterConfigItem( ImpPDFTabDialog* pParent ) +{ + // please note that in PDF/A-1a mode even if this are copied back, + // the security settings are forced disabled in PDFExport::Export + pParent->mbEncrypt = mbHaveUserPassword; + pParent->mxPreparedPasswords = mxPreparedPasswords; + + pParent->mbRestrictPermissions = mbHaveOwnerPassword; + pParent->maPreparedOwnerPassword = maPreparedOwnerPassword; + + // verify print status + pParent->mnPrint = 0; + if (mxRbPrintLowRes->get_active()) + pParent->mnPrint = 1; + else if (mxRbPrintHighRes->get_active()) + pParent->mnPrint = 2; + + // verify changes permitted + pParent->mnChangesAllowed = 0; + + if( mxRbChangesInsDel->get_active() ) + pParent->mnChangesAllowed = 1; + else if( mxRbChangesFillForm->get_active() ) + pParent->mnChangesAllowed = 2; + else if( mxRbChangesComment->get_active() ) + pParent->mnChangesAllowed = 3; + else if( mxRbChangesAnyNoCopy->get_active() ) + pParent->mnChangesAllowed = 4; + + pParent->mbCanCopyOrExtract = mxCbEnableCopy->get_active(); + pParent->mbCanExtractForAccessibility = mxCbEnableAccessibility->get_active(); +} + +void ImpPDFTabSecurityPage::SetFilterConfigItem( const ImpPDFTabDialog* pParent ) +{ + switch( pParent->mnPrint ) + { + default: + case 0: + mxRbPrintNone->set_active(true); + break; + case 1: + mxRbPrintLowRes->set_active(true); + break; + case 2: + mxRbPrintHighRes->set_active(true); + break; + } + + switch( pParent->mnChangesAllowed ) + { + default: + case 0: + mxRbChangesNone->set_active(true); + break; + case 1: + mxRbChangesInsDel->set_active(true); + break; + case 2: + mxRbChangesFillForm->set_active(true); + break; + case 3: + mxRbChangesComment->set_active(true); + break; + case 4: + mxRbChangesAnyNoCopy->set_active(true); + break; + } + + mxCbEnableCopy->set_active(pParent->mbCanCopyOrExtract); + mxCbEnableAccessibility->set_active(pParent->mbCanExtractForAccessibility); + + // set the status of this windows, according to the PDFA selection + enablePermissionControls(); + + ImpPDFTabGeneralPage* pGeneralPage = pParent->getGeneralPage(); + + if (pGeneralPage) + ImplPDFASecurityControl(!pGeneralPage->IsPdfaSelected()); +} + +IMPL_LINK_NOARG(ImpPDFTabSecurityPage, ClickmaPbSetPwdHdl, weld::Button&, void) +{ + SfxPasswordDialog aPwdDialog(m_xContainer.get(), &msUserPwdTitle); + aPwdDialog.SetMinLen(0); + aPwdDialog.ShowMinLengthText(false); + aPwdDialog.ShowExtras( SfxShowExtras::CONFIRM | SfxShowExtras::PASSWORD2 | SfxShowExtras::CONFIRM2 ); + aPwdDialog.set_title(msStrSetPwd); + aPwdDialog.SetGroup2Text(msOwnerPwdTitle); + aPwdDialog.AllowAsciiOnly(); + if (aPwdDialog.run() == RET_OK) // OK issued get password and set it + { + OUString aUserPW(aPwdDialog.GetPassword()); + OUString aOwnerPW(aPwdDialog.GetPassword2()); + + mbHaveUserPassword = !aUserPW.isEmpty(); + mbHaveOwnerPassword = !aOwnerPW.isEmpty(); + + mxPreparedPasswords = vcl::PDFWriter::InitEncryption( aOwnerPW, aUserPW ); + if (!mxPreparedPasswords.is()) { + OUString msg; + ErrorHandler::GetErrorString(ERRCODE_IO_NOTSUPPORTED, msg); //TODO: handle failure + std::unique_ptr<weld::MessageDialog>( + Application::CreateMessageDialog( + GetFrameWeld(), VclMessageType::Error, VclButtonsType::Ok, msg)) + ->run(); + return; + } + + if( mbHaveOwnerPassword ) + { + maPreparedOwnerPassword = comphelper::OStorageHelper::CreatePackageEncryptionData( aOwnerPW ); + } + else + maPreparedOwnerPassword = Sequence< NamedValue >(); + } + enablePermissionControls(); +} + +void ImpPDFTabSecurityPage::enablePermissionControls() +{ + bool bIsPDFASel = false; + ImpPDFTabDialog* pParent = static_cast<ImpPDFTabDialog*>(GetDialogController()); + ImpPDFTabGeneralPage* pGeneralPage = pParent ? pParent->getGeneralPage() : nullptr; + if (pGeneralPage) + { + bIsPDFASel = pGeneralPage->IsPdfaSelected(); + } + if (bIsPDFASel) + { + mxUserPwdPdfa->show(); + mxUserPwdSet->hide(); + mxUserPwdUnset->hide(); + } + else + { + if (mbHaveUserPassword && m_xContainer->get_sensitive()) + { + mxUserPwdSet->show(); + mxUserPwdUnset->hide(); + mxUserPwdPdfa->hide(); + } + else + { + mxUserPwdUnset->show(); + mxUserPwdSet->hide(); + mxUserPwdPdfa->hide(); + } + } + + bool bLocalEnable = mbHaveOwnerPassword && m_xContainer->get_sensitive(); + if (bIsPDFASel) + { + mxOwnerPwdPdfa->show(); + mxOwnerPwdSet->hide(); + mxOwnerPwdUnset->hide(); + } + else + { + if (bLocalEnable) + { + mxOwnerPwdSet->show(); + mxOwnerPwdUnset->hide(); + mxOwnerPwdPdfa->hide(); + } + else + { + mxOwnerPwdUnset->show(); + mxOwnerPwdSet->hide(); + mxOwnerPwdPdfa->hide(); + } + } + + mxPrintPermissions->set_sensitive(bLocalEnable); + mxChangesAllowed->set_sensitive(bLocalEnable); + mxContent->set_sensitive(bLocalEnable); +} + +// This tab page is under control of the PDF/A-1a checkbox: +// TODO: implement a method to do it. +void ImpPDFTabSecurityPage::ImplPDFASecurityControl( bool bEnableSecurity ) +{ + m_xContainer->set_sensitive(bEnableSecurity); + // after enable, check the status of control as if the dialog was initialized + enablePermissionControls(); +} + +/// The link preferences tab page (relative and other stuff) +ImpPDFTabLinksPage::ImpPDFTabLinksPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet) + : SfxTabPage(pPage, pController, "filter/ui/pdflinkspage.ui", "PdfLinksPage", &rCoreSet) + , mbOpnLnksDefaultUserState(false) + , mbOpnLnksLaunchUserState(false) + , mbOpnLnksBrowserUserState(false) + , m_xCbExprtBmkrToNmDst(m_xBuilder->weld_check_button("export")) + , m_xCbOOoToPDFTargets(m_xBuilder->weld_check_button("convert")) + , m_xCbExportRelativeFsysLinks(m_xBuilder->weld_check_button("exporturl")) + , m_xRbOpnLnksDefault(m_xBuilder->weld_radio_button("default")) + , m_xRbOpnLnksLaunch(m_xBuilder->weld_radio_button("openpdf")) + , m_xRbOpnLnksBrowser(m_xBuilder->weld_radio_button("openinternet")) +{ +} + +ImpPDFTabLinksPage::~ImpPDFTabLinksPage() +{ +} + +std::unique_ptr<SfxTabPage> ImpPDFTabLinksPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rAttrSet) +{ + return std::make_unique<ImpPDFTabLinksPage>(pPage, pController, *rAttrSet); +} + +void ImpPDFTabLinksPage::GetFilterConfigItem( ImpPDFTabDialog* pParent ) +{ + pParent->mbExportRelativeFsysLinks = m_xCbExportRelativeFsysLinks->get_active(); + + bool bIsPDFASel = false; + ImpPDFTabGeneralPage* pGeneralPage = pParent->getGeneralPage(); + if (pGeneralPage) + bIsPDFASel = pGeneralPage->IsPdfaSelected(); + // if PDF/A-1 was not selected while exiting dialog... + if( !bIsPDFASel ) + { + // ...get the control states + mbOpnLnksDefaultUserState = m_xRbOpnLnksDefault->get_active(); + mbOpnLnksLaunchUserState = m_xRbOpnLnksLaunch->get_active(); + mbOpnLnksBrowserUserState = m_xRbOpnLnksBrowser->get_active(); + } + // the control states, or the saved is used + // to form the stored selection + pParent->mnViewPDFMode = 0; + if( mbOpnLnksBrowserUserState ) + pParent->mnViewPDFMode = 2; + else if( mbOpnLnksLaunchUserState ) + pParent->mnViewPDFMode = 1; + + pParent->mbConvertOOoTargets = m_xCbOOoToPDFTargets->get_active(); + pParent->mbExportBmkToPDFDestination = m_xCbExprtBmkrToNmDst->get_active(); +} + +void ImpPDFTabLinksPage::SetFilterConfigItem( const ImpPDFTabDialog* pParent ) +{ + m_xCbOOoToPDFTargets->set_active(pParent->mbConvertOOoTargets); + m_xCbExprtBmkrToNmDst->set_active(pParent->mbExportBmkToPDFDestination); + + m_xRbOpnLnksDefault->connect_toggled(LINK(this, ImpPDFTabLinksPage, ClickRbOpnLnksDefaultHdl)); + m_xRbOpnLnksBrowser->connect_toggled(LINK(this, ImpPDFTabLinksPage, ClickRbOpnLnksBrowserHdl)); + + m_xCbExportRelativeFsysLinks->set_active(pParent->mbExportRelativeFsysLinks); + switch( pParent->mnViewPDFMode ) + { + default: + case 0: + m_xRbOpnLnksDefault->set_active(true); + mbOpnLnksDefaultUserState = true; + break; + case 1: + m_xRbOpnLnksLaunch->set_active(true); + mbOpnLnksLaunchUserState = true; + break; + case 2: + m_xRbOpnLnksBrowser->set_active(true); + mbOpnLnksBrowserUserState = true; + break; + } + + // now check the status of PDF/A selection + // and set the link action accordingly + // PDF/A-2 doesn't allow launch action on links + + ImpPDFTabGeneralPage* pGeneralPage = pParent->getGeneralPage(); + if (pGeneralPage) + ImplPDFALinkControl(!pGeneralPage->mxCbPDFA->get_active()); +} + + +/** Called from general tab, with PDFA/1 selection status. + Retrieves/store the status of Launch action selection. + */ +void ImpPDFTabLinksPage::ImplPDFALinkControl( bool bEnableLaunch ) +{ + // set the value and position of link type selection + if( bEnableLaunch ) + { + m_xRbOpnLnksLaunch->set_sensitive(true); + // restore user state with no PDF/A-1 selected + m_xRbOpnLnksDefault->set_active(mbOpnLnksDefaultUserState); + m_xRbOpnLnksLaunch->set_active(mbOpnLnksLaunchUserState); + m_xRbOpnLnksBrowser->set_active(mbOpnLnksBrowserUserState); + } + else + { + // save user state with no PDF/A-1 selected + mbOpnLnksDefaultUserState = m_xRbOpnLnksDefault->get_active(); + mbOpnLnksLaunchUserState = m_xRbOpnLnksLaunch->get_active(); + mbOpnLnksBrowserUserState = m_xRbOpnLnksBrowser->get_active(); + m_xRbOpnLnksLaunch->set_sensitive(false); + if (mbOpnLnksLaunchUserState) + m_xRbOpnLnksBrowser->set_active(true); + } +} + +/// Reset the memory of Launch action present when PDF/A-1 was requested +IMPL_LINK_NOARG(ImpPDFTabLinksPage, ClickRbOpnLnksDefaultHdl, weld::Toggleable&, void) +{ + mbOpnLnksDefaultUserState = m_xRbOpnLnksDefault->get_active(); + mbOpnLnksLaunchUserState = m_xRbOpnLnksLaunch->get_active(); + mbOpnLnksBrowserUserState = m_xRbOpnLnksBrowser->get_active(); +} + +/// Reset the memory of a launch action present when PDF/A-1 was requested +IMPL_LINK_NOARG(ImpPDFTabLinksPage, ClickRbOpnLnksBrowserHdl, weld::Toggleable&, void) +{ + mbOpnLnksDefaultUserState = m_xRbOpnLnksDefault->get_active(); + mbOpnLnksLaunchUserState = m_xRbOpnLnksLaunch->get_active(); + mbOpnLnksBrowserUserState = m_xRbOpnLnksBrowser->get_active(); +} + +ImplErrorDialog::ImplErrorDialog(weld::Window* pParent, const std::set<vcl::PDFWriter::ErrorCode>& rErrors) + : MessageDialogController(pParent, "filter/ui/warnpdfdialog.ui", "WarnPDFDialog", "grid") + , m_xErrors(m_xBuilder->weld_tree_view("errors")) + , m_xExplanation(m_xBuilder->weld_label("message")) +{ + int nWidth = m_xErrors->get_approximate_digit_width() * 26; + int nHeight = m_xErrors->get_height_rows(9); + m_xErrors->set_size_request(nWidth, nHeight); + m_xExplanation->set_size_request(nWidth, nHeight); + + for (auto const& error : rErrors) + { + switch(error) + { + case vcl::PDFWriter::Warning_Transparency_Omitted_PDFA: + m_xErrors->append(PDFFilterResId(STR_WARN_TRANSP_PDFA), PDFFilterResId(STR_WARN_TRANSP_PDFA_SHORT), "dialog-warning"); + break; + case vcl::PDFWriter::Warning_Transparency_Omitted_PDF13: + m_xErrors->append(PDFFilterResId(STR_WARN_TRANSP_VERSION), PDFFilterResId(STR_WARN_TRANSP_VERSION_SHORT), "dialog-warning"); + break; + case vcl::PDFWriter::Warning_FormAction_Omitted_PDFA: + m_xErrors->append(PDFFilterResId(STR_WARN_FORMACTION_PDFA), PDFFilterResId(STR_WARN_FORMACTION_PDFA_SHORT), "dialog-warning"); + break; + case vcl::PDFWriter::Warning_Transparency_Converted: + m_xErrors->append(PDFFilterResId(STR_WARN_TRANSP_CONVERTED), PDFFilterResId(STR_WARN_TRANSP_CONVERTED_SHORT), "dialog-warning"); + break; + case vcl::PDFWriter::Error_Signature_Failed: + m_xErrors->append(PDFFilterResId(STR_ERR_PDF_EXPORT_ABORTED), PDFFilterResId(STR_ERR_SIGNATURE_FAILED), "dialog-error"); + break; + default: + break; + } + } + + if (m_xErrors->n_children() > 0) + { + m_xErrors->select(0); + m_xExplanation->set_label(m_xErrors->get_id(0)); + } + + m_xErrors->connect_changed(LINK(this, ImplErrorDialog, SelectHdl)); +} + +IMPL_LINK_NOARG(ImplErrorDialog, SelectHdl, weld::TreeView&, void) +{ + OUString aExplanation = m_xErrors->get_selected_id(); + m_xExplanation->set_label(aExplanation); +} + +/// The digital signatures tab page +ImpPDFTabSigningPage::ImpPDFTabSigningPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet) + : SfxTabPage(pPage, pController, "filter/ui/pdfsignpage.ui", "PdfSignPage", &rCoreSet) + , mxEdSignCert(m_xBuilder->weld_entry("cert")) + , mxPbSignCertSelect(m_xBuilder->weld_button("select")) + , mxPbSignCertClear(m_xBuilder->weld_button("clear")) + , mxEdSignPassword(m_xBuilder->weld_entry("password")) + , mxEdSignLocation(m_xBuilder->weld_entry("location")) + , mxEdSignContactInfo(m_xBuilder->weld_entry("contact")) + , mxEdSignReason(m_xBuilder->weld_entry("reason")) + , mxLBSignTSA(m_xBuilder->weld_combo_box("tsa")) +{ + mxPbSignCertSelect->set_sensitive(true); + mxPbSignCertSelect->connect_clicked(LINK(this, ImpPDFTabSigningPage, ClickmaPbSignCertSelect)); + mxPbSignCertClear->connect_clicked(LINK(this, ImpPDFTabSigningPage, ClickmaPbSignCertClear)); +} + +ImpPDFTabSigningPage::~ImpPDFTabSigningPage() +{ +} + +IMPL_LINK_NOARG(ImpPDFTabSigningPage, ClickmaPbSignCertSelect, weld::Button&, void) +{ + Reference< security::XDocumentDigitalSignatures > xSigner( + security::DocumentDigitalSignatures::createDefault( + comphelper::getProcessComponentContext())); + xSigner->setParentWindow(GetFrameWeld()->GetXWindow()); + + // The use may provide a description while choosing a certificate. + OUString aDescription; + maSignCertificate = xSigner->selectSigningCertificateWithType( + security::CertificateKind::CertificateKind_X509, aDescription); + + if (!maSignCertificate.is()) + return; + + mxEdSignCert->set_text(maSignCertificate->getSubjectName()); + mxPbSignCertClear->set_sensitive(true); + mxEdSignLocation->set_sensitive(true); + mxEdSignPassword->set_sensitive(true); + mxEdSignContactInfo->set_sensitive(true); + mxEdSignReason->set_sensitive(true); + mxEdSignReason->set_text(aDescription); + + try + { + std::optional<css::uno::Sequence<OUString>> aTSAURLs(officecfg::Office::Common::Security::Scripting::TSAURLs::get()); + if (aTSAURLs) + { + const css::uno::Sequence<OUString>& rTSAURLs = *aTSAURLs; + for (auto const& elem : rTSAURLs) + { + mxLBSignTSA->append_text(elem); + } + } + } + catch (const uno::Exception &) + { + TOOLS_INFO_EXCEPTION("filter.pdf", "TSAURLsDialog::TSAURLsDialog()"); + } + + // If more than only the "None" entry is there, enable the ListBox + if (mxLBSignTSA->get_count() > 1) + mxLBSignTSA->set_sensitive(true); +} + +IMPL_LINK_NOARG(ImpPDFTabSigningPage, ClickmaPbSignCertClear, weld::Button&, void) +{ + mxEdSignCert->set_text(""); + maSignCertificate.clear(); + mxPbSignCertClear->set_sensitive(false); + mxEdSignLocation->set_sensitive(false); + mxEdSignPassword->set_sensitive(false); + mxEdSignContactInfo->set_sensitive(false); + mxEdSignReason->set_sensitive(false); + mxLBSignTSA->set_sensitive(false); +} + +std::unique_ptr<SfxTabPage> ImpPDFTabSigningPage::Create( weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet* rAttrSet) +{ + return std::make_unique<ImpPDFTabSigningPage>(pPage, pController, *rAttrSet); +} + +void ImpPDFTabSigningPage::GetFilterConfigItem( ImpPDFTabDialog* pParent ) +{ + pParent->mbSignPDF = maSignCertificate.is(); + pParent->maSignCertificate = maSignCertificate; + pParent->msSignLocation = mxEdSignLocation->get_text(); + pParent->msSignPassword = mxEdSignPassword->get_text(); + pParent->msSignContact = mxEdSignContactInfo->get_text(); + pParent->msSignReason = mxEdSignReason->get_text(); + // Entry 0 is 'None' + if (mxLBSignTSA->get_active() >= 1) + pParent->msSignTSA = mxLBSignTSA->get_active_text(); +} + +void ImpPDFTabSigningPage::SetFilterConfigItem( const ImpPDFTabDialog* pParent ) +{ + mxEdSignLocation->set_sensitive(false); + mxEdSignPassword->set_sensitive(false); + mxEdSignContactInfo->set_sensitive(false); + mxEdSignReason->set_sensitive(false); + mxLBSignTSA->set_sensitive(false); + mxPbSignCertClear->set_sensitive(false); + + if (pParent->mbSignPDF) + { + mxEdSignPassword->set_text(pParent->msSignPassword); + mxEdSignLocation->set_text(pParent->msSignLocation); + mxEdSignContactInfo->set_text(pParent->msSignContact); + mxEdSignReason->set_text(pParent->msSignReason); + maSignCertificate = pParent->maSignCertificate; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |