summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
authorNickWingate <nick.wingate@collabora.com>2023-08-29 15:31:08 +0100
committerCaolán McNamara <caolan.mcnamara@collabora.com>2023-12-21 10:49:16 +0100
commit13bd849f60286c49457c290218e5b7acf9cadba8 (patch)
tree3e455d3bec6870eb648ed36257552fc1c4fc5245 /filter
parentdac88850909eb337cfaf96963fa4bffa91470381 (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.cxx62
-rw-r--r--filter/source/pdf/impdialog.hxx12
-rw-r--r--filter/source/pdf/pdfexport.cxx9
-rw-r--r--filter/uiconfig/ui/pdfgeneralpage.ui62
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"/>