]> git.lyx.org Git - lyx.git/blob - src/frontends/controllers/ControlSpellchecker.C
Compilation fix.
[lyx.git] / src / frontends / controllers / ControlSpellchecker.C
1 /**
2  * \file ControlSpellchecker.C
3  * Copyright 2001 the LyX Team
4  * Read the file COPYING
5  *
6  * \author Edwin Leuven <leuven@fee.uva.nl>
7  */
8
9 #include <config.h>
10
11 #ifdef __GNUG__
12 #pragma implementation
13 #endif
14
15 #include "ControlSpellchecker.h"
16 #include "buffer.h"
17 #include "lyxrc.h"
18 #include "BufferView.h"
19 #include "lyxtext.h"
20 #include "gettext.h"
21 #include "language.h"
22
23 #include "ViewBase.h"
24 #include "Dialogs.h"
25 #include "Liason.h"
26
27 #include "frontends/LyXView.h"
28
29 #include "support/lstrings.h"
30
31 #include "ispell.h"
32 #ifdef USE_PSPELL
33 # include "pspell.h"
34 #endif
35
36 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
37         : ControlDialogBD(lv, d),
38           rtl_(false), newval_(0.0), oldval_(0), newvalue_(0), count_(0),
39           stop_(false), speller_(0)
40 {}
41
42
43 void ControlSpellchecker::setParams()
44 {
45         if (!speller_) {
46                 // create spell object
47                 string tmp;
48 #ifdef USE_PSPELL
49                 if (lyxrc.use_pspell) {
50                         tmp = (lyxrc.isp_use_alt_lang) ?
51                                 lyxrc.isp_alt_lang : lv_.buffer()->params.language->code();
52
53                         speller_ = new PSpell(lv_.view()->buffer()->params, tmp);
54                 } else {
55 #endif
56                         tmp = (lyxrc.isp_use_alt_lang) ?
57                                 lyxrc.isp_alt_lang : lv_.buffer()->params.language->lang();
58
59                         speller_ = new ISpell(lv_.view()->buffer()->params, tmp);
60 #ifdef USE_PSPELL
61                 }
62 #endif
63
64                 if (lyxrc.isp_use_alt_lang) {
65                         Language const * lang = languages.getLanguage(tmp);
66                         if (lang)
67                                 rtl_ = lang->RightToLeft();
68                 } else {
69                         rtl_ = lv_.buffer()->params.language->RightToLeft();
70                 }
71
72                 if (!speller_->error().empty()) {
73                         clearParams();
74                         return;
75                 }
76         }
77 }
78
79
80 void ControlSpellchecker::check()
81 {
82         SpellBase::Result res = SpellBase::OK;
83         stop_ = false;
84
85         // clear any old selection
86         LyXText * text = lv_.view()->getLyXText();
87         lv_.view()->toggleSelection(true);
88         lv_.view()->update(text, BufferView::SELECT);
89
90         while ((res == SpellBase::OK || res == SpellBase::IGNORE) && !stop_) {
91                 word_ = lv_.view()->nextWord(newval_);
92
93                 if (word_.empty()) {
94                         clearParams();
95                         break;
96                 }
97
98                 ++count_;
99
100                 // Update slider if and only if value has changed
101                 newvalue_ = int(100.0*newval_);
102                 if (newvalue_!= oldval_) {
103                         oldval_ = newvalue_;
104                         // set progress bar
105                         view().partialUpdate(0);
106                 }
107
108                 if (!speller_->alive()) clearParams();
109
110                 res = speller_->check(word_);
111         }
112
113         if (!stop_ && !word_.empty())
114                 lv_.view()->selectLastWord();
115
116         // set suggestions
117         if (res != SpellBase::OK && res != SpellBase::IGNORE) {
118                 view().partialUpdate(1);
119         }
120 }
121
122
123 void ControlSpellchecker::replace(string const & replacement)
124 {
125         lv_.view()->replaceWord(replacement);
126         check();
127 }
128
129
130 void ControlSpellchecker::replaceAll(string const & replacement)
131 {
132         // TODO: add to list
133         replace(replacement);
134 }
135
136
137 void ControlSpellchecker::insert()
138 {
139         speller_->insert(word_);
140         check();
141 }
142
143
144 string ControlSpellchecker::getSuggestion()
145 {
146         string miss(speller_->nextMiss());
147
148         if (rtl_)
149                 std::reverse(miss.begin(), miss.end());
150
151         return miss;
152 }
153
154
155 string ControlSpellchecker::getWord()
156 {
157         string tmp = word_;
158         if (rtl_)
159                 std::reverse(tmp.begin(), tmp.end());
160         return tmp;
161 }
162
163
164 void ControlSpellchecker::ignoreAll()
165 {
166         speller_->accept(word_);
167         check();
168 }
169
170
171 void ControlSpellchecker::stop()
172 {
173         stop_ = true;
174         lv_.view()->endOfSpellCheck();
175 }
176
177
178 void ControlSpellchecker::clearParams()
179 {
180         if (!speller_) return;
181
182         if (speller_->alive()) {
183                 speller_->close();
184                 message_ = tostr(count_);
185                 if (count_ != 1) {
186                         message_ += _(" words checked.");
187
188                 } else {
189                         message_ += _(" word checked.");
190                 }
191                 message_ = "\n" + message_;
192                 message_ = _("Spellchecking completed! ") + message_;
193
194         } else {
195                 message_ = speller_->error();
196                 speller_->cleanUp();
197                 if (message_.empty())
198                     message_ = _("The spell checker has died for some reason.\n"
199                                  "Maybe it has been killed.");
200
201                 // make sure that the dialog is not launched
202                 emergency_exit_ = true;
203         }
204
205         delete speller_;
206
207         lv_.view()->endOfSpellCheck();
208
209         // show closing message if any words were checked.
210         if (count_ > 0)
211                 view().partialUpdate(2);
212
213         // reset values to initial
214         rtl_ = false;
215         word_.erase();
216         newval_ = 0.0;
217         oldval_ = 0;
218         newvalue_ = 0;
219         count_ = 0;
220         message_.erase();
221         stop_ = false;
222         speller_ = 0;
223 }