KDECore
speller.cpp
Go to the documentation of this file.
00001 // -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*- 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 //qDebug()<<"deleting "<<this; 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 const QStringList lst = l->languages(); 00274 QMap<QString, QString> langs; 00275 00276 foreach(QString tag, lst) { // krazy:exclude=foreach (no const& because tag is modified below) 00277 tag = tag.mid(0, tag.indexOf(QLatin1Char('-'))); 00278 int underscorePos = tag.indexOf(QLatin1Char('_')); 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::fromLatin1("%1 (%2)") 00291 .arg(KGlobal::locale()->languageCodeToName(lIsoName)) 00292 .arg(KGlobal::locale()->countryCodeToName(cIsoName)); 00293 else 00294 description= KGlobal::locale()->languageCodeToName(lIsoName); 00295 //qDebug()<<"Dict is "<<tag<<" ( "<<loc.name()<<")"<<", descr = "<<description; 00296 langs.insert(description, tag); 00297 } 00298 00299 return langs; 00300 } 00301 00302 }
KDE 4.6 API Reference