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 "ControlSpellchecker.h"
23 #include "BufferView.h"
29 #include "ButtonControllerBase.h"
33 #include "frontends/LyXView.h"
35 #include "support/lstrings.h"
37 # include "sp_ispell.h"
39 # include "sp_pspell.h"
44 #include <boost/bind.hpp>
46 #include <sys/types.h> // needed by <sys/select.h> at least on freebsd
48 #ifdef HAVE_SYS_SELECT_H
49 # ifdef HAVE_STRINGS_H
50 // <strings.h> is needed at least on AIX because FD_ZERO uses bzero().
51 // BUT we cannot include both string.h and strings.h on Irix 6.5 :(
56 #include <sys/select.h>
59 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
60 : ControlDialogBD(lv, d),
61 rtl_(false), newval_(0.0), oldval_(0), newvalue_(0), count_(0),
62 stop_(false), result_(SpellBase::ISP_OK), speller_(0)
64 d_.showSpellchecker = boost::bind(&ControlSpellchecker::show, this);
68 void ControlSpellchecker::setParams()
71 // create spell object
74 if (lyxrc.use_pspell) {
75 tmp = (lyxrc.isp_use_alt_lang) ?
76 lyxrc.isp_alt_lang : lv_.buffer()->params.language->code();
78 speller_ = new PSpell(lv_.view()->buffer()->params, tmp);
81 tmp = (lyxrc.isp_use_alt_lang) ?
82 lyxrc.isp_alt_lang : lv_.buffer()->params.language->lang();
84 speller_ = new ISpell(lv_.view()->buffer()->params, tmp);
89 if (lyxrc.isp_use_alt_lang) {
90 Language const * lang = languages.getLanguage(tmp);
92 rtl_ = lang->RightToLeft();
94 rtl_ = lv_.buffer()->params.language->RightToLeft();
97 if (speller_->error() != 0) {
99 message_ = speller_->error();
100 // show error message
101 view().partialUpdate(2);
110 void ControlSpellchecker::check()
112 result_ = SpellBase::ISP_OK;
115 // clear any old selection
116 LyXText * text = lv_.view()->getLyXText();
117 lv_.view()->toggleSelection(true);
118 lv_.view()->update(text, BufferView::SELECT);
120 while ((result_==SpellBase::ISP_OK || result_==SpellBase::ISP_IGNORE) &&
122 word_ = lv_.view()->nextWord(newval_);
131 // Update slider if and only if value has changed
132 newvalue_ = int(100.0*newval_);
133 if (newvalue_!= oldval_) {
136 view().partialUpdate(0);
139 if (!speller_->alive()) clearParams();
141 result_ = speller_->check(word_);
144 if (!stop_ && !word_.empty())
145 lv_.view()->selectLastWord();
148 if (result_!=SpellBase::ISP_OK && result_!=SpellBase::ISP_IGNORE) {
149 view().partialUpdate(1);
154 void ControlSpellchecker::replace(string const & replacement)
156 lv_.view()->replaceWord(replacement);
161 void ControlSpellchecker::replaceAll(string const & replacement)
164 replace(replacement);
168 void ControlSpellchecker::insert()
170 speller_->insert(word_);
175 string ControlSpellchecker::getSuggestion()
177 // this is needed because string tmp = nextmiss()
178 // segfaults when nextMiss is 0
180 char const * w = speller_->nextMiss();
184 if (rtl_) std::reverse(tmp.begin(), tmp.end());
191 string ControlSpellchecker::getWord()
194 if (rtl_) std::reverse(tmp.begin(), tmp.end());
199 void ControlSpellchecker::ignoreAll()
201 speller_->accept(word_);
206 void ControlSpellchecker::stop()
209 lv_.view()->endOfSpellCheck();
213 void ControlSpellchecker::clearParams()
215 if (!speller_) return;
217 if (speller_->alive()) {
219 message_ = tostr(count_);
221 message_ += _(" words checked.");
224 message_ += _(" word checked.");
226 message_ = "\n" + message_;
227 message_ = _("Spellchecking completed! ") + message_;
230 message_ = speller_->error();
232 if (message_.empty())
233 message_ = _("The spell checker has died for some reason.\n"
234 "Maybe it has been killed.");
236 // make sure that the dialog is not launched
237 emergency_exit_ = true;
242 lv_.view()->endOfSpellCheck();
244 // show closing message if any words were checked.
246 view().partialUpdate(2);
248 // reset values to initial
257 result_ = SpellBase::ISP_OK;
262 void ControlSpellchecker::options()
264 lv_.getDialogs()->showSpellcheckerPreferences();