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