]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/FormThesaurus.C
sourcedoc-friendly files.
[lyx.git] / src / frontends / xforms / FormThesaurus.C
1 /**
2  * \file FormThesaurus.C
3  * Copyright 2001 The LyX Team.
4  * See the file COPYING.
5  *
6  * \author Edwin Leuven, leuven@fee.uva.nl
7  */
8
9 #include <config.h>
10
11 #ifdef __GNUG__
12 #pragma implementation
13 #endif
14
15 #include <cctype>
16 #include "support/lstrings.h"
17 #include "xformsBC.h"
18 #include "xforms_helpers.h"
19 #include "ControlThesaurus.h"
20 #include "FormThesaurus.h"
21 #include "form_thesaurus.h"
22 #include "debug.h"
23
24
25 using std::vector;
26
27
28 typedef FormCB<ControlThesaurus, FormDB<FD_form_thesaurus> > base_class;
29
30 FormThesaurus::FormThesaurus(ControlThesaurus & c)
31         : base_class(c, _("LyX: Thesaurus"), false),
32         clickline_(-1)
33 {
34 }
35
36
37 void FormThesaurus::build()
38 {
39         dialog_.reset(build_thesaurus());
40  
41         // Manage the ok, apply and cancel/close buttons
42         bc().setCancel(dialog_->button_close);
43         bc().addReadOnly(dialog_->input_replace);
44
45         fl_set_input_return(dialog_->input_entry, FL_RETURN_END_CHANGED);
46 }
47
48
49 void FormThesaurus::update()
50 {
51         if (!dialog_.get())
52                 return;
53
54         string const & str_ = controller().text();
55         setEnabled(dialog_->button_replace, !str_.empty());
56         fl_set_input(dialog_->input_replace, "");
57         updateMeanings(str_);
58 }
59
60
61 void FormThesaurus::updateMeanings(string const & str)
62 {
63         fl_clear_browser(dialog_->browser_meanings);
64  
65         fl_set_input(dialog_->input_entry, str.c_str());
66
67         fl_set_browser_topline(dialog_->browser_meanings, 1);
68
69         fl_freeze_form(form());
70
71         Thesaurus::Meanings meanings = controller().getMeanings(str);
72
73         Thesaurus::Meanings::const_iterator cit = meanings.begin();
74         Thesaurus::Meanings::const_iterator end = meanings.end();
75         for (; cit != end; ++cit) {
76                 fl_add_browser_line(dialog_->browser_meanings,
77                                     cit->first.c_str());
78                 
79                 vector<string> const & tmpvec = cit->second;
80                 vector<string>::const_iterator cit2 = tmpvec.begin();
81                 vector<string>::const_iterator end2 = tmpvec.end();
82                 for (; cit2 != end2; ++cit2) {
83                         string ent = "   ";
84                         ent += *cit2;
85                         fl_add_browser_line(dialog_->browser_meanings,
86                                             ent.c_str());
87                 }
88         }
89  
90         fl_unfreeze_form(form());
91         fl_redraw_form(form());
92 }
93
94
95 void FormThesaurus::setReplace(string const & templ, string const & nstr)
96 {
97         string str(nstr);
98
99         // the following mechanism makes sure we replace "House" with "Home",
100         // "HOUSE" with "HOME" etc.
101
102         bool all_lower = true;
103         bool all_upper = true;
104
105         string::const_iterator beg = templ.begin();
106         string::const_iterator end = templ.end();
107         string::const_iterator cit = beg;
108         for (; cit != end; ++cit) {
109                 if (isupper(*cit))
110                         all_lower = false;
111                 if (islower(*cit))
112                         all_upper = false;
113         }
114
115         if (all_lower) {
116                 str = lowercase(nstr);
117         } else if (all_upper) {
118                 str = uppercase(nstr);
119         } else if (templ.size() > 0 && isupper(templ[0])) {
120                 bool rest_lower = true;
121                 string::const_iterator cit2 = beg + 1;
122                 
123                 for (; cit2 != end; ++cit2) {
124                         if (isupper(*cit2))
125                                 rest_lower = false;
126                 }
127                 
128                 if (rest_lower) {
129                         str = lowercase(nstr);
130                         str[0] = uppercase(nstr[0]);
131                 }
132         }
133
134         fl_set_input(dialog_->input_replace, str.c_str());
135 }
136
137
138 ButtonPolicy::SMInput FormThesaurus::input(FL_OBJECT * obj, long)
139 {
140         if (obj == dialog_->input_entry) {
141                 string s = strip(frontStrip(fl_get_input(dialog_->input_entry)));
142                  
143                 updateMeanings(s);
144
145                 if (s.empty()) {
146                         fl_set_input(dialog_->input_replace, "");
147                         return ButtonPolicy::SMI_APPLY;
148                 }
149                 return ButtonPolicy::SMI_NOOP;
150
151         } else if (obj == dialog_->button_replace) {
152                 string rep(fl_get_input(dialog_->input_replace));
153                 if (!rep.empty())
154                         controller().replace(fl_get_input(dialog_->input_replace));
155                 clickline_ = -1;
156                 updateMeanings(rep);
157                 return ButtonPolicy::SMI_APPLY;
158         } else if (obj != dialog_->browser_meanings) {
159                 return ButtonPolicy::SMI_NOOP;
160         }
161
162         int const line = fl_get_browser(obj);
163         if (line > 0) {
164                 setReplace(fl_get_input(dialog_->input_entry),
165                            strip(frontStrip(fl_get_browser_line(obj, line))));
166         }
167
168         if (clickline_ == fl_get_browser(obj)) {
169                 updateMeanings(fl_get_input(dialog_->input_replace));
170                 clickline_ = -1;
171         } else {
172                 clickline_ = fl_get_browser(obj);
173         }
174
175         return ButtonPolicy::SMI_VALID;
176 }