1 /* This file is part of the KDE project
2    Copyright (C) 2005-2012 Jarosław Staniek <staniek@kde.org>
3 
4    This program is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public
6    License as published by the Free Software Foundation; either
7    version 2 of the License, or (at your option) any later version.
8 
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13 
14    You should have received a copy of the GNU Library General Public License
15    along with this program; see the file COPYING.  If not, write to
16    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19 
20 #include "kexicharencodingcombobox.h"
21 #include <kexiutils/utils.h>
22 
23 #include <KCharsets>
24 #include <KLocalizedString>
25 
26 #include <QTextCodec>
27 #include <QLocale>
28 #include <QDebug>
29 
30 class Q_DECL_HIDDEN KexiCharacterEncodingComboBox::Private {
31 public:
32     Private();
33 
34     QHash<QString, QString> encodingDescriptionForName;
35     bool defaultEncodingAdded;
36 };
37 
38 KexiCharacterEncodingComboBox::KexiCharacterEncodingComboBox(
39     QWidget* parent, const QString& selectedEncoding)
40   : KComboBox(parent), d(new Private)
41 {
42     QString defaultEncoding(QString::fromLatin1(KexiUtils::encoding()));
43     QString defaultEncodingDescriptiveName;
44 
45     QString _selectedEncoding = selectedEncoding;
46     if (_selectedEncoding.isEmpty())
47         _selectedEncoding = defaultEncoding;
48 
49     QStringList descEncodings(KCharsets::charsets()->descriptiveEncodingNames());
50 
51     int id = 0;
52     foreach(const QString &descEncoding, descEncodings) {
53         bool found = false;
54         QString name(KCharsets::charsets()->encodingForName(descEncoding));
55         QTextCodec *codecForEnc = KCharsets::charsets()->codecForName(name, found);
56         if (found) {
57             addItem(descEncoding);
58             if (codecForEnc->name() == defaultEncoding || name == defaultEncoding) {
59                 defaultEncodingDescriptiveName = descEncoding;
60                 //remember, do not add, will be prepended later
61             } else {
62                 d->encodingDescriptionForName.insert(name, descEncoding);
63             }
64             if (codecForEnc->name() == _selectedEncoding || name == _selectedEncoding) {
65                 setCurrentIndex(id);
66             }
67             id++;
68         }
69     }
70 
71     //prepend default encoding, if present
72     if (!defaultEncodingDescriptiveName.isEmpty()) {
73         d->defaultEncodingAdded = true;
74         QString desc = xi18nc("Text encoding: Default", "Default: %1",
75                              defaultEncodingDescriptiveName);
76         insertItem(0, desc);
77         if (_selectedEncoding == defaultEncoding) {
78             setCurrentIndex(0);
79         }
80         d->encodingDescriptionForName.insert(defaultEncoding, desc);
81     }
82 }
83 
84 KexiCharacterEncodingComboBox::~KexiCharacterEncodingComboBox()
85 {
86     delete d;
87 }
88 
89 QString KexiCharacterEncodingComboBox::selectedEncoding() const
90 {
91     if (defaultEncodingSelected()) {
92         return QString::fromLatin1(KexiUtils::encoding());
93     } else {
94         return KCharsets::charsets()->encodingForName(currentText());
95     }
96 }
97 
98 void KexiCharacterEncodingComboBox::setSelectedEncoding(const QString& encodingName)
99 {
100     QString desc = d->encodingDescriptionForName[encodingName];
101     if (desc.isEmpty()) {
102         qWarning() << "no such encoding" << encodingName;
103         return;
104     }
105     setCurrentIndex(findText(desc));
106 }
107 
108 bool KexiCharacterEncodingComboBox::defaultEncodingSelected() const
109 {
110     return d->defaultEncodingAdded && 0 == currentIndex();
111 }
112 
113 void KexiCharacterEncodingComboBox::selectDefaultEncoding()
114 {
115     if (d->defaultEncodingAdded)
116         setCurrentIndex(0);
117 }
118 
119 KexiCharacterEncodingComboBox::Private::Private()
120   : defaultEncodingAdded(false)
121 {
122 }
123