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"
23 #include "frontends/Alert.h"
24 #include "support/lstrings.h"
32 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
33 : ControlDialogBD(lv, d),
34 rtl_(false), newval_(0.0), oldval_(0), newvalue_(0), count_(0),
35 stop_(false), speller_(0)
39 void ControlSpellchecker::setParams()
42 // create spell object
45 if (lyxrc.use_pspell) {
46 tmp = (lyxrc.isp_use_alt_lang) ?
47 lyxrc.isp_alt_lang : buffer()->params.language->code();
49 speller_ = new PSpell(buffer()->params, tmp);
52 tmp = (lyxrc.isp_use_alt_lang) ?
53 lyxrc.isp_alt_lang : buffer()->params.language->lang();
55 speller_ = new ISpell(buffer()->params, tmp);
60 if (lyxrc.isp_use_alt_lang) {
61 Language const * lang = languages.getLanguage(tmp);
63 rtl_ = lang->RightToLeft();
65 rtl_ = buffer()->params.language->RightToLeft();
68 if (!speller_->error().empty()) {
69 emergency_exit_ = true;
70 Alert::alert("The spellchecker has failed", speller_->error());
78 void ControlSpellchecker::check()
80 SpellBase::Result res = SpellBase::OK;
83 // clear any old selection
84 LyXText * text = bufferview()->getLyXText();
85 bufferview()->toggleSelection(true);
86 bufferview()->update(text, BufferView::SELECT);
88 while ((res == SpellBase::OK || res == SpellBase::IGNORE) && !stop_) {
89 word_ = bufferview()->nextWord(newval_);
91 if (word_.word().empty()) {
98 // Update slider if and only if value has changed
99 newvalue_ = int(100.0 * newval_);
100 if (newvalue_!= oldval_) {
103 view().partialUpdate(0);
106 if (!speller_->alive()) {
112 res = speller_->check(word_);
115 if (!stop_ && !word_.word().empty())
116 bufferview()->selectLastWord();
119 if (res != SpellBase::OK && res != SpellBase::IGNORE) {
120 view().partialUpdate(1);
125 void ControlSpellchecker::replace(string const & replacement)
127 bufferview()->replaceWord(replacement);
134 void ControlSpellchecker::replaceAll(string const & replacement)
137 replace(replacement);
141 void ControlSpellchecker::insert()
143 speller_->insert(word_);
148 string ControlSpellchecker::getSuggestion()
150 string miss(speller_->nextMiss());
153 std::reverse(miss.begin(), miss.end());
159 string ControlSpellchecker::getWord()
161 string tmp = word_.word();
163 std::reverse(tmp.begin(), tmp.end());
168 void ControlSpellchecker::ignoreAll()
170 speller_->accept(word_);
175 void ControlSpellchecker::stop()
178 bufferview()->endOfSpellCheck();
182 void ControlSpellchecker::clearParams()
187 if (speller_->alive()) {
189 message_ = tostr(count_);
191 message_ += _(" words checked.");
193 message_ += _(" word checked.");
195 message_ = "\n" + message_;
196 message_ = _("Spellchecking completed! ") + message_;
199 message_ = speller_->error();
201 if (message_.empty())
202 message_ = _("The spell checker has died for some reason.\n"
203 "Maybe it has been killed.");
205 // make sure that the dialog is not launched
206 emergency_exit_ = true;
207 Alert::alert("The spellchecker has failed", message_);
212 bufferview()->endOfSpellCheck();
214 // show closing message if any words were checked.
216 view().partialUpdate(2);
218 // reset values to initial