2 * \file FormThesaurus.C
3 * See the file COPYING.
7 * Full author contact details are available in file CREDITS
13 #pragma implementation
16 #include "ControlThesaurus.h"
17 #include "FormThesaurus.h"
18 #include "forms/form_thesaurus.h"
20 #include "xforms_helpers.h"
22 #include "support/lstrings.h"
23 #include FORMS_H_LOCATION
26 #ifndef CXX_GLOBAL_CSTD
34 typedef FormCB<ControlThesaurus, FormDB<FD_thesaurus> > base_class;
37 FormThesaurus::FormThesaurus()
38 : base_class(_("LyX: Thesaurus"), false),
44 void FormThesaurus::build()
46 dialog_.reset(build_thesaurus(this));
48 fl_set_input_return(dialog_->input_entry, FL_RETURN_CHANGED);
49 fl_set_input_return(dialog_->input_replace, FL_RETURN_CHANGED);
51 setPrehandler(dialog_->input_entry);
52 setPrehandler(dialog_->input_replace);
54 // Manage the ok, apply and cancel/close buttons
55 bc().setCancel(dialog_->button_close);
56 bc().addReadOnly(dialog_->input_replace);
58 fl_set_input_return(dialog_->input_entry, FL_RETURN_END_CHANGED);
62 void FormThesaurus::update()
67 string const & str_ = controller().text();
68 setEnabled(dialog_->button_replace, !str_.empty());
69 fl_set_input(dialog_->input_replace, "");
74 void FormThesaurus::updateMeanings(string const & str)
76 fl_clear_browser(dialog_->browser_meanings);
78 fl_set_input(dialog_->input_entry, str.c_str());
80 fl_set_browser_topline(dialog_->browser_meanings, 1);
82 fl_freeze_form(form());
84 Thesaurus::Meanings meanings = controller().getMeanings(str);
86 Thesaurus::Meanings::const_iterator cit = meanings.begin();
87 Thesaurus::Meanings::const_iterator end = meanings.end();
88 for (; cit != end; ++cit) {
89 fl_add_browser_line(dialog_->browser_meanings,
92 vector<string> const & tmpvec = cit->second;
93 vector<string>::const_iterator cit2 = tmpvec.begin();
94 vector<string>::const_iterator end2 = tmpvec.end();
95 for (; cit2 != end2; ++cit2) {
98 fl_add_browser_line(dialog_->browser_meanings,
103 fl_unfreeze_form(form());
104 fl_redraw_form(form());
108 void FormThesaurus::setReplace(string const & templ, string const & nstr)
112 // the following mechanism makes sure we replace "House" with "Home",
113 // "HOUSE" with "HOME" etc.
115 bool all_lower = true;
116 bool all_upper = true;
118 string::const_iterator beg = templ.begin();
119 string::const_iterator end = templ.end();
120 string::const_iterator cit = beg;
121 for (; cit != end; ++cit) {
129 str = lowercase(nstr);
130 } else if (all_upper) {
131 str = uppercase(nstr);
132 } else if (templ.size() > 0 && isupper(templ[0])) {
133 bool rest_lower = true;
134 string::const_iterator cit2 = beg + 1;
136 for (; cit2 != end; ++cit2) {
142 str = lowercase(nstr);
143 str[0] = uppercase(nstr[0]);
147 fl_set_input(dialog_->input_replace, str.c_str());
151 ButtonPolicy::SMInput FormThesaurus::input(FL_OBJECT * obj, long)
153 if (obj == dialog_->input_entry) {
154 string s = trim(fl_get_input(dialog_->input_entry));
159 fl_set_input(dialog_->input_replace, "");
160 return ButtonPolicy::SMI_APPLY;
162 return ButtonPolicy::SMI_NOOP;
164 } else if (obj == dialog_->button_replace) {
165 string rep(fl_get_input(dialog_->input_replace));
167 controller().replace(fl_get_input(dialog_->input_replace));
170 return ButtonPolicy::SMI_APPLY;
171 } else if (obj != dialog_->browser_meanings) {
172 return ButtonPolicy::SMI_NOOP;
175 int const line = fl_get_browser(obj);
177 setReplace(fl_get_input(dialog_->input_entry),
178 trim(fl_get_browser_line(obj, line)));
181 if (clickline_ == fl_get_browser(obj)) {
182 updateMeanings(fl_get_input(dialog_->input_replace));
185 clickline_ = fl_get_browser(obj);
188 return ButtonPolicy::SMI_VALID;