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 FORMS_H_LOCATION
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"
48 # include "sp_pspell.h"
50 # include "sp_ispell.h"
57 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
58 : ControlDialog<ControlConnectBD>(lv, d)
60 d_.showSpellchecker.connect(SigC::slot(this, &ControlSpellchecker::show));
70 result_ = SpellBase::ISP_UNKNOWN;
76 ControlSpellchecker::~ControlSpellchecker()
81 void ControlSpellchecker::show()
83 if (isBufferDependent() && !lv_.view()->available())
87 // create spell object
89 string tmp = (lyxrc.isp_use_alt_lang) ?
90 lyxrc.isp_alt_lang : lv_.buffer()->params.language->code();
92 speller_ = new PSpell(lv_.view()->buffer()->params, tmp);
94 string tmp = (lyxrc.isp_use_alt_lang) ?
95 lyxrc.isp_alt_lang : lv_.buffer()->params.language->lang();
97 speller_ = new ISpell(lv_.view()->buffer()->params, tmp);
100 if (lyxrc.isp_use_alt_lang) {
101 Language const * lang = languages.getLanguage(tmp);
103 rtl_ = lang->RightToLeft();
105 rtl_ = lv_.buffer()->params.language->RightToLeft();
108 if (speller_->error() != 0) {
109 message_ = speller_->error();
110 view().partialUpdate(2);
116 bc().readOnly(isReadonly());
121 void ControlSpellchecker::hide()
131 void ControlSpellchecker::check()
133 result_ = SpellBase::ISP_UNKNOWN;
136 while (result_!=SpellBase::ISP_MISSED && !stop_) {
137 word_ = lv_.view()->nextWord(newval_);
145 // Update slider if and only if value has changed
146 newvalue_ = int(100.0*newval_);
147 if (newvalue_!= oldval_) {
150 view().partialUpdate(0);
153 if (!speller_->alive()) quit();
155 result_ = speller_->check(word_);
158 if (!stop_ && !word_.empty())
159 lv_.view()->selectLastWord();
162 if (result_==SpellBase::ISP_MISSED) {
163 view().partialUpdate(1);
168 void ControlSpellchecker::replace(string const & replacement)
170 lv_.view()->replaceWord(replacement);
175 void ControlSpellchecker::replaceAll(string const & replacement)
178 replace(replacement);
182 void ControlSpellchecker::insert()
184 speller_->insert(word_);
188 string ControlSpellchecker::getSuggestion()
190 // this is needed because string tmp = nextmiss()
191 // segfaults when nextMiss is 0
193 char const * w = speller_->nextMiss();
197 if (rtl_) reverse(tmp.begin(), tmp.end());
204 string ControlSpellchecker::getWord()
207 if (rtl_) reverse(tmp.begin(), tmp.end());
212 void ControlSpellchecker::ignoreAll()
214 speller_->accept(word_);
219 void ControlSpellchecker::stop()
225 void ControlSpellchecker::quit()
227 if (speller_->alive()) {
229 message_ = tostr(count_);
231 message_ += _(" words checked.");
233 message_ += _(" word checked.");
235 message_ = "\n" + message_;
236 message_ = _("Spellchecking completed! ") + message_;
239 message_ = _("The spell checker has died for some reason.\n"
240 "Maybe it has been killed.");
243 lv_.view()->endOfSpellCheck();
245 // hide dialog, disconnect and delete speller
248 // show closing message
249 view().partialUpdate(2);
251 // reset values to initial
260 result_ = SpellBase::ISP_UNKNOWN;
264 void ControlSpellchecker::options()
266 lv_.getDialogs()->showSpellcheckerPreferences();