]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/FormSpellchecker.C
namespace grfx -> lyx::graphics
[lyx.git] / src / frontends / xforms / FormSpellchecker.C
1 /**
2  * \file FormSpellchecker.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Edwin Leuven
7  *
8  * Full author contact details are available in file CREDITS
9  */
10
11 #include <config.h>
12
13 #include "xformsBC.h"
14 #include "FormSpellchecker.h"
15 #include "ControlSpellchecker.h"
16 #include "forms/form_spellchecker.h"
17
18 #include "forms_gettext.h"
19 #include "Tooltips.h"
20 #include "xforms_helpers.h"
21 #include "support/tostr.h"
22
23 #include "lyx_forms.h"
24
25 using std::endl;
26
27 typedef FormCB<ControlSpellchecker, FormDB<FD_spellchecker> > base_class;
28
29 FormSpellchecker::FormSpellchecker()
30         : base_class(_("Spell-check Document"))
31 {}
32
33
34 void FormSpellchecker::build()
35 {
36         dialog_.reset(build_spellchecker(this));
37
38         // Manage the buttons
39         bcview().setCancel(dialog_->button_close);
40
41         // disable for read-only documents
42         bcview().addReadOnly(dialog_->button_replace);
43
44         // trigger an input event for cut&paste with middle mouse button.
45         setPrehandler(dialog_->input_replacement);
46
47         fl_set_input_return(dialog_->input_replacement, FL_RETURN_CHANGED);
48
49         // callback for double click in browser
50         fl_set_browser_dblclick_callback(dialog_->browser_suggestions,
51                                          C_FormBaseInputCB, 2);
52
53         // do not allow setting of slider by the mouse
54         fl_deactivate_object(dialog_->slider_progress);
55
56         // set up the tooltips
57         string str = _("Type replacement for unknown word "
58                         "or select from suggestions.");
59         tooltips().init(dialog_->input_replacement, str);
60         str = _("List of replacement suggestions from dictionary.");
61         tooltips().init(dialog_->browser_suggestions, str);
62         // Work-around xforms' bug; enable tooltips for browser widgets.
63         setPrehandler(dialog_->browser_suggestions);
64         str = _("Replace unknown word.");
65         tooltips().init(dialog_->button_replace, str);
66         str = _("Ignore unknown word.");
67         tooltips().init(dialog_->button_ignore, str);
68         str = _("Accept unknown word as known in this session.");
69         tooltips().init(dialog_->button_accept, str);
70         str = _("Add unknown word to personal dictionary.");
71         tooltips().init(dialog_->button_add, str);
72         str = _("Shows word count and progress on spell check.");
73         tooltips().init(dialog_->slider_progress, str);
74 }
75
76
77 void FormSpellchecker::partialUpdate(int s)
78 {
79         ControlSpellchecker::State const state =
80                 static_cast<ControlSpellchecker::State>(s);
81
82         switch (state) {
83
84         case ControlSpellchecker::SPELL_FOUND_WORD: {
85                 // Set suggestions.
86                 string w = controller().getWord();
87                 fl_set_input(dialog_->input_replacement, w.c_str());
88                 fl_set_object_label(dialog_->text_unknown, w.c_str());
89                 fl_clear_browser(dialog_->browser_suggestions);
90                 while (!(w = controller().getSuggestion()).empty()) {
91                         fl_add_browser_line(dialog_->browser_suggestions,
92                                             w.c_str());
93                 }
94                 // Fall through...
95         }
96
97         case ControlSpellchecker::SPELL_PROGRESSED: {
98                 int const progress = controller().getProgress();
99                 if (progress == 0)
100                         break;
101
102                 double const wordcount = controller().getCount();
103                 double const total = 100.0 * wordcount / progress;
104                 string const label = tostr(progress) + " %";
105
106                 fl_set_slider_bounds(dialog_->slider_progress, 0.0, total);
107                 fl_set_slider_value(dialog_->slider_progress, wordcount);
108                 fl_set_object_label(dialog_->slider_progress, label.c_str());
109                 fl_redraw_object(dialog_->slider_progress);
110                 break;
111         }
112
113         }
114 }
115
116
117 ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * ob, long ob_value)
118 {
119         if (ob == dialog_->button_replace) {
120                 string const tmp = getString(dialog_->input_replacement);
121                 controller().replace(tmp);
122
123         } else if (ob == dialog_->button_ignore) {
124                 controller().check();
125
126         } else if (ob == dialog_->button_accept) {
127                 controller().ignoreAll();
128
129         } else if (ob == dialog_->button_add) {
130                 controller().insert();
131
132         } else if (ob == dialog_->browser_suggestions) {
133                 string const tmp = getString(dialog_->browser_suggestions);
134                 if (tmp.empty())
135                         return ButtonPolicy::SMI_NOOP;
136
137                 if (ob_value != 2) {
138                         // single-click
139                         // place the chosen string in the input as feedback
140                         fl_set_input(dialog_->input_replacement, tmp.c_str());
141
142                 } else {
143                         // double-click
144                         controller().replace(tmp);
145                         // reset the browser so that the following
146                         // single-click callback doesn't do anything
147                         fl_deselect_browser(dialog_->browser_suggestions);
148                 }
149         }
150
151         return ButtonPolicy::SMI_VALID;
152 }