Added exception and event handling: gui & plugin
[mdictionary] / trunk / src / base / backbone / backbone.cpp
index c24c82d..e65582f 100644 (file)
@@ -18,7 +18,7 @@
     Copyright 2010 Comarch S.A.
 
 *******************************************************************************/
-/*! /file backbone.cpp
+/*! \file backbone.cpp
 \brief Backbone/core main file \see Backbone
 
 
 #include "backbone.h"
 #include <QDebug>
 
+int Backbone::_searchLimit;
+
+// Sadly QtConcurent::mapped dosent let me use something like calling method of
+// some class with supplied argument
 QString mappedSearch;
 QList<Translation*> mapSearch(CommonDictInterface *dict) {
     if(dict)
-        return dict->searchWordList(mappedSearch, 15);
+        return dict->searchWordList(mappedSearch, Backbone::_searchLimit);
     return QList<Translation*>();
 }
 
@@ -81,6 +85,7 @@ void Backbone::init() {
            QThreadPool::globalInstance()->maxThreadCount()+1);
 
    _history = new History(5, this);
+   _dictNum = 0;
 }
 
 
@@ -215,13 +220,16 @@ void Backbone::addDictionary(CommonDictInterface *dict, bool active) {
 
 
  void Backbone::addInternalDictionary(CommonDictInterface* dict, bool active) {
-     dict->setHash(_dicts.size()+1);
+     dict->setHash(++_dictNum);
      _dicts[dict] = active;
      connect(dict, SIGNAL(settingsChanged()), this, SLOT(dictUpdated()));
+     connect(dict, SIGNAL(notify(Notify::NotifyType,QString)), this,
+             SIGNAL(notify(Notify::NotifyType,QString)));
  }
 
  void Backbone::removeDictionary(CommonDictInterface *dict) {
      _dicts.remove(dict);
+     delete dict;
      dictUpdated();
 
  }
@@ -236,7 +244,11 @@ void Backbone::addDictionary(CommonDictInterface *dict, bool active) {
 
 
 void Backbone::translationReady() {
+    bool changed = 0; // prevents doubling ready() signal, when both if are
+                      //  executed in one translationReady() call then second
+                      // call doubles ready*() emit without any new data
     if(!dictFin && _innerResult.isFinished()) {
+        changed = 1;
         dictFin = 1;
         QFutureIterator<QList<Translation*> > it(_innerResult);
 
@@ -248,6 +260,7 @@ void Backbone::translationReady() {
     }
 
     if(!bookmarkFin && _innerBookmarks.isFinished()) {
+        changed = 1;
         bookmarkFin = 1;
         QList<Translation*> list = _innerBookmarks.result();
 
@@ -255,14 +268,17 @@ void Backbone::translationReady() {
                 _result.insert(trans->key().toLower(), trans);
     }
 
-    if(!stopped && bookmarkFin && dictFin)
+    if(!stopped && bookmarkFin && dictFin && changed) {
         Q_EMIT ready();
+        }
 }
 
 QStringList Backbone::getFilesFromDir(QString dir, QStringList nameFilter) {
     QDir plug(QDir::toNativeSeparators(dir));
     if(!plug.exists()) {
         qDebug() << plug.absolutePath() << " folder dosen't exists";
+        Q_EMIT notify(Notify::Warning,
+                QString("%1 folder dosen't exists.").arg(plug.path()));
         return QStringList();
     }
     plug.setFilter(QDir::Files);
@@ -284,6 +300,9 @@ void Backbone::loadPlugins() {
     foreach(QString file, files) {
         QPluginLoader loader(file);
         if(!loader.load()) {
+            Q_EMIT notify(Notify::Error,
+                    QString("%1 plugin cannot be loaded: %2.")
+                    .arg(file).arg(loader.errorString()));
             qDebug()<< file << " " << loader.errorString();
             continue;
         }
@@ -313,6 +332,9 @@ void Backbone::loadPrefs(QString fileName) {
     if(!confDir.exists()){
         qDebug() << "Configuration file dosn't exists ("
                 << file.filePath() << ")";
+        Q_EMIT notify(Notify::Warning,
+                QString("%1 configurationfile dosen't exists.")
+                .arg(file.filePath()));
         return;
     }
     QSettings set(file.filePath(), QSettings::IniFormat);
@@ -355,6 +377,9 @@ void Backbone::loadDicts(QString fileName, bool _default) {
     if(!confDir.exists()){
         qDebug() << "Configuration file dosn't exists ("
                 << file.filePath() << ")";
+        Q_EMIT notify(Notify::Warning,
+                QString("%1 configurationfile dosen't exists.")
+                .arg(file.filePath()));
         return;
     }
 
@@ -369,6 +394,9 @@ void Backbone::loadDicts(QString fileName, bool _default) {
             qDebug() << "Config file error: "
                     << set.value(dict + "/type", "").toString()
                     << " dosen't exists";
+            Q_EMIT notify(Notify::Warning,
+                    QString("Configuration file error. %2 plugin dosen't exists.")
+                    .arg(set.value(dict + "/type", "").toString()));
             continue;
         }
         Settings* plugSet = new Settings();
@@ -392,6 +420,7 @@ void Backbone::loadDicts(QString fileName, bool _default) {
 void Backbone::dictUpdated() {
     if(dryRun)
         return;
+    _history->setMaxSize(_historyLen);
     QFileInfo file(QDir::toNativeSeparators(_configPath));
     QDir confDir(file.dir());
     if(!confDir.exists())
@@ -447,8 +476,10 @@ void Backbone::searchHtml(QList<Translation *> translations) {
 
     QList<TranslationPtr> dummy;
     stopped = false;
-    foreach(Translation* tr, translations)
-        dummy.append(TranslationPtr(tr));
+    foreach(Translation* tr, translations) {
+        if(containsDict(tr->dict()) || !tr->dict())
+            dummy.append(TranslationPtr(tr));
+  }
 
    _innerHtmlResult = QtConcurrent::mapped(dummy,
                                             &TranslationPtr::toHtml);
@@ -491,8 +522,12 @@ void Backbone::setSettings(Settings *settings) {
     _searchLimit = settings->value("search_limit").toInt();
     if(settings->value("search_dictionaries") == "true")
         _searchDicts = 1;
+    else
+        _searchDicts = 0;
     if(settings->value("search_bookmarks") == "true")
         _searchBookmarks = 1;
+    else
+        _searchBookmarks = 0;
     dictUpdated();
 }
 
@@ -503,7 +538,25 @@ Settings* Backbone::settings() {
     Settings * settings = new Settings();
     settings->setValue("history_size", QString("%1").arg(_historyLen));
     settings->setValue("search_limit", QString("%1").arg(_searchLimit));
-    settings->setValue("search_dictionaries", QString("%1").arg(_searchDicts));
-    settings->setValue("search_bookmarks", QString("%1").arg(_searchBookmarks));
+    if(_searchBookmarks)
+        settings->setValue("search_bookmarks", "true");
+    else
+        settings->setValue("search_bookmarks", "false");
+
+    if(_searchDicts)
+        settings->setValue("search_dictionaries", "true");
+    else
+        settings->setValue("search_dictionaries", "false");
     return settings;
 }
+
+
+bool Backbone::containsDict(uint hash) const {
+    QHashIterator<CommonDictInterface*, bool> it(_dicts);
+    if (!hash)
+        return false;
+    while(it.hasNext())
+        if(it.next().key()->hash() == hash)
+            return true;
+    return false;
+}