namespace {
+enchant::Broker & broker()
+{
+#ifdef HAVE_ENCHANT2
+ static enchant::Broker thebroker;
+ return thebroker;
+#else
+ return *enchant::Broker::instance();
+#endif
+}
+
+
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();
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 = broker().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 = nullptr;
}
- // FIXME error handling?
- return 0;
+ spellers_[lang] = m;
+ return m.speller;
}
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()
enchant::Dict * m = d->speller(word.lang()->code());
if (!m)
- return OK;
+ return NO_DICTIONARY;
- std::string utf8word(to_utf8(word.word()));
+ if (word.word().empty())
+ return WORD_OK;
+
+ 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();
+ }
}
vector<string> suggs = m->suggest(utf8word);
vector<string>::const_iterator it = suggs.begin();
-
+
for (; it != suggs.end(); ++it)
suggestions.push_back(from_utf8(*it));
}
{
if (!lang)
return false;
- enchant::Broker * instance = enchant::Broker::instance();
- return (instance->dict_exists(lang->code()));
+ return broker().dict_exists(lang->code());
+}
+
+
+int EnchantChecker::numDictionaries() const
+{
+ return d->spellers_.size();
}