2 * \file ControlSpellchecker.C
3 * Copyright 2001 the LyX Team
4 * Read the file COPYING
6 * \author Edwin Leuven <leuven@fee.uva.nl>
12 #pragma implementation
15 #include "ControlSpellchecker.h"
18 #include "BufferView.h"
27 #include "frontends/LyXView.h"
29 #include "support/lstrings.h"
36 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
37 : ControlDialogBD(lv, d),
38 rtl_(false), newval_(0.0), oldval_(0), newvalue_(0), count_(0),
39 stop_(false), speller_(0)
43 void ControlSpellchecker::setParams()
46 // create spell object
49 if (lyxrc.use_pspell) {
50 tmp = (lyxrc.isp_use_alt_lang) ?
51 lyxrc.isp_alt_lang : lv_.buffer()->params.language->code();
53 speller_ = new PSpell(lv_.view()->buffer()->params, tmp);
56 tmp = (lyxrc.isp_use_alt_lang) ?
57 lyxrc.isp_alt_lang : lv_.buffer()->params.language->lang();
59 speller_ = new ISpell(lv_.view()->buffer()->params, tmp);
64 if (lyxrc.isp_use_alt_lang) {
65 Language const * lang = languages.getLanguage(tmp);
67 rtl_ = lang->RightToLeft();
69 rtl_ = lv_.buffer()->params.language->RightToLeft();
72 if (!speller_->error().empty()) {
80 void ControlSpellchecker::check()
82 SpellBase::Result res = SpellBase::OK;
85 // clear any old selection
86 LyXText * text = lv_.view()->getLyXText();
87 lv_.view()->toggleSelection(true);
88 lv_.view()->update(text, BufferView::SELECT);
90 while ((res == SpellBase::OK || res == SpellBase::IGNORE) && !stop_) {
91 word_ = lv_.view()->nextWord(newval_);
100 // Update slider if and only if value has changed
101 newvalue_ = int(100.0*newval_);
102 if (newvalue_!= oldval_) {
105 view().partialUpdate(0);
108 if (!speller_->alive()) clearParams();
110 res = speller_->check(word_);
113 if (!stop_ && !word_.empty())
114 lv_.view()->selectLastWord();
117 if (res != SpellBase::OK && res != SpellBase::IGNORE) {
118 view().partialUpdate(1);
123 void ControlSpellchecker::replace(string const & replacement)
125 lv_.view()->replaceWord(replacement);
130 void ControlSpellchecker::replaceAll(string const & replacement)
133 replace(replacement);
137 void ControlSpellchecker::insert()
139 speller_->insert(word_);
144 string ControlSpellchecker::getSuggestion()
146 string miss(speller_->nextMiss());
149 std::reverse(miss.begin(), miss.end());
155 string ControlSpellchecker::getWord()
159 std::reverse(tmp.begin(), tmp.end());
164 void ControlSpellchecker::ignoreAll()
166 speller_->accept(word_);
171 void ControlSpellchecker::stop()
174 lv_.view()->endOfSpellCheck();
178 void ControlSpellchecker::clearParams()
180 if (!speller_) return;
182 if (speller_->alive()) {
184 message_ = tostr(count_);
186 message_ += _(" words checked.");
189 message_ += _(" word checked.");
191 message_ = "\n" + message_;
192 message_ = _("Spellchecking completed! ") + message_;
195 message_ = speller_->error();
197 if (message_.empty())
198 message_ = _("The spell checker has died for some reason.\n"
199 "Maybe it has been killed.");
201 // make sure that the dialog is not launched
202 emergency_exit_ = true;
207 lv_.view()->endOfSpellCheck();
209 // show closing message if any words were checked.
211 view().partialUpdate(2);
213 // reset values to initial