]> git.lyx.org Git - lyx.git/blob - src/frontends/Toolbars.C
Remove unused symbol encoding
[lyx.git] / src / frontends / Toolbars.C
1 /**
2  * \file Toolbars.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Lars Gullik Bjønnes
7  * \author Angus Leeming
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "Toolbars.h"
15
16 #include "buffer.h"
17 #include "bufferparams.h"
18 #include "debug.h"
19 #include "funcrequest.h"
20 #include "FuncStatus.h"
21 #include "gettext.h"
22 #include "lyxfunc.h"
23 #include "lyxtextclass.h"
24 #include "LyXView.h"
25 #include "lyx_main.h"
26
27
28 namespace lyx {
29
30 using std::endl;
31 using std::string;
32
33
34 Toolbars::Toolbars(LyXView & owner)
35         : owner_(owner),
36           layout_(0),
37           last_textclass_(-1)
38 {}
39
40 #define TurnOnFlag(x)   flags |= ToolbarBackend::x
41 #define TurnOffFlag(x)  flags &= ~ToolbarBackend::x
42
43 void Toolbars::initFlags(ToolbarBackend::Toolbar & tbb)
44 {
45         ToolbarSection::ToolbarInfo & info = LyX::ref().session().toolbars().load(tbb.name);
46
47         unsigned int flags = static_cast<unsigned int>(tbb.flags);
48         // remove position
49         TurnOffFlag(TOP);
50         TurnOffFlag(BOTTOM);
51         TurnOffFlag(RIGHT);
52         TurnOffFlag(LEFT);
53
54         bool valid_location = true;
55         // init tbb.flags with saved location
56         if (info.location == ToolbarSection::ToolbarInfo::TOP)
57                 TurnOnFlag(TOP);
58         else if (info.location == ToolbarSection::ToolbarInfo::BOTTOM)
59                 TurnOnFlag(BOTTOM);
60         else if (info.location == ToolbarSection::ToolbarInfo::RIGHT)
61                 TurnOnFlag(RIGHT);
62         else if (info.location == ToolbarSection::ToolbarInfo::LEFT)
63                 TurnOnFlag(LEFT);
64         else {
65                 TurnOnFlag(TOP);
66                 valid_location = false;
67         }
68
69         // invalid location is for a new toolbar that has no saved information,
70         // so info.visible is not used for this case.
71         if (valid_location) {
72                 // init tbb.flags with saved visibility,
73                 TurnOffFlag(ON);
74                 TurnOffFlag(OFF);
75                 TurnOffFlag(AUTO);
76                 if (info.state == ToolbarSection::ToolbarInfo::ON)
77                         TurnOnFlag(ON);
78                 else if (info.state == ToolbarSection::ToolbarInfo::OFF)
79                         TurnOnFlag(OFF);
80                 else
81                         TurnOnFlag(AUTO);
82         }
83         /*
84         std::cout << "State " << info.state << " FLAGS: " << flags
85                 << " ON:" << (flags & ToolbarBackend::ON) 
86                 << " OFF:" << (flags & ToolbarBackend::OFF)
87                 << " L:" << (flags & ToolbarBackend::LEFT) 
88                 << " R:" << (flags & ToolbarBackend::RIGHT) 
89                 << " T:" << (flags & ToolbarBackend::TOP) 
90                 << " B:" << (flags & ToolbarBackend::BOTTOM) 
91                 << " MA:" << (flags & ToolbarBackend::MATH) 
92                 << " RE:" << (flags & ToolbarBackend::REVIEW) 
93                 << " TB:" << (flags & ToolbarBackend::TABLE) 
94                 << " AU:" << (flags & ToolbarBackend::AUTO) 
95                 << std::endl;
96         */
97         // now set the flags
98         tbb.flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
99 }
100
101
102 void Toolbars::init()
103 {
104         // extracts the toolbars from the backend
105         ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
106         ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
107
108         for (; cit != end; ++cit) {
109                 initFlags(*cit);
110                 add(*cit);
111         }
112 }
113
114
115 void Toolbars::display(string const & name, bool show)
116 {
117         ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
118         ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
119
120         for (; cit != end; ++cit) {
121                 if (cit->name == name) {
122                         displayToolbar(*cit, show);
123                         return;
124                 }
125         }
126
127         lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
128                 << name << endl;
129 }
130
131
132 ToolbarBackend::Flags Toolbars::getToolbarState(string const & name)
133 {       
134         ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
135         ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
136
137         for (; cit != end; ++cit) {
138                 if (cit->name == name)
139                         return cit->flags;
140         }
141
142         lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
143                 << name << endl;
144
145         // return dummy for msvc
146         return ToolbarBackend::OFF;
147 }
148
149
150 void Toolbars::toggleToolbarState(string const & name)
151 {
152         ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
153         ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
154
155         for (; cit != end; ++cit) {
156                 if (cit->name == name) {
157                         int flags = cit->flags;
158                         // off -> on
159                         if (flags & ToolbarBackend::OFF) {
160                                 TurnOffFlag(OFF);
161                                 TurnOnFlag(ON);
162                         // auto -> off
163                         } else if (flags & ToolbarBackend::AUTO) {
164                                 TurnOffFlag(AUTO);
165                                 TurnOnFlag(OFF);
166                         } else if ((flags & ToolbarBackend::MATH) || (flags & ToolbarBackend::TABLE)
167                                 || (flags & ToolbarBackend::REVIEW)) {
168                                 // for math etc, toggle from on -> auto
169                                 TurnOffFlag(ON);
170                                 TurnOnFlag(AUTO);
171                         } else {
172                                 // for others, toggle from on -> off
173                                 TurnOffFlag(ON);
174                                 TurnOnFlag(OFF);
175                         }
176                         cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
177                         return;
178                 }
179         }
180         lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
181                 << name << endl;
182 }
183 #undef TurnOnFlag
184 #undef TurnOffFlag
185
186
187 void Toolbars::update(bool in_math, bool in_table, bool review)
188 {
189         update();
190
191         // extracts the toolbars from the backend
192         ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
193         ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
194
195         for (; cit != end; ++cit) {
196                 if (cit->flags & ToolbarBackend::ON)
197                         displayToolbar(*cit, true);
198                 else if (cit->flags & ToolbarBackend::OFF)
199                         displayToolbar(*cit, false);
200                 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::MATH))
201                         displayToolbar(*cit, in_math);
202                 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::TABLE))
203                         displayToolbar(*cit, in_table);
204                 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::REVIEW))
205                         displayToolbar(*cit, review);
206         }
207 }
208
209
210 void Toolbars::saveToolbarInfo()
211 {
212         ToolbarSection & tb = LyX::ref().session().toolbars();
213
214         for (ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
215                 cit != toolbarbackend.end(); ++cit) {
216                 ToolbarsMap::iterator it = toolbars_.find(cit->name);
217                 BOOST_ASSERT(it != toolbars_.end());
218                 // get toolbar info from session.
219                 ToolbarSection::ToolbarInfo & info = tb.load(cit->name);
220                 if (cit->flags & ToolbarBackend::ON)
221                         info.state = ToolbarSection::ToolbarInfo::ON;
222                 else if (cit->flags & ToolbarBackend::OFF)
223                         info.state = ToolbarSection::ToolbarInfo::OFF;
224                 else if (cit->flags & ToolbarBackend::AUTO)
225                         info.state = ToolbarSection::ToolbarInfo::AUTO;
226                 // save other information
227                 // if auto, frontend should *not* set on/off
228                 it->second->saveInfo(info);
229                 // maybe it is useful to update flags with real status. I do not know
230                 /*
231                 if (!(cit->flags & ToolbarBackend::AUTO)) {
232                         unsigned int flags = static_cast<unsigned int>(cit->flags);
233                         flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::OFF : ToolbarBackend::ON);
234                         flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::ON : ToolbarBackend::OFF);
235                         if (info.state == ToolbarSection::ToolbarInfo::ON)
236                         cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
237                 }
238                 */
239         }
240 }
241
242
243 void Toolbars::setLayout(string const & layout)
244 {
245         if (layout_)
246                 layout_->set(layout);
247 }
248
249
250 bool Toolbars::updateLayoutList(int textclass)
251 {
252         // update the layout display
253         if (last_textclass_ != textclass) {
254                 if (layout_)
255                         layout_->update();
256                 last_textclass_ = textclass;
257                 return true;
258         } else
259                 return false;
260 }
261
262
263 void Toolbars::openLayoutList()
264 {
265         if (layout_)
266                 layout_->open();
267 }
268
269
270 void Toolbars::clearLayoutList()
271 {
272         last_textclass_ = -1;
273         if (layout_)
274                 layout_->clear();
275 }
276
277
278 void Toolbars::add(ToolbarBackend::Toolbar const & tbb)
279 {
280         ToolbarPtr tb_ptr = owner_.makeToolbar(tbb);
281         toolbars_[tbb.name] = tb_ptr;
282
283         if (tbb.flags & ToolbarBackend::ON)
284                 tb_ptr->show(false);
285         else
286                 tb_ptr->hide(false);
287
288         if (tb_ptr->layout())
289                 layout_ = tb_ptr->layout();
290 }
291
292
293 void Toolbars::displayToolbar(ToolbarBackend::Toolbar const & tbb,
294                               bool show_it)
295 {
296         ToolbarsMap::iterator it = toolbars_.find(tbb.name);
297         BOOST_ASSERT(it != toolbars_.end());
298
299         if (show_it)
300                 it->second->show(true);
301         else
302                 it->second->hide(true);
303 }
304
305
306 void Toolbars::update()
307 {
308         ToolbarsMap::const_iterator it = toolbars_.begin();
309         ToolbarsMap::const_iterator const end = toolbars_.end();
310         for (; it != end; ++it)
311                 it->second->update();
312
313         bool const enable =
314                 lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled();
315
316         if (layout_)
317                 layout_->setEnabled(enable);
318 }
319
320
321 void layoutSelected(LyXView & lv, string const & name)
322 {
323         LyXTextClass const & tc = lv.buffer()->params().getLyXTextClass();
324
325         LyXTextClass::const_iterator it  = tc.begin();
326         LyXTextClass::const_iterator const end = tc.end();
327         for (; it != end; ++it) {
328                 string const & itname = (*it)->name();
329                 // Yes, the lyx::to_utf8(_()) is correct
330                 if (lyx::to_utf8(_(itname)) == name) {
331                         FuncRequest const func(LFUN_LAYOUT, itname,
332                                                FuncRequest::UI);
333                         lv.dispatch(func);
334                         return;
335                 }
336         }
337         lyxerr << "ERROR (layoutSelected): layout not found!"
338                << endl;
339 }
340
341
342 } // namespace lyx