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