]> git.lyx.org Git - lyx.git/blob - src/frontends/Toolbars.C
Session/Toolbars:
[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 void Toolbars::toggleToolbarState(string const & name)
133 {
134         ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
135         ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
136
137         for (; cit != end; ++cit) {
138                 if (cit->name == name) {
139                         int flags = cit->flags;
140                         if (flags & ToolbarBackend::ON) {
141                                 TurnOffFlag(ON);
142                                 TurnOnFlag(OFF);
143                         } else if (flags & ToolbarBackend::AUTO) {
144                                 TurnOffFlag(AUTO);
145                                 TurnOnFlag(ON);
146                         } else if ((flags & ToolbarBackend::MATH) || (flags & ToolbarBackend::TABLE)
147                                 || (flags & ToolbarBackend::REVIEW)) {
148                                 // for math etc, toggle from off -> auto
149                                 TurnOffFlag(OFF);
150                                 TurnOnFlag(AUTO);
151                         } else {
152                                 // for others, toggle from off -> on
153                                 TurnOffFlag(OFF);
154                                 TurnOnFlag(ON);
155                         }
156                         cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
157                         break;
158                 }
159         }
160 }
161 #undef TurnOnFlag
162 #undef TurnOffFlag
163
164
165 void Toolbars::update(bool in_math, bool in_table, bool review)
166 {
167         update();
168
169         // extracts the toolbars from the backend
170         ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
171         ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
172
173         for (; cit != end; ++cit) {
174                 if (cit->flags & ToolbarBackend::ON)
175                         displayToolbar(*cit, true);
176                 else if (cit->flags & ToolbarBackend::OFF)
177                         displayToolbar(*cit, false);
178                 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::MATH))
179                         displayToolbar(*cit, in_math);
180                 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::TABLE))
181                         displayToolbar(*cit, in_table);
182                 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::REVIEW))
183                         displayToolbar(*cit, review);
184         }
185 }
186
187
188 void Toolbars::saveToolbarInfo()
189 {
190         ToolbarSection & tb = LyX::ref().session().toolbars();
191
192         for (ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
193                 cit != toolbarbackend.end(); ++cit) {
194                 ToolbarsMap::iterator it = toolbars_.find(cit->name);
195                 BOOST_ASSERT(it != toolbars_.end());
196                 // get toolbar info from session.
197                 ToolbarSection::ToolbarInfo & info = tb.load(cit->name);
198                 if (cit->flags & ToolbarBackend::ON)
199                         info.state = ToolbarSection::ToolbarInfo::ON;
200                 else if (cit->flags & ToolbarBackend::OFF)
201                         info.state = ToolbarSection::ToolbarInfo::OFF;
202                 else if (cit->flags & ToolbarBackend::AUTO)
203                         info.state = ToolbarSection::ToolbarInfo::AUTO;
204                 // save other information
205                 // if auto, frontend should *not* set on/off
206                 it->second->saveInfo(info);
207                 // maybe it is useful to update flags with real status. I do not know
208                 /*
209                 if (!(cit->flags & ToolbarBackend::AUTO)) {
210                         unsigned int flags = static_cast<unsigned int>(cit->flags);
211                         flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::OFF : ToolbarBackend::ON);
212                         flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::ON : ToolbarBackend::OFF);
213                         if (info.state == ToolbarSection::ToolbarInfo::ON)
214                         cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
215                 }
216                 */
217         }
218 }
219
220
221 void Toolbars::setLayout(string const & layout)
222 {
223         if (layout_)
224                 layout_->set(layout);
225 }
226
227
228 bool Toolbars::updateLayoutList(int textclass)
229 {
230         // update the layout display
231         if (last_textclass_ != textclass) {
232                 if (layout_)
233                         layout_->update();
234                 last_textclass_ = textclass;
235                 return true;
236         } else
237                 return false;
238 }
239
240
241 void Toolbars::openLayoutList()
242 {
243         if (layout_)
244                 layout_->open();
245 }
246
247
248 void Toolbars::clearLayoutList()
249 {
250         last_textclass_ = -1;
251         if (layout_)
252                 layout_->clear();
253 }
254
255
256 void Toolbars::add(ToolbarBackend::Toolbar const & tbb)
257 {
258         ToolbarPtr tb_ptr = owner_.makeToolbar(tbb);
259         toolbars_[tbb.name] = tb_ptr;
260
261         if (tbb.flags & ToolbarBackend::ON)
262                 tb_ptr->show(false);
263         else
264                 tb_ptr->hide(false);
265
266         if (tb_ptr->layout())
267                 layout_ = tb_ptr->layout();
268 }
269
270
271 void Toolbars::displayToolbar(ToolbarBackend::Toolbar const & tbb,
272                               bool show_it)
273 {
274         ToolbarsMap::iterator it = toolbars_.find(tbb.name);
275         BOOST_ASSERT(it != toolbars_.end());
276
277         if (show_it)
278                 it->second->show(true);
279         else
280                 it->second->hide(true);
281 }
282
283
284 void Toolbars::update()
285 {
286         ToolbarsMap::const_iterator it = toolbars_.begin();
287         ToolbarsMap::const_iterator const end = toolbars_.end();
288         for (; it != end; ++it)
289                 it->second->update();
290
291         bool const enable =
292                 lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled();
293
294         if (layout_)
295                 layout_->setEnabled(enable);
296 }
297
298
299 void layoutSelected(LyXView & lv, string const & name)
300 {
301         LyXTextClass const & tc = lv.buffer()->params().getLyXTextClass();
302
303         LyXTextClass::const_iterator it  = tc.begin();
304         LyXTextClass::const_iterator const end = tc.end();
305         for (; it != end; ++it) {
306                 string const & itname = (*it)->name();
307                 // Yes, the lyx::to_utf8(_()) is correct
308                 if (lyx::to_utf8(_(itname)) == name) {
309                         FuncRequest const func(LFUN_LAYOUT, itname,
310                                                FuncRequest::UI);
311                         lv.dispatch(func);
312                         return;
313                 }
314         }
315         lyxerr << "ERROR (layoutSelected): layout not found!"
316                << endl;
317 }
318
319
320 } // namespace lyx