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"
28 #include "frontends/Alert.h"
30 #include "support/lstrings.h"
37 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
38 : ControlDialogBD(lv, d),
39 rtl_(false), newval_(0.0), oldval_(0), newvalue_(0), count_(0),
40 stop_(false), speller_(0)
44 void ControlSpellchecker::setParams()
47 // create spell object
50 if (lyxrc.use_pspell) {
51 tmp = (lyxrc.isp_use_alt_lang) ?
52 lyxrc.isp_alt_lang : lv_.buffer()->params.language->code();
54 speller_ = new PSpell(lv_.view()->buffer()->params, tmp);
57 tmp = (lyxrc.isp_use_alt_lang) ?
58 lyxrc.isp_alt_lang : lv_.buffer()->params.language->lang();
60 speller_ = new ISpell(lv_.view()->buffer()->params, tmp);
65 if (lyxrc.isp_use_alt_lang) {
66 Language const * lang = languages.getLanguage(tmp);
68 rtl_ = lang->RightToLeft();
70 rtl_ = lv_.buffer()->params.language->RightToLeft();
73 if (!speller_->error().empty()) {
81 void ControlSpellchecker::check()
83 SpellBase::Result res = SpellBase::OK;
86 // clear any old selection
87 LyXText * text = lv_.view()->getLyXText();
88 lv_.view()->toggleSelection(true);
89 lv_.view()->update(text, BufferView::SELECT);
91 while ((res == SpellBase::OK || res == SpellBase::IGNORE) && !stop_) {
92 word_ = lv_.view()->nextWord(newval_);
101 // Update slider if and only if value has changed
102 newvalue_ = int(100.0*newval_);
103 if (newvalue_!= oldval_) {
106 view().partialUpdate(0);
109 if (!speller_->alive()) clearParams();
111 res = speller_->check(word_);
114 if (!stop_ && !word_.empty())
115 lv_.view()->selectLastWord();
118 if (res != SpellBase::OK && res != SpellBase::IGNORE) {
119 view().partialUpdate(1);
124 void ControlSpellchecker::replace(string const & replacement)
126 lv_.view()->replaceWord(replacement);
131 void ControlSpellchecker::replaceAll(string const & replacement)
134 replace(replacement);
138 void ControlSpellchecker::insert()
140 speller_->insert(word_);
145 string ControlSpellchecker::getSuggestion()
147 string miss(speller_->nextMiss());
150 std::reverse(miss.begin(), miss.end());
156 string ControlSpellchecker::getWord()
160 std::reverse(tmp.begin(), tmp.end());
165 void ControlSpellchecker::ignoreAll()
167 speller_->accept(word_);
172 void ControlSpellchecker::stop()
175 lv_.view()->endOfSpellCheck();
179 void ControlSpellchecker::clearParams()
181 if (!speller_) return;
183 if (speller_->alive()) {
185 message_ = tostr(count_);
187 message_ += _(" words checked.");
190 message_ += _(" word checked.");
192 message_ = "\n" + message_;
193 message_ = _("Spellchecking completed! ") + message_;
196 message_ = speller_->error();
198 if (message_.empty())
199 message_ = _("The spell checker has died for some reason.\n"
200 "Maybe it has been killed.");
202 // make sure that the dialog is not launched
203 emergency_exit_ = true;
204 Alert::alert("The spellchecker has failed", message_);
209 lv_.view()->endOfSpellCheck();
211 // show closing message if any words were checked.
213 view().partialUpdate(2);
215 // reset values to initial