2 * \file FormSpellchecker.C
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS
14 #pragma implementation
18 #include "ControlSpellchecker.h"
19 #include "FormSpellchecker.h"
20 #include "forms/form_spellchecker.h"
22 #include "forms_gettext.h"
24 #include "xforms_helpers.h"
25 #include "support/lstrings.h"
27 #include FORMS_H_LOCATION
29 typedef FormCB<ControlSpellchecker, FormDB<FD_spellchecker> > base_class;
32 FormSpellchecker::FormSpellchecker()
33 : base_class(_("Spellchecker")), state_(STOPPED)
37 void FormSpellchecker::build()
39 dialog_.reset(build_spellchecker(this));
42 bc().setCancel(dialog_->button_close);
44 // disable for read-only documents
45 bc().addReadOnly(dialog_->button_replace);
47 // trigger an input event for cut&paste with middle mouse button.
48 setPrehandler(dialog_->input_replacement);
50 fl_set_input_return(dialog_->input_replacement, FL_RETURN_CHANGED);
52 // callback for double click in browser
53 fl_set_browser_dblclick_callback(dialog_->browser_suggestions,
54 C_FormBaseInputCB, 2);
56 // do not allow setting of slider by the mouse
57 fl_deactivate_object(dialog_->slider_progress);
59 // set up the tooltips
60 string str = _("Type replacement for unknown word "
61 "or select from suggestions.");
62 tooltips().init(dialog_->input_replacement, str);
63 str = _("List of replacement suggestions from dictionary.");
64 tooltips().init(dialog_->browser_suggestions, str);
65 // Work-around xforms' bug; enable tooltips for browser widgets.
66 setPrehandler(dialog_->browser_suggestions);
67 str = _("Start the spellingchecker.");
68 tooltips().init(dialog_->button_start, str);
69 str = _("Replace unknown word.");
70 tooltips().init(dialog_->button_replace, str);
71 str = _("Ignore unknown word.");
72 tooltips().init(dialog_->button_ignore, str);
73 str = _("Accept unknown word as known in this session.");
74 tooltips().init(dialog_->button_accept, str);
75 str = _("Add unknown word to personal dictionary.");
76 tooltips().init(dialog_->button_add, str);
77 str = _("Shows word count and progress on spell check.");
78 tooltips().init(dialog_->slider_progress, str);
82 void FormSpellchecker::updateState(State state)
86 fl_set_slider_value(dialog_->slider_progress, 0.0);
87 fl_set_object_label(dialog_->slider_progress, "0 %");
93 string w = controller().getWord();
94 fl_set_input(dialog_->input_replacement, w.c_str());
95 fl_set_object_label(dialog_->text_unknown, w.c_str());
96 fl_clear_browser(dialog_->browser_suggestions);
97 while (!(w = controller().getSuggestion()).empty()) {
98 fl_add_browser_line(dialog_->browser_suggestions,
106 int const progress = controller().getProgress();
110 double const wordcount = controller().getCount();
111 double const total = 100.0 * wordcount / progress;
112 string const label = tostr(progress) + " %";
114 fl_set_slider_bounds(dialog_->slider_progress, 0.0, total);
115 fl_set_slider_value(dialog_->slider_progress, wordcount);
116 fl_set_object_label(dialog_->slider_progress, label.c_str());
124 double const wordcount = controller().getCount();
126 fl_set_slider_bounds(dialog_->slider_progress, 0.0, wordcount);
127 fl_set_slider_value(dialog_->slider_progress, wordcount);
128 fl_set_object_label(dialog_->slider_progress, "100 %");
133 bool const state_change = state_ != state;
139 bool const running = (state == STARTED || state == CHECKING);
140 string const label = running ? _("Stop|#S") : _("Start|#S");
142 fl_set_object_label(dialog_->button_start, idex(label).c_str());
143 fl_set_button_shortcut(dialog_->button_start, scex(label).c_str(), 1);
144 fl_redraw_object(dialog_->button_start);
146 string const tip = running ?
147 _("Stop the spellingchecker.") :
148 _("Start the spellingchecker.");
149 tooltips().init(dialog_->button_start, tip);
151 setEnabled(dialog_->button_replace, running);
152 setEnabled(dialog_->button_ignore, running);
153 setEnabled(dialog_->button_accept, running);
154 setEnabled(dialog_->button_add, running);
155 setEnabled(dialog_->browser_suggestions, running);
156 setEnabled(dialog_->input_replacement, running);
160 void FormSpellchecker::update()
162 // clear input fields
163 fl_set_input(dialog_->input_replacement, "");
164 fl_set_object_label(dialog_->text_unknown, "");
165 fl_clear_browser(dialog_->browser_suggestions);
167 // reset dialog and buttons into start condition
168 updateState(READY_TO_START);
172 ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * ob, long ob_value)
174 if (ob == dialog_->button_start) {
175 updateState(STARTED);
176 controller().check();
178 } else if (ob == dialog_->button_replace) {
179 string const tmp = getString(dialog_->input_replacement);
180 controller().replace(tmp);
182 } else if (ob == dialog_->button_ignore) {
183 controller().check();
185 } else if (ob == dialog_->button_accept) {
186 controller().ignoreAll();
188 } else if (ob == dialog_->button_add) {
189 controller().insert();
191 } else if (ob == dialog_->browser_suggestions) {
192 string const tmp = getString(dialog_->browser_suggestions);
194 return ButtonPolicy::SMI_NOOP;
198 // place the chosen string in the input as feedback
199 fl_set_input(dialog_->input_replacement, tmp.c_str());
203 controller().replace(tmp);
204 // reset the browser so that the following
205 // single-click callback doesn't do anything
206 fl_deselect_browser(dialog_->browser_suggestions);
210 return ButtonPolicy::SMI_VALID;
214 void FormSpellchecker::partialUpdate(int id)
219 updateState(CHECKING);
222 // End of spell checking.
223 updateState(STOPPED);