2 * \file ControlSpellchecker.C
3 * Read the file COPYING
7 * Full author contact details are available in file CREDITS
13 #pragma implementation
16 #include "ControlSpellchecker.h"
19 #include "BufferView.h"
24 #include "frontends/Alert.h"
25 #include "support/lstrings.h"
33 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
34 : ControlDialogBD(lv, d),
35 rtl_(false), newval_(0.0), oldval_(0), newvalue_(0), count_(0),
36 stop_(false), speller_(0)
40 void ControlSpellchecker::setParams()
43 // create spell object
46 if (lyxrc.use_pspell) {
47 tmp = (lyxrc.isp_use_alt_lang) ?
48 lyxrc.isp_alt_lang : buffer()->params.language->code();
50 speller_ = new PSpell(buffer()->params, tmp);
53 tmp = (lyxrc.isp_use_alt_lang) ?
54 lyxrc.isp_alt_lang : buffer()->params.language->lang();
56 speller_ = new ISpell(buffer()->params, tmp);
61 if (lyxrc.isp_use_alt_lang) {
62 Language const * lang = languages.getLanguage(tmp);
64 rtl_ = lang->RightToLeft();
66 rtl_ = buffer()->params.language->RightToLeft();
69 if (!speller_->error().empty()) {
70 emergency_exit_ = true;
71 Alert::alert("The spellchecker has failed", speller_->error());
79 void ControlSpellchecker::check()
81 SpellBase::Result res = SpellBase::OK;
84 // clear any old selection
85 LyXText * text = bufferview()->getLyXText();
86 bufferview()->toggleSelection(true);
87 bufferview()->update(text, BufferView::SELECT);
89 while ((res == SpellBase::OK || res == SpellBase::IGNORE) && !stop_) {
90 word_ = bufferview()->nextWord(newval_);
92 if (word_.word().empty()) {
99 // Update slider if and only if value has changed
100 newvalue_ = int(100.0 * newval_);
101 if (newvalue_!= oldval_) {
104 view().partialUpdate(0);
107 if (!speller_->alive()) {
113 res = speller_->check(word_);
116 if (!stop_ && !word_.word().empty())
117 bufferview()->selectLastWord();
120 if (res != SpellBase::OK && res != SpellBase::IGNORE) {
121 view().partialUpdate(1);
126 void ControlSpellchecker::replace(string const & replacement)
128 bufferview()->replaceWord(replacement);
135 void ControlSpellchecker::replaceAll(string const & replacement)
138 replace(replacement);
142 void ControlSpellchecker::insert()
144 speller_->insert(word_);
149 string ControlSpellchecker::getSuggestion()
151 string miss(speller_->nextMiss());
154 std::reverse(miss.begin(), miss.end());
160 string ControlSpellchecker::getWord()
162 string tmp = word_.word();
164 std::reverse(tmp.begin(), tmp.end());
169 void ControlSpellchecker::ignoreAll()
171 speller_->accept(word_);
176 void ControlSpellchecker::stop()
179 bufferview()->endOfSpellCheck();
183 void ControlSpellchecker::clearParams()
188 if (speller_->alive()) {
190 message_ = tostr(count_);
192 message_ += _(" words checked.");
194 message_ += _(" word checked.");
196 message_ = "\n" + message_;
197 message_ = _("Spellchecking completed! ") + message_;
200 message_ = speller_->error();
202 if (message_.empty())
203 message_ = _("The spell checker has died for some reason.\n"
204 "Maybe it has been killed.");
206 // make sure that the dialog is not launched
207 emergency_exit_ = true;
208 Alert::alert("The spellchecker has failed", message_);
213 bufferview()->endOfSpellCheck();
215 // show closing message if any words were checked.
217 view().partialUpdate(2);
219 // reset values to initial