1 | // -*- c++ -*- |
2 | /* |
3 | This file is part of the KDE libraries |
4 | SPDX-FileCopyrightText: 2003 Joseph Wenninger <jowenn@kde.org> |
5 | SPDX-FileCopyrightText: 2003 Andras Mantia <amantia@freemail.hu> |
6 | SPDX-FileCopyrightText: 2013 Teo Mrnjavac <teo@kde.org> |
7 | |
8 | SPDX-License-Identifier: LGPL-2.0-or-later |
9 | */ |
10 | |
11 | #include "kencodingfiledialog.h" |
12 | |
13 | #include "kfilewidget.h" |
14 | |
15 | #include <defaults-kfile.h> |
16 | |
17 | #include <KConfigGroup> |
18 | #include <KLocalizedString> |
19 | #include <KSharedConfig> |
20 | #include <KWindowConfig> |
21 | #include <krecentdocument.h> |
22 | |
23 | #include <QBoxLayout> |
24 | #include <QComboBox> |
25 | #include <QPushButton> |
26 | #include <QStringDecoder> |
27 | |
28 | struct KEncodingFileDialogPrivate { |
29 | KEncodingFileDialogPrivate() |
30 | : cfgGroup(KSharedConfig::openConfig(), ConfigGroup) |
31 | { |
32 | } |
33 | |
34 | QComboBox *encoding; |
35 | KFileWidget *w; |
36 | KConfigGroup cfgGroup; |
37 | }; |
38 | |
39 | KEncodingFileDialog::KEncodingFileDialog(const QUrl &startDir, |
40 | const QString &encoding, |
41 | const QString &filter, |
42 | const QString &title, |
43 | QFileDialog::AcceptMode type, |
44 | QWidget *parent) |
45 | : QDialog(parent, Qt::Dialog) |
46 | , d(new KEncodingFileDialogPrivate) |
47 | { |
48 | d->w = new KFileWidget(startDir, this); |
49 | d->w->setFilters(filters: KFileFilter::fromFilterString(filterString: filter)); |
50 | if (type == QFileDialog::AcceptOpen) { |
51 | d->w->setOperationMode(KFileWidget::Opening); |
52 | } else { |
53 | d->w->setOperationMode(KFileWidget::Saving); |
54 | } |
55 | |
56 | setWindowTitle(title); |
57 | // ops->clearHistory(); |
58 | |
59 | KWindowConfig::restoreWindowSize(window: windowHandle(), config: d->cfgGroup); |
60 | |
61 | QBoxLayout *mainLayout = new QVBoxLayout(this); |
62 | mainLayout->addWidget(d->w); |
63 | |
64 | d->w->okButton()->show(); |
65 | connect(sender: d->w->okButton(), signal: &QAbstractButton::clicked, context: this, slot: &KEncodingFileDialog::slotOk); |
66 | d->w->cancelButton()->show(); |
67 | connect(sender: d->w->cancelButton(), signal: &QAbstractButton::clicked, context: this, slot: &KEncodingFileDialog::slotCancel); |
68 | connect(sender: d->w, signal: &KFileWidget::accepted, context: this, slot: &KEncodingFileDialog::accept); |
69 | |
70 | d->encoding = new QComboBox(this); |
71 | d->w->setCustomWidget(i18n("Encoding:" ), widget: d->encoding); |
72 | |
73 | d->encoding->clear(); |
74 | QByteArray sEncoding = encoding.toUtf8(); |
75 | const auto systemEncoding = QStringDecoder(QStringDecoder::System).name(); |
76 | if (sEncoding.isEmpty() || sEncoding == "System" ) { |
77 | sEncoding = systemEncoding; |
78 | } |
79 | |
80 | auto encodings = QStringDecoder::availableCodecs(); |
81 | std::sort(first: encodings.begin(), last: encodings.end(), comp: [](auto &a, auto &b) { |
82 | return (a.compare(b, Qt::CaseInsensitive) < 0); |
83 | }); |
84 | |
85 | int insert = 0; |
86 | int system = 0; |
87 | bool foundRequested = false; |
88 | for (const auto &encoding : encodings) { |
89 | d->encoding->addItem(atext: encoding); |
90 | const auto codecName = QStringDecoder(encoding.toUtf8().constData()).name(); |
91 | if ((codecName == sEncoding) || (encoding.toUtf8() == sEncoding)) { |
92 | d->encoding->setCurrentIndex(insert); |
93 | foundRequested = true; |
94 | } |
95 | |
96 | if ((codecName == systemEncoding) || (encoding.toUtf8() == systemEncoding)) { |
97 | system = insert; |
98 | } |
99 | insert++; |
100 | } |
101 | |
102 | if (!foundRequested) { |
103 | d->encoding->setCurrentIndex(system); |
104 | } |
105 | } |
106 | |
107 | KEncodingFileDialog::~KEncodingFileDialog() = default; |
108 | |
109 | QString KEncodingFileDialog::selectedEncoding() const |
110 | { |
111 | if (d->encoding) { |
112 | return d->encoding->currentText(); |
113 | } else { |
114 | return QString(); |
115 | } |
116 | } |
117 | |
118 | KEncodingFileDialog::Result |
119 | KEncodingFileDialog::getOpenFileNameAndEncoding(const QString &encoding, const QUrl &startDir, const QString &filter, QWidget *parent, const QString &title) |
120 | { |
121 | KEncodingFileDialog dlg(startDir, encoding, filter, title.isNull() ? i18n("Open" ) : title, QFileDialog::AcceptOpen, parent); |
122 | |
123 | dlg.d->w->setMode(KFile::File | KFile::LocalOnly); |
124 | dlg.exec(); |
125 | |
126 | Result res; |
127 | res.fileNames << dlg.d->w->selectedFile(); |
128 | res.encoding = dlg.selectedEncoding(); |
129 | return res; |
130 | } |
131 | |
132 | KEncodingFileDialog::Result |
133 | KEncodingFileDialog::getOpenFileNamesAndEncoding(const QString &encoding, const QUrl &startDir, const QString &filter, QWidget *parent, const QString &title) |
134 | { |
135 | KEncodingFileDialog dlg(startDir, encoding, filter, title.isNull() ? i18n("Open" ) : title, QFileDialog::AcceptOpen, parent); |
136 | dlg.d->w->setMode(KFile::Files | KFile::LocalOnly); |
137 | dlg.exec(); |
138 | |
139 | Result res; |
140 | res.fileNames = dlg.d->w->selectedFiles(); |
141 | res.encoding = dlg.selectedEncoding(); |
142 | return res; |
143 | } |
144 | |
145 | KEncodingFileDialog::Result |
146 | KEncodingFileDialog::getOpenUrlAndEncoding(const QString &encoding, const QUrl &startDir, const QString &filter, QWidget *parent, const QString &title) |
147 | { |
148 | KEncodingFileDialog dlg(startDir, encoding, filter, title.isNull() ? i18n("Open" ) : title, QFileDialog::AcceptOpen, parent); |
149 | |
150 | dlg.d->w->setMode(KFile::File); |
151 | dlg.exec(); |
152 | |
153 | Result res; |
154 | res.URLs << dlg.d->w->selectedUrl(); |
155 | res.encoding = dlg.selectedEncoding(); |
156 | return res; |
157 | } |
158 | |
159 | KEncodingFileDialog::Result |
160 | KEncodingFileDialog::getOpenUrlsAndEncoding(const QString &encoding, const QUrl &startDir, const QString &filter, QWidget *parent, const QString &title) |
161 | { |
162 | KEncodingFileDialog dlg(startDir, encoding, filter, title.isNull() ? i18n("Open" ) : title, QFileDialog::AcceptOpen, parent); |
163 | |
164 | dlg.d->w->setMode(KFile::Files); |
165 | dlg.exec(); |
166 | |
167 | Result res; |
168 | res.URLs = dlg.d->w->selectedUrls(); |
169 | res.encoding = dlg.selectedEncoding(); |
170 | return res; |
171 | } |
172 | |
173 | KEncodingFileDialog::Result |
174 | KEncodingFileDialog::getSaveFileNameAndEncoding(const QString &encoding, const QUrl &dir, const QString &filter, QWidget *parent, const QString &title) |
175 | { |
176 | KEncodingFileDialog dlg(dir, encoding, filter, title.isNull() ? i18n("Save As" ) : title, QFileDialog::AcceptSave, parent); |
177 | dlg.d->w->setMode(KFile::File); |
178 | dlg.exec(); |
179 | |
180 | QString filename = dlg.d->w->selectedFile(); |
181 | if (!filename.isEmpty()) { |
182 | KRecentDocument::add(url: QUrl::fromLocalFile(localfile: filename)); |
183 | } |
184 | |
185 | Result res; |
186 | res.fileNames << filename; |
187 | res.encoding = dlg.selectedEncoding(); |
188 | return res; |
189 | } |
190 | |
191 | KEncodingFileDialog::Result |
192 | KEncodingFileDialog::getSaveUrlAndEncoding(const QString &encoding, const QUrl &dir, const QString &filter, QWidget *parent, const QString &title) |
193 | { |
194 | KEncodingFileDialog dlg(dir, encoding, filter, title.isNull() ? i18n("Save As" ) : title, QFileDialog::AcceptSave, parent); |
195 | dlg.d->w->setMode(KFile::File); |
196 | |
197 | Result res; |
198 | if (dlg.exec() == QDialog::Accepted) { |
199 | QUrl url = dlg.d->w->selectedUrl(); |
200 | if (url.isValid()) { |
201 | KRecentDocument::add(url); |
202 | } |
203 | res.URLs << url; |
204 | res.encoding = dlg.selectedEncoding(); |
205 | } |
206 | return res; |
207 | } |
208 | |
209 | QSize KEncodingFileDialog::sizeHint() const |
210 | { |
211 | return d->w->dialogSizeHint(); |
212 | } |
213 | |
214 | void KEncodingFileDialog::hideEvent(QHideEvent *e) |
215 | { |
216 | KWindowConfig::saveWindowSize(window: windowHandle(), config&: d->cfgGroup, options: KConfigBase::Persistent); |
217 | |
218 | QDialog::hideEvent(event: e); |
219 | } |
220 | |
221 | void KEncodingFileDialog::accept() |
222 | { |
223 | d->w->accept(); |
224 | QDialog::accept(); |
225 | } |
226 | |
227 | void KEncodingFileDialog::slotOk() |
228 | { |
229 | d->w->slotOk(); |
230 | } |
231 | |
232 | void KEncodingFileDialog::slotCancel() |
233 | { |
234 | d->w->slotCancel(); |
235 | reject(); |
236 | } |
237 | |
238 | #include "moc_kencodingfiledialog.cpp" |
239 | |