1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <string.h>
21 
22 #include "impdialog.hxx"
23 #include <strings.hrc>
24 #include <officecfg/Office/Common.hxx>
25 #include <vcl/errinf.hxx>
26 #include <vcl/settings.hxx>
27 #include <vcl/svapp.hxx>
28 #include <vcl/weld.hxx>
29 #include <sfx2/passwd.hxx>
30 #include <svtools/miscopt.hxx>
31 #include <unotools/resmgr.hxx>
32 #include <sal/log.hxx>
33 #include <tools/diagnose_ex.h>
34 
35 #include <comphelper/propertyvalue.hxx>
36 #include <comphelper/sequence.hxx>
37 #include <comphelper/storagehelper.hxx>
38 
39 #include <com/sun/star/text/XTextRange.hpp>
40 #include <com/sun/star/drawing/XShapes.hpp>
41 #include <com/sun/star/container/XIndexAccess.hpp>
42 #include <com/sun/star/frame/XController.hpp>
43 #include <com/sun/star/view/XSelectionSupplier.hpp>
44 #include <com/sun/star/security/DocumentDigitalSignatures.hpp>
45 #include <com/sun/star/security/XCertificate.hpp>
46 #include <com/sun/star/beans/XMaterialHolder.hpp>
47 
PDFFilterResId(const char * pId)48 static OUString PDFFilterResId(const char* pId)
49 {
50     return Translate::get(pId, Translate::Create("flt"));
51 }
52 
53 using namespace ::com::sun::star;
54 using namespace ::com::sun::star::uno;
55 
56 /** Tabbed PDF dialog implementation
57     Please note: the default used here are the same as per specification,
58     They should be the same in  PDFFilter::implExport and  in PDFExport::PDFExport
59  */
ImpPDFTabDialog(weld::Window * pParent,Sequence<PropertyValue> & rFilterData,const Reference<XComponent> & rxDoc)60 ImpPDFTabDialog::ImpPDFTabDialog(weld::Window* pParent, Sequence< PropertyValue >& rFilterData,
61     const Reference< XComponent >& rxDoc)
62     : SfxTabDialogController(pParent, "filter/ui/pdfoptionsdialog.ui", "PdfOptionsDialog"),
63     maConfigItem( "Office.Common/Filter/PDF/Export/", &rFilterData ),
64     maConfigI18N( "Office.Common/I18N/CTL/" ),
65     mbIsPresentation( false ),
66     mbIsSpreadsheet( false ),
67     mbIsWriter( false ),
68 
69     mbSelectionPresent( false ),
70     mbUseCTLFont( false ),
71     mbUseLosslessCompression( true ),
72     mnQuality( 90 ),
73     mbReduceImageResolution( false ),
74     mnMaxImageResolution( 300 ),
75     mbUseTaggedPDF( false ),
76     mbUseTaggedPDFUserSelection( false ),
77     mbExportNotes( true ),
78     mbViewPDF( false ),
79     mbUseReferenceXObject( false ),
80     mbExportNotesPages( false ),
81     mbExportOnlyNotesPages( false ),
82     mbUseTransitionEffects( false ),
83     mbIsSkipEmptyPages( true ),
84     mbIsExportPlaceholders( false ),
85     mbAddStream( false ),
86     mnFormsType( 0 ),
87     mbExportFormFields( true ),
88     mbAllowDuplicateFieldNames( false ),
89     mbExportBookmarks( true ),
90     mbExportHiddenSlides ( false ),
91     mbSinglePageSheets ( false ),
92     mnOpenBookmarkLevels( -1 ),
93 
94     mbHideViewerToolbar( false ),
95     mbHideViewerMenubar( false ),
96     mbHideViewerWindowControls( false ),
97     mbResizeWinToInit( false ),
98     mbCenterWindow( false ),
99     mbOpenInFullScreenMode( false ),
100     mbDisplayPDFDocumentTitle( false ),
101     mnMagnification( 0 ),
102     mnInitialView( 0 ),
103     mnZoom( 0 ),
104     mnInitialPage( 1 ),
105     mnPageLayout( 0 ),
106     mbFirstPageLeft( false ),
107 
108     mbEncrypt( false ),
109     mbRestrictPermissions( false ),
110     mnPrint( 0 ),
111     mnChangesAllowed( 0 ),
112     mbCanCopyOrExtract( false ),
113     mbCanExtractForAccessibility( true ),
114 
115     mbIsRangeChecked( false ),
116     msPageRange( ' ' ),
117 
118     mbSelectionIsChecked( false ),
119     mbExportRelativeFsysLinks( false ),
120     mnViewPDFMode( 0 ),
121     mbConvertOOoTargets( false ),
122     mbExportBmkToPDFDestination( false ),
123 
124     mbSignPDF( false )
125 {
126     // check for selection
127     try
128     {
129         Reference< frame::XController > xController( Reference< frame::XModel >( rxDoc, UNO_QUERY_THROW )->getCurrentController() );
130         if( xController.is() )
131         {
132             Reference< view::XSelectionSupplier > xView( xController, UNO_QUERY );
133             if( xView.is() )
134                 maSelection = xView->getSelection();
135         }
136     }
137     catch(const RuntimeException &)
138     {
139     }
140     mbSelectionPresent = maSelection.hasValue();
141     if ( mbSelectionPresent )
142     {
143         Reference< drawing::XShapes > xShapes;
144         if ( !( maSelection >>= xShapes ) ) // XShapes is always a selection
145         {
146             // even if nothing is selected in writer the selection is not empty
147             Reference< container::XIndexAccess > xIndexAccess;
148             if ( maSelection >>= xIndexAccess )
149             {
150                 sal_Int32 nLen = xIndexAccess->getCount();
151                 if ( !nLen )
152                     mbSelectionPresent = false;
153                 else if ( nLen == 1 )
154                 {
155                     Reference< text::XTextRange > xTextRange( xIndexAccess->getByIndex( 0 ), UNO_QUERY );
156                     if ( xTextRange.is() && ( xTextRange->getString().isEmpty() ) )
157                         mbSelectionPresent = false;
158                 }
159             }
160         }
161     }
162 
163     // check if source document is a presentation or a spreadsheet or a textdocument
164     try
165     {
166         Reference< XServiceInfo > xInfo( rxDoc, UNO_QUERY );
167         if ( xInfo.is() )
168         {
169             if ( xInfo->supportsService( "com.sun.star.presentation.PresentationDocument" ) )
170                 mbIsPresentation = true;
171             if ( xInfo->supportsService( "com.sun.star.sheet.SpreadsheetDocument" ) )
172                 mbIsSpreadsheet = true;
173             if ( xInfo->supportsService( "com.sun.star.text.GenericTextDocument" ) )
174                 mbIsWriter = true;
175         }
176     }
177     catch(const RuntimeException &)
178     {
179     }
180 
181     // get the CTL (Complex Text Layout) from general options, returns sal_True if we have a CTL font on our hands.
182     mbUseCTLFont = maConfigI18N.ReadBool( "CTLFont", false );
183 
184     mbUseLosslessCompression = maConfigItem.ReadBool( "UseLosslessCompression", false );
185     mnQuality = maConfigItem.ReadInt32( "Quality", 90 );
186     mbReduceImageResolution = maConfigItem.ReadBool( "ReduceImageResolution", false );
187     mnMaxImageResolution = maConfigItem.ReadInt32( "MaxImageResolution", 300 );
188 
189     // this is always the user selection, independent from the PDF/A forced selection
190     mbUseTaggedPDF = maConfigItem.ReadBool( "UseTaggedPDF", false );
191     mbUseTaggedPDFUserSelection = mbUseTaggedPDF;
192 
193     mnPDFTypeSelection =  maConfigItem.ReadInt32( "SelectPdfVersion", 0 );
194     if ( mbIsPresentation )
195     {
196         mbExportNotesPages = maConfigItem.ReadBool( "ExportNotesPages", false );
197         mbExportOnlyNotesPages = maConfigItem.ReadBool( "ExportOnlyNotesPages", false );
198     }
199     mbExportNotes = maConfigItem.ReadBool( "ExportNotes", false );
200     mbViewPDF = maConfigItem.ReadBool( "ViewPDFAfterExport", false );
201 
202     mbExportBookmarks = maConfigItem.ReadBool( "ExportBookmarks", true );
203     if ( mbIsPresentation )
204         mbExportHiddenSlides = maConfigItem.ReadBool( "ExportHiddenSlides", false );
205     if ( mbIsSpreadsheet )
206         mbSinglePageSheets = maConfigItem.ReadBool( "SinglePageSheets", false );
207     mnOpenBookmarkLevels = maConfigItem.ReadInt32( "OpenBookmarkLevels", -1 );
208     mbUseTransitionEffects = maConfigItem.ReadBool( "UseTransitionEffects", true );
209     mbIsSkipEmptyPages = maConfigItem.ReadBool( "IsSkipEmptyPages", false );
210     mbIsExportPlaceholders = maConfigItem.ReadBool( "ExportPlaceholders", false );
211     mbAddStream = maConfigItem.ReadBool( "IsAddStream", false );
212 
213     mbExportFormFields = maConfigItem.ReadBool( "ExportFormFields", true );
214     mnFormsType = maConfigItem.ReadInt32( "FormsType", 0 );
215     if ( ( mnFormsType < 0 ) || ( mnFormsType > 3 ) )
216         mnFormsType = 0;
217     mbAllowDuplicateFieldNames = maConfigItem.ReadBool( "AllowDuplicateFieldNames", false );
218 
219     // prepare values for the Viewer tab page
220     mbHideViewerToolbar = maConfigItem.ReadBool( "HideViewerToolbar", false );
221     mbHideViewerMenubar = maConfigItem.ReadBool( "HideViewerMenubar", false );
222     mbHideViewerWindowControls = maConfigItem.ReadBool( "HideViewerWindowControls", false );
223     mbResizeWinToInit = maConfigItem.ReadBool( "ResizeWindowToInitialPage", false );
224     mbCenterWindow = maConfigItem.ReadBool( "CenterWindow", false );
225     mbOpenInFullScreenMode = maConfigItem.ReadBool( "OpenInFullScreenMode", false );
226     mbDisplayPDFDocumentTitle = maConfigItem.ReadBool( "DisplayPDFDocumentTitle", true );
227 
228     mnInitialView = maConfigItem.ReadInt32( "InitialView", 0 );
229     mnMagnification = maConfigItem.ReadInt32( "Magnification", 0 );
230     mnZoom = maConfigItem.ReadInt32( "Zoom", 100 );
231     mnPageLayout = maConfigItem.ReadInt32( "PageLayout", 0 );
232     mbFirstPageLeft = maConfigItem.ReadBool( "FirstPageOnLeft", false );
233     mnInitialPage = maConfigItem.ReadInt32( "InitialPage", 1 );
234     if( mnInitialPage < 1 )
235         mnInitialPage = 1;
236 
237     // prepare values for the security tab page
238     mnPrint = maConfigItem.ReadInt32( "Printing", 2 );
239     mnChangesAllowed = maConfigItem.ReadInt32( "Changes", 4 );
240     mbCanCopyOrExtract = maConfigItem.ReadBool( "EnableCopyingOfContent", true );
241     mbCanExtractForAccessibility = maConfigItem.ReadBool( "EnableTextAccessForAccessibilityTools", true );
242 
243     // prepare values for relative links
244     mbExportRelativeFsysLinks = maConfigItem.ReadBool( "ExportLinksRelativeFsys", false );
245 
246     mnViewPDFMode = maConfigItem.ReadInt32( "PDFViewSelection", 0 );
247 
248     mbConvertOOoTargets = maConfigItem.ReadBool( "ConvertOOoTargetToPDFTarget", false );
249     mbExportBmkToPDFDestination = maConfigItem.ReadBool( "ExportBookmarksToPDFDestination", false );
250 
251     // prepare values for digital signatures
252     mbSignPDF = maConfigItem.ReadBool( "SignPDF", false );
253 
254     // queue the tab pages for later creation (created when first shown)
255     AddTabPage("general", ImpPDFTabGeneralPage::Create, nullptr );
256     AddTabPage("digitalsignatures", ImpPDFTabSigningPage::Create, nullptr);
257     AddTabPage("security", ImpPDFTabSecurityPage::Create, nullptr);
258     AddTabPage("links", ImpPDFTabLinksPage::Create, nullptr);
259     AddTabPage("userinterface", ImpPDFTabViewerPage::Create, nullptr);
260     AddTabPage("initialview", ImpPDFTabOpnFtrPage::Create, nullptr);
261 
262     SetCurPageId("general");
263 
264     // get the string property value (from sfx2/source/dialog/mailmodel.cxx) to overwrite the text for the Ok button
265     OUString sOkButtonText = maConfigItem.ReadString( "_OkButtonString", OUString() );
266 
267     // change text on the Ok button: get the relevant string from resources, update it on the button
268     // according to the exported pdf file destination: send as e-mail or write to file?
269     if (!sOkButtonText.isEmpty())
270         GetOKButton().set_label(sOkButtonText);
271 
272     GetCancelButton().connect_clicked(LINK(this, ImpPDFTabDialog, CancelHdl));
273 
274     // remove the reset button, not needed in this tabbed dialog
275     RemoveResetButton();
276 }
277 
getSecurityPage() const278 ImpPDFTabSecurityPage* ImpPDFTabDialog::getSecurityPage() const
279 {
280     SfxTabPage* pSecurityPage = GetTabPage("security");
281     if (pSecurityPage)
282     {
283         return static_cast<ImpPDFTabSecurityPage*>(pSecurityPage);
284     }
285     return nullptr;
286 }
287 
288 
getLinksPage() const289 ImpPDFTabLinksPage* ImpPDFTabDialog::getLinksPage() const
290 {
291     SfxTabPage* pLinksPage = GetTabPage("links");
292     if (pLinksPage)
293     {
294         return static_cast<ImpPDFTabLinksPage*>(pLinksPage);
295     }
296     return nullptr;
297 }
298 
299 
getGeneralPage() const300 ImpPDFTabGeneralPage* ImpPDFTabDialog::getGeneralPage() const
301 {
302     SfxTabPage* pGeneralPage = GetTabPage("general");
303     if (pGeneralPage)
304     {
305         return static_cast<ImpPDFTabGeneralPage*>(pGeneralPage);
306     }
307     return nullptr;
308 }
309 
IMPL_LINK_NOARG(ImpPDFTabDialog,CancelHdl,weld::Button &,void)310 IMPL_LINK_NOARG(ImpPDFTabDialog, CancelHdl, weld::Button&, void)
311 {
312     m_xDialog->response(RET_CANCEL);
313 }
314 
~ImpPDFTabDialog()315 ImpPDFTabDialog::~ImpPDFTabDialog()
316 {
317     maConfigItem.WriteModifiedConfig();
318     maConfigI18N.WriteModifiedConfig();
319 }
320 
PageCreated(const OString & rId,SfxTabPage & rPage)321 void ImpPDFTabDialog::PageCreated(const OString& rId, SfxTabPage& rPage)
322 {
323     if (rId == "general")
324         static_cast<ImpPDFTabGeneralPage&>(rPage).SetFilterConfigItem(this);
325     else if (rId == "userinterface")
326     {
327         static_cast<ImpPDFTabViewerPage&>(rPage).SetFilterConfigItem(this);
328     }
329     else if (rId == "initialview")
330     {
331         static_cast<ImpPDFTabOpnFtrPage&>(rPage).SetFilterConfigItem(this);
332     }
333     else if (rId == "links")
334     {
335         static_cast<ImpPDFTabLinksPage&>(rPage).SetFilterConfigItem(this);
336     }
337     else if (rId == "security")
338     {
339         static_cast<ImpPDFTabSecurityPage&>(rPage).SetFilterConfigItem(this);
340     }
341     else if (rId == "digitalsignatures")
342     {
343         static_cast<ImpPDFTabSigningPage&>(rPage).SetFilterConfigItem(this);
344     }
345 }
346 
Ok()347 short ImpPDFTabDialog::Ok( )
348 {
349     // here the whole mechanism of the base class is not used
350     // when Ok is hit, the user means 'convert to PDF', so simply close with ok
351     return RET_OK;
352 }
353 
GetFilterData()354 Sequence< PropertyValue > ImpPDFTabDialog::GetFilterData()
355 {
356     // updating the FilterData sequence and storing FilterData to configuration
357     if (ImpPDFTabGeneralPage* pPage = static_cast<ImpPDFTabGeneralPage*>(GetTabPage("general")))
358         pPage->GetFilterConfigItem(this);
359     if (ImpPDFTabViewerPage* pPage = static_cast<ImpPDFTabViewerPage*>(GetTabPage("userinterface")))
360         pPage->GetFilterConfigItem(this);
361     if (ImpPDFTabOpnFtrPage* pPage = static_cast<ImpPDFTabOpnFtrPage*>(GetTabPage("initialview")))
362         pPage->GetFilterConfigItem(this);
363     if (ImpPDFTabLinksPage* pPage = static_cast<ImpPDFTabLinksPage*>(GetTabPage("links")))
364         pPage->GetFilterConfigItem(this);
365     if (ImpPDFTabSecurityPage* pPage = static_cast<ImpPDFTabSecurityPage*>( GetTabPage("security")))
366         pPage->GetFilterConfigItem(this);
367     if (ImpPDFTabSigningPage* pPage = static_cast<ImpPDFTabSigningPage*>(GetTabPage("digitalsignatures")))
368         pPage->GetFilterConfigItem(this);
369 
370     // prepare the items to be returned
371     maConfigItem.WriteBool( "UseLosslessCompression", mbUseLosslessCompression );
372     maConfigItem.WriteInt32("Quality", mnQuality );
373     maConfigItem.WriteBool( "ReduceImageResolution", mbReduceImageResolution );
374     maConfigItem.WriteInt32("MaxImageResolution", mnMaxImageResolution );
375 
376     // always write the user selection, never the overridden PDF/A value
377     const bool bIsPDFA = (1 == mnPDFTypeSelection) || (2 == mnPDFTypeSelection);
378     maConfigItem.WriteBool("UseTaggedPDF", bIsPDFA ? mbUseTaggedPDFUserSelection : mbUseTaggedPDF);
379     maConfigItem.WriteInt32("SelectPdfVersion", mnPDFTypeSelection );
380 
381     if ( mbIsPresentation )
382     {
383         maConfigItem.WriteBool( "ExportNotesPages", mbExportNotesPages );
384         maConfigItem.WriteBool( "ExportOnlyNotesPages", mbExportOnlyNotesPages );
385     }
386     maConfigItem.WriteBool( "ExportNotes", mbExportNotes );
387     maConfigItem.WriteBool( "ViewPDFAfterExport", mbViewPDF );
388 
389     maConfigItem.WriteBool( "ExportBookmarks", mbExportBookmarks );
390     if ( mbIsPresentation )
391         maConfigItem.WriteBool( "ExportHiddenSlides", mbExportHiddenSlides );
392     if ( mbIsSpreadsheet )
393         maConfigItem.WriteBool( "SinglePageSheets", mbSinglePageSheets );
394     maConfigItem.WriteBool( "UseTransitionEffects", mbUseTransitionEffects );
395     maConfigItem.WriteBool( "IsSkipEmptyPages", mbIsSkipEmptyPages );
396     maConfigItem.WriteBool( "ExportPlaceholders", mbIsExportPlaceholders );
397     maConfigItem.WriteBool( "IsAddStream", mbAddStream );
398 
399     /*
400     * FIXME: the entries are only implicitly defined by the resource file. Should there
401     * ever be an additional form submit format this could get invalid.
402     */
403     maConfigItem.WriteInt32( "FormsType", mnFormsType );
404     maConfigItem.WriteBool( "ExportFormFields", mbExportFormFields );
405     maConfigItem.WriteBool( "AllowDuplicateFieldNames", mbAllowDuplicateFieldNames );
406 
407     maConfigItem.WriteBool( "HideViewerToolbar", mbHideViewerToolbar );
408     maConfigItem.WriteBool( "HideViewerMenubar", mbHideViewerMenubar );
409     maConfigItem.WriteBool( "HideViewerWindowControls", mbHideViewerWindowControls );
410     maConfigItem.WriteBool( "ResizeWindowToInitialPage", mbResizeWinToInit );
411     maConfigItem.WriteBool( "CenterWindow", mbCenterWindow );
412     maConfigItem.WriteBool( "OpenInFullScreenMode", mbOpenInFullScreenMode );
413     maConfigItem.WriteBool( "DisplayPDFDocumentTitle", mbDisplayPDFDocumentTitle );
414     maConfigItem.WriteInt32( "InitialView", mnInitialView );
415     maConfigItem.WriteInt32( "Magnification", mnMagnification);
416     maConfigItem.WriteInt32( "Zoom", mnZoom );
417     maConfigItem.WriteInt32( "InitialPage", mnInitialPage );
418     maConfigItem.WriteInt32( "PageLayout", mnPageLayout );
419     maConfigItem.WriteBool( "FirstPageOnLeft", mbFirstPageLeft );
420     maConfigItem.WriteInt32( "OpenBookmarkLevels", mnOpenBookmarkLevels );
421 
422     maConfigItem.WriteBool( "ExportLinksRelativeFsys", mbExportRelativeFsysLinks );
423     maConfigItem.WriteInt32("PDFViewSelection", mnViewPDFMode );
424     maConfigItem.WriteBool( "ConvertOOoTargetToPDFTarget", mbConvertOOoTargets );
425     maConfigItem.WriteBool( "ExportBookmarksToPDFDestination", mbExportBmkToPDFDestination );
426 
427     maConfigItem.WriteBool( "SignPDF", mbSignPDF );
428 
429     maConfigItem.WriteInt32( "Printing", mnPrint );
430     maConfigItem.WriteInt32( "Changes", mnChangesAllowed );
431     maConfigItem.WriteBool( "EnableCopyingOfContent", mbCanCopyOrExtract );
432     maConfigItem.WriteBool( "EnableTextAccessForAccessibilityTools", mbCanExtractForAccessibility );
433 
434     std::vector<beans::PropertyValue> aRet;
435 
436     aRet.push_back(comphelper::makePropertyValue("Watermark", maWatermarkText));
437     aRet.push_back(comphelper::makePropertyValue("EncryptFile", mbEncrypt));
438     aRet.push_back(comphelper::makePropertyValue("PreparedPasswords", mxPreparedPasswords));
439     aRet.push_back(comphelper::makePropertyValue("RestrictPermissions", mbRestrictPermissions));
440     aRet.push_back(comphelper::makePropertyValue("PreparedPermissionPassword", maPreparedOwnerPassword));
441     if( mbIsRangeChecked )
442         aRet.push_back(comphelper::makePropertyValue("PageRange", msPageRange));
443     else if( mbSelectionIsChecked )
444         aRet.push_back(comphelper::makePropertyValue("Selection", maSelection));
445 
446     aRet.push_back(comphelper::makePropertyValue("SignatureLocation", msSignLocation));
447     aRet.push_back(comphelper::makePropertyValue("SignatureReason", msSignReason));
448     aRet.push_back(comphelper::makePropertyValue("SignatureContactInfo", msSignContact));
449     aRet.push_back(comphelper::makePropertyValue("SignaturePassword", msSignPassword));
450     aRet.push_back(comphelper::makePropertyValue("SignatureCertificate", maSignCertificate));
451     aRet.push_back(comphelper::makePropertyValue("SignatureTSA", msSignTSA));
452     aRet.push_back(comphelper::makePropertyValue("UseReferenceXObject", mbUseReferenceXObject));
453 
454     return comphelper::concatSequences(maConfigItem.GetFilterData(), comphelper::containerToSequence(aRet));
455 }
456 
457 
ImpPDFTabGeneralPage(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet & rCoreSet)458 ImpPDFTabGeneralPage::ImpPDFTabGeneralPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet)
459     : SfxTabPage(pPage, pController, "filter/ui/pdfgeneralpage.ui", "PdfGeneralPage", &rCoreSet)
460     , mbUseTaggedPDFUserSelection(false)
461     , mbIsPresentation(false)
462     , mbIsSpreadsheet(false)
463     , mbIsWriter(false)
464     , mpParent(nullptr)
465     , mxRbAll(m_xBuilder->weld_radio_button("all"))
466     , mxRbRange(m_xBuilder->weld_radio_button("range"))
467     , mxRbSelection(m_xBuilder->weld_radio_button("selection"))
468     , mxEdPages(m_xBuilder->weld_entry("pages"))
469     , mxSelectedSheets(m_xBuilder->weld_label("selectedsheets"))
470     , mxRbLosslessCompression(m_xBuilder->weld_radio_button("losslesscompress"))
471     , mxRbJPEGCompression(m_xBuilder->weld_radio_button("jpegcompress"))
472     , mxQualityFrame(m_xBuilder->weld_widget("qualityframe"))
473     , mxNfQuality(m_xBuilder->weld_metric_spin_button("quality", FieldUnit::PERCENT))
474     , mxCbReduceImageResolution(m_xBuilder->weld_check_button("reduceresolution"))
475     , mxCoReduceImageResolution(m_xBuilder->weld_combo_box("resolution"))
476     , mxCbPDFA(m_xBuilder->weld_check_button("pdfa"))
477     , mxRbPDFA1b(m_xBuilder->weld_radio_button("pdfa1"))
478     , mxRbPDFA2b(m_xBuilder->weld_radio_button("pdfa2"))
479     , mxCbTaggedPDF(m_xBuilder->weld_check_button("tagged"))
480     , mxCbExportFormFields(m_xBuilder->weld_check_button("forms"))
481     , mxFormsFrame(m_xBuilder->weld_widget("formsframe"))
482     , mxLbFormsFormat(m_xBuilder->weld_combo_box("format"))
483     , mxCbAllowDuplicateFieldNames(m_xBuilder->weld_check_button("allowdups"))
484     , mxCbExportBookmarks(m_xBuilder->weld_check_button("bookmarks"))
485     , mxCbExportHiddenSlides(m_xBuilder->weld_check_button("hiddenpages"))
486     , mxCbSinglePageSheets(m_xBuilder->weld_check_button("singlepagesheets"))
487     , mxCbExportNotes(m_xBuilder->weld_check_button("comments"))
488     , mxCbViewPDF(m_xBuilder->weld_check_button("viewpdf"))
489     , mxCbUseReferenceXObject(m_xBuilder->weld_check_button("usereferencexobject"))
490     , mxCbExportNotesPages(m_xBuilder->weld_check_button("notes"))
491     , mxCbExportOnlyNotesPages(m_xBuilder->weld_check_button("onlynotes"))
492     , mxCbExportEmptyPages(m_xBuilder->weld_check_button("emptypages"))
493     , mxCbExportPlaceholders(m_xBuilder->weld_check_button("exportplaceholders"))
494     , mxCbAddStream(m_xBuilder->weld_check_button("embed"))
495     , mxCbWatermark(m_xBuilder->weld_check_button("watermark"))
496     , mxFtWatermark(m_xBuilder->weld_label("watermarklabel"))
497     , mxEdWatermark(m_xBuilder->weld_entry("watermarkentry"))
498     , mxSlidesFt(m_xBuilder->weld_label("slides"))
499     , mxSheetsFt(m_xBuilder->weld_label("selectedsheets"))
500 {
501 }
502 
~ImpPDFTabGeneralPage()503 ImpPDFTabGeneralPage::~ImpPDFTabGeneralPage()
504 {
505 }
506 
SetFilterConfigItem(ImpPDFTabDialog * pParent)507 void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent)
508 {
509     mpParent = pParent;
510 
511     // init this class data
512     mxRbRange->connect_toggled( LINK( this, ImpPDFTabGeneralPage, TogglePagesHdl ) );
513 
514     mxRbAll->set_active(true);
515     mxRbAll->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleAllHdl ) );
516     TogglePagesHdl();
517 
518     const bool bSelectionPresent = pParent->mbSelectionPresent;
519     mxRbSelection->set_sensitive( bSelectionPresent );
520     if ( bSelectionPresent )
521         mxRbSelection->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleSelectionHdl ) );
522     mbIsPresentation = pParent->mbIsPresentation;
523     mbIsWriter = pParent->mbIsWriter;
524     mbIsSpreadsheet = pParent->mbIsSpreadsheet;
525 
526     mxCbExportEmptyPages->set_sensitive( mbIsWriter );
527     mxCbExportPlaceholders->set_sensitive( mbIsWriter );
528 
529     mxRbLosslessCompression->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleCompressionHdl ) );
530     const bool bUseLosslessCompression = pParent->mbUseLosslessCompression;
531     if ( bUseLosslessCompression )
532         mxRbLosslessCompression->set_active(true);
533     else
534         mxRbJPEGCompression->set_active(true);
535 
536     mxNfQuality->set_value( pParent->mnQuality, FieldUnit::PERCENT );
537     mxQualityFrame->set_sensitive(!bUseLosslessCompression);
538 
539     mxCbReduceImageResolution->connect_toggled(LINK(this, ImpPDFTabGeneralPage, ToggleReduceImageResolutionHdl));
540     const bool  bReduceImageResolution = pParent->mbReduceImageResolution;
541     mxCbReduceImageResolution->set_active( bReduceImageResolution );
542     OUString aStrRes = OUString::number( pParent->mnMaxImageResolution ) + " DPI";
543     mxCoReduceImageResolution->set_entry_text(aStrRes);
544     mxCoReduceImageResolution->set_sensitive( bReduceImageResolution );
545     mxCbWatermark->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleWatermarkHdl ) );
546     mxFtWatermark->set_sensitive(false );
547     mxEdWatermark->set_sensitive( false );
548     mxCbPDFA->connect_toggled(LINK(this, ImpPDFTabGeneralPage, ToggleExportPDFAHdl));
549 
550     const bool bIsPDFA = (1 == pParent->mnPDFTypeSelection) || (2 == pParent->mnPDFTypeSelection);
551     mxCbPDFA->set_active(bIsPDFA);
552     switch( pParent->mnPDFTypeSelection )
553     {
554     case 1: // PDF/A-1
555         mxRbPDFA1b->set_active(true);
556         mxRbPDFA2b->set_active(false);
557         break;
558     case 2: // PDF/A-2
559     default: // PDF 1.x
560         mxRbPDFA1b->set_active(false);
561         mxRbPDFA2b->set_active(true);
562         break;
563     }
564     // the ToggleExportPDFAHdl handler will read or write the *UserSelection based
565     // on the mxCbPDFA (= bIsPDFA) state, so we have to prepare the correct input state.
566     if (bIsPDFA)
567         mxCbTaggedPDF->set_active(pParent->mbUseTaggedPDFUserSelection);
568     else
569         mbUseTaggedPDFUserSelection = pParent->mbUseTaggedPDFUserSelection;
570     ToggleExportPDFAHdl( *mxCbPDFA );
571 
572     mxCbExportFormFields->set_active(pParent->mbExportFormFields);
573     mxCbExportFormFields->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleExportFormFieldsHdl ) );
574 
575     mxLbFormsFormat->set_active(static_cast<sal_uInt16>(pParent->mnFormsType));
576     mxCbAllowDuplicateFieldNames->set_active( pParent->mbAllowDuplicateFieldNames );
577     mxFormsFrame->set_sensitive(pParent->mbExportFormFields);
578 
579     mxCbExportBookmarks->set_active( pParent->mbExportBookmarks );
580 
581     mxCbExportNotes->set_active( pParent->mbExportNotes );
582     mxCbViewPDF->set_active( pParent->mbViewPDF);
583 
584     if ( mbIsPresentation )
585     {
586         mxRbRange->set_label(mxSlidesFt->get_label());
587         mxCbExportNotesPages->show();
588         mxCbExportNotesPages->set_active(pParent->mbExportNotesPages);
589         mxCbExportNotesPages->connect_toggled( LINK(this, ImpPDFTabGeneralPage, ToggleExportNotesPagesHdl ) );
590         mxCbExportOnlyNotesPages->show();
591         mxCbExportOnlyNotesPages->set_active(pParent->mbExportOnlyNotesPages);
592         // tdf#116473 Initially enable Export only note pages option depending on the checked state of Export notes pages option
593         mxCbExportOnlyNotesPages->set_sensitive(mxCbExportNotesPages->get_active());
594         mxCbExportHiddenSlides->show();
595         mxCbExportHiddenSlides->set_active(pParent->mbExportHiddenSlides);
596     }
597     else
598     {
599         mxCbExportNotesPages->hide();
600         mxCbExportNotesPages->set_active(false);
601         mxCbExportOnlyNotesPages->hide();
602         mxCbExportOnlyNotesPages->set_active(false);
603         mxCbExportHiddenSlides->hide();
604         mxCbExportHiddenSlides->set_active(false);
605     }
606 
607     if( mbIsSpreadsheet )
608     {
609         mxRbSelection->set_label(mxSheetsFt->get_label());
610         // tdf#105965 Make Selection/Selected sheets the default PDF export range setting for spreadsheets
611         mxRbSelection->set_active(true);
612 
613         mxCbSinglePageSheets->show();
614         mxCbSinglePageSheets->set_active(pParent->mbSinglePageSheets);
615     }
616     else
617     {
618         mxCbSinglePageSheets->hide();
619         mxCbSinglePageSheets->set_active(false);
620     }
621 
622     mxCbExportPlaceholders->set_visible(mbIsWriter);
623     if( mbIsWriter )
624     {
625         // tdf#54908 Make selection active if there is a selection in Writer's version
626         mxRbSelection->set_active( bSelectionPresent );
627     }
628     else
629     {
630         mxCbExportPlaceholders->set_active(false);
631     }
632     mxCbExportEmptyPages->set_active(!pParent->mbIsSkipEmptyPages);
633     mxCbExportPlaceholders->set_active(pParent->mbIsExportPlaceholders);
634 
635     mxCbAddStream->show();
636     mxCbAddStream->set_active(pParent->mbAddStream);
637 
638     mxCbAddStream->connect_toggled(LINK(this, ImpPDFTabGeneralPage, ToggleAddStreamHdl));
639     ToggleAddStreamHdl(*mxCbAddStream); // init addstream dependencies
640 }
641 
GetFilterConfigItem(ImpPDFTabDialog * pParent)642 void ImpPDFTabGeneralPage::GetFilterConfigItem( ImpPDFTabDialog* pParent )
643 {
644     // updating the FilterData sequence and storing FilterData to configuration
645     pParent->mbUseLosslessCompression = mxRbLosslessCompression->get_active();
646     pParent->mnQuality = static_cast<sal_Int32>(mxNfQuality->get_value(FieldUnit::PERCENT));
647     pParent->mbReduceImageResolution = mxCbReduceImageResolution->get_active();
648     pParent->mnMaxImageResolution = mxCoReduceImageResolution->get_active_text().toInt32();
649     pParent->mbExportNotes = mxCbExportNotes->get_active();
650     pParent->mbViewPDF = mxCbViewPDF->get_active();
651     pParent->mbUseReferenceXObject = mxCbUseReferenceXObject->get_active();
652     if ( mbIsPresentation )
653     {
654         pParent->mbExportNotesPages = mxCbExportNotesPages->get_active();
655         pParent->mbExportOnlyNotesPages = mxCbExportOnlyNotesPages->get_active();
656     }
657     pParent->mbExportBookmarks = mxCbExportBookmarks->get_active();
658     if ( mbIsPresentation )
659         pParent->mbExportHiddenSlides = mxCbExportHiddenSlides->get_active();
660 
661     if (mbIsSpreadsheet)
662         pParent->mbSinglePageSheets = mxCbSinglePageSheets->get_active();
663 
664     pParent->mbIsSkipEmptyPages = !mxCbExportEmptyPages->get_active();
665     pParent->mbIsExportPlaceholders = mxCbExportPlaceholders->get_active();
666     pParent->mbAddStream = mxCbAddStream->get_visible() && mxCbAddStream->get_active();
667 
668     pParent->mbIsRangeChecked = false;
669     if( mxRbRange->get_active() )
670     {
671         pParent->mbIsRangeChecked = true;
672         pParent->msPageRange = mxEdPages->get_text(); //FIXME all right on other languages ?
673     }
674     else if( mxRbSelection->get_active() )
675     {
676         pParent->mbSelectionIsChecked = mxRbSelection->get_active();
677     }
678 
679     pParent->mnPDFTypeSelection = 0;
680     pParent->mbUseTaggedPDF = mxCbTaggedPDF->get_active();
681 
682     const bool bIsPDFA = mxCbPDFA->get_active();
683     if (bIsPDFA)
684     {
685         pParent->mnPDFTypeSelection = 2;
686         if( mxRbPDFA1b->get_active() )
687             pParent->mnPDFTypeSelection = 1;
688     }
689     else
690         mbUseTaggedPDFUserSelection = pParent->mbUseTaggedPDF;
691     pParent->mbUseTaggedPDFUserSelection = mbUseTaggedPDFUserSelection;
692     pParent->mbExportFormFields = mxCbExportFormFields->get_active();
693 
694     if( mxCbWatermark->get_active() )
695         pParent->maWatermarkText = mxEdWatermark->get_text();
696 
697     /*
698     * FIXME: the entries are only implicitly defined by the resource file. Should there
699     * ever be an additional form submit format this could get invalid.
700     */
701     pParent->mnFormsType = mxLbFormsFormat->get_active();
702     pParent->mbAllowDuplicateFieldNames = mxCbAllowDuplicateFieldNames->get_active();
703 }
704 
Create(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * rAttrSet)705 std::unique_ptr<SfxTabPage> ImpPDFTabGeneralPage::Create( weld::Container* pPage, weld::DialogController* pController,
706                                                  const SfxItemSet* rAttrSet)
707 {
708     return std::make_unique<ImpPDFTabGeneralPage>(pPage, pController, *rAttrSet);
709 }
710 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,ToggleAllHdl,weld::ToggleButton &,void)711 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleAllHdl, weld::ToggleButton&, void)
712 {
713     EnableExportNotesPages();
714 }
715 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,TogglePagesHdl,weld::ToggleButton &,void)716 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, TogglePagesHdl, weld::ToggleButton&, void)
717 {
718     TogglePagesHdl();
719     EnableExportNotesPages();
720 }
721 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,ToggleSelectionHdl,weld::ToggleButton &,void)722 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleSelectionHdl, weld::ToggleButton&, void)
723 {
724     EnableExportNotesPages();
725 }
726 
TogglePagesHdl()727 void ImpPDFTabGeneralPage::TogglePagesHdl()
728 {
729     mxEdPages->set_sensitive( mxRbRange->get_active() );
730     if (mxRbRange->get_active())
731         mxEdPages->grab_focus();
732 }
733 
EnableExportNotesPages()734 void ImpPDFTabGeneralPage::EnableExportNotesPages()
735 {
736     if ( mbIsPresentation )
737     {
738         mxCbExportNotesPages->set_sensitive( !mxRbSelection->get_active() );
739         mxCbExportOnlyNotesPages->set_sensitive( !mxRbSelection->get_active() && mxCbExportNotesPages->get_active() );
740     }
741 }
742 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,ToggleExportFormFieldsHdl,weld::ToggleButton &,void)743 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleExportFormFieldsHdl, weld::ToggleButton&, void)
744 {
745     mxFormsFrame->set_sensitive(mxCbExportFormFields->get_active());
746 }
747 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,ToggleExportNotesPagesHdl,weld::ToggleButton &,void)748 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleExportNotesPagesHdl, weld::ToggleButton&, void)
749 {
750     mxCbExportOnlyNotesPages->set_sensitive(mxCbExportNotesPages->get_active());
751 }
752 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,ToggleCompressionHdl,weld::ToggleButton &,void)753 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleCompressionHdl, weld::ToggleButton&, void)
754 {
755     mxQualityFrame->set_sensitive(mxRbJPEGCompression->get_active());
756 }
757 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,ToggleReduceImageResolutionHdl,weld::ToggleButton &,void)758 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleReduceImageResolutionHdl, weld::ToggleButton&, void)
759 {
760     mxCoReduceImageResolution->set_sensitive(mxCbReduceImageResolution->get_active());
761 }
762 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,ToggleWatermarkHdl,weld::ToggleButton &,void)763 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleWatermarkHdl, weld::ToggleButton&, void)
764 {
765     mxEdWatermark->set_sensitive(mxCbWatermark->get_active());
766     mxFtWatermark->set_sensitive(mxCbWatermark->get_active());
767     if (mxCbWatermark->get_active())
768         mxEdWatermark->grab_focus();
769 }
770 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,ToggleAddStreamHdl,weld::ToggleButton &,void)771 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleAddStreamHdl, weld::ToggleButton&, void)
772 {
773     if (mxCbAddStream->get_visible())
774     {
775         if( mxCbAddStream->get_active() )
776         {
777             mxRbAll->set_active(true);
778             mxRbRange->set_sensitive( false );
779             mxRbSelection->set_sensitive( false );
780             mxEdPages->set_sensitive( false );
781             mxRbAll->set_sensitive( false );
782         }
783         else
784         {
785             mxRbAll->set_sensitive(true);
786             mxRbRange->set_sensitive(true);
787             mxRbSelection->set_sensitive(true);
788         }
789     }
790 }
791 
IMPL_LINK_NOARG(ImpPDFTabGeneralPage,ToggleExportPDFAHdl,weld::ToggleButton &,void)792 IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleExportPDFAHdl, weld::ToggleButton&, void)
793 {
794     const bool bIsPDFA = mxCbPDFA->get_active();
795 
796     // set the security page status (and its controls as well)
797     ImpPDFTabSecurityPage* pSecPage = mpParent ? mpParent->getSecurityPage() : nullptr;
798     if (pSecPage)
799         pSecPage->ImplPDFASecurityControl(!bIsPDFA);
800 
801     mxCbTaggedPDF->set_sensitive(!bIsPDFA);
802     mxRbPDFA1b->set_sensitive(bIsPDFA);
803     mxRbPDFA2b->set_sensitive(bIsPDFA);
804 
805     if (bIsPDFA)
806     {
807         // store the users selection of subordinate controls and set required PDF/A values
808         mbUseTaggedPDFUserSelection = mxCbTaggedPDF->get_active();
809         mxCbTaggedPDF->set_active(true);
810 
811         // if a password was set, inform the user that this will not be used
812         if (pSecPage && pSecPage->hasPassword())
813         {
814             std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(m_xContainer.get(),
815                                                       VclMessageType::Warning, VclButtonsType::Ok,
816                                                       PDFFilterResId(STR_WARN_PASSWORD_PDFA)));
817             xBox->run();
818         }
819     }
820     else
821     {
822         // restore the users values of subordinate controls
823         mxCbTaggedPDF->set_active(mbUseTaggedPDFUserSelection);
824     }
825 
826     // PDF/A doesn't allow launch action, so enable/disable the selection on the Link page
827     ImpPDFTabLinksPage* pLinksPage = mpParent ? mpParent->getLinksPage() : nullptr;
828     if (pLinksPage)
829         pLinksPage->ImplPDFALinkControl(!bIsPDFA);
830 }
831 
832 /// The option features tab page
ImpPDFTabOpnFtrPage(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet & rCoreSet)833 ImpPDFTabOpnFtrPage::ImpPDFTabOpnFtrPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet)
834     : SfxTabPage(pPage, pController, "filter/ui/pdfviewpage.ui", "PdfViewPage", &rCoreSet)
835     , mbUseCTLFont(false)
836     , mxRbOpnPageOnly(m_xBuilder->weld_radio_button("pageonly"))
837     , mxRbOpnOutline(m_xBuilder->weld_radio_button("outline"))
838     , mxRbOpnThumbs(m_xBuilder->weld_radio_button("thumbs"))
839     , mxNumInitialPage(m_xBuilder->weld_spin_button("page"))
840     , mxRbMagnDefault(m_xBuilder->weld_radio_button("fitdefault"))
841     , mxRbMagnFitWin(m_xBuilder->weld_radio_button("fitwin"))
842     , mxRbMagnFitWidth(m_xBuilder->weld_radio_button("fitwidth"))
843     , mxRbMagnFitVisible(m_xBuilder->weld_radio_button("fitvis"))
844     , mxRbMagnZoom(m_xBuilder->weld_radio_button("fitzoom"))
845     , mxNumZoom(m_xBuilder->weld_spin_button("zoom"))
846     , mxRbPgLyDefault(m_xBuilder->weld_radio_button("defaultlayout"))
847     , mxRbPgLySinglePage(m_xBuilder->weld_radio_button("singlelayout"))
848     , mxRbPgLyContinue(m_xBuilder->weld_radio_button("contlayout"))
849     , mxRbPgLyContinueFacing(m_xBuilder->weld_radio_button("contfacinglayout"))
850     , mxCbPgLyFirstOnLeft(m_xBuilder->weld_check_button("firstonleft"))
851 {
852     mxRbMagnDefault->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) );
853     mxRbMagnFitWin->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) );
854     mxRbMagnFitWidth->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) );
855     mxRbMagnFitVisible->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) );
856     mxRbMagnZoom->connect_toggled( LINK( this, ImpPDFTabOpnFtrPage, ToggleRbMagnHdl ) );
857 }
858 
~ImpPDFTabOpnFtrPage()859 ImpPDFTabOpnFtrPage::~ImpPDFTabOpnFtrPage()
860 {
861 }
862 
Create(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * rAttrSet)863 std::unique_ptr<SfxTabPage> ImpPDFTabOpnFtrPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rAttrSet)
864 {
865     return std::make_unique<ImpPDFTabOpnFtrPage>(pPage, pController, *rAttrSet);
866 }
867 
GetFilterConfigItem(ImpPDFTabDialog * pParent)868 void ImpPDFTabOpnFtrPage::GetFilterConfigItem( ImpPDFTabDialog* pParent  )
869 {
870     pParent->mnInitialView = 0;
871     if( mxRbOpnOutline->get_active() )
872         pParent->mnInitialView = 1;
873     else if( mxRbOpnThumbs->get_active() )
874         pParent->mnInitialView = 2;
875 
876     pParent->mnMagnification = 0;
877     if( mxRbMagnFitWin->get_active() )
878         pParent->mnMagnification = 1;
879     else if( mxRbMagnFitWidth->get_active() )
880         pParent->mnMagnification = 2;
881     else if( mxRbMagnFitVisible->get_active() )
882         pParent->mnMagnification = 3;
883     else if( mxRbMagnZoom->get_active() )
884     {
885         pParent->mnMagnification = 4;
886         pParent->mnZoom = mxNumZoom->get_value();
887     }
888 
889     pParent->mnInitialPage = mxNumInitialPage->get_value();
890 
891     pParent->mnPageLayout = 0;
892     if( mxRbPgLySinglePage->get_active() )
893         pParent->mnPageLayout = 1;
894     else if( mxRbPgLyContinue->get_active() )
895         pParent->mnPageLayout = 2;
896     else if( mxRbPgLyContinueFacing->get_active() )
897         pParent->mnPageLayout = 3;
898 
899     pParent->mbFirstPageLeft = mbUseCTLFont && mxCbPgLyFirstOnLeft->get_active();
900 }
901 
SetFilterConfigItem(const ImpPDFTabDialog * pParent)902 void ImpPDFTabOpnFtrPage::SetFilterConfigItem( const  ImpPDFTabDialog* pParent )
903 {
904     mbUseCTLFont = pParent->mbUseCTLFont;
905     switch( pParent->mnPageLayout )
906     {
907     default:
908     case 0:
909         mxRbPgLyDefault->set_active(true);
910         break;
911     case 1:
912         mxRbPgLySinglePage->set_active(true);
913         break;
914     case 2:
915         mxRbPgLyContinue->set_active(true);
916         break;
917     case 3:
918         mxRbPgLyContinueFacing->set_active(true);
919         break;
920     }
921 
922     switch( pParent->mnInitialView )
923     {
924     default:
925     case 0:
926         mxRbOpnPageOnly->set_active(true);
927         break;
928     case 1:
929         mxRbOpnOutline->set_active(true);
930         break;
931     case 2:
932         mxRbOpnThumbs->set_active(true);
933         break;
934     }
935 
936     switch( pParent->mnMagnification )
937     {
938     default:
939     case 0:
940         mxRbMagnDefault->set_active(true);
941         mxNumZoom->set_sensitive(false);
942         break;
943     case 1:
944         mxRbMagnFitWin->set_active(true);
945         mxNumZoom->set_sensitive(false);
946         break;
947     case 2:
948         mxRbMagnFitWidth->set_active(true);
949         mxNumZoom->set_sensitive(false);
950         break;
951     case 3:
952         mxRbMagnFitVisible->set_active(true);
953         mxNumZoom->set_sensitive(false);
954         break;
955     case 4:
956         mxRbMagnZoom->set_active(true);
957         mxNumZoom->set_sensitive(true);
958         break;
959     }
960 
961     mxNumZoom->set_value(pParent->mnZoom);
962     mxNumInitialPage->set_value(pParent->mnInitialPage);
963 
964     if (!mbUseCTLFont)
965         mxCbPgLyFirstOnLeft->hide();
966     else
967     {
968         mxRbPgLyContinueFacing->connect_toggled(LINK(this, ImpPDFTabOpnFtrPage, ToggleRbPgLyContinueFacingHdl));
969         mxCbPgLyFirstOnLeft->set_active(pParent->mbFirstPageLeft);
970         ToggleRbPgLyContinueFacingHdl();
971     }
972 }
973 
IMPL_LINK_NOARG(ImpPDFTabOpnFtrPage,ToggleRbPgLyContinueFacingHdl,weld::ToggleButton &,void)974 IMPL_LINK_NOARG(ImpPDFTabOpnFtrPage, ToggleRbPgLyContinueFacingHdl, weld::ToggleButton&, void)
975 {
976     ToggleRbPgLyContinueFacingHdl();
977 }
978 
ToggleRbPgLyContinueFacingHdl()979 void ImpPDFTabOpnFtrPage::ToggleRbPgLyContinueFacingHdl()
980 {
981     mxCbPgLyFirstOnLeft->set_sensitive(mxRbPgLyContinueFacing->get_active());
982 }
983 
IMPL_LINK_NOARG(ImpPDFTabOpnFtrPage,ToggleRbMagnHdl,weld::ToggleButton &,void)984 IMPL_LINK_NOARG( ImpPDFTabOpnFtrPage, ToggleRbMagnHdl, weld::ToggleButton&, void )
985 {
986     mxNumZoom->set_sensitive(mxRbMagnZoom->get_active());
987 }
988 
989 /// The Viewer preferences tab page
ImpPDFTabViewerPage(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet & rCoreSet)990 ImpPDFTabViewerPage::ImpPDFTabViewerPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet )
991     : SfxTabPage(pPage, pController, "filter/ui/pdfuserinterfacepage.ui", "PdfUserInterfacePage", &rCoreSet)
992     , mbIsPresentation(false)
993     , m_xCbResWinInit(m_xBuilder->weld_check_button("resize"))
994     , m_xCbCenterWindow(m_xBuilder->weld_check_button("center"))
995     , m_xCbOpenFullScreen(m_xBuilder->weld_check_button("open"))
996     , m_xCbDispDocTitle(m_xBuilder->weld_check_button("display"))
997     , m_xCbHideViewerMenubar(m_xBuilder->weld_check_button("menubar"))
998     , m_xCbHideViewerToolbar(m_xBuilder->weld_check_button("toolbar"))
999     , m_xCbHideViewerWindowControls(m_xBuilder->weld_check_button("window"))
1000     , m_xCbTransitionEffects(m_xBuilder->weld_check_button("effects"))
1001     , m_xRbAllBookmarkLevels(m_xBuilder->weld_radio_button("allbookmarks"))
1002     , m_xRbVisibleBookmarkLevels(m_xBuilder->weld_radio_button("visiblebookmark"))
1003     , m_xNumBookmarkLevels(m_xBuilder->weld_spin_button("visiblelevel"))
1004 {
1005     m_xRbAllBookmarkLevels->connect_toggled(LINK(this, ImpPDFTabViewerPage, ToggleRbBookmarksHdl));
1006     m_xRbVisibleBookmarkLevels->connect_toggled(LINK(this, ImpPDFTabViewerPage, ToggleRbBookmarksHdl));
1007 }
1008 
~ImpPDFTabViewerPage()1009 ImpPDFTabViewerPage::~ImpPDFTabViewerPage()
1010 {
1011 }
1012 
IMPL_LINK_NOARG(ImpPDFTabViewerPage,ToggleRbBookmarksHdl,weld::ToggleButton &,void)1013 IMPL_LINK_NOARG( ImpPDFTabViewerPage, ToggleRbBookmarksHdl, weld::ToggleButton&, void )
1014 {
1015     m_xNumBookmarkLevels->set_sensitive(m_xRbVisibleBookmarkLevels->get_active());
1016 }
1017 
Create(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * rAttrSet)1018 std::unique_ptr<SfxTabPage> ImpPDFTabViewerPage::Create( weld::Container* pPage, weld::DialogController* pController,
1019                                                 const SfxItemSet* rAttrSet)
1020 {
1021     return std::make_unique<ImpPDFTabViewerPage>(pPage, pController, *rAttrSet);
1022 }
1023 
GetFilterConfigItem(ImpPDFTabDialog * pParent)1024 void ImpPDFTabViewerPage::GetFilterConfigItem( ImpPDFTabDialog* pParent  )
1025 {
1026     pParent->mbHideViewerMenubar = m_xCbHideViewerMenubar->get_active();
1027     pParent->mbHideViewerToolbar = m_xCbHideViewerToolbar->get_active();
1028     pParent->mbHideViewerWindowControls = m_xCbHideViewerWindowControls->get_active();
1029     pParent->mbResizeWinToInit = m_xCbResWinInit->get_active();
1030     pParent->mbOpenInFullScreenMode = m_xCbOpenFullScreen->get_active();
1031     pParent->mbCenterWindow = m_xCbCenterWindow->get_active();
1032     pParent->mbDisplayPDFDocumentTitle = m_xCbDispDocTitle->get_active();
1033     pParent->mbUseTransitionEffects = m_xCbTransitionEffects->get_active();
1034     pParent->mnOpenBookmarkLevels = m_xRbAllBookmarkLevels->get_active() ?
1035                                      -1 : static_cast<sal_Int32>(m_xNumBookmarkLevels->get_value());
1036 }
1037 
SetFilterConfigItem(const ImpPDFTabDialog * pParent)1038 void ImpPDFTabViewerPage::SetFilterConfigItem( const  ImpPDFTabDialog* pParent )
1039 {
1040     m_xCbHideViewerMenubar->set_active( pParent->mbHideViewerMenubar );
1041     m_xCbHideViewerToolbar->set_active( pParent->mbHideViewerToolbar );
1042     m_xCbHideViewerWindowControls->set_active( pParent->mbHideViewerWindowControls );
1043 
1044     m_xCbResWinInit->set_active( pParent->mbResizeWinToInit );
1045     m_xCbOpenFullScreen->set_active( pParent->mbOpenInFullScreenMode );
1046     m_xCbCenterWindow->set_active( pParent->mbCenterWindow );
1047     m_xCbDispDocTitle->set_active( pParent->mbDisplayPDFDocumentTitle );
1048     mbIsPresentation = pParent->mbIsPresentation;
1049     m_xCbTransitionEffects->set_active( pParent->mbUseTransitionEffects );
1050     m_xCbTransitionEffects->set_sensitive( mbIsPresentation );
1051     if( pParent->mnOpenBookmarkLevels < 0 )
1052     {
1053         m_xRbAllBookmarkLevels->set_active(true);
1054         m_xNumBookmarkLevels->set_sensitive( false );
1055     }
1056     else
1057     {
1058         m_xRbVisibleBookmarkLevels->set_active(true);
1059         m_xNumBookmarkLevels->set_sensitive(true);
1060         m_xNumBookmarkLevels->set_value(pParent->mnOpenBookmarkLevels);
1061     }
1062 }
1063 
1064 /// The Security preferences tab page
ImpPDFTabSecurityPage(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet & i_rCoreSet)1065 ImpPDFTabSecurityPage::ImpPDFTabSecurityPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& i_rCoreSet)
1066     : SfxTabPage(pPage, pController, "filter/ui/pdfsecuritypage.ui", "PdfSecurityPage", &i_rCoreSet)
1067     , msUserPwdTitle( PDFFilterResId( STR_PDF_EXPORT_UDPWD ) )
1068     , mbHaveOwnerPassword( false )
1069     , mbHaveUserPassword( false )
1070     , msOwnerPwdTitle( PDFFilterResId( STR_PDF_EXPORT_ODPWD ) )
1071     , mxPbSetPwd(m_xBuilder->weld_button("setpassword"))
1072     , mxUserPwdSet(m_xBuilder->weld_widget("userpwdset"))
1073     , mxUserPwdUnset(m_xBuilder->weld_widget("userpwdunset"))
1074     , mxUserPwdPdfa(m_xBuilder->weld_widget("userpwdpdfa"))
1075     , mxOwnerPwdSet(m_xBuilder->weld_widget("ownerpwdset"))
1076     , mxOwnerPwdUnset(m_xBuilder->weld_widget("ownerpwdunset"))
1077     , mxOwnerPwdPdfa(m_xBuilder->weld_widget("ownerpwdpdfa"))
1078     , mxPrintPermissions(m_xBuilder->weld_widget("printing"))
1079     , mxRbPrintNone(m_xBuilder->weld_radio_button("printnone"))
1080     , mxRbPrintLowRes(m_xBuilder->weld_radio_button("printlow"))
1081     , mxRbPrintHighRes(m_xBuilder->weld_radio_button("printhigh"))
1082     , mxChangesAllowed(m_xBuilder->weld_widget("changes"))
1083     , mxRbChangesNone(m_xBuilder->weld_radio_button("changenone"))
1084     , mxRbChangesInsDel(m_xBuilder->weld_radio_button("changeinsdel"))
1085     , mxRbChangesFillForm(m_xBuilder->weld_radio_button("changeform"))
1086     , mxRbChangesComment(m_xBuilder->weld_radio_button("changecomment"))
1087     , mxRbChangesAnyNoCopy(m_xBuilder->weld_radio_button("changeany"))
1088     , mxContent(m_xBuilder->weld_widget("content"))
1089     , mxCbEnableCopy(m_xBuilder->weld_check_button("enablecopy"))
1090     , mxCbEnableAccessibility(m_xBuilder->weld_check_button("enablea11y"))
1091     , mxPasswordTitle(m_xBuilder->weld_label("setpasswordstitle"))
1092 {
1093     msStrSetPwd = mxPasswordTitle->get_label();
1094     mxPbSetPwd->connect_clicked(LINK(this, ImpPDFTabSecurityPage, ClickmaPbSetPwdHdl));
1095 }
1096 
~ImpPDFTabSecurityPage()1097 ImpPDFTabSecurityPage::~ImpPDFTabSecurityPage()
1098 {
1099 }
1100 
Create(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * rAttrSet)1101 std::unique_ptr<SfxTabPage> ImpPDFTabSecurityPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rAttrSet)
1102 {
1103     return std::make_unique<ImpPDFTabSecurityPage>(pPage, pController, *rAttrSet);
1104 }
1105 
GetFilterConfigItem(ImpPDFTabDialog * pParent)1106 void ImpPDFTabSecurityPage::GetFilterConfigItem( ImpPDFTabDialog* pParent  )
1107 {
1108     // please note that in PDF/A-1a mode even if this are copied back,
1109     // the security settings are forced disabled in PDFExport::Export
1110     pParent->mbEncrypt = mbHaveUserPassword;
1111     pParent->mxPreparedPasswords = mxPreparedPasswords;
1112 
1113     pParent->mbRestrictPermissions = mbHaveOwnerPassword;
1114     pParent->maPreparedOwnerPassword = maPreparedOwnerPassword;
1115 
1116     // verify print status
1117     pParent->mnPrint = 0;
1118     if (mxRbPrintLowRes->get_active())
1119         pParent->mnPrint = 1;
1120     else if (mxRbPrintHighRes->get_active())
1121         pParent->mnPrint = 2;
1122 
1123     // verify changes permitted
1124     pParent->mnChangesAllowed = 0;
1125 
1126     if( mxRbChangesInsDel->get_active() )
1127         pParent->mnChangesAllowed = 1;
1128     else if( mxRbChangesFillForm->get_active() )
1129         pParent->mnChangesAllowed = 2;
1130     else if( mxRbChangesComment->get_active() )
1131         pParent->mnChangesAllowed = 3;
1132     else if( mxRbChangesAnyNoCopy->get_active() )
1133         pParent->mnChangesAllowed = 4;
1134 
1135     pParent->mbCanCopyOrExtract = mxCbEnableCopy->get_active();
1136     pParent->mbCanExtractForAccessibility = mxCbEnableAccessibility->get_active();
1137 }
1138 
SetFilterConfigItem(const ImpPDFTabDialog * pParent)1139 void ImpPDFTabSecurityPage::SetFilterConfigItem( const  ImpPDFTabDialog* pParent )
1140 {
1141     switch( pParent->mnPrint )
1142     {
1143     default:
1144     case 0:
1145         mxRbPrintNone->set_active(true);
1146         break;
1147     case 1:
1148         mxRbPrintLowRes->set_active(true);
1149         break;
1150     case 2:
1151         mxRbPrintHighRes->set_active(true);
1152         break;
1153     }
1154 
1155     switch( pParent->mnChangesAllowed )
1156     {
1157     default:
1158     case 0:
1159         mxRbChangesNone->set_active(true);
1160         break;
1161     case 1:
1162         mxRbChangesInsDel->set_active(true);
1163         break;
1164     case 2:
1165         mxRbChangesFillForm->set_active(true);
1166         break;
1167     case 3:
1168         mxRbChangesComment->set_active(true);
1169         break;
1170     case 4:
1171         mxRbChangesAnyNoCopy->set_active(true);
1172         break;
1173     }
1174 
1175     mxCbEnableCopy->set_active(pParent->mbCanCopyOrExtract);
1176     mxCbEnableAccessibility->set_active(pParent->mbCanExtractForAccessibility);
1177 
1178     // set the status of this windows, according to the PDFA selection
1179     enablePermissionControls();
1180 
1181     ImpPDFTabGeneralPage* pGeneralPage = pParent->getGeneralPage();
1182 
1183     if (pGeneralPage)
1184         ImplPDFASecurityControl(!pGeneralPage->IsPdfaSelected());
1185 }
1186 
IMPL_LINK_NOARG(ImpPDFTabSecurityPage,ClickmaPbSetPwdHdl,weld::Button &,void)1187 IMPL_LINK_NOARG(ImpPDFTabSecurityPage, ClickmaPbSetPwdHdl, weld::Button&, void)
1188 {
1189     SfxPasswordDialog aPwdDialog(m_xContainer.get(), &msUserPwdTitle);
1190     aPwdDialog.SetMinLen(0);
1191     aPwdDialog.ShowMinLengthText(false);
1192     aPwdDialog.ShowExtras( SfxShowExtras::CONFIRM | SfxShowExtras::PASSWORD2 | SfxShowExtras::CONFIRM2 );
1193     aPwdDialog.set_title(msStrSetPwd);
1194     aPwdDialog.SetGroup2Text(msOwnerPwdTitle);
1195     aPwdDialog.AllowAsciiOnly();
1196     if (aPwdDialog.run() == RET_OK)  // OK issued get password and set it
1197     {
1198         OUString aUserPW(aPwdDialog.GetPassword());
1199         OUString aOwnerPW(aPwdDialog.GetPassword2());
1200 
1201         mbHaveUserPassword = !aUserPW.isEmpty();
1202         mbHaveOwnerPassword = !aOwnerPW.isEmpty();
1203 
1204         mxPreparedPasswords = vcl::PDFWriter::InitEncryption( aOwnerPW, aUserPW );
1205         if (!mxPreparedPasswords.is()) {
1206             OUString msg;
1207             ErrorHandler::GetErrorString(ERRCODE_IO_NOTSUPPORTED, msg); //TODO: handle failure
1208             std::unique_ptr<weld::MessageDialog>(
1209                 Application::CreateMessageDialog(
1210                     GetFrameWeld(), VclMessageType::Error, VclButtonsType::Ok, msg))
1211                 ->run();
1212             return;
1213         }
1214 
1215         if( mbHaveOwnerPassword )
1216         {
1217             maPreparedOwnerPassword = comphelper::OStorageHelper::CreatePackageEncryptionData( aOwnerPW );
1218         }
1219         else
1220             maPreparedOwnerPassword = Sequence< NamedValue >();
1221     }
1222     enablePermissionControls();
1223 }
1224 
enablePermissionControls()1225 void ImpPDFTabSecurityPage::enablePermissionControls()
1226 {
1227     bool bIsPDFASel = false;
1228     ImpPDFTabDialog* pParent = static_cast<ImpPDFTabDialog*>(GetDialogController());
1229     ImpPDFTabGeneralPage* pGeneralPage = pParent ? pParent->getGeneralPage() : nullptr;
1230     if (pGeneralPage)
1231     {
1232         bIsPDFASel = pGeneralPage->IsPdfaSelected();
1233     }
1234     if (bIsPDFASel)
1235     {
1236         mxUserPwdPdfa->show();
1237         mxUserPwdSet->hide();
1238         mxUserPwdUnset->hide();
1239     }
1240     else
1241     {
1242         if (mbHaveUserPassword && m_xContainer->get_sensitive())
1243         {
1244             mxUserPwdSet->show();
1245             mxUserPwdUnset->hide();
1246             mxUserPwdPdfa->hide();
1247         }
1248         else
1249         {
1250             mxUserPwdUnset->show();
1251             mxUserPwdSet->hide();
1252             mxUserPwdPdfa->hide();
1253         }
1254     }
1255 
1256     bool bLocalEnable = mbHaveOwnerPassword && m_xContainer->get_sensitive();
1257     if (bIsPDFASel)
1258     {
1259         mxOwnerPwdPdfa->show();
1260         mxOwnerPwdSet->hide();
1261         mxOwnerPwdUnset->hide();
1262     }
1263     else
1264     {
1265         if (bLocalEnable)
1266         {
1267             mxOwnerPwdSet->show();
1268             mxOwnerPwdUnset->hide();
1269             mxOwnerPwdPdfa->hide();
1270         }
1271         else
1272         {
1273             mxOwnerPwdUnset->show();
1274             mxOwnerPwdSet->hide();
1275             mxOwnerPwdPdfa->hide();
1276         }
1277     }
1278 
1279     mxPrintPermissions->set_sensitive(bLocalEnable);
1280     mxChangesAllowed->set_sensitive(bLocalEnable);
1281     mxContent->set_sensitive(bLocalEnable);
1282 }
1283 
1284 // This tab page is under control of the PDF/A-1a checkbox:
1285 // TODO: implement a method to do it.
ImplPDFASecurityControl(bool bEnableSecurity)1286 void ImpPDFTabSecurityPage::ImplPDFASecurityControl( bool bEnableSecurity )
1287 {
1288     m_xContainer->set_sensitive(bEnableSecurity);
1289     // after enable, check the status of control as if the dialog was initialized
1290     enablePermissionControls();
1291 }
1292 
1293 /// The link preferences tab page (relative and other stuff)
ImpPDFTabLinksPage(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet & rCoreSet)1294 ImpPDFTabLinksPage::ImpPDFTabLinksPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet)
1295     : SfxTabPage(pPage, pController, "filter/ui/pdflinkspage.ui", "PdfLinksPage", &rCoreSet)
1296     , mbOpnLnksDefaultUserState(false)
1297     , mbOpnLnksLaunchUserState(false)
1298     , mbOpnLnksBrowserUserState(false)
1299     , m_xCbExprtBmkrToNmDst(m_xBuilder->weld_check_button("export"))
1300     , m_xCbOOoToPDFTargets(m_xBuilder->weld_check_button("convert"))
1301     , m_xCbExportRelativeFsysLinks(m_xBuilder->weld_check_button("exporturl"))
1302     , m_xRbOpnLnksDefault(m_xBuilder->weld_radio_button("default"))
1303     , m_xRbOpnLnksLaunch(m_xBuilder->weld_radio_button("openpdf"))
1304     , m_xRbOpnLnksBrowser(m_xBuilder->weld_radio_button("openinternet"))
1305 {
1306 }
1307 
~ImpPDFTabLinksPage()1308 ImpPDFTabLinksPage::~ImpPDFTabLinksPage()
1309 {
1310 }
1311 
Create(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * rAttrSet)1312 std::unique_ptr<SfxTabPage> ImpPDFTabLinksPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rAttrSet)
1313 {
1314     return std::make_unique<ImpPDFTabLinksPage>(pPage, pController, *rAttrSet);
1315 }
1316 
GetFilterConfigItem(ImpPDFTabDialog * pParent)1317 void ImpPDFTabLinksPage::GetFilterConfigItem( ImpPDFTabDialog* pParent  )
1318 {
1319     pParent->mbExportRelativeFsysLinks = m_xCbExportRelativeFsysLinks->get_active();
1320 
1321     bool bIsPDFASel = false;
1322     ImpPDFTabGeneralPage* pGeneralPage = pParent->getGeneralPage();
1323     if (pGeneralPage)
1324         bIsPDFASel = pGeneralPage->IsPdfaSelected();
1325     // if PDF/A-1 was not selected while exiting dialog...
1326     if( !bIsPDFASel )
1327     {
1328         // ...get the control states
1329         mbOpnLnksDefaultUserState = m_xRbOpnLnksDefault->get_active();
1330         mbOpnLnksLaunchUserState =  m_xRbOpnLnksLaunch->get_active();
1331         mbOpnLnksBrowserUserState = m_xRbOpnLnksBrowser->get_active();
1332     }
1333     // the control states, or the saved is used
1334     // to form the stored selection
1335     pParent->mnViewPDFMode = 0;
1336     if( mbOpnLnksBrowserUserState )
1337         pParent->mnViewPDFMode = 2;
1338     else if( mbOpnLnksLaunchUserState )
1339         pParent->mnViewPDFMode = 1;
1340 
1341     pParent->mbConvertOOoTargets = m_xCbOOoToPDFTargets->get_active();
1342     pParent->mbExportBmkToPDFDestination = m_xCbExprtBmkrToNmDst->get_active();
1343 }
1344 
SetFilterConfigItem(const ImpPDFTabDialog * pParent)1345 void ImpPDFTabLinksPage::SetFilterConfigItem( const  ImpPDFTabDialog* pParent )
1346 {
1347     m_xCbOOoToPDFTargets->set_active(pParent->mbConvertOOoTargets);
1348     m_xCbExprtBmkrToNmDst->set_active(pParent->mbExportBmkToPDFDestination);
1349 
1350     m_xRbOpnLnksDefault->connect_toggled(LINK(this, ImpPDFTabLinksPage, ClickRbOpnLnksDefaultHdl));
1351     m_xRbOpnLnksBrowser->connect_toggled(LINK(this, ImpPDFTabLinksPage, ClickRbOpnLnksBrowserHdl));
1352 
1353     m_xCbExportRelativeFsysLinks->set_active(pParent->mbExportRelativeFsysLinks);
1354     switch( pParent->mnViewPDFMode )
1355     {
1356     default:
1357     case 0:
1358         m_xRbOpnLnksDefault->set_active(true);
1359         mbOpnLnksDefaultUserState = true;
1360         break;
1361     case 1:
1362         m_xRbOpnLnksLaunch->set_active(true);
1363         mbOpnLnksLaunchUserState = true;
1364         break;
1365     case 2:
1366         m_xRbOpnLnksBrowser->set_active(true);
1367         mbOpnLnksBrowserUserState = true;
1368         break;
1369     }
1370 
1371     // now check the status of PDF/A selection
1372     // and set the link action accordingly
1373     // PDF/A-2 doesn't allow launch action on links
1374 
1375     ImpPDFTabGeneralPage* pGeneralPage = pParent->getGeneralPage();
1376     if (pGeneralPage)
1377         ImplPDFALinkControl(!pGeneralPage->mxCbPDFA->get_active());
1378 }
1379 
1380 
1381 /** Called from general tab, with PDFA/1 selection status.
1382     Retrieves/store the status of Launch action selection.
1383  */
ImplPDFALinkControl(bool bEnableLaunch)1384 void ImpPDFTabLinksPage::ImplPDFALinkControl( bool bEnableLaunch )
1385 {
1386     // set the value and position of link type selection
1387     if( bEnableLaunch )
1388     {
1389         m_xRbOpnLnksLaunch->set_sensitive(true);
1390         // restore user state with no PDF/A-1 selected
1391         m_xRbOpnLnksDefault->set_active(mbOpnLnksDefaultUserState);
1392         m_xRbOpnLnksLaunch->set_active(mbOpnLnksLaunchUserState);
1393         m_xRbOpnLnksBrowser->set_active(mbOpnLnksBrowserUserState);
1394     }
1395     else
1396     {
1397         // save user state with no PDF/A-1 selected
1398         mbOpnLnksDefaultUserState = m_xRbOpnLnksDefault->get_active();
1399         mbOpnLnksLaunchUserState = m_xRbOpnLnksLaunch->get_active();
1400         mbOpnLnksBrowserUserState = m_xRbOpnLnksBrowser->get_active();
1401         m_xRbOpnLnksLaunch->set_sensitive(false);
1402         if (mbOpnLnksLaunchUserState)
1403             m_xRbOpnLnksBrowser->set_active(true);
1404     }
1405 }
1406 
1407 /// Reset the memory of Launch action present when PDF/A-1 was requested
IMPL_LINK_NOARG(ImpPDFTabLinksPage,ClickRbOpnLnksDefaultHdl,weld::ToggleButton &,void)1408 IMPL_LINK_NOARG(ImpPDFTabLinksPage, ClickRbOpnLnksDefaultHdl, weld::ToggleButton&, void)
1409 {
1410     mbOpnLnksDefaultUserState = m_xRbOpnLnksDefault->get_active();
1411     mbOpnLnksLaunchUserState = m_xRbOpnLnksLaunch->get_active();
1412     mbOpnLnksBrowserUserState = m_xRbOpnLnksBrowser->get_active();
1413 }
1414 
1415 /// Reset the memory of a launch action present when PDF/A-1 was requested
IMPL_LINK_NOARG(ImpPDFTabLinksPage,ClickRbOpnLnksBrowserHdl,weld::ToggleButton &,void)1416 IMPL_LINK_NOARG(ImpPDFTabLinksPage, ClickRbOpnLnksBrowserHdl, weld::ToggleButton&, void)
1417 {
1418     mbOpnLnksDefaultUserState = m_xRbOpnLnksDefault->get_active();
1419     mbOpnLnksLaunchUserState = m_xRbOpnLnksLaunch->get_active();
1420     mbOpnLnksBrowserUserState = m_xRbOpnLnksBrowser->get_active();
1421 }
1422 
ImplErrorDialog(weld::Window * pParent,const std::set<vcl::PDFWriter::ErrorCode> & rErrors)1423 ImplErrorDialog::ImplErrorDialog(weld::Window* pParent, const std::set<vcl::PDFWriter::ErrorCode>& rErrors)
1424     : MessageDialogController(pParent, "filter/ui/warnpdfdialog.ui", "WarnPDFDialog", "grid")
1425     , m_xErrors(m_xBuilder->weld_tree_view("errors"))
1426     , m_xExplanation(m_xBuilder->weld_label("message"))
1427 {
1428     int nWidth = m_xErrors->get_approximate_digit_width() * 26;
1429     int nHeight = m_xErrors->get_height_rows(9);
1430     m_xErrors->set_size_request(nWidth, nHeight);
1431     m_xExplanation->set_size_request(nWidth, nHeight);
1432 
1433     for (auto const& error : rErrors)
1434     {
1435         switch(error)
1436         {
1437         case vcl::PDFWriter::Warning_Transparency_Omitted_PDFA:
1438             m_xErrors->append(PDFFilterResId(STR_WARN_TRANSP_PDFA), PDFFilterResId(STR_WARN_TRANSP_PDFA_SHORT), "dialog-warning");
1439             break;
1440         case vcl::PDFWriter::Warning_Transparency_Omitted_PDF13:
1441             m_xErrors->append(PDFFilterResId(STR_WARN_TRANSP_VERSION), PDFFilterResId(STR_WARN_TRANSP_VERSION_SHORT), "dialog-warning");
1442             break;
1443         case vcl::PDFWriter::Warning_FormAction_Omitted_PDFA:
1444             m_xErrors->append(PDFFilterResId(STR_WARN_FORMACTION_PDFA), PDFFilterResId(STR_WARN_FORMACTION_PDFA_SHORT), "dialog-warning");
1445             break;
1446         case vcl::PDFWriter::Warning_Transparency_Converted:
1447             m_xErrors->append(PDFFilterResId(STR_WARN_TRANSP_CONVERTED), PDFFilterResId(STR_WARN_TRANSP_CONVERTED_SHORT), "dialog-warning");
1448             break;
1449         case vcl::PDFWriter::Error_Signature_Failed:
1450             m_xErrors->append(PDFFilterResId(STR_ERR_PDF_EXPORT_ABORTED), PDFFilterResId(STR_ERR_SIGNATURE_FAILED), "dialog-error");
1451             break;
1452         default:
1453             break;
1454         }
1455     }
1456 
1457     if (m_xErrors->n_children() > 0)
1458     {
1459         m_xErrors->select(0);
1460         m_xExplanation->set_label(m_xErrors->get_id(0));
1461     }
1462 
1463     m_xErrors->connect_changed(LINK(this, ImplErrorDialog, SelectHdl));
1464 }
1465 
IMPL_LINK_NOARG(ImplErrorDialog,SelectHdl,weld::TreeView &,void)1466 IMPL_LINK_NOARG(ImplErrorDialog, SelectHdl, weld::TreeView&, void)
1467 {
1468     OUString aExplanation = m_xErrors->get_selected_id();
1469     m_xExplanation->set_label(aExplanation);
1470 }
1471 
1472 /// The digital signatures tab page
ImpPDFTabSigningPage(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet & rCoreSet)1473 ImpPDFTabSigningPage::ImpPDFTabSigningPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet)
1474     : SfxTabPage(pPage, pController, "filter/ui/pdfsignpage.ui", "PdfSignPage", &rCoreSet)
1475     , maSignCertificate()
1476     , mxEdSignCert(m_xBuilder->weld_entry("cert"))
1477     , mxPbSignCertSelect(m_xBuilder->weld_button("select"))
1478     , mxPbSignCertClear(m_xBuilder->weld_button("clear"))
1479     , mxEdSignPassword(m_xBuilder->weld_entry("password"))
1480     , mxEdSignLocation(m_xBuilder->weld_entry("location"))
1481     , mxEdSignContactInfo(m_xBuilder->weld_entry("contact"))
1482     , mxEdSignReason(m_xBuilder->weld_entry("reason"))
1483     , mxLBSignTSA(m_xBuilder->weld_combo_box("tsa"))
1484 {
1485     mxPbSignCertSelect->set_sensitive(true);
1486     mxPbSignCertSelect->connect_clicked(LINK(this, ImpPDFTabSigningPage, ClickmaPbSignCertSelect));
1487     mxPbSignCertClear->connect_clicked(LINK(this, ImpPDFTabSigningPage, ClickmaPbSignCertClear));
1488 }
1489 
~ImpPDFTabSigningPage()1490 ImpPDFTabSigningPage::~ImpPDFTabSigningPage()
1491 {
1492 }
1493 
IMPL_LINK_NOARG(ImpPDFTabSigningPage,ClickmaPbSignCertSelect,weld::Button &,void)1494 IMPL_LINK_NOARG(ImpPDFTabSigningPage, ClickmaPbSignCertSelect, weld::Button&, void)
1495 {
1496     Reference< security::XDocumentDigitalSignatures > xSigner(
1497         security::DocumentDigitalSignatures::createWithVersion(
1498             comphelper::getProcessComponentContext(), "1.2" ) );
1499     xSigner->setParentWindow(GetFrameWeld()->GetXWindow());
1500 
1501     // The use may provide a description while choosing a certificate.
1502     OUString aDescription;
1503     maSignCertificate = xSigner->chooseCertificate(aDescription);
1504 
1505     if (maSignCertificate.is())
1506     {
1507         mxEdSignCert->set_text(maSignCertificate->getSubjectName());
1508         mxPbSignCertClear->set_sensitive(true);
1509         mxEdSignLocation->set_sensitive(true);
1510         mxEdSignPassword->set_sensitive(true);
1511         mxEdSignContactInfo->set_sensitive(true);
1512         mxEdSignReason->set_sensitive(true);
1513         mxEdSignReason->set_text(aDescription);
1514 
1515         try
1516         {
1517             boost::optional<css::uno::Sequence<OUString>> aTSAURLs(officecfg::Office::Common::Security::Scripting::TSAURLs::get());
1518             if (aTSAURLs)
1519             {
1520                 const css::uno::Sequence<OUString>& rTSAURLs = aTSAURLs.get();
1521                 for (auto const& elem : rTSAURLs)
1522                 {
1523                     mxLBSignTSA->append_text(elem);
1524                 }
1525             }
1526         }
1527         catch (const uno::Exception &)
1528         {
1529             TOOLS_INFO_EXCEPTION("filter.pdf", "TSAURLsDialog::TSAURLsDialog()");
1530         }
1531 
1532         // If more than only the "None" entry is there, enable the ListBox
1533         if (mxLBSignTSA->get_count() > 1)
1534             mxLBSignTSA->set_sensitive(true);
1535     }
1536 }
1537 
IMPL_LINK_NOARG(ImpPDFTabSigningPage,ClickmaPbSignCertClear,weld::Button &,void)1538 IMPL_LINK_NOARG(ImpPDFTabSigningPage, ClickmaPbSignCertClear, weld::Button&, void)
1539 {
1540     mxEdSignCert->set_text("");
1541     maSignCertificate.clear();
1542     mxPbSignCertClear->set_sensitive(false);
1543     mxEdSignLocation->set_sensitive(false);
1544     mxEdSignPassword->set_sensitive(false);
1545     mxEdSignContactInfo->set_sensitive(false);
1546     mxEdSignReason->set_sensitive(false);
1547     mxLBSignTSA->set_sensitive(false);
1548 }
1549 
Create(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * rAttrSet)1550 std::unique_ptr<SfxTabPage> ImpPDFTabSigningPage::Create( weld::Container* pPage, weld::DialogController* pController,
1551                                                  const SfxItemSet* rAttrSet)
1552 {
1553     return std::make_unique<ImpPDFTabSigningPage>(pPage, pController, *rAttrSet);
1554 }
1555 
GetFilterConfigItem(ImpPDFTabDialog * pParent)1556 void ImpPDFTabSigningPage::GetFilterConfigItem( ImpPDFTabDialog* pParent  )
1557 {
1558     pParent->mbSignPDF = maSignCertificate.is();
1559     pParent->maSignCertificate = maSignCertificate;
1560     pParent->msSignLocation = mxEdSignLocation->get_text();
1561     pParent->msSignPassword = mxEdSignPassword->get_text();
1562     pParent->msSignContact = mxEdSignContactInfo->get_text();
1563     pParent->msSignReason = mxEdSignReason->get_text();
1564     // Entry 0 is 'None'
1565     if (mxLBSignTSA->get_active() >= 1)
1566         pParent->msSignTSA = mxLBSignTSA->get_active_text();
1567 }
1568 
SetFilterConfigItem(const ImpPDFTabDialog * pParent)1569 void ImpPDFTabSigningPage::SetFilterConfigItem( const  ImpPDFTabDialog* pParent )
1570 {
1571     mxEdSignLocation->set_sensitive(false);
1572     mxEdSignPassword->set_sensitive(false);
1573     mxEdSignContactInfo->set_sensitive(false);
1574     mxEdSignReason->set_sensitive(false);
1575     mxLBSignTSA->set_sensitive(false);
1576     mxPbSignCertClear->set_sensitive(false);
1577 
1578     if (pParent->mbSignPDF)
1579     {
1580         mxEdSignPassword->set_text(pParent->msSignPassword);
1581         mxEdSignLocation->set_text(pParent->msSignLocation);
1582         mxEdSignContactInfo->set_text(pParent->msSignContact);
1583         mxEdSignReason->set_text(pParent->msSignReason);
1584         maSignCertificate = pParent->maSignCertificate;
1585     }
1586 }
1587 
1588 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1589