]> git.lyx.org Git - lyx.git/blob - src/frontends/gtk/GThesaurus.C
Extracted from r14281
[lyx.git] / src / frontends / gtk / GThesaurus.C
1 /**
2  * \file GThesaurus.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Bernhard Reiter
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 // Too hard to make concept checks work with this file
14 #ifdef _GLIBCXX_CONCEPT_CHECKS
15 #undef _GLIBCXX_CONCEPT_CHECKS
16 #endif
17 #ifdef _GLIBCPP_CONCEPT_CHECKS
18 #undef _GLIBCPP_CONCEPT_CHECKS
19 #endif
20
21 #include "GThesaurus.h"
22 #include "ControlThesaurus.h"
23 #include "ghelpers.h"
24
25 #include "support/lstrings.h"
26
27 #include <libglademm.h>
28
29 using std::string;
30
31 namespace lyx {
32 namespace frontend {
33
34 class synModelColumns : public Gtk::TreeModel::ColumnRecord
35 {
36 public:
37
38         synModelColumns() { add(name); }
39
40         Gtk::TreeModelColumn<Glib::ustring> name;
41 };
42
43 synModelColumns synColumns;
44
45
46 GThesaurus::GThesaurus(Dialog & parent)
47         : GViewCB<ControlThesaurus, GViewGladeB>(parent, _("Thesaurus"), false)
48 {}
49
50
51 void GThesaurus::doBuild()
52 {
53         string const gladeName = findGladeFile("thesaurus");
54         xml_ = Gnome::Glade::Xml::create(gladeName);
55
56         xml_->get_widget("Cancel", cancelbutton_);
57         setCancel(cancelbutton_);
58         xml_->get_widget("Apply", applybutton_);
59         setApply(applybutton_);
60         xml_->get_widget("OK", okbutton_);
61         setOK(okbutton_);
62
63         xml_->get_widget("Keyword", keywordentry_);
64         xml_->get_widget("Meanings", meaningsview_);
65
66         meaningsview_->append_column(_("Synonym"), synColumns.name);
67
68
69         // Keyword entry changed
70         keywordentry_->signal_changed().connect(
71                 sigc::mem_fun(*this, &GThesaurus::update_lists));
72
73         // Single click in meanings (synonyms) list
74         meaningsview_->signal_cursor_changed().connect(
75                 sigc::mem_fun(*this, &GThesaurus::selection_changed));
76
77         // Double click in meanings (synonyms) list
78         meaningsview_->signal_row_activated().connect(
79                 sigc::mem_fun(*this, &GThesaurus::meaningsview_activated));
80
81 }
82
83 void GThesaurus::update()
84 {
85         string const contents = support::trim(controller().text());
86         if (contents.empty()) {
87                 applylock_ = true;
88                 bc().valid(false);
89         } else {
90                 applylock_ = false;
91                 keywordentry_->set_text(Glib::locale_to_utf8(contents));
92                 bc().valid(true);
93         }
94         keywordentry_->grab_focus();
95         update_lists();
96
97 }
98
99
100 void GThesaurus::selection_changed()
101 {
102         Gtk::TreeModel::iterator iter = meaningsview_->get_selection()->get_selected();
103         if(iter) {
104                 if (!applylock_) bc().valid(true);
105         }
106
107 }
108
109
110 void GThesaurus::meaningsview_activated(const Gtk::TreeModel::Path&, Gtk::TreeViewColumn*)
111 {
112         Gtk::TreeModel::iterator iter = meaningsview_->get_selection()->get_selected();
113         if(iter) {
114                 Gtk::TreeModel::Row row = *iter;
115                 keywordentry_->set_text(row[synColumns.name]);
116         }
117         selection_changed();
118         update_lists();
119         if (!applylock_) bc().valid(true);
120 }
121
122
123 void GThesaurus::apply()
124 {
125         Gtk::TreeModel::iterator iter = meaningsview_->get_selection()->get_selected();
126         if(iter) {
127                 controller().replace(Glib::locale_from_utf8((*iter)[synColumns.name]));
128         } else if (keywordentry_->get_text_length()) {
129                 controller().replace(Glib::locale_from_utf8(keywordentry_->get_text()));
130         }
131         update();
132 }
133
134
135 void GThesaurus::update_lists()
136 {
137         Thesaurus::Meanings meanings = controller().getMeanings(keywordentry_->get_text());
138         synTreeStore_ = Gtk::TreeStore::create(synColumns);
139
140         if (!meanings.empty()) {
141                 for (Thesaurus::Meanings::const_iterator cit = meanings.begin();
142                         cit != meanings.end(); ++cit) {
143
144                         Gtk::TreeModel::Row row = *(synTreeStore_->append());
145                         row[synColumns.name] = cit->first;
146
147                         for (std::vector<string>::const_iterator cit2 = cit->second.begin();
148                                 cit2 != cit->second.end(); ++cit2) {
149                                 Gtk::TreeModel::Row childrow = *(synTreeStore_->append(row.children()));
150                                 childrow[synColumns.name] = *cit2;
151                                 }
152                 }
153                 meaningsview_->set_sensitive(true);
154         } else {
155                 Gtk::TreeModel::Row row = *(synTreeStore_->append());
156                 row[synColumns.name] = _("No synonyms found");
157                 meaningsview_->set_sensitive(false);
158         }
159         meaningsview_->set_model(synTreeStore_);
160
161         if (keywordentry_->get_text_length()) {
162                 if (!applylock_) bc().valid(true);
163         } else {
164                 bc().valid(false);
165         }
166 }
167
168
169 } // namespace frontend
170 } // namespace lyx