1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright 2001 The LyX Team.
8 * ======================================================
10 * \file ControlSpellchecker.C
11 * \author Edwin Leuven <leuven@fee.uva.nl>
17 #pragma implementation
20 #include <sys/types.h> // needed by <sys/select.h> at least on freebsd
22 #ifdef HAVE_SYS_SELECT_H
23 # ifdef HAVE_STRINGS_H
24 // <strings.h> is needed at least on AIX because FD_ZERO uses bzero().
25 // BUT we cannot include both string.h and strings.h on Irix 6.5 :(
30 #include <sys/select.h>
35 #include "BufferView.h"
38 #include "support/lstrings.h"
42 #include "ButtonControllerBase.h"
43 #include "ControlSpellchecker.h"
47 # include "sp_ispell.h"
49 # include "sp_pspell.h"
56 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
57 : ControlDialogBD(lv, d),
58 rtl_(false), newval_(0.0), oldval_(0), newvalue_(0), count_(0),
59 stop_(false), result_(SpellBase::ISP_OK), speller_(0)
61 d_.showSpellchecker.connect(SigC::slot(this, &ControlSpellchecker::show));
65 void ControlSpellchecker::setParams()
68 // create spell object
71 if (lyxrc.use_pspell) {
72 tmp = (lyxrc.isp_use_alt_lang) ?
73 lyxrc.isp_alt_lang : lv_.buffer()->params.language->code();
75 speller_ = new PSpell(lv_.view()->buffer()->params, tmp);
78 tmp = (lyxrc.isp_use_alt_lang) ?
79 lyxrc.isp_alt_lang : lv_.buffer()->params.language->lang();
81 speller_ = new ISpell(lv_.view()->buffer()->params, tmp);
86 if (lyxrc.isp_use_alt_lang) {
87 Language const * lang = languages.getLanguage(tmp);
89 rtl_ = lang->RightToLeft();
91 rtl_ = lv_.buffer()->params.language->RightToLeft();
94 if (speller_->error() != 0) {
96 message_ = speller_->error();
98 view().partialUpdate(2);
107 void ControlSpellchecker::check()
109 result_ = SpellBase::ISP_OK;
112 while ((result_==SpellBase::ISP_OK || result_==SpellBase::ISP_IGNORE) &&
114 word_ = lv_.view()->nextWord(newval_);
123 // Update slider if and only if value has changed
124 newvalue_ = int(100.0*newval_);
125 if (newvalue_!= oldval_) {
128 view().partialUpdate(0);
131 if (!speller_->alive()) clearParams();
133 result_ = speller_->check(word_);
136 if (!stop_ && !word_.empty())
137 lv_.view()->selectLastWord();
140 if (result_!=SpellBase::ISP_OK && result_!=SpellBase::ISP_IGNORE) {
141 view().partialUpdate(1);
146 void ControlSpellchecker::replace(string const & replacement)
148 lv_.view()->replaceWord(replacement);
153 void ControlSpellchecker::replaceAll(string const & replacement)
156 replace(replacement);
160 void ControlSpellchecker::insert()
162 speller_->insert(word_);
167 string ControlSpellchecker::getSuggestion()
169 // this is needed because string tmp = nextmiss()
170 // segfaults when nextMiss is 0
172 char const * w = speller_->nextMiss();
176 if (rtl_) std::reverse(tmp.begin(), tmp.end());
183 string ControlSpellchecker::getWord()
186 if (rtl_) std::reverse(tmp.begin(), tmp.end());
191 void ControlSpellchecker::ignoreAll()
193 speller_->accept(word_);
198 void ControlSpellchecker::stop()
201 lv_.view()->endOfSpellCheck();
205 void ControlSpellchecker::clearParams()
207 if (!speller_) return;
209 if (speller_->alive()) {
211 message_ = tostr(count_);
213 message_ += _(" words checked.");
216 message_ += _(" word checked.");
218 message_ = "\n" + message_;
219 message_ = _("Spellchecking completed! ") + message_;
222 message_ = speller_->error();
224 if (message_.empty())
225 message_ = _("The spell checker has died for some reason.\n"
226 "Maybe it has been killed.");
228 // make sure that the dialog is not launched
229 emergency_exit_ = true;
234 lv_.view()->endOfSpellCheck();
236 // show closing message if any words were checked.
238 view().partialUpdate(2);
240 // reset values to initial
249 result_ = SpellBase::ISP_OK;
254 void ControlSpellchecker::options()
256 lv_.getDialogs()->showSpellcheckerPreferences();