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.
13 #include "FormSpellchecker.h"
14 #include "ControlSpellchecker.h"
15 #include "forms/form_spellchecker.h"
18 #include "xforms_helpers.h"
21 #include "support/tostr.h"
23 #include "lyx_forms.h"
26 typedef FormCB<ControlSpellchecker, FormDB<FD_spellchecker> > base_class;
28 FormSpellchecker::FormSpellchecker()
29 : base_class(_("Spell-check Document"))
33 void FormSpellchecker::build()
35 dialog_.reset(build_spellchecker(this));
38 bcview().setCancel(dialog_->button_close);
40 // disable for read-only documents
41 bcview().addReadOnly(dialog_->button_replace);
43 // trigger an input event for cut&paste with middle mouse button.
44 setPrehandler(dialog_->input_replacement);
46 fl_set_input_return(dialog_->input_replacement, FL_RETURN_CHANGED);
48 // callback for double click in browser
49 fl_set_browser_dblclick_callback(dialog_->browser_suggestions,
50 C_FormBaseInputCB, 2);
52 // do not allow setting of slider by the mouse
53 fl_deactivate_object(dialog_->slider_progress);
55 // set up the tooltips
56 string str = _("Type replacement for unknown word "
57 "or select from suggestions.");
58 tooltips().init(dialog_->input_replacement, str);
59 str = _("List of replacement suggestions from dictionary.");
60 tooltips().init(dialog_->browser_suggestions, str);
61 // Work-around xforms' bug; enable tooltips for browser widgets.
62 setPrehandler(dialog_->browser_suggestions);
63 str = _("Replace unknown word.");
64 tooltips().init(dialog_->button_replace, str);
65 str = _("Ignore unknown word.");
66 tooltips().init(dialog_->button_ignore, str);
67 str = _("Accept unknown word as known in this session.");
68 tooltips().init(dialog_->button_accept, str);
69 str = _("Add unknown word to personal dictionary.");
70 tooltips().init(dialog_->button_add, str);
71 str = _("Shows word count and progress on spell check.");
72 tooltips().init(dialog_->slider_progress, str);
76 void FormSpellchecker::partialUpdate(int s)
78 ControlSpellchecker::State const state =
79 static_cast<ControlSpellchecker::State>(s);
83 case ControlSpellchecker::SPELL_FOUND_WORD: {
85 string w = controller().getWord();
86 fl_set_input(dialog_->input_replacement, w.c_str());
87 fl_set_object_label(dialog_->text_unknown, w.c_str());
88 fl_clear_browser(dialog_->browser_suggestions);
89 while (!(w = controller().getSuggestion()).empty()) {
90 fl_add_browser_line(dialog_->browser_suggestions,
96 case ControlSpellchecker::SPELL_PROGRESSED: {
97 int const progress = controller().getProgress();
101 double const wordcount = controller().getCount();
102 double const total = 100.0 * wordcount / progress;
103 string const label = tostr(progress) + " %";
105 fl_set_slider_bounds(dialog_->slider_progress, 0.0, total);
106 fl_set_slider_value(dialog_->slider_progress, wordcount);
107 fl_set_object_label(dialog_->slider_progress, label.c_str());
108 fl_redraw_object(dialog_->slider_progress);
116 ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * ob, long ob_value)
118 if (ob == dialog_->button_replace) {
119 string const tmp = getString(dialog_->input_replacement);
120 controller().replace(tmp);
122 } else if (ob == dialog_->button_ignore) {
123 controller().check();
125 } else if (ob == dialog_->button_accept) {
126 controller().ignoreAll();
128 } else if (ob == dialog_->button_add) {
129 controller().insert();
131 } else if (ob == dialog_->browser_suggestions) {
132 string const tmp = getString(dialog_->browser_suggestions);
134 return ButtonPolicy::SMI_NOOP;
138 // place the chosen string in the input as feedback
139 fl_set_input(dialog_->input_replacement, tmp.c_str());
143 controller().replace(tmp);
144 // reset the browser so that the following
145 // single-click callback doesn't do anything
146 fl_deselect_browser(dialog_->browser_suggestions);
150 return ButtonPolicy::SMI_VALID;