kiten/lib
DictionaryManager.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "DictionaryManager.h"
00021 #include "DictionaryPreferenceDialog.h"
00022 #include "DictQuery.h"
00023 #include "Entry.h"
00024 #include "EntryList.h"
00025
00026 #include "dictFile.h"
00027
00028 #include <kdebug.h>
00029 #include <kglobal.h>
00030 #include <kconfig.h>
00031 #include <kconfigskeleton.h>
00032 #include <QtCore/QString>
00033 #include <QtCore/QFile>
00034
00035
00036
00037
00038 #include "dictEdict/dictFileEdict.h"
00039 #include "dictKanjidic/dictFileKanjidic.h"
00040 #include "dictDeinflect/dictFileDeinflect.h"
00041
00042 #if 0
00043 class debug_entry : public Entry {
00044 public:
00045 debug_entry(QString word) :
00046 Entry(QString("libkiten"),word,QStringList(),QStringList()),
00047 count(counter++) {
00048 }
00049 virtual Entry * clone() const { return new debug_entry(*this); }
00050 virtual bool loadEntry(const QString &) { return false; }
00051 virtual QString dumpEntry() const { return ""; }
00052 virtual bool sort(const debug_entry &that, const QStringList &dicts,
00053 const QStringList &fields) {
00054 return this->count < that.count;
00055 }
00056 int count;
00057 static int counter;
00058 };
00059 int debug_entry::counter = 0;
00060 #endif
00061
00065 dictFile *DictionaryManager::makeDictFile(const QString &type) {
00066 if(type == "edict")
00067 return new dictFileEdict();
00068 if(type == "kanjidic")
00069 return new dictFileKanjidic();
00070 if(type == "deinflect")
00071 return new dictFileDeinflect();
00072
00073
00074 return NULL;
00075 }
00079 QStringList DictionaryManager::listDictFileTypes() {
00080 QStringList list;
00081 list.append("edict");
00082 list.append("kanjidic");
00083 list.append("deinflect");
00084
00085 return list;
00086 }
00087
00088 class DictionaryManager::Private {
00089 public:
00091 QHash<QString,dictFile*> dictManagers;
00092 };
00093
00094
00095
00096 bool DictionaryManager::addDictionary(const QString &file, const QString &name,
00097 const QString &type) {
00098
00099 if(d->dictManagers.contains(name))
00100 return false;
00101
00102 dictFile *newDict = makeDictFile(type);
00103 if(newDict == NULL)
00104 return false;
00105
00106 if(!newDict->loadDictionary(file,name)) {
00107 kDebug() << "Dictionary load FAILED: " << newDict->getName();
00108 delete newDict;
00109 return false;
00110 }
00111
00112 kDebug() << "Dictionary Loaded : " << newDict->getName();
00113 d->dictManagers.insert(name,newDict);
00114 return true;
00115 }
00116
00117
00118 DictionaryManager::DictionaryManager() : d(new Private) {
00119 }
00120
00121
00122 DictionaryManager::~DictionaryManager() {
00123 {
00124 QMutableHashIterator<QString, dictFile*> it(d->dictManagers);
00125 while(it.hasNext()) {
00126 it.next();
00127 delete it.value();
00128 it.remove();
00129 }
00130 }
00131 delete d;
00132 }
00133
00134
00135
00136
00137 bool DictionaryManager::removeDictionary(const QString &name) {
00138 dictFile *file = d->dictManagers.take(name);
00139 delete file;
00140 return true;
00141 }
00142
00143
00144
00145
00146 QStringList DictionaryManager::listDictionaries() const {
00147 QStringList ret;
00148 foreach(dictFile *it, d->dictManagers)
00149 ret.append(it->getName());
00150 return ret;
00151 }
00152
00153
00154
00155
00156 QPair<QString, QString> DictionaryManager::listDictionaryInfo(const QString &name) const {
00157 if(!d->dictManagers.contains(name))
00158 return qMakePair(QString(),QString());
00159 return qMakePair(d->dictManagers[name]->getName(),d->dictManagers[name]->getFile());
00160 }
00161
00162
00163
00164 QStringList DictionaryManager::listDictionariesOfType(const QString &type) const {
00165 QStringList ret;
00166 QHash<QString, dictFile*>::const_iterator it = d->dictManagers.begin();
00167 while(it != d->dictManagers.end()) {
00168 if(it.value()->getType() == type)
00169 ret.append(it.key());
00170 ++it;
00171 }
00172 return ret;
00173 }
00174
00175
00176
00177
00178
00179 EntryList *DictionaryManager::doSearch(const DictQuery &query) const {
00180 EntryList *ret=new EntryList();
00181 #if 0
00182 if(query.getMeaning() == "(libkiten)") {
00183 ret->append(new debug_entry("Summary of libkiten data"));
00184 foreach(const QString &dict, listDictionaries()) {
00185 ret->append(new debug_entry(dict));
00186 }
00187 return ret;
00188 }
00189 #endif
00190
00191
00192
00193 QStringList dictsFromQuery = query.getDictionaries();
00194 if(dictsFromQuery.isEmpty()) {
00195 foreach( dictFile *it, d->dictManagers) {
00196 EntryList *temp=it->doSearch(query);
00197 if(temp)
00198 ret->appendList(temp);
00199 delete temp;
00200 }
00201 } else {
00202 foreach( const QString &target, dictsFromQuery) {
00203 dictFile *newestFound = d->dictManagers.find(target).value();
00204 if(newestFound != 0) {
00205 EntryList *temp = newestFound->doSearch(query);
00206 if(temp)
00207 ret->appendList(temp);
00208 delete temp;
00209 }
00210 }
00211 }
00212
00213 ret->setQuery(query);
00214 kDebug()<<"From query: '"<<query.toString()<<"' Found " << ret->count() << " results";
00215 kDebug()<<"Incoming match type: "<<query.getMatchType()<<" Outgoing: "<<ret->getQuery().getMatchType();
00216 return ret;
00217 }
00218
00219
00220
00221
00222 EntryList *DictionaryManager::doSearchInList(const DictQuery &query, const EntryList *list) const {
00223 EntryList *ret = new EntryList();
00224
00225 foreach( Entry* it, *list) {
00226 if(it->matchesQuery(query)) {
00227 Entry *x = it->clone();
00228 ret->append(x);
00229 }
00230 }
00231 ret->setQuery(query + list->getQuery());
00232 return ret;
00233 }
00234
00235
00236 void DictionaryManager::loadDictSettings(const QString &dictName, KConfigSkeleton *config) {
00237 dictFile *dict = this->makeDictFile(dictName);
00238 if(dict != NULL) {
00239 config->setCurrentGroup("dicts_"+dictName.toLower());
00240 dict->loadSettings(config);
00241 }
00242 }
00243
00244 void DictionaryManager::loadSettings(const KConfig &config) {
00245 }
00246
00247 QMap<QString,DictionaryPreferenceDialog*>
00248 DictionaryManager::generatePreferenceDialogs(KConfigSkeleton *config, QWidget *parent) {
00249 QMap<QString,DictionaryPreferenceDialog*> result;
00250 QStringList dictTypes = listDictFileTypes();
00251 foreach(const QString &dictType, dictTypes) {
00252 dictFile *tempDictFile = makeDictFile(dictType);
00253 DictionaryPreferenceDialog *newDialog =
00254 tempDictFile->preferencesWidget(config,parent);
00255 if(newDialog==NULL)
00256 continue;
00257 result.insert(dictType,newDialog);
00258 delete tempDictFile;
00259 }
00260 return result;
00261 }
00262
00263 QMap<QString, QString>
00264 DictionaryManager::generateExtendedFieldsList() {
00265 QMap<QString,QString> result;
00266 QStringList dictTypes = listDictFileTypes();
00267 foreach(const QString &dictType, dictTypes) {
00268 dictFile *tempDictFile = makeDictFile(dictType);
00269 QMap<QString,QString> tempList = tempDictFile->getSearchableAttributes();
00270 QMap<QString,QString>::const_iterator it = tempList.constBegin();
00271 while( it != tempList.constEnd() ) {
00272 if(!result.contains(it.key()))
00273 result.insert(it.key(),it.value());
00274 ++it;
00275 }
00276 delete tempDictFile;
00277 }
00278 return result;
00279 }
00280