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"
47 # include "sp_ispell.h"
49 # include "sp_pspell.h"
56 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
57 : ControlDialog<ControlConnectBD>(lv, d)
59 d_.showSpellchecker.connect(SigC::slot(this, &ControlSpellchecker::show));
69 result_ = SpellBase::ISP_UNKNOWN;
75 ControlSpellchecker::~ControlSpellchecker()
80 void ControlSpellchecker::show()
82 if (isBufferDependent() && !lv_.view()->available())
86 // create spell object
89 if (lyxrc.use_pspell) {
90 tmp = (lyxrc.isp_use_alt_lang) ?
91 lyxrc.isp_alt_lang : lv_.buffer()->params.language->code();
93 speller_ = new PSpell(lv_.view()->buffer()->params, tmp);
96 tmp = (lyxrc.isp_use_alt_lang) ?
97 lyxrc.isp_alt_lang : lv_.buffer()->params.language->lang();
99 speller_ = new ISpell(lv_.view()->buffer()->params, tmp);
104 if (lyxrc.isp_use_alt_lang) {
105 Language const * lang = languages.getLanguage(tmp);
107 rtl_ = lang->RightToLeft();
109 rtl_ = lv_.buffer()->params.language->RightToLeft();
112 if (speller_->error() != 0) {
113 message_ = speller_->error();
114 view().partialUpdate(2);
120 bc().readOnly(isReadonly());
125 void ControlSpellchecker::hide()
135 void ControlSpellchecker::check()
137 result_ = SpellBase::ISP_UNKNOWN;
140 while (result_!=SpellBase::ISP_MISSED && !stop_) {
141 word_ = lv_.view()->nextWord(newval_);
149 // Update slider if and only if value has changed
150 newvalue_ = int(100.0*newval_);
151 if (newvalue_!= oldval_) {
154 view().partialUpdate(0);
157 if (!speller_->alive()) quit();
159 result_ = speller_->check(word_);
162 if (!stop_ && !word_.empty())
163 lv_.view()->selectLastWord();
166 if (result_==SpellBase::ISP_MISSED) {
167 view().partialUpdate(1);
172 void ControlSpellchecker::replace(string const & replacement)
174 lv_.view()->replaceWord(replacement);
179 void ControlSpellchecker::replaceAll(string const & replacement)
182 replace(replacement);
186 void ControlSpellchecker::insert()
188 speller_->insert(word_);
192 string ControlSpellchecker::getSuggestion()
194 // this is needed because string tmp = nextmiss()
195 // segfaults when nextMiss is 0
197 char const * w = speller_->nextMiss();
201 if (rtl_) std::reverse(tmp.begin(), tmp.end());
208 string ControlSpellchecker::getWord()
211 if (rtl_) std::reverse(tmp.begin(), tmp.end());
216 void ControlSpellchecker::ignoreAll()
218 speller_->accept(word_);
223 void ControlSpellchecker::stop()
229 void ControlSpellchecker::quit()
231 if (speller_->alive()) {
233 message_ = tostr(count_);
235 message_ += _(" words checked.");
237 message_ += _(" word checked.");
239 message_ = "\n" + message_;
240 message_ = _("Spellchecking completed! ") + message_;
243 message_ = _("The spell checker has died for some reason.\n"
244 "Maybe it has been killed.");
247 lv_.view()->endOfSpellCheck();
249 // hide dialog, disconnect and delete speller
252 // show closing message
253 view().partialUpdate(2);
255 // reset values to initial
264 result_ = SpellBase::ISP_UNKNOWN;
268 void ControlSpellchecker::options()
270 lv_.getDialogs()->showSpellcheckerPreferences();