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
19 #include "xforms_helpers.h"
20 #include "ControlSpellchecker.h"
21 #include "FormSpellchecker.h"
22 #include "forms/form_spellchecker.h"
23 #include "support/lstrings.h"
25 #include FORMS_H_LOCATION
27 typedef FormCB<ControlSpellchecker, FormDB<FD_spellchecker> > base_class;
30 FormSpellchecker::FormSpellchecker()
31 : base_class(_("Spellchecker"))
35 void FormSpellchecker::build()
37 dialog_.reset(build_spellchecker(this));
40 bc().setCancel(dialog_->button_close);
42 // disable for read-only documents
43 bc().addReadOnly(dialog_->button_replace);
45 // trigger an input event for cut&paste with middle mouse button.
46 setPrehandler(dialog_->input_replacement);
48 fl_set_input_return(dialog_->input_replacement, FL_RETURN_CHANGED);
50 // callback for double click in browser
51 fl_set_browser_dblclick_callback(dialog_->browser_suggestions,
52 C_FormBaseInputCB, 2);
54 // do not allow setting of slider by the mouse
55 fl_deactivate_object(dialog_->slider_progress);
57 // set up the tooltips
58 string str = _("Type replacement for unknown word "
59 " or select from suggestions.");
60 tooltips().init(dialog_->input_replacement, str);
61 str = _("List of replacement suggestions from dictionary.");
62 tooltips().init(dialog_->browser_suggestions, str);
63 // Work-around xforms' bug; enable tooltips for browser widgets.
64 setPrehandler(dialog_->browser_suggestions);
65 str = _("Start the spellingchecker.");
66 tooltips().init(dialog_->button_start, str);
67 str = _("Replace unknown word.");
68 tooltips().init(dialog_->button_replace, str);
69 str = _("Ignore unknown word.");
70 tooltips().init(dialog_->button_ignore, str);
71 str = _("Accept unknown word as known in this session.");
72 tooltips().init(dialog_->button_accept, str);
73 str = _("Add unknown word to personal dictionary.");
74 tooltips().init(dialog_->button_add, str);
75 str = _("Shows word count and progress on spell check.");
76 tooltips().init(dialog_->slider_progress, str);
80 void FormSpellchecker::update()
83 fl_set_input(dialog_->input_replacement, "");
84 fl_set_object_label(dialog_->text_unknown, "");
85 fl_clear_browser(dialog_->browser_suggestions);
87 // reset dialog and buttons into start condition
90 // reset slider to zero count
91 fl_set_slider_value(dialog_->slider_progress, 0.0);
92 fl_set_object_label(dialog_->slider_progress, "0 %");
96 ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * ob, long ob_value)
98 if (!ob || ob == dialog_->button_start) {
99 static bool running = false;
101 // update running status of spellingchecker
102 running = !running && ob == dialog_->button_start;
104 // modify text of Start/Stop button according to running status
105 string const labeltext = running ? _("Stop") : _("Start");
106 fl_set_object_label(dialog_->button_start, labeltext.c_str());
107 fl_set_button_shortcut(dialog_->button_start, "#S", 1);
108 fl_show_object(dialog_->button_start);
110 // adjust tooltips to modified Start/Stop button
111 string const str = (running ? _("Stop the spellingchecker.") :
112 _("Start the spellingchecker."));
113 tooltips().init(dialog_->button_start, str);
115 // enable buttons according to running status
116 setEnabled(dialog_->button_replace, running);
117 setEnabled(dialog_->button_ignore, running);
118 setEnabled(dialog_->button_accept, running);
119 setEnabled(dialog_->button_add, running);
120 setEnabled(dialog_->browser_suggestions, running);
121 setEnabled(dialog_->input_replacement, running);
123 // call controller if Start/Stop button is pressed
126 controller().check();
131 } else if (ob == dialog_->button_replace) {
132 string const tmp = getString(dialog_->input_replacement);
133 controller().replace(tmp);
135 } else if (ob == dialog_->button_ignore) {
136 controller().check();
138 } else if (ob == dialog_->button_accept) {
139 controller().ignoreAll();
141 } else if (ob == dialog_->button_add) {
142 controller().insert();
144 } else if (ob == dialog_->browser_suggestions) {
145 string const tmp = getString(dialog_->browser_suggestions);
147 return ButtonPolicy::SMI_NOOP;
151 // place the chosen string in the input as feedback
152 fl_set_input(dialog_->input_replacement, tmp.c_str());
156 controller().replace(tmp);
157 // reset the browser so that the following
158 // single-click callback doesn't do anything
159 fl_deselect_browser(dialog_->browser_suggestions);
163 // update slider with word count and progress
164 int const progress = controller().getProgress();
166 double const wordcount = controller().getCount();
167 double const total = 100.0 * wordcount / progress;
168 string const label = tostr(progress) + " %";
169 fl_set_slider_bounds(dialog_->slider_progress, 0.0, total);
170 fl_set_slider_value(dialog_->slider_progress, wordcount);
171 fl_set_object_label(dialog_->slider_progress, label.c_str());
174 return ButtonPolicy::SMI_VALID;
178 void FormSpellchecker::partialUpdate(int id)
181 case 1: // set suggestions
183 string w = controller().getWord();
184 fl_set_input(dialog_->input_replacement, w.c_str());
185 fl_set_object_label(dialog_->text_unknown, w.c_str());
186 fl_clear_browser(dialog_->browser_suggestions);
187 while (!(w = controller().getSuggestion()).empty()) {
188 fl_add_browser_line(dialog_->browser_suggestions, w.c_str());
192 case 2: // end of spell checking
194 // reset dialog and buttons into start condition
197 // set slider 'finished' status
198 fl_set_slider_bounds(dialog_->slider_progress, 0.0, controller().getCount());
199 fl_set_slider_value(dialog_->slider_progress, controller().getCount());
200 fl_set_object_label(dialog_->slider_progress, "100 %");