KDECore
speller.cpp
Go to the documentation of this file.00001
00021 #include "speller.h"
00022
00023 #include "loader_p.h"
00024 #include "settings_p.h"
00025 #include "spellerplugin_p.h"
00026
00027 #include <kconfig.h>
00028 #include <kglobal.h>
00029 #include <klocale.h>
00030 #include <QLocale>
00031 #include <QSet>
00032 #include <QDebug>
00033
00034 namespace Sonnet
00035 {
00036
00037 class Speller::Private
00038 {
00039 public:
00040 ~Private()
00041 {
00042 delete dict;
00043 dict = 0;
00044 }
00045 void init(const QString &lang)
00046 {
00047 Loader *loader = Loader::openLoader();
00048 settings = loader->settings();
00049
00050 language = lang;
00051
00052 if (language.isEmpty())
00053 language = settings->defaultLanguage();
00054
00055 dict = loader->createSpeller(language);
00056 }
00057 bool isValid()
00058 {
00059 if (settings->modified()) {
00060 recreateDict();
00061 settings->setModified(false);
00062 }
00063 return dict;
00064 }
00065 void recreateDict()
00066 {
00067 delete dict;
00068 dict = Loader::openLoader()->createSpeller(language);
00069 }
00070
00071 SpellerPlugin *dict;
00072 Settings *settings;
00073
00074 QString language;
00075 };
00076
00077 Speller::Speller(const QString &lang)
00078 : d(new Private)
00079 {
00080 d->init(lang);
00081 }
00082
00083
00084 Speller::~Speller()
00085 {
00086
00087 delete d;
00088 }
00089
00090
00091 Speller::Speller(const Speller &speller)
00092 : d(new Private)
00093 {
00094 d->language = speller.language();
00095 d->init(d->language);
00096 }
00097
00098
00099 Speller & Speller::operator=(const Speller &speller)
00100 {
00101 d->language = speller.language();
00102 d->recreateDict();
00103 return *this;
00104 }
00105
00106
00107 bool Speller::isCorrect(const QString &word) const
00108 {
00109 if (!d->isValid())
00110 return true;
00111 return d->dict->isCorrect(word);
00112 }
00113
00114
00115 bool Speller::isMisspelled(const QString &word) const
00116 {
00117 if (!d->isValid())
00118 return false;
00119 return d->dict->isMisspelled(word);
00120 }
00121
00122 QStringList Speller::suggest(const QString &word) const
00123 {
00124 if (!d->isValid())
00125 return QStringList();
00126 return d->dict->suggest(word);
00127 }
00128
00129 bool Speller::checkAndSuggest(const QString &word,
00130 QStringList &suggestions) const
00131 {
00132 if (!d->isValid())
00133 return true;
00134 return d->dict->checkAndSuggest(word, suggestions);
00135 }
00136
00137
00138 bool Speller::storeReplacement(const QString &bad,
00139 const QString &good)
00140 {
00141 if (!d->isValid())
00142 return false;
00143 return d->dict->storeReplacement(bad, good);
00144 }
00145
00146
00147 bool Speller::addToPersonal(const QString &word)
00148 {
00149 if (!d->isValid())
00150 return false;
00151 return d->dict->addToPersonal(word);
00152 }
00153
00154
00155 bool Speller::addToSession(const QString &word)
00156 {
00157 if (!d->isValid())
00158 return false;
00159 return d->dict->addToSession(word);
00160 }
00161
00162
00163 QString Speller::language() const
00164 {
00165 if (!d->isValid())
00166 return QString();
00167 return d->dict->language();
00168 }
00169
00170
00171 void Speller::save(KConfig *config)
00172 {
00173 if (d->settings) {
00174 d->settings->save(config);
00175 }
00176 }
00177
00178
00179 void Speller::restore(KConfig *config)
00180 {
00181 if (d->settings) {
00182 d->settings->restore(config);
00183 d->recreateDict();
00184 }
00185 }
00186
00187
00188 QStringList Speller::availableBackends() const
00189 {
00190 Loader *l = Loader::openLoader();
00191 return l->clients();
00192 }
00193
00194
00195 QStringList Speller::availableLanguages() const
00196 {
00197 Loader *l = Loader::openLoader();
00198 return l->languages();
00199 }
00200
00201
00202 QStringList Speller::availableLanguageNames() const
00203 {
00204 Loader *l = Loader::openLoader();
00205 return l->languageNames();
00206 }
00207
00208
00209 void Speller::setDefaultLanguage(const QString &lang)
00210 {
00211 d->settings->setDefaultLanguage(lang);
00212 }
00213
00214
00215 QString Speller::defaultLanguage() const
00216 {
00217 return d->settings->defaultLanguage();
00218 }
00219
00220
00221 void Speller::setDefaultClient(const QString &client)
00222 {
00223 d->settings->setDefaultClient(client);
00224 }
00225
00226
00227 QString Speller::defaultClient() const
00228 {
00229 return d->settings->defaultClient();
00230 }
00231
00232
00233 void Speller::setAttribute(Attribute attr, bool b)
00234 {
00235 switch (attr) {
00236 case CheckUppercase:
00237 d->settings->setCheckUppercase(b);
00238 break;
00239 case SkipRunTogether:
00240 d->settings->setSkipRunTogether(b);
00241 break;
00242 }
00243 }
00244
00245
00246 bool Speller::testAttribute(Attribute attr) const
00247 {
00248 switch (attr) {
00249 case CheckUppercase:
00250 return d->settings->checkUppercase();
00251 break;
00252 case SkipRunTogether:
00253 return d->settings->skipRunTogether();
00254 break;
00255 }
00256 return false;
00257 }
00258
00259 bool Speller::isValid() const
00260 {
00261 return d->dict;
00262 }
00263
00264 void Speller::setLanguage(const QString &lang)
00265 {
00266 d->language = lang;
00267 d->recreateDict();
00268 }
00269
00270 QMap<QString, QString> Sonnet::Speller::availableDictionaries() const
00271 {
00272 Loader *l = Loader::openLoader();
00273 QStringList lst = l->languages();
00274 QMap<QString, QString> langs;
00275
00276 foreach(QString tag, lst) {
00277 tag = tag.mid(0, tag.indexOf('-'));
00278 int underscorePos = tag.indexOf('_');
00279 QString cIsoName, lIsoName;
00280 if (underscorePos != -1 && underscorePos <= 3) {
00281 cIsoName = tag.mid(underscorePos + 1, 2);
00282 lIsoName = tag.left(underscorePos);
00283 } else {
00284 lIsoName = tag;
00285 }
00286 QLocale loc(tag);
00287 QString description;
00288
00289 if (!cIsoName.isEmpty())
00290 description= QString("%1 (%2)")
00291 .arg(KGlobal::locale()->languageCodeToName(lIsoName))
00292 .arg(KGlobal::locale()->countryCodeToName(cIsoName));
00293 else
00294 description= QString("%1")
00295 .arg(KGlobal::locale()->languageCodeToName(lIsoName));
00296
00297 langs.insert(description, tag);
00298 }
00299
00300 return langs;
00301 }
00302
00303 }