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