1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
10 #include "EPUBExportDialog.hxx"
12 #include <libepubgen/libepubgen.h>
14 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
15 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
16 #include <com/sun/star/ui/dialogs/XFolderPicker2.hpp>
17 #include <comphelper/lok.hxx>
18 #include <comphelper/sequenceashashmap.hxx>
19 #include <sfx2/filedlghelper.hxx>
20 #include <sfx2/opengrf.hxx>
21 #include <sax/tools/converter.hxx>
22 #include <i18nlangtag/languagetag.hxx>
24 #include "EPUBExportFilter.hxx"
26 using namespace com::sun::star
;
30 /// Converts version value to a listbox entry position.
31 sal_Int32
VersionToPosition(sal_Int32 nVersion
)
33 sal_Int32 nPosition
= 0;
51 /// Converts listbox entry position to a version value.
52 sal_Int32
PositionToVersion(sal_Int32 nPosition
)
54 sal_Int32 nVersion
= 0;
73 namespace writerperfect
75 EPUBExportDialog::EPUBExportDialog(weld::Window
* pParent
,
76 comphelper::SequenceAsHashMap
& rFilterData
,
77 uno::Reference
<uno::XComponentContext
> xContext
,
78 css::uno::Reference
<css::lang::XComponent
> xDocument
)
79 : GenericDialogController(pParent
, "writerperfect/ui/exportepub.ui", "EpubDialog")
80 , m_xContext(std::move(xContext
))
81 , m_rFilterData(rFilterData
)
82 , m_xSourceDocument(std::move(xDocument
))
83 , m_xVersion(m_xBuilder
->weld_combo_box("versionlb"))
84 , m_xSplit(m_xBuilder
->weld_combo_box("splitlb"))
85 , m_xLayout(m_xBuilder
->weld_combo_box("layoutlb"))
86 , m_xCoverPath(m_xBuilder
->weld_entry("coverpath"))
87 , m_xCoverButton(m_xBuilder
->weld_button("coverbutton"))
88 , m_xMediaDir(m_xBuilder
->weld_entry("mediadir"))
89 , m_xMediaButton(m_xBuilder
->weld_button("mediabutton"))
90 , m_xOKButton(m_xBuilder
->weld_button("ok"))
91 , m_xIdentifier(m_xBuilder
->weld_entry("identifier"))
92 , m_xTitle(m_xBuilder
->weld_entry("title"))
93 , m_xInitialCreator(m_xBuilder
->weld_entry("author"))
94 , m_xLanguage(m_xBuilder
->weld_entry("language"))
95 , m_xDate(m_xBuilder
->weld_entry("date"))
96 , m_xCustomizeFrame(m_xBuilder
->weld_frame("customize"))
99 assert(PositionToVersion(m_xVersion
->get_active()) == EPUBExportFilter::GetDefaultVersion());
101 auto it
= rFilterData
.find("EPUBVersion");
102 if (it
!= rFilterData
.end())
104 sal_Int32 nVersion
= 0;
105 if (it
->second
>>= nVersion
)
106 m_xVersion
->set_active(VersionToPosition(nVersion
));
108 m_xVersion
->connect_changed(LINK(this, EPUBExportDialog
, VersionSelectHdl
));
110 it
= rFilterData
.find("EPUBSplitMethod");
111 if (it
!= rFilterData
.end())
113 sal_Int32 nSplitMethod
= 0;
114 if (it
->second
>>= nSplitMethod
)
115 // No conversion, 1:1 mapping between libepubgen::EPUBSplitMethod
116 // and entry positions.
117 m_xSplit
->set_active(nSplitMethod
);
120 m_xSplit
->set_active(EPUBExportFilter::GetDefaultSplitMethod());
121 m_xSplit
->connect_changed(LINK(this, EPUBExportDialog
, SplitSelectHdl
));
123 it
= rFilterData
.find("EPUBLayoutMethod");
124 if (it
!= rFilterData
.end())
126 sal_Int32 nLayoutMethod
= 0;
127 if (it
->second
>>= nLayoutMethod
)
128 // No conversion, 1:1 mapping between libepubgen::EPUBLayoutMethod
129 // and entry positions.
130 m_xLayout
->set_active(nLayoutMethod
);
133 m_xLayout
->set_active(EPUBExportFilter::GetDefaultLayoutMethod());
134 m_xLayout
->connect_changed(LINK(this, EPUBExportDialog
, LayoutSelectHdl
));
136 m_xCoverButton
->connect_clicked(LINK(this, EPUBExportDialog
, CoverClickHdl
));
138 m_xMediaButton
->connect_clicked(LINK(this, EPUBExportDialog
, MediaClickHdl
));
140 uno::Reference
<document::XDocumentPropertiesSupplier
> xDPS(m_xSourceDocument
, uno::UNO_QUERY
);
141 uno::Reference
<document::XDocumentProperties
> xDP
;
143 xDP
= xDPS
->getDocumentProperties();
146 m_xTitle
->set_text(xDP
->getTitle());
147 m_xInitialCreator
->set_text(xDP
->getAuthor());
149 OUString
aLanguage(LanguageTag::convertToBcp47(xDP
->getLanguage(), false));
150 m_xLanguage
->set_text(aLanguage
);
152 OUStringBuffer aBuffer
;
153 util::DateTime
aDate(xDP
->getModificationDate());
154 sax::Converter::convertDateTime(aBuffer
, aDate
, nullptr, true);
155 m_xDate
->set_text(aBuffer
.makeStringAndClear());
158 m_xOKButton
->connect_clicked(LINK(this, EPUBExportDialog
, OKClickHdl
));
160 if (comphelper::LibreOfficeKit::isActive())
161 m_xCustomizeFrame
->hide();
164 IMPL_LINK_NOARG(EPUBExportDialog
, VersionSelectHdl
, weld::ComboBox
&, void)
166 m_rFilterData
["EPUBVersion"] <<= PositionToVersion(m_xVersion
->get_active());
169 IMPL_LINK_NOARG(EPUBExportDialog
, SplitSelectHdl
, weld::ComboBox
&, void)
171 // No conversion, 1:1 mapping between entry positions and
172 // libepubgen::EPUBSplitMethod.
173 m_rFilterData
["EPUBSplitMethod"] <<= static_cast<sal_Int32
>(m_xSplit
->get_active());
176 IMPL_LINK_NOARG(EPUBExportDialog
, LayoutSelectHdl
, weld::ComboBox
&, void)
178 // No conversion, 1:1 mapping between entry positions and
179 // libepubgen::EPUBLayoutMethod.
180 m_rFilterData
["EPUBLayoutMethod"] <<= static_cast<sal_Int32
>(m_xLayout
->get_active());
181 m_xSplit
->set_sensitive(m_xLayout
->get_active() != libepubgen::EPUB_LAYOUT_METHOD_FIXED
);
184 IMPL_LINK_NOARG(EPUBExportDialog
, CoverClickHdl
, weld::Button
&, void)
186 SvxOpenGraphicDialog
aDlg("Import", m_xDialog
.get());
187 aDlg
.EnableLink(false);
188 if (aDlg
.Execute() == ERRCODE_NONE
)
189 m_xCoverPath
->set_text(aDlg
.GetPath());
192 IMPL_LINK_NOARG(EPUBExportDialog
, MediaClickHdl
, weld::Button
&, void)
194 uno::Reference
<ui::dialogs::XFolderPicker2
> xFolderPicker
195 = sfx2::createFolderPicker(m_xContext
, m_xDialog
.get());
196 if (xFolderPicker
->execute() != ui::dialogs::ExecutableDialogResults::OK
)
199 m_xMediaDir
->set_text(xFolderPicker
->getDirectory());
202 IMPL_LINK_NOARG(EPUBExportDialog
, OKClickHdl
, weld::Button
&, void)
205 if (!m_xCoverPath
->get_text().isEmpty())
206 m_rFilterData
["RVNGCoverImage"] <<= m_xCoverPath
->get_text();
207 if (!m_xMediaDir
->get_text().isEmpty())
208 m_rFilterData
["RVNGMediaDir"] <<= m_xMediaDir
->get_text();
211 if (!m_xIdentifier
->get_text().isEmpty())
212 m_rFilterData
["RVNGIdentifier"] <<= m_xIdentifier
->get_text();
213 if (!m_xTitle
->get_text().isEmpty())
214 m_rFilterData
["RVNGTitle"] <<= m_xTitle
->get_text();
215 if (!m_xInitialCreator
->get_text().isEmpty())
216 m_rFilterData
["RVNGInitialCreator"] <<= m_xInitialCreator
->get_text();
217 if (!m_xLanguage
->get_text().isEmpty())
218 m_rFilterData
["RVNGLanguage"] <<= m_xLanguage
->get_text();
219 if (!m_xDate
->get_text().isEmpty())
220 m_rFilterData
["RVNGDate"] <<= m_xDate
->get_text();
222 m_xDialog
->response(RET_OK
);
225 EPUBExportDialog::~EPUBExportDialog() = default;
227 } // namespace writerperfect
229 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */