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