diff options
author | NickWingate <nick.wingate@collabora.com> | 2023-08-29 15:31:08 +0100 |
---|---|---|
committer | Caolán McNamara <caolan.mcnamara@collabora.com> | 2023-12-21 10:49:16 +0100 |
commit | 13bd849f60286c49457c290218e5b7acf9cadba8 (patch) | |
tree | 3e455d3bec6870eb648ed36257552fc1c4fc5245 /filter | |
parent | dac88850909eb337cfaf96963fa4bffa91470381 (diff) |
Add export sheet range option to calc
User can specify which sheets to export e.g. '2-5,7'
exports sheets 2,3,4,5,7.
Note: this is different from exporting pages as one
sheet may contain several pages worth of content.
Also fix a bug where exporting only a selected sheet
causes the next sheet to be exported. e.g.:
Sheet 1 is empty, Sheet 2 has content. Exporting Sheet 1
results in Sheet 2's content being exported
Signed-off-by: NickWingate <nick.wingate@collabora.com>
Change-Id: Iecd42188ddbbbcd70eb37bec80783e29e3cb5b19
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156255
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159686
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Diffstat (limited to 'filter')
-rw-r--r-- | filter/source/pdf/impdialog.cxx | 62 | ||||
-rw-r--r-- | filter/source/pdf/impdialog.hxx | 12 | ||||
-rw-r--r-- | filter/source/pdf/pdfexport.cxx | 9 | ||||
-rw-r--r-- | filter/uiconfig/ui/pdfgeneralpage.ui | 62 |
4 files changed, 121 insertions, 24 deletions
diff --git a/filter/source/pdf/impdialog.cxx b/filter/source/pdf/impdialog.cxx index c7149b0ca534..c4e133297e95 100644 --- a/filter/source/pdf/impdialog.cxx +++ b/filter/source/pdf/impdialog.cxx @@ -108,8 +108,10 @@ ImpPDFTabDialog::ImpPDFTabDialog(weld::Window* pParent, const Sequence< Property mbCanCopyOrExtract( false ), mbCanExtractForAccessibility( true ), - mbIsRangeChecked( false ), + mbIsPageRangeChecked( false ), msPageRange( ' ' ), + mbIsSheetRangeChecked( false ), + msSheetRange( ' ' ), mbSelectionIsChecked( false ), mbExportRelativeFsysLinks( false ), @@ -506,8 +508,10 @@ Sequence< PropertyValue > ImpPDFTabDialog::GetFilterData() comphelper::makePropertyValue("RestrictPermissions", mbRestrictPermissions), comphelper::makePropertyValue("PreparedPermissionPassword", maPreparedOwnerPassword) }; - if( mbIsRangeChecked ) + if( mbIsPageRangeChecked ) aRet.push_back(comphelper::makePropertyValue("PageRange", msPageRange)); + if( mbIsSheetRangeChecked ) + aRet.push_back(comphelper::makePropertyValue("SheetRange", msSheetRange)); else if( mbSelectionIsChecked ) aRet.push_back(comphelper::makePropertyValue("Selection", maSelection)); @@ -531,9 +535,11 @@ ImpPDFTabGeneralPage::ImpPDFTabGeneralPage(weld::Container* pPage, weld::DialogC , mbIsWriter(false) , mpParent(nullptr) , mxRbAll(m_xBuilder->weld_radio_button("all")) - , mxRbRange(m_xBuilder->weld_radio_button("range")) + , mxRbPageRange(m_xBuilder->weld_radio_button("pagerange")) + , mxRbSheetRange(m_xBuilder->weld_radio_button("sheetrange")) , mxRbSelection(m_xBuilder->weld_radio_button("selection")) , mxEdPages(m_xBuilder->weld_entry("pages")) + , mxEdSheets(m_xBuilder->weld_entry("sheets")) , mxRbLosslessCompression(m_xBuilder->weld_radio_button("losslesscompress")) , mxRbJPEGCompression(m_xBuilder->weld_radio_button("jpegcompress")) , mxQualityFrame(m_xBuilder->weld_widget("qualityframe")) @@ -564,7 +570,7 @@ ImpPDFTabGeneralPage::ImpPDFTabGeneralPage(weld::Container* pPage, weld::DialogC , mxFtWatermark(m_xBuilder->weld_label("watermarklabel")) , mxEdWatermark(m_xBuilder->weld_entry("watermarkentry")) , mxSlidesFt(m_xBuilder->weld_label("slides")) - , mxSheetsFt(m_xBuilder->weld_label("selectedsheets")) + , mxSheetsSelectionFt(m_xBuilder->weld_label("selectedsheets")) { } @@ -579,11 +585,13 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) mpParent = pParent; // init this class data - mxRbRange->connect_toggled( LINK( this, ImpPDFTabGeneralPage, TogglePagesHdl ) ); + mxRbPageRange->connect_toggled( LINK( this, ImpPDFTabGeneralPage, TogglePagesHdl ) ); + mxRbSheetRange->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleSheetsHdl ) ); mxRbAll->set_active(true); mxRbAll->connect_toggled( LINK( this, ImpPDFTabGeneralPage, ToggleAllHdl ) ); TogglePagesHdl(); + ToggleSheetsHdl(); mxRbSelection->set_sensitive( pParent->mbSelectionPresent ); if ( pParent->mbSelectionPresent ) @@ -687,7 +695,7 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) if ( mbIsPresentation ) { - mxRbRange->set_label(mxSlidesFt->get_label()); + mxRbPageRange->set_label(mxSlidesFt->get_label()); mxCbExportNotesPages->show(); mxCbExportNotesPages->set_active(pParent->mbExportNotesPages); mxCbExportNotesPages->connect_toggled( LINK(this, ImpPDFTabGeneralPage, ToggleExportNotesPagesHdl ) ); @@ -714,10 +722,13 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) if( mbIsSpreadsheet ) { - mxRbSelection->set_label(mxSheetsFt->get_label()); + mxRbSelection->set_label(mxSheetsSelectionFt->get_label()); // tdf#105965 Make Selection/Selected sheets the default PDF export range setting for spreadsheets mxRbSelection->set_active(true); + mxRbSheetRange->show(); + mxEdSheets->show(); + mxCbSinglePageSheets->show(); mxCbSinglePageSheets->set_active(pParent->mbSinglePageSheets); mxCbSinglePageSheets->set_sensitive(!pParent->maConfigItem.IsReadOnly("SinglePageSheets")); @@ -726,6 +737,9 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem(ImpPDFTabDialog* pParent) { mxCbSinglePageSheets->hide(); mxCbSinglePageSheets->set_active(false); + mxRbSheetRange->hide(); + mxRbSheetRange->set_active(false); + mxEdSheets->hide(); } mxCbExportEmptyPages->set_active(!pParent->mbIsSkipEmptyPages); @@ -773,12 +787,17 @@ void ImpPDFTabGeneralPage::GetFilterConfigItem( ImpPDFTabDialog* pParent ) pParent->mbIsExportPlaceholders = mxCbExportPlaceholders->get_active(); pParent->mbAddStream = mxCbAddStream->get_visible() && mxCbAddStream->get_active(); - pParent->mbIsRangeChecked = false; - if( mxRbRange->get_active() ) + pParent->mbIsPageRangeChecked = false; + if( mxRbPageRange->get_active() ) { - pParent->mbIsRangeChecked = true; + pParent->mbIsPageRangeChecked = true; pParent->msPageRange = mxEdPages->get_text(); //FIXME all right on other languages ? } + else if ( mxRbSheetRange->get_active() ) + { + pParent->mbIsSheetRangeChecked = true; + pParent->msSheetRange = mxEdSheets->get_text(); + } else if( mxRbSelection->get_active() ) { pParent->mbSelectionIsChecked = mxRbSelection->get_active(); @@ -841,6 +860,12 @@ IMPL_LINK_NOARG(ImpPDFTabGeneralPage, TogglePagesHdl, weld::Toggleable&, void) EnableExportNotesPages(); } +IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleSheetsHdl, weld::Toggleable&, void) +{ + ToggleSheetsHdl(); + EnableExportNotesPages(); +} + IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleSelectionHdl, weld::Toggleable&, void) { EnableExportNotesPages(); @@ -848,11 +873,18 @@ IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleSelectionHdl, weld::Toggleable&, voi void ImpPDFTabGeneralPage::TogglePagesHdl() { - mxEdPages->set_sensitive( mxRbRange->get_active() ); - if (mxRbRange->get_active()) + mxEdPages->set_sensitive( mxRbPageRange->get_active() ); + if (mxRbPageRange->get_active()) mxEdPages->grab_focus(); } +void ImpPDFTabGeneralPage::ToggleSheetsHdl() +{ + mxEdSheets->set_sensitive( mxRbSheetRange->get_active() ); + if (mxRbSheetRange->get_active()) + mxEdSheets->grab_focus(); +} + void ImpPDFTabGeneralPage::EnableExportNotesPages() { if ( mbIsPresentation ) @@ -915,7 +947,8 @@ IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleAddStreamHdl, weld::Toggleable&, voi if( mxCbAddStream->get_active() ) { mxRbAll->set_active(true); - mxRbRange->set_sensitive( false ); + mxRbPageRange->set_sensitive( false ); + mxRbSheetRange->set_sensitive( false ); mxRbSelection->set_sensitive( false ); mxEdPages->set_sensitive( false ); mxRbAll->set_sensitive( false ); @@ -923,7 +956,8 @@ IMPL_LINK_NOARG(ImpPDFTabGeneralPage, ToggleAddStreamHdl, weld::Toggleable&, voi else { mxRbAll->set_sensitive(true); - mxRbRange->set_sensitive(true); + mxRbPageRange->set_sensitive(true); + mxRbSheetRange->set_sensitive(true); mxRbSelection->set_sensitive(true); } } diff --git a/filter/source/pdf/impdialog.hxx b/filter/source/pdf/impdialog.hxx index 8cbfc0af987f..95d25f99d705 100644 --- a/filter/source/pdf/impdialog.hxx +++ b/filter/source/pdf/impdialog.hxx @@ -128,8 +128,10 @@ class ImpPDFTabDialog final : public SfxTabDialogController bool mbCanExtractForAccessibility; css::uno::Reference< css::beans::XMaterialHolder > mxPreparedPasswords; - bool mbIsRangeChecked; + bool mbIsPageRangeChecked; OUString msPageRange; + bool mbIsSheetRangeChecked; + OUString msSheetRange; bool mbSelectionIsChecked; bool mbExportRelativeFsysLinks; @@ -184,9 +186,11 @@ class ImpPDFTabGeneralPage : public SfxTabPage ImpPDFTabDialog* mpParent; std::unique_ptr<weld::RadioButton> mxRbAll; - std::unique_ptr<weld::RadioButton> mxRbRange; + std::unique_ptr<weld::RadioButton> mxRbPageRange; + std::unique_ptr<weld::RadioButton> mxRbSheetRange; std::unique_ptr<weld::RadioButton> mxRbSelection; std::unique_ptr<weld::Entry> mxEdPages; + std::unique_ptr<weld::Entry> mxEdSheets; std::unique_ptr<weld::RadioButton> mxRbLosslessCompression; std::unique_ptr<weld::RadioButton> mxRbJPEGCompression; std::unique_ptr<weld::Widget> mxQualityFrame; @@ -217,10 +221,11 @@ class ImpPDFTabGeneralPage : public SfxTabPage std::unique_ptr<weld::Label> mxFtWatermark; std::unique_ptr<weld::Entry> mxEdWatermark; std::unique_ptr<weld::Label> mxSlidesFt; - std::unique_ptr<weld::Label> mxSheetsFt; + std::unique_ptr<weld::Label> mxSheetsSelectionFt; DECL_LINK(ToggleAllHdl, weld::Toggleable&, void); DECL_LINK(TogglePagesHdl, weld::Toggleable&, void); + DECL_LINK(ToggleSheetsHdl, weld::Toggleable&, void); DECL_LINK(ToggleSelectionHdl, weld::Toggleable&, void); DECL_LINK(ToggleCompressionHdl, weld::Toggleable&, void); DECL_LINK(ToggleReduceImageResolutionHdl, weld::Toggleable&, void); @@ -230,6 +235,7 @@ class ImpPDFTabGeneralPage : public SfxTabPage DECL_LINK(ToggleExportNotesPagesHdl, weld::Toggleable&, void); void TogglePagesHdl(); + void ToggleSheetsHdl(); void EnableExportNotesPages(); DECL_LINK(TogglePDFVersionOrUniversalAccessibilityHandle, weld::Toggleable&, void); diff --git a/filter/source/pdf/pdfexport.cxx b/filter/source/pdf/pdfexport.cxx index 7d07f8182bdc..1459590b2f23 100644 --- a/filter/source/pdf/pdfexport.cxx +++ b/filter/source/pdf/pdfexport.cxx @@ -59,6 +59,7 @@ #include <com/sun/star/io/XOutputStream.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/drawing/XShapes.hpp> +#include <com/sun/star/sheet/XSheetRange.hpp> #include <com/sun/star/security/XCertificate.hpp> #include <com/sun/star/beans/XMaterialHolder.hpp> #include <com/sun/star/xml/crypto/SEInitializer.hpp> @@ -518,6 +519,14 @@ bool PDFExport::Export( const OUString& rFile, const Sequence< PropertyValue >& { if ( rProp.Name == "PageRange" ) rProp.Value >>= aPageRange; + else if ( rProp.Name == "SheetRange" ) + { + Reference< frame::XController > xController( Reference< frame::XModel >( mxSrcDoc, UNO_QUERY_THROW )->getCurrentController() ); + Reference< sheet::XSheetRange > xView( xController, UNO_QUERY); + OUString aSheetRange; + rProp.Value >>= aSheetRange; + aSelection = xView->getSelectionFromString(aSheetRange); + } else if ( rProp.Name == "Selection" ) aSelection = rProp.Value; else if ( rProp.Name == "UseLosslessCompression" ) diff --git a/filter/uiconfig/ui/pdfgeneralpage.ui b/filter/uiconfig/ui/pdfgeneralpage.ui index 40c5fc4eb47d..f09113793d07 100644 --- a/filter/uiconfig/ui/pdfgeneralpage.ui +++ b/filter/uiconfig/ui/pdfgeneralpage.ui @@ -60,8 +60,8 @@ </packing> </child> <child> - <object class="GtkRadioButton" id="range"> - <property name="label" translatable="yes" context="pdfgeneralpage|range">_Pages:</property> + <object class="GtkRadioButton" id="pagerange"> + <property name="label" translatable="yes" context="pdfgeneralpage|pagerange">_Pages:</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="receives-default">False</property> @@ -74,8 +74,8 @@ <relation type="label-for" target="pages"/> </accessibility> <child internal-child="accessible"> - <object class="AtkObject" id="range-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="pdfgeneralpage|extended_tip|range">Exports the pages you type in the box.</property> + <object class="AtkObject" id="pagerange-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="pdfgeneralpage|extended_tip|pagerange">Exports the pages you type in the box.</property> </object> </child> </object> @@ -85,6 +85,31 @@ </packing> </child> <child> + <object class="GtkRadioButton" id="sheetrange"> + <property name="label" translatable="yes" context="pdfgeneralpage|sheetrange">_Sheets:</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="valign">center</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">all</property> + <accessibility> + <relation type="label-for" target="sheets"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="sheetrange-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="pdfgeneralpage|extended_tip|sheetrange">Exports the sheets you type in the box.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> <object class="GtkRadioButton" id="selection"> <property name="label" translatable="yes" context="pdfgeneralpage|selection">_Selection</property> <property name="visible">True</property> @@ -114,7 +139,7 @@ <property name="width-chars">5</property> <property name="truncate-multiline">True</property> <accessibility> - <relation type="labelled-by" target="range"/> + <relation type="labelled-by" target="pagerange"/> </accessibility> <child internal-child="accessible"> <object class="AtkObject" id="pages-atkobject"> @@ -128,11 +153,32 @@ </packing> </child> <child> + <object class="GtkEntry" id="sheets"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="activates-default">True</property> + <property name="width-chars">5</property> + <property name="truncate-multiline">True</property> + <accessibility> + <relation type="labelled-by" target="sheetrange"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="sheets-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="pdfgeneralpage|extended_tip|sheets">Exports the sheets you type in the box.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> <object class="GtkLabel" id="slides"> <property name="can-focus">False</property> <property name="no-show-all">True</property> <property name="halign">start</property> - <property name="label" translatable="yes" context="pdfgeneralpage|slides">Slides:</property> + <property name="label" translatable="yes" context="pdfgeneralpage|slides">_Slides:</property> </object> <packing> <property name="left-attach">0</property> @@ -1040,7 +1086,8 @@ <object class="GtkSizeGroup" id="sizegroupLabel"> <widgets> <widget name="all"/> - <widget name="range"/> + <widget name="pagerange"/> + <widget name="sheetrange"/> <widget name="selection"/> <widget name="losslesscompress"/> <widget name="box3"/> @@ -1051,6 +1098,7 @@ <object class="GtkSizeGroup" id="sizegroupWidget"> <widgets> <widget name="pages"/> + <widget name="sheets"/> <widget name="qualityframe"/> <widget name="resolution"/> <widget name="watermarkentry"/> |