]> git.lyx.org Git - lyx.git/blobdiff - src/EnchantChecker.cpp
Update fr.po
[lyx.git] / src / EnchantChecker.cpp
index 61becbcec86ef3b8e26378f2df493d75d72fa256..5ef399a24ad14ea8769d387223fd36a2a5e69793 100644 (file)
@@ -34,13 +34,14 @@ struct Speller {
        enchant::Dict * speller;
 };
 
-typedef std::map<std::string, Speller> Spellers;
-  
-} // anon namespace
+typedef map<string, Speller> Spellers;
+
+} // namespace
 
 struct EnchantChecker::Private
 {
-       Private() {}
+       Private()
+       {}
 
        ~Private();
 
@@ -60,30 +61,29 @@ EnchantChecker::Private::~Private()
        Spellers::iterator it = spellers_.begin();
        Spellers::iterator end = spellers_.end();
 
-       for (; it != end; ++it) {
+       for (; it != end; ++it)
                delete it->second.speller;
-       }
 }
 
 
 enchant::Dict * EnchantChecker::Private::addSpeller(string const & lang)
 {
        enchant::Broker * instance = enchant::Broker::instance();
+       Speller m;
 
-       if (!instance->dict_exists(lang))
+       try {
+               LYXERR(Debug::FILES, "request enchant speller for language " << lang);
+               m.speller = instance->request_dict(lang);
+       }
+       catch (enchant::Exception & e) {
                // FIXME error handling?
-               return 0;
-
-       enchant::Dict * dict = instance->request_dict(lang);
-
-       if (dict) {
-               Speller m;
-               m.speller = dict;
-               spellers_[lang] = m;
-               return m.speller;
+               const char * what = e.what();
+               LYXERR(Debug::FILES, "cannot add enchant speller: " <<
+                          ((what && *what) ? what : "unspecified enchant exception in request_dict()"));
+               m.speller = 0;
        }
-       // FIXME error handling?
-       return 0;
+       spellers_[lang] = m;
+       return m.speller;
 }
 
 
@@ -92,14 +92,14 @@ enchant::Dict * EnchantChecker::Private::speller(string const & lang)
        Spellers::iterator it = spellers_.find(lang);
        if (it != spellers_.end())
                return it->second.speller;
-       
+
        return addSpeller(lang);
 }
 
 
-EnchantChecker::EnchantChecker(): d(new Private)
-{
-}
+EnchantChecker::EnchantChecker()
+       : d(new Private)
+{}
 
 
 EnchantChecker::~EnchantChecker()
@@ -113,30 +113,53 @@ SpellChecker::Result EnchantChecker::check(WordLangTuple const & word)
        enchant::Dict * m = d->speller(word.lang()->code());
 
        if (!m)
-               return OK;
+               return NO_DICTIONARY;
+
+       if (word.word().empty())
+               return WORD_OK;
 
-       std::string utf8word(to_utf8(word.word()));
+       string utf8word = to_utf8(word.word());
 
        if (m->check(utf8word))
-               return OK;
+               return WORD_OK;
 
        return UNKNOWN_WORD;
 }
 
 
+void EnchantChecker::advanceChangeNumber()
+{
+       nextChangeNumber();
+}
+
+
 void EnchantChecker::insert(WordLangTuple const & word)
 {
-       Spellers::iterator it = d->spellers_.find(word.lang()->code());
-       if (it != d->spellers_.end())
-               it->second.speller->add(to_utf8(word.word()));
+       enchant::Dict * m = d->speller(word.lang()->code());
+       if (m) {
+               m->add(to_utf8(word.word()));
+               advanceChangeNumber();
+       }
+}
+
+
+void EnchantChecker::remove(WordLangTuple const & word)
+{
+       enchant::Dict * m = d->speller(word.lang()->code());
+       if (m) {
+               m->remove(to_utf8(word.word()));
+               advanceChangeNumber();
+       }
 }
 
 
 void EnchantChecker::accept(WordLangTuple const & word)
 {
-       Spellers::iterator it = d->spellers_.find(word.lang()->code());
-       if (it != d->spellers_.end())
-               it->second.speller->add_to_session(to_utf8(word.word()));
+       enchant::Dict * m = d->speller(word.lang()->code());
+       if (m) {
+               m->add_to_session(to_utf8(word.word()));
+               advanceChangeNumber();
+       }
 }
 
 
@@ -153,12 +176,27 @@ void EnchantChecker::suggest(WordLangTuple const & wl,
 
        vector<string> suggs = m->suggest(utf8word);
        vector<string>::const_iterator it = suggs.begin();
-       
+
        for (; it != suggs.end(); ++it)
                suggestions.push_back(from_utf8(*it));
 }
 
 
+bool EnchantChecker::hasDictionary(Language const * lang) const
+{
+       if (!lang)
+               return false;
+       enchant::Broker * instance = enchant::Broker::instance();
+       return (instance->dict_exists(lang->code()));
+}
+
+
+int EnchantChecker::numDictionaries() const
+{
+       return d->spellers_.size();
+}
+
+
 docstring const EnchantChecker::error()
 {
        return docstring();