ksconfig.cpp
00001 /* This file is part of the KDE libraries 00002 Copyright (C) 1997 David Sweet <dsweet@kde.org> 00003 Copyright (C) 2000-2001 Wolfram Diestel <wolfram@steloj.de> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License version 2 as published by the Free Software Foundation. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00017 Boston, MA 02110-1301, USA. 00018 */ 00019 00020 #include <config.h> 00021 00022 #include <tqcheckbox.h> 00023 #include <tqcombobox.h> 00024 #include <tqlabel.h> 00025 #include <tqlayout.h> 00026 #include <tqtimer.h> 00027 00028 #include <tdeapplication.h> 00029 #include <tdeconfig.h> 00030 #include <kdebug.h> 00031 #include <kdialog.h> 00032 #include <tdefiledialog.h> 00033 #include <tdeglobal.h> 00034 #include <klineedit.h> 00035 #include <tdelocale.h> 00036 #include <kpushbutton.h> 00037 #include <kstdguiitem.h> 00038 00039 #include "ksconfig.h" 00040 00041 class KSpellConfigPrivate 00042 { 00043 public: 00044 TQStringList replacelist; 00045 }; 00046 00047 00048 KSpellConfig::KSpellConfig (const KSpellConfig &_ksc) 00049 : TQWidget(0, 0), nodialog(true) 00050 , kc(0) 00051 , cb1(0) 00052 , cb2(0) 00053 , dictlist(0) 00054 , dictcombo(0) 00055 , encodingcombo(0) 00056 , clientcombo(0) 00057 { 00058 d = new KSpellConfigPrivate; 00059 setReplaceAllList( _ksc.replaceAllList() ); 00060 setNoRootAffix( _ksc.noRootAffix() ); 00061 setRunTogether( _ksc.runTogether() ); 00062 setDictionary( _ksc.dictionary() ); 00063 setDictFromList( _ksc.dictFromList() ); 00064 // setPersonalDict (_ksc.personalDict()); 00065 setIgnoreList( _ksc.ignoreList() ); 00066 setEncoding( _ksc.encoding() ); 00067 setClient( _ksc.client() ); 00068 } 00069 00070 00071 KSpellConfig::KSpellConfig( TQWidget *parent, const char *name, 00072 KSpellConfig *_ksc, bool addHelpButton ) 00073 : TQWidget (parent, name), nodialog(false) 00074 , kc(0) 00075 , cb1(0) 00076 , cb2(0) 00077 , dictlist(0) 00078 , dictcombo(0) 00079 , encodingcombo(0) 00080 , clientcombo(0) 00081 { 00082 d = new KSpellConfigPrivate; 00083 kc = TDEGlobal::config(); 00084 00085 if( !_ksc ) 00086 { 00087 readGlobalSettings(); 00088 } 00089 else 00090 { 00091 setNoRootAffix( _ksc->noRootAffix() ); 00092 setRunTogether( _ksc->runTogether() ); 00093 setDictionary( _ksc->dictionary() ); 00094 setDictFromList( _ksc->dictFromList() ); 00095 //setPersonalDict (_ksc->personalDict()); 00096 setIgnoreList( _ksc->ignoreList() ); 00097 setEncoding( _ksc->encoding() ); 00098 setClient( _ksc->client() ); 00099 } 00100 00101 TQGridLayout *glay = new TQGridLayout( this, 6, 3, 0, KDialog::spacingHint() ); 00102 cb1 = new TQCheckBox( i18n("Create &root/affix combinations" 00103 " not in dictionary"), this, "NoRootAffix" ); 00104 connect( cb1, TQT_SIGNAL(toggled(bool)), TQT_SLOT(sNoAff(bool)) ); 00105 glay->addMultiCellWidget( cb1, 0, 0, 0, 2 ); 00106 00107 cb2 = new TQCheckBox( i18n("Consider run-together &words" 00108 " as spelling errors"), this, "RunTogether" ); 00109 connect( cb2, TQT_SIGNAL(toggled(bool)), TQT_SLOT(sRunTogether(bool)) ); 00110 glay->addMultiCellWidget( cb2, 1, 1, 0, 2 ); 00111 00112 dictcombo = new TQComboBox( this, "DictFromList" ); 00113 dictcombo->setInsertionPolicy( TQComboBox::NoInsertion ); 00114 connect( dictcombo, TQT_SIGNAL (activated(int)), 00115 this, TQT_SLOT (sSetDictionary(int)) ); 00116 glay->addMultiCellWidget( dictcombo, 2, 2, 1, 2 ); 00117 00118 dictlist = new TQLabel( dictcombo, i18n("&Dictionary:"), this ); 00119 glay->addWidget( dictlist, 2 ,0 ); 00120 00121 encodingcombo = new TQComboBox( this, "Encoding" ); 00122 encodingcombo->insertItem( "US-ASCII" ); 00123 encodingcombo->insertItem( "ISO 8859-1" ); 00124 encodingcombo->insertItem( "ISO 8859-2" ); 00125 encodingcombo->insertItem( "ISO 8859-3" ); 00126 encodingcombo->insertItem( "ISO 8859-4" ); 00127 encodingcombo->insertItem( "ISO 8859-5" ); 00128 encodingcombo->insertItem( "ISO 8859-7" ); 00129 encodingcombo->insertItem( "ISO 8859-8" ); 00130 encodingcombo->insertItem( "ISO 8859-9" ); 00131 encodingcombo->insertItem( "ISO 8859-13" ); 00132 encodingcombo->insertItem( "ISO 8859-15" ); 00133 encodingcombo->insertItem( "UTF-8" ); 00134 encodingcombo->insertItem( "KOI8-R" ); 00135 encodingcombo->insertItem( "KOI8-U" ); 00136 encodingcombo->insertItem( "CP1251" ); 00137 encodingcombo->insertItem( "CP1255" ); 00138 00139 connect( encodingcombo, TQT_SIGNAL(activated(int)), this, 00140 TQT_SLOT(sChangeEncoding(int)) ); 00141 glay->addMultiCellWidget( encodingcombo, 3, 3, 1, 2 ); 00142 00143 TQLabel *tmpQLabel = new TQLabel( encodingcombo, i18n("&Encoding:"), this); 00144 glay->addWidget( tmpQLabel, 3, 0 ); 00145 00146 00147 clientcombo = new TQComboBox( this, "Client" ); 00148 clientcombo->insertItem( i18n("International Ispell") ); 00149 clientcombo->insertItem( i18n("Aspell") ); 00150 clientcombo->insertItem( i18n("Hspell") ); 00151 clientcombo->insertItem( i18n("Zemberek") ); 00152 connect( clientcombo, TQT_SIGNAL (activated(int)), this, 00153 TQT_SLOT (sChangeClient(int)) ); 00154 glay->addMultiCellWidget( clientcombo, 4, 4, 1, 2 ); 00155 00156 tmpQLabel = new TQLabel( clientcombo, i18n("&Client:"), this ); 00157 glay->addWidget( tmpQLabel, 4, 0 ); 00158 00159 if( addHelpButton ) 00160 { 00161 TQPushButton *pushButton = new KPushButton( KStdGuiItem::help(), this ); 00162 connect( pushButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(sHelp()) ); 00163 glay->addWidget(pushButton, 5, 2); 00164 } 00165 00166 fillInDialog(); 00167 } 00168 00169 KSpellConfig::~KSpellConfig() 00170 { 00171 delete d; 00172 } 00173 00174 00175 bool 00176 KSpellConfig::dictFromList() const 00177 { 00178 return dictfromlist; 00179 } 00180 00181 bool 00182 KSpellConfig::readGlobalSettings() 00183 { 00184 TDEConfigGroupSaver cs( kc,"KSpell" ); 00185 00186 setNoRootAffix ( kc->readNumEntry("KSpell_NoRootAffix", 0) ); 00187 setRunTogether ( kc->readNumEntry("KSpell_RunTogether", 0) ); 00188 setDictionary ( kc->readEntry("KSpell_Dictionary") ); 00189 setDictFromList ( kc->readNumEntry("KSpell_DictFromList", false) ); 00190 setEncoding ( kc->readNumEntry ("KSpell_Encoding", KS_E_UTF8) ); 00191 #if defined(__OpenBSD__) || defined(__FreeBSD__) 00192 setClient ( kc->readNumEntry ("KSpell_Client", KS_CLIENT_ASPELL) ); 00193 #else 00194 setClient ( kc->readNumEntry ("KSpell_Client", KS_CLIENT_ISPELL) ); 00195 #endif 00196 00197 return true; 00198 } 00199 00200 bool 00201 KSpellConfig::writeGlobalSettings () 00202 { 00203 TDEConfigGroupSaver cs( kc,"KSpell" ); 00204 00205 kc->writeEntry ("KSpell_NoRootAffix",(int) noRootAffix(), true, true); 00206 kc->writeEntry ("KSpell_RunTogether", (int) runTogether(), true, true); 00207 kc->writeEntry ("KSpell_Dictionary", dictionary(), true, true); 00208 kc->writeEntry ("KSpell_DictFromList",(int) dictFromList(), true, true); 00209 kc->writeEntry ("KSpell_Encoding", (int) encoding(), 00210 true, true); 00211 kc->writeEntry ("KSpell_Client", client(), 00212 true, true); 00213 kc->sync(); 00214 00215 return true; 00216 } 00217 00218 void 00219 KSpellConfig::sChangeEncoding( int i ) 00220 { 00221 kdDebug(750) << "KSpellConfig::sChangeEncoding(" << i << ")" << endl; 00222 setEncoding( i ); 00223 emit configChanged(); 00224 } 00225 00226 void 00227 KSpellConfig::sChangeClient( int i ) 00228 { 00229 setClient( i ); 00230 00231 // read in new dict list 00232 if ( dictcombo ) { 00233 if ( iclient == KS_CLIENT_ISPELL ) 00234 getAvailDictsIspell(); 00235 else if ( iclient == KS_CLIENT_HSPELL ) 00236 { 00237 langfnames.clear(); 00238 dictcombo->clear(); 00239 dictcombo->insertItem( i18n("Hebrew") ); 00240 sChangeEncoding( KS_E_CP1255 ); 00241 } else if ( iclient == KS_CLIENT_ZEMBEREK ) { 00242 langfnames.clear(); 00243 dictcombo->clear(); 00244 dictcombo->insertItem( i18n("Turkish") ); 00245 sChangeEncoding( KS_E_UTF8 ); 00246 } 00247 else 00248 getAvailDictsAspell(); 00249 } 00250 emit configChanged(); 00251 } 00252 00253 // KDE 4: Make it const TQString & fname (only fname) 00254 bool 00255 KSpellConfig::interpret( TQString &fname, TQString &lname, 00256 TQString &hname ) 00257 00258 { 00259 00260 kdDebug(750) << "KSpellConfig::interpret [" << fname << "]" << endl; 00261 00262 TQString dname( fname ); 00263 00264 if( dname.endsWith( "+" ) ) 00265 dname.remove( dname.length()-1, 1 ); 00266 00267 if( dname.endsWith("sml") || dname.endsWith("med") || dname.endsWith("lrg") || 00268 dname.endsWith("xlg")) 00269 dname.remove(dname.length()-3,3); 00270 00271 TQString extension; 00272 00273 int i = dname.find('-'); 00274 if ( i != -1 ) 00275 { 00276 extension = dname.mid(i+1); 00277 dname.truncate(i); 00278 } 00279 00280 // Aspell uses 2 alpha language codes or 2 alpha language + 2 alpha country, 00281 // but since aspell 0.6 also 3-character ISO-codes can be used 00282 if ( (dname.length() == 2) || (dname.length() == 3) ) { 00283 lname = dname; 00284 hname = TDEGlobal::locale()->twoAlphaToLanguageName( lname ); 00285 } 00286 else if ( (dname.length() == 5) && (dname[2] == '_') ) { 00287 lname = dname.left(2); 00288 hname = TDEGlobal::locale()->twoAlphaToLanguageName(lname); 00289 TQString country = TDEGlobal::locale()->twoAlphaToCountryName( dname.right(2) ); 00290 if ( extension.isEmpty() ) 00291 extension = country; 00292 else 00293 extension = country + " - " + extension; 00294 } 00295 //These are mostly the ispell-langpack defaults 00296 else if ( dname=="english" || dname=="american" || 00297 dname=="british" || dname=="canadian" ) { 00298 lname="en"; hname=i18n("English"); 00299 } 00300 else if ( dname == "espa~nol" || dname == "espanol" ) { 00301 lname="es"; hname=i18n("Spanish"); 00302 } 00303 else if (dname=="dansk") { 00304 lname="da"; hname=i18n("Danish"); 00305 } 00306 else if (dname=="deutsch") { 00307 lname="de"; hname=i18n("German"); 00308 } 00309 else if (dname=="german") { 00310 lname="de"; hname=i18n("German (new spelling)"); 00311 } 00312 else if (dname=="portuguesb" || dname=="br") { 00313 lname="br"; hname=i18n("Brazilian Portuguese"); 00314 } 00315 else if (dname=="portugues") { 00316 lname="pt"; hname=i18n("Portuguese"); 00317 } 00318 else if (dname=="esperanto") { 00319 lname="eo"; hname=i18n("Esperanto"); 00320 } 00321 else if (dname=="norsk") { 00322 lname="no"; hname=i18n("Norwegian"); 00323 } 00324 else if (dname=="polish") { 00325 lname="pl"; hname=i18n("Polish"); sChangeEncoding(KS_E_LATIN2); 00326 } 00327 else if (dname=="russian") { 00328 lname="ru"; hname=i18n("Russian"); 00329 } 00330 else if (dname=="slovensko") { 00331 lname="si"; hname=i18n("Slovenian"); sChangeEncoding(KS_E_LATIN2); 00332 } 00333 else if (dname=="slovak"){ 00334 lname="sk"; hname=i18n("Slovak"); sChangeEncoding(KS_E_LATIN2); 00335 } 00336 else if (dname=="czech") { 00337 lname="cs"; hname=i18n("Czech"); sChangeEncoding(KS_E_LATIN2); 00338 } 00339 else if (dname=="svenska") { 00340 lname="sv"; hname=i18n("Swedish"); 00341 } 00342 else if (dname=="swiss") { 00343 lname="de"; hname=i18n("Swiss German"); 00344 } 00345 else if (dname=="ukrainian") { 00346 lname="uk"; hname=i18n("Ukrainian"); 00347 } 00348 else if (dname=="lietuviu" || dname=="lithuanian") { 00349 lname="lt"; hname=i18n("Lithuanian"); 00350 } 00351 else if (dname=="francais" || dname=="french") { 00352 lname="fr"; hname=i18n("French"); 00353 } 00354 else if (dname=="belarusian") { // waiting for post 2.2 to not dissapoint translators 00355 lname="be"; hname=i18n("Belarusian"); 00356 } 00357 else if( dname == "magyar" ) { 00358 lname="hu"; hname=i18n("Hungarian"); 00359 sChangeEncoding(KS_E_LATIN2); 00360 } 00361 else { 00362 lname=""; hname=i18n("Unknown ispell dictionary", "Unknown"); 00363 } 00364 if (!extension.isEmpty()) 00365 { 00366 hname = hname + " (" + extension + ")"; 00367 } 00368 00369 //We have explicitly chosen English as the default here. 00370 if ( ( TDEGlobal::locale()->language() == TQString::fromLatin1("C") && 00371 lname==TQString::fromLatin1("en") ) || 00372 TDEGlobal::locale()->language() == lname ) 00373 return true; 00374 00375 return false; 00376 } 00377 00378 void 00379 KSpellConfig::fillInDialog () 00380 { 00381 if ( nodialog ) 00382 return; 00383 00384 kdDebug(750) << "KSpellConfig::fillinDialog" << endl; 00385 00386 cb1->setChecked( noRootAffix() ); 00387 cb2->setChecked( runTogether() ); 00388 encodingcombo->setCurrentItem( encoding() ); 00389 clientcombo->setCurrentItem( client() ); 00390 00391 // get list of available dictionaries 00392 if ( iclient == KS_CLIENT_ISPELL ) 00393 getAvailDictsIspell(); 00394 else if ( iclient == KS_CLIENT_HSPELL ) 00395 { 00396 langfnames.clear(); 00397 dictcombo->clear(); 00398 langfnames.append(""); // Default 00399 dictcombo->insertItem( i18n("Hebrew") ); 00400 } else if ( iclient == KS_CLIENT_ZEMBEREK ) { 00401 langfnames.clear(); 00402 dictcombo->clear(); 00403 langfnames.append(""); 00404 dictcombo->insertItem( i18n("Turkish") ); 00405 } 00406 else 00407 getAvailDictsAspell(); 00408 00409 // select the used dictionary in the list 00410 int whichelement=-1; 00411 00412 if ( dictFromList() ) 00413 whichelement = langfnames.findIndex(dictionary()); 00414 00415 dictcombo->setMinimumWidth (dictcombo->sizeHint().width()); 00416 00417 if (dictionary().isEmpty() || whichelement!=-1) 00418 { 00419 setDictFromList (true); 00420 if (whichelement!=-1) 00421 dictcombo->setCurrentItem(whichelement); 00422 } 00423 else 00424 // Current dictionary vanished, present the user with a default if possible. 00425 if ( !langfnames.empty() ) 00426 { 00427 setDictFromList( true ); 00428 dictcombo->setCurrentItem(0); 00429 } 00430 else 00431 setDictFromList( false ); 00432 00433 sDictionary( dictFromList() ); 00434 sPathDictionary( !dictFromList() ); 00435 00436 } 00437 00438 00439 void KSpellConfig::getAvailDictsIspell () { 00440 00441 langfnames.clear(); 00442 dictcombo->clear(); 00443 langfnames.append(""); // Default 00444 dictcombo->insertItem( i18n("ISpell Default") ); 00445 00446 // dictionary path 00447 TQFileInfo dir; 00448 TQStringList dirs; 00449 dirs 00450 << "/usr/" SYSTEM_LIBDIR "/ispell" 00451 << "/usr/lib/ispell" 00452 << "/usr/local/" SYSTEM_LIBDIR "/ispell" 00453 << "/usr/local/lib/ispell" 00454 << "/usr/local/share/ispell" 00455 << "/usr/share/ispell" 00456 << "/usr/pkg/lib"; 00457 for (TQStringList::ConstIterator it=dirs.begin(); it != dirs.end(); ++it) { 00458 dir.setFile(*it); 00459 if (dir.exists() && dir.isDir()) { 00460 break; 00461 } 00462 } 00463 /* TODO get them all instead of just one of them. 00464 * If /usr/local/lib exists, it skips the rest 00465 */ 00466 if (!dir.exists() || !dir.isDir()) return; 00467 00468 kdDebug(750) << "KSpellConfig::getAvailDictsIspell " 00469 << dir.filePath() << " " << dir.dirPath() << endl; 00470 00471 const TQDir thedir (dir.filePath(),"*.hash"); 00472 const TQStringList entryList = thedir.entryList(); 00473 00474 kdDebug(750) << "KSpellConfig" << thedir.path() << "\n" << endl; 00475 kdDebug(750) << "entryList().count()=" 00476 << entryList.count() << endl; 00477 00478 TQStringList::const_iterator entryListItr = entryList.constBegin(); 00479 const TQStringList::const_iterator entryListEnd = entryList.constEnd(); 00480 00481 for ( ; entryListItr != entryListEnd; ++entryListItr) 00482 { 00483 TQString fname, lname, hname; 00484 fname = *entryListItr; 00485 00486 // remove .hash 00487 if (fname.endsWith(".hash")) fname.remove (fname.length()-5,5); 00488 00489 if (interpret (fname, lname, hname) && langfnames.first().isEmpty()) 00490 { // This one is the KDE default language 00491 // so place it first in the lists (overwrite "Default") 00492 00493 langfnames.remove ( langfnames.begin() ); 00494 langfnames.prepend ( fname ); 00495 00496 hname=i18n("default spelling dictionary" 00497 ,"Default - %1 [%2]").arg(hname).arg(fname); 00498 00499 dictcombo->changeItem (hname,0); 00500 } 00501 else 00502 { 00503 langfnames.append (fname); 00504 hname=hname+" ["+fname+"]"; 00505 00506 dictcombo->insertItem (hname); 00507 } 00508 } 00509 } 00510 00511 void KSpellConfig::getAvailDictsAspell () { 00512 00513 langfnames.clear(); 00514 dictcombo->clear(); 00515 00516 langfnames.append(""); // Default 00517 dictcombo->insertItem (i18n("ASpell Default")); 00518 00519 // Aspell now have /usr/lib/aspell as 00520 // ASPELL_DATADIR default. 00521 TQFileInfo dir ( ASPELL_DATADIR ); 00522 if (!dir.exists() || !dir.isDir()) 00523 dir.setFile ("/usr/lib" KDELIBSUFF "/aspell-0.60"); 00524 if (!dir.exists() || !dir.isDir()) 00525 dir.setFile ("/usr/local/lib" KDELIBSUFF "/aspell"); 00526 if (!dir.exists() || !dir.isDir()) 00527 dir.setFile ("/usr/share/aspell"); 00528 if (!dir.exists() || !dir.isDir()) 00529 dir.setFile ("/usr/local/share/aspell"); 00530 if (!dir.exists() || !dir.isDir()) 00531 dir.setFile ("/usr/pkg/lib/aspell"); 00532 if (!dir.exists() || !dir.isDir()) return; 00533 00534 kdDebug(750) << "KSpellConfig::getAvailDictsAspell " 00535 << dir.filePath() << " " << dir.dirPath() << endl; 00536 00537 const TQDir thedir (dir.filePath(),"*"); 00538 const TQStringList entryList = thedir.entryList(); 00539 00540 kdDebug(750) << "KSpellConfig" << thedir.path() << "\n" << endl; 00541 kdDebug(750) << "entryList().count()=" 00542 << entryList.count() << endl; 00543 00544 TQStringList::const_iterator entryListItr = entryList.constBegin(); 00545 const TQStringList::const_iterator entryListEnd = entryList.constEnd(); 00546 00547 for ( ; entryListItr != entryListEnd; ++entryListItr) 00548 { 00549 TQString fname, lname, hname; 00550 fname = *entryListItr; 00551 00552 // consider only simple dicts without '-' in the name 00553 // FIXME: may be this is wrong an the list should contain 00554 // all *.multi files too, to allow using special dictionaries 00555 00556 // Well, KSpell2 has a better way to do this, but this code has to be 00557 // cleaned up somehow: since aspell 0.6 we have quite a lot of files in the 00558 // aspell dictionary that are not dictionaries. These must not be presented as "languages" 00559 // We only keep 00560 // *.rws: dictionary 00561 // *.multi: definition file to load several subdictionaries 00562 if ( !( fname.endsWith(".rws") || fname.endsWith(".multi") ) ) { 00563 // remove noise from the language list 00564 continue; 00565 } 00566 if (fname[0] != '.') 00567 { 00568 00569 // remove .multi 00570 if (fname.endsWith(".multi")) fname.remove (fname.length()-6,6); 00571 // remove .rws 00572 if (fname.endsWith(".rws")) fname.remove (fname.length()-4,4); 00573 00574 if (interpret (fname, lname, hname) && langfnames.first().isEmpty()) 00575 { // This one is the KDE default language 00576 // so place it first in the lists (overwrite "Default") 00577 00578 langfnames.remove ( langfnames.begin() ); 00579 langfnames.prepend ( fname ); 00580 00581 hname=i18n("default spelling dictionary" 00582 ,"Default - %1").arg(hname); 00583 00584 dictcombo->changeItem (hname,0); 00585 } 00586 else 00587 { 00588 langfnames.append (fname); 00589 dictcombo->insertItem (hname); 00590 } 00591 } 00592 } 00593 } 00594 00595 void 00596 KSpellConfig::fillDicts( TQComboBox* box, TQStringList* dictionaries ) 00597 { 00598 langfnames.clear(); 00599 if ( box ) { 00600 if ( iclient == KS_CLIENT_ISPELL ) { 00601 box->clear(); 00602 langfnames.append(""); // Default 00603 box->insertItem( i18n("ISpell Default") ); 00604 00605 // dictionary path 00606 TQFileInfo dir ("/usr/lib/ispell"); 00607 if (!dir.exists() || !dir.isDir()) 00608 dir.setFile ("/usr/local/lib/ispell"); 00609 if (!dir.exists() || !dir.isDir()) 00610 dir.setFile ("/usr/local/share/ispell"); 00611 if (!dir.exists() || !dir.isDir()) 00612 dir.setFile ("/usr/share/ispell"); 00613 if (!dir.exists() || !dir.isDir()) 00614 dir.setFile ("/usr/pkg/lib"); 00615 /* TODO get them all instead of just one of them. 00616 * If /usr/local/lib exists, it skips the rest 00617 if (!dir.exists() || !dir.isDir()) 00618 dir.setFile ("/usr/local/lib"); 00619 */ 00620 if (!dir.exists() || !dir.isDir()) return; 00621 00622 kdDebug(750) << "KSpellConfig::getAvailDictsIspell " 00623 << dir.filePath() << " " << dir.dirPath() << endl; 00624 00625 const TQDir thedir (dir.filePath(),"*.hash"); 00626 const TQStringList entryList = thedir.entryList(); 00627 00628 kdDebug(750) << "KSpellConfig" << thedir.path() << "\n" << endl; 00629 kdDebug(750) << "entryList().count()=" 00630 << entryList.count() << endl; 00631 00632 TQStringList::const_iterator entryListItr = entryList.constBegin(); 00633 const TQStringList::const_iterator entryListEnd = entryList.constEnd(); 00634 00635 for ( ; entryListItr != entryListEnd; ++entryListItr) 00636 { 00637 TQString fname, lname, hname; 00638 fname = *entryListItr; 00639 00640 // remove .hash 00641 if (fname.endsWith(".hash")) fname.remove (fname.length()-5,5); 00642 00643 if (interpret (fname, lname, hname) && langfnames.first().isEmpty()) 00644 { // This one is the KDE default language 00645 // so place it first in the lists (overwrite "Default") 00646 00647 langfnames.remove ( langfnames.begin() ); 00648 langfnames.prepend ( fname ); 00649 00650 hname=i18n("default spelling dictionary" 00651 ,"Default - %1 [%2]").arg(hname).arg(fname); 00652 00653 box->changeItem (hname,0); 00654 } 00655 else 00656 { 00657 langfnames.append (fname); 00658 hname=hname+" ["+fname+"]"; 00659 00660 box->insertItem (hname); 00661 } 00662 } 00663 } else if ( iclient == KS_CLIENT_HSPELL ) { 00664 box->clear(); 00665 box->insertItem( i18n("Hebrew") ); 00666 langfnames.append(""); // Default 00667 sChangeEncoding( KS_E_CP1255 ); 00668 } else if ( iclient == KS_CLIENT_ZEMBEREK ) { 00669 box->clear(); 00670 box->insertItem( i18n("Turkish") ); 00671 langfnames.append(""); 00672 sChangeEncoding( KS_E_UTF8 ); 00673 } 00674 else { 00675 box->clear(); 00676 langfnames.append(""); // Default 00677 box->insertItem (i18n("ASpell Default")); 00678 00679 // dictionary path 00680 // FIXME: use "aspell dump config" to find out the dict-dir 00681 TQFileInfo dir ("/usr/lib" KDELIBSUFF "/aspell"); 00682 if (!dir.exists() || !dir.isDir()) 00683 dir.setFile ("/usr/lib" KDELIBSUFF "/aspell-0.60"); 00684 if (!dir.exists() || !dir.isDir()) 00685 dir.setFile ("/usr/local/lib" KDELIBSUFF "/aspell"); 00686 if (!dir.exists() || !dir.isDir()) 00687 dir.setFile ("/usr/share/aspell"); 00688 if (!dir.exists() || !dir.isDir()) 00689 dir.setFile ("/usr/local/share/aspell"); 00690 if (!dir.exists() || !dir.isDir()) 00691 dir.setFile ("/usr/pkg/lib/aspell"); 00692 if (!dir.exists() || !dir.isDir()) return; 00693 00694 kdDebug(750) << "KSpellConfig::getAvailDictsAspell " 00695 << dir.filePath() << " " << dir.dirPath() << endl; 00696 00697 const TQDir thedir (dir.filePath(),"*"); 00698 const TQStringList entryList = thedir.entryList(); 00699 00700 kdDebug(750) << "KSpellConfig" << thedir.path() << "\n" << endl; 00701 kdDebug(750) << "entryList().count()=" 00702 << entryList.count() << endl; 00703 00704 TQStringList::const_iterator entryListItr = entryList.constBegin(); 00705 const TQStringList::const_iterator entryListEnd = entryList.constEnd(); 00706 00707 for ( ; entryListItr != entryListEnd; ++entryListItr) 00708 { 00709 TQString fname, lname, hname; 00710 fname = *entryListItr; 00711 00712 // consider only simple dicts without '-' in the name 00713 // FIXME: may be this is wrong an the list should contain 00714 // all *.multi files too, to allow using special dictionaries 00715 00716 // Well, KSpell2 has a better way to do this, but this code has to be 00717 // cleaned up somehow: since aspell 0.6 we have quite a lot of files in the 00718 // aspell dictionary that are not dictionaries. These must not be presented as "languages" 00719 // We only keep 00720 // *.rws: dictionary 00721 // *.multi: definition file to load several subdictionaries 00722 if ( !( fname.endsWith(".rws") || fname.endsWith(".multi") ) ) { 00723 // remove noise from the language list 00724 continue; 00725 } 00726 if (fname[0] != '.') 00727 { 00728 00729 // remove .multi 00730 if (fname.endsWith(".multi")) fname.remove (fname.length()-6,6); 00731 // remove .rws 00732 if (fname.endsWith(".rws")) fname.remove (fname.length()-4,4); 00733 00734 if (interpret (fname, lname, hname) && langfnames.first().isEmpty()) 00735 { // This one is the KDE default language 00736 // so place it first in the lists (overwrite "Default") 00737 00738 langfnames.remove ( langfnames.begin() ); 00739 langfnames.prepend ( fname ); 00740 00741 hname=i18n("default spelling dictionary" 00742 ,"Default - %1").arg(hname); 00743 00744 box->changeItem (hname,0); 00745 } 00746 else 00747 { 00748 langfnames.append (fname); 00749 box->insertItem (hname); 00750 } 00751 } 00752 } 00753 } 00754 int whichelement = langfnames.findIndex(qsdict); 00755 if ( whichelement >= 0 ) { 00756 box->setCurrentItem( whichelement ); 00757 } 00758 if ( dictionaries ) 00759 *dictionaries = langfnames; 00760 } 00761 } 00762 00763 /* 00764 * Options setting routines. 00765 */ 00766 00767 void 00768 KSpellConfig::setClient (int c) 00769 { 00770 iclient = c; 00771 00772 if (clientcombo) 00773 clientcombo->setCurrentItem(c); 00774 } 00775 00776 void 00777 KSpellConfig::setNoRootAffix (bool b) 00778 { 00779 bnorootaffix=b; 00780 00781 if(cb1) 00782 cb1->setChecked(b); 00783 } 00784 00785 void 00786 KSpellConfig::setRunTogether(bool b) 00787 { 00788 bruntogether=b; 00789 00790 if(cb2) 00791 cb2->setChecked(b); 00792 } 00793 00794 void 00795 KSpellConfig::setDictionary (const TQString s) 00796 { 00797 qsdict=s; //.copy(); 00798 00799 if (qsdict.length()>5) 00800 if ((signed)qsdict.find(".hash")==(signed)qsdict.length()-5) 00801 qsdict.remove (qsdict.length()-5,5); 00802 00803 00804 if(dictcombo) 00805 { 00806 int whichelement=-1; 00807 if (dictFromList()) 00808 { 00809 whichelement = langfnames.findIndex(s); 00810 00811 if(whichelement >= 0) 00812 { 00813 dictcombo->setCurrentItem(whichelement); 00814 } 00815 } 00816 } 00817 00818 00819 } 00820 00821 void 00822 KSpellConfig::setDictFromList (bool dfl) 00823 { 00824 // kdebug (KDEBUG_INFO, 750, "sdfl = %d", dfl); 00825 dictfromlist=dfl; 00826 } 00827 00828 /* 00829 void KSpellConfig::setPersonalDict (const char *s) 00830 { 00831 qspdict=s; 00832 } 00833 */ 00834 00835 void 00836 KSpellConfig::setEncoding (int enctype) 00837 { 00838 enc=enctype; 00839 00840 if(encodingcombo) 00841 encodingcombo->setCurrentItem(enctype); 00842 } 00843 00844 /* 00845 Options reading routines. 00846 */ 00847 int 00848 KSpellConfig::client () const 00849 { 00850 return iclient; 00851 } 00852 00853 00854 bool 00855 KSpellConfig::noRootAffix () const 00856 { 00857 return bnorootaffix; 00858 } 00859 00860 bool 00861 KSpellConfig::runTogether() const 00862 { 00863 return bruntogether; 00864 } 00865 00866 const 00867 TQString KSpellConfig::dictionary () const 00868 { 00869 return qsdict; 00870 } 00871 00872 /* 00873 const TQString KSpellConfig::personalDict () const 00874 { 00875 return qspdict; 00876 } 00877 */ 00878 00879 int 00880 KSpellConfig::encoding () const 00881 { 00882 return enc; 00883 } 00884 00885 void 00886 KSpellConfig::sRunTogether(bool) 00887 { 00888 setRunTogether (cb2->isChecked()); 00889 emit configChanged(); 00890 } 00891 00892 void 00893 KSpellConfig::sNoAff(bool) 00894 { 00895 setNoRootAffix (cb1->isChecked()); 00896 emit configChanged(); 00897 } 00898 00899 /* 00900 void 00901 KSpellConfig::sBrowseDict() 00902 { 00903 return; 00904 00905 TQString qs( KFileDialog::getOpenFileName ("/usr/local/lib","*.hash") ); 00906 if ( !qs.isNull() ) 00907 kle1->setText (qs); 00908 00909 } 00910 */ 00911 00912 /* 00913 void KSpellConfig::sBrowsePDict() 00914 { 00915 //how do I find home directory path?? 00916 TQString qs( KFileDialog::getOpenFileName ("",".ispell_*") ); 00917 if ( !qs.isNull() ) 00918 kle2->setText (qs); 00919 00920 00921 } 00922 */ 00923 00924 void 00925 KSpellConfig::sSetDictionary (int i) 00926 { 00927 setDictionary (langfnames[i]); 00928 setDictFromList (true); 00929 TQTimer::singleShot( 0, this, TQT_SIGNAL( configChanged() ) ); 00930 } 00931 00932 void 00933 KSpellConfig::sDictionary(bool on) 00934 { 00935 if (on) 00936 { 00937 dictcombo->setEnabled (true); 00938 setDictionary (langfnames[dictcombo->currentItem()] ); 00939 setDictFromList (true); 00940 } 00941 else 00942 { 00943 dictcombo->setEnabled (false); 00944 } 00945 emit configChanged(); 00946 } 00947 00948 void 00949 KSpellConfig::sPathDictionary(bool on) 00950 { 00951 return; //enough for now 00952 00953 00954 if (on) 00955 { 00956 //kle1->setEnabled (true); 00957 // browsebutton1->setEnabled (true); 00958 //setDictionary (kle1->text()); 00959 setDictFromList (false); 00960 } 00961 else 00962 { 00963 //kle1->setEnabled (false); 00964 //browsebutton1->setEnabled (false); 00965 } 00966 emit configChanged(); 00967 } 00968 00969 00970 void KSpellConfig::activateHelp( void ) 00971 { 00972 sHelp(); 00973 } 00974 00975 void KSpellConfig::sHelp( void ) 00976 { 00977 kapp->invokeHelp("configuration", "tdespell"); 00978 } 00979 00980 /* 00981 void KSpellConfig::textChanged1 (const char *s) 00982 { 00983 setDictionary (s); 00984 } 00985 00986 void KSpellConfig::textChanged2 (const char *) 00987 { 00988 // setPersonalDict (s); 00989 } 00990 */ 00991 00992 void 00993 KSpellConfig::operator= (const KSpellConfig &ksc) 00994 { 00995 //We want to copy the data members, but not the 00996 //pointers to the child widgets 00997 setNoRootAffix (ksc.noRootAffix()); 00998 setRunTogether (ksc.runTogether()); 00999 setDictionary (ksc.dictionary()); 01000 setDictFromList (ksc.dictFromList()); 01001 // setPersonalDict (ksc.personalDict()); 01002 setEncoding (ksc.encoding()); 01003 setClient (ksc.client()); 01004 01005 fillInDialog(); 01006 } 01007 01008 // KDE 4: Make it const TQStringList & 01009 void 01010 KSpellConfig::setIgnoreList (TQStringList _ignorelist) 01011 { 01012 ignorelist=_ignorelist; 01013 } 01014 01015 TQStringList 01016 KSpellConfig::ignoreList () const 01017 { 01018 return ignorelist; 01019 } 01020 01021 // KDE 4: Make it const TQStringList & 01022 void 01023 KSpellConfig::setReplaceAllList (TQStringList _replacelist) 01024 { 01025 d->replacelist=_replacelist; 01026 } 01027 01028 TQStringList 01029 KSpellConfig::replaceAllList() const 01030 { 01031 return d->replacelist; 01032 } 01033 01034 #include "ksconfig.moc" 01035 01036 01037