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
10 #include "EPUBExportDialog.hxx"
11
12 #include <libepubgen/libepubgen.h>
13
14 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
15 #include <com/sun/star/ui/dialogs/FolderPicker.hpp>
16 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
17 #include <comphelper/sequenceashashmap.hxx>
18 #include <sfx2/opengrf.hxx>
19 #include <sax/tools/converter.hxx>
20 #include <i18nlangtag/languagetag.hxx>
21
22 #include "EPUBExportFilter.hxx"
23
24 using namespace com::sun::star;
25
26 namespace
27 {
28 /// Converts version value to a listbox entry position.
VersionToPosition(sal_Int32 nVersion)29 sal_Int32 VersionToPosition(sal_Int32 nVersion)
30 {
31 sal_Int32 nPosition = 0;
32
33 switch (nVersion)
34 {
35 case 30:
36 nPosition = 0;
37 break;
38 case 20:
39 nPosition = 1;
40 break;
41 default:
42 assert(false);
43 break;
44 }
45
46 return nPosition;
47 }
48
49 /// Converts listbox entry position to a version value.
PositionToVersion(sal_Int32 nPosition)50 sal_Int32 PositionToVersion(sal_Int32 nPosition)
51 {
52 sal_Int32 nVersion = 0;
53
54 switch (nPosition)
55 {
56 case 0:
57 nVersion = 30;
58 break;
59 case 1:
60 nVersion = 20;
61 break;
62 default:
63 assert(false);
64 break;
65 }
66
67 return nVersion;
68 }
69 }
70
71 namespace writerperfect
72 {
EPUBExportDialog(weld::Window * pParent,comphelper::SequenceAsHashMap & rFilterData,uno::Reference<uno::XComponentContext> xContext,css::uno::Reference<css::lang::XComponent> xDocument)73 EPUBExportDialog::EPUBExportDialog(weld::Window* pParent,
74 comphelper::SequenceAsHashMap& rFilterData,
75 uno::Reference<uno::XComponentContext> xContext,
76 css::uno::Reference<css::lang::XComponent> xDocument)
77 : GenericDialogController(pParent, "writerperfect/ui/exportepub.ui", "EpubDialog")
78 , m_xContext(std::move(xContext))
79 , m_rFilterData(rFilterData)
80 , m_xSourceDocument(std::move(xDocument))
81 , m_xVersion(m_xBuilder->weld_combo_box("versionlb"))
82 , m_xSplit(m_xBuilder->weld_combo_box("splitlb"))
83 , m_xLayout(m_xBuilder->weld_combo_box("layoutlb"))
84 , m_xCoverPath(m_xBuilder->weld_entry("coverpath"))
85 , m_xCoverButton(m_xBuilder->weld_button("coverbutton"))
86 , m_xMediaDir(m_xBuilder->weld_entry("mediadir"))
87 , m_xMediaButton(m_xBuilder->weld_button("mediabutton"))
88 , m_xOKButton(m_xBuilder->weld_button("ok"))
89 , m_xIdentifier(m_xBuilder->weld_entry("identifier"))
90 , m_xTitle(m_xBuilder->weld_entry("title"))
91 , m_xInitialCreator(m_xBuilder->weld_entry("author"))
92 , m_xLanguage(m_xBuilder->weld_entry("language"))
93 , m_xDate(m_xBuilder->weld_entry("date"))
94
95 {
96 assert(PositionToVersion(m_xVersion->get_active()) == EPUBExportFilter::GetDefaultVersion());
97
98 auto it = rFilterData.find("EPUBVersion");
99 if (it != rFilterData.end())
100 {
101 sal_Int32 nVersion = 0;
102 if (it->second >>= nVersion)
103 m_xVersion->set_active(VersionToPosition(nVersion));
104 }
105 m_xVersion->connect_changed(LINK(this, EPUBExportDialog, VersionSelectHdl));
106
107 it = rFilterData.find("EPUBSplitMethod");
108 if (it != rFilterData.end())
109 {
110 sal_Int32 nSplitMethod = 0;
111 if (it->second >>= nSplitMethod)
112 // No conversion, 1:1 mapping between libepubgen::EPUBSplitMethod
113 // and entry positions.
114 m_xSplit->set_active(nSplitMethod);
115 }
116 else
117 m_xSplit->set_active(EPUBExportFilter::GetDefaultSplitMethod());
118 m_xSplit->connect_changed(LINK(this, EPUBExportDialog, SplitSelectHdl));
119
120 it = rFilterData.find("EPUBLayoutMethod");
121 if (it != rFilterData.end())
122 {
123 sal_Int32 nLayoutMethod = 0;
124 if (it->second >>= nLayoutMethod)
125 // No conversion, 1:1 mapping between libepubgen::EPUBLayoutMethod
126 // and entry positions.
127 m_xLayout->set_active(nLayoutMethod);
128 }
129 else
130 m_xLayout->set_active(EPUBExportFilter::GetDefaultLayoutMethod());
131 m_xLayout->connect_changed(LINK(this, EPUBExportDialog, LayoutSelectHdl));
132
133 m_xCoverButton->connect_clicked(LINK(this, EPUBExportDialog, CoverClickHdl));
134
135 m_xMediaButton->connect_clicked(LINK(this, EPUBExportDialog, MediaClickHdl));
136
137 uno::Reference<document::XDocumentPropertiesSupplier> xDPS(m_xSourceDocument, uno::UNO_QUERY);
138 uno::Reference<document::XDocumentProperties> xDP;
139 if (xDPS.is())
140 xDP = xDPS->getDocumentProperties();
141 if (xDP.is())
142 {
143 m_xTitle->set_text(xDP->getTitle());
144 m_xInitialCreator->set_text(xDP->getAuthor());
145
146 OUString aLanguage(LanguageTag::convertToBcp47(xDP->getLanguage(), false));
147 m_xLanguage->set_text(aLanguage);
148
149 OUStringBuffer aBuffer;
150 util::DateTime aDate(xDP->getModificationDate());
151 sax::Converter::convertDateTime(aBuffer, aDate, nullptr, true);
152 m_xDate->set_text(aBuffer.makeStringAndClear());
153 }
154
155 m_xOKButton->connect_clicked(LINK(this, EPUBExportDialog, OKClickHdl));
156 }
157
IMPL_LINK_NOARG(EPUBExportDialog,VersionSelectHdl,weld::ComboBox &,void)158 IMPL_LINK_NOARG(EPUBExportDialog, VersionSelectHdl, weld::ComboBox&, void)
159 {
160 m_rFilterData["EPUBVersion"] <<= PositionToVersion(m_xVersion->get_active());
161 }
162
IMPL_LINK_NOARG(EPUBExportDialog,SplitSelectHdl,weld::ComboBox &,void)163 IMPL_LINK_NOARG(EPUBExportDialog, SplitSelectHdl, weld::ComboBox&, void)
164 {
165 // No conversion, 1:1 mapping between entry positions and
166 // libepubgen::EPUBSplitMethod.
167 m_rFilterData["EPUBSplitMethod"] <<= static_cast<sal_Int32>(m_xSplit->get_active());
168 }
169
IMPL_LINK_NOARG(EPUBExportDialog,LayoutSelectHdl,weld::ComboBox &,void)170 IMPL_LINK_NOARG(EPUBExportDialog, LayoutSelectHdl, weld::ComboBox&, void)
171 {
172 // No conversion, 1:1 mapping between entry positions and
173 // libepubgen::EPUBLayoutMethod.
174 m_rFilterData["EPUBLayoutMethod"] <<= static_cast<sal_Int32>(m_xLayout->get_active());
175 m_xSplit->set_sensitive(m_xLayout->get_active() != libepubgen::EPUB_LAYOUT_METHOD_FIXED);
176 }
177
IMPL_LINK_NOARG(EPUBExportDialog,CoverClickHdl,weld::Button &,void)178 IMPL_LINK_NOARG(EPUBExportDialog, CoverClickHdl, weld::Button&, void)
179 {
180 SvxOpenGraphicDialog aDlg("Import", m_xDialog.get());
181 aDlg.EnableLink(false);
182 if (aDlg.Execute() == ERRCODE_NONE)
183 m_xCoverPath->set_text(aDlg.GetPath());
184 }
185
IMPL_LINK_NOARG(EPUBExportDialog,MediaClickHdl,weld::Button &,void)186 IMPL_LINK_NOARG(EPUBExportDialog, MediaClickHdl, weld::Button&, void)
187 {
188 uno::Reference<ui::dialogs::XFolderPicker2> xFolderPicker
189 = ui::dialogs::FolderPicker::create(m_xContext);
190 if (xFolderPicker->execute() != ui::dialogs::ExecutableDialogResults::OK)
191 return;
192
193 m_xMediaDir->set_text(xFolderPicker->getDirectory());
194 }
195
IMPL_LINK_NOARG(EPUBExportDialog,OKClickHdl,weld::Button &,void)196 IMPL_LINK_NOARG(EPUBExportDialog, OKClickHdl, weld::Button&, void)
197 {
198 // General
199 if (!m_xCoverPath->get_text().isEmpty())
200 m_rFilterData["RVNGCoverImage"] <<= m_xCoverPath->get_text();
201 if (!m_xMediaDir->get_text().isEmpty())
202 m_rFilterData["RVNGMediaDir"] <<= m_xMediaDir->get_text();
203
204 // Metadata
205 if (!m_xIdentifier->get_text().isEmpty())
206 m_rFilterData["RVNGIdentifier"] <<= m_xIdentifier->get_text();
207 if (!m_xTitle->get_text().isEmpty())
208 m_rFilterData["RVNGTitle"] <<= m_xTitle->get_text();
209 if (!m_xInitialCreator->get_text().isEmpty())
210 m_rFilterData["RVNGInitialCreator"] <<= m_xInitialCreator->get_text();
211 if (!m_xLanguage->get_text().isEmpty())
212 m_rFilterData["RVNGLanguage"] <<= m_xLanguage->get_text();
213 if (!m_xDate->get_text().isEmpty())
214 m_rFilterData["RVNGDate"] <<= m_xDate->get_text();
215
216 m_xDialog->response(RET_OK);
217 }
218
219 EPUBExportDialog::~EPUBExportDialog() = default;
220
221 } // namespace writerperfect
222
223 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
224