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