]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/GuiToolbars.cpp
Complete the removal of the embedding stuff. Maybe. It's hard to be sure we got every...
[lyx.git] / src / frontends / qt4 / GuiToolbars.cpp
1 /**
2  * \file GuiToolbars.cpp
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  * \author Abdelrazak Younes
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12
13 #include <config.h>
14
15 #include "GuiToolbars.h"
16
17 #include "GuiCommandBuffer.h"
18 #include "GuiToolbar.h"
19 #include "GuiView.h"
20
21 #include "Buffer.h"
22 #include "BufferParams.h"
23 #include "FuncRequest.h"
24 #include "FuncStatus.h"
25 #include "Layout.h"
26 #include "LyX.h"
27 #include "LyXFunc.h"
28 #include "TextClass.h"
29 #include "ToolbarBackend.h"
30
31 #include "support/debug.h"
32 #include "support/gettext.h"
33
34 #include "support/assert.h"
35
36
37 using namespace std;
38
39 namespace lyx {
40 namespace frontend {
41
42 #define TurnOnFlag(x)   flags |= ToolbarInfo::x
43 #define TurnOffFlag(x)  flags &= ~ToolbarInfo::x
44
45 GuiToolbars::GuiToolbars(GuiView & owner)
46         : owner_(owner)
47 {
48         init();
49 }
50
51
52 void GuiToolbars::initFlags(ToolbarInfo & tbinfo)
53 {
54         ToolbarSection::ToolbarInfo & info = LyX::ref().session().toolbars().load(tbinfo.name);
55
56         unsigned int flags = static_cast<unsigned int>(tbinfo.flags);
57
58         // Remove default.ui positions. Only when a valid postion is stored
59         // in the session file the default.ui value will be overwritten
60         unsigned int save = flags;
61         TurnOffFlag(TOP);
62         TurnOffFlag(BOTTOM);
63         TurnOffFlag(RIGHT);
64         TurnOffFlag(LEFT);
65
66         bool valid_location = true;
67         // init tbinfo.flags with saved location
68         if (info.location == ToolbarSection::ToolbarInfo::TOP)
69                 TurnOnFlag(TOP);
70         else if (info.location == ToolbarSection::ToolbarInfo::BOTTOM)
71                 TurnOnFlag(BOTTOM);
72         else if (info.location == ToolbarSection::ToolbarInfo::RIGHT)
73                 TurnOnFlag(RIGHT);
74         else if (info.location == ToolbarSection::ToolbarInfo::LEFT)
75                 TurnOnFlag(LEFT);
76         else {
77                 // use setting from default.ui
78                 flags = save;
79                 valid_location = false;
80         }
81
82         // invalid location is for a new toolbar that has no saved information,
83         // so info.visible is not used for this case.
84         if (valid_location) {
85                 // init tbinfo.flags with saved visibility,
86                 TurnOffFlag(ON);
87                 TurnOffFlag(OFF);
88                 TurnOffFlag(AUTO);
89                 if (info.state == ToolbarSection::ToolbarInfo::ON)
90                         TurnOnFlag(ON);
91                 else if (info.state == ToolbarSection::ToolbarInfo::OFF)
92                         TurnOnFlag(OFF);
93                 else
94                         TurnOnFlag(AUTO);
95         }
96         /*
97         cout << "State " << info.state << " FLAGS: " << flags
98                 << " ON:" << (flags & ToolbarBackend::ON)
99                 << " OFF:" << (flags & ToolbarBackend::OFF)
100                 << " L:" << (flags & ToolbarBackend::LEFT)
101                 << " R:" << (flags & ToolbarBackend::RIGHT)
102                 << " T:" << (flags & ToolbarBackend::TOP)
103                 << " B:" << (flags & ToolbarBackend::BOTTOM)
104                 << " MA:" << (flags & ToolbarBackend::MATH)
105                 << " RE:" << (flags & ToolbarBackend::REVIEW)
106                 << " TB:" << (flags & ToolbarBackend::TABLE)
107                 << " AU:" << (flags & ToolbarBackend::AUTO)
108                 << endl;
109         */
110         // now set the flags
111         tbinfo.flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
112 }
113
114
115 void GuiToolbars::init()
116 {
117         ToolbarsMap::const_iterator it = toolbars_.begin();
118         for (; it != toolbars_.end(); ++it)
119                 delete it->second;
120         toolbars_.clear();
121
122         // extracts the toolbars from the backend
123         ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
124         ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
125
126         // init flags will also add these toolbars to session if they
127         // are not already there (e.g. first run of lyx).
128         for (; cit != end; ++cit)
129                 initFlags(*cit);
130
131         // add toolbars according the order in session
132         ToolbarSection::ToolbarList::const_iterator tb =
133                 LyX::ref().session().toolbars().begin();
134         ToolbarSection::ToolbarList::const_iterator te =
135                 LyX::ref().session().toolbars().end();
136         ToolbarSection::ToolbarInfo::Location last_loc =
137                 ToolbarSection::ToolbarInfo::NOTSET;
138         int last_posx = 0;
139         int last_posy = 0;
140         for (; tb != te; ++tb) {
141                 LYXERR(Debug::INIT, "Adding " << tb->key << " at position "
142                         << tb->info.posx << " " << tb->info.posy);
143                 // add toolbar break if posx or posy changes
144                 bool newline = tb->info.location == last_loc && (
145                         // if two toolbars at the same location, assume uninitialized and add toolbar break
146                         (tb->info.posx == last_posx && tb->info.posy == last_posy) ||
147                         (last_loc == ToolbarSection::ToolbarInfo::TOP && tb->info.posy != last_posy) ||
148                         (last_loc == ToolbarSection::ToolbarInfo::BOTTOM && tb->info.posy != last_posy) ||
149                         (last_loc == ToolbarSection::ToolbarInfo::LEFT && tb->info.posx != last_posx) ||
150                         (last_loc == ToolbarSection::ToolbarInfo::RIGHT && tb->info.posx != last_posx) );
151                 // find the backend item and add
152                 for (cit = toolbarbackend.begin(); cit != end; ++cit)
153                         if (cit->name == tb->key) {
154                                 add(*cit, newline);
155                                 last_loc = tb->info.location;
156                                 last_posx = tb->info.posx;
157                                 last_posy = tb->info.posy;
158                                 break;
159                         }
160         }
161 }
162
163
164 void GuiToolbars::display(string const & name, bool show)
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                         unsigned int flags = cit->flags;
172                         TurnOffFlag(ON);
173                         TurnOffFlag(OFF);
174                         TurnOffFlag(AUTO);
175                         if (show)
176                                 TurnOnFlag(ON);
177                         else
178                                 TurnOnFlag(OFF);
179                         cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
180                         displayToolbar(*cit, show);
181                 }
182         }
183
184         LYXERR(Debug::GUI, "Toolbar::display: no toolbar named " << name);
185 }
186
187
188 ToolbarInfo * GuiToolbars::getToolbarInfo(string const & name)
189 {
190         return toolbarbackend.getUsedToolbarInfo(name);
191 }
192
193
194 void GuiToolbars::toggleToolbarState(string const & name, bool allowauto)
195 {
196         ToolbarInfo * tbi = toolbarbackend.getUsedToolbarInfo(name);
197
198         if (!tbi) {
199                 LYXERR(Debug::GUI, "Toolbar::display: no toolbar named " << name);
200                 return;
201         }
202
203         int flags = tbi->flags;
204         // off -> on
205         if (flags & ToolbarInfo::OFF) {
206                 TurnOffFlag(OFF);
207                 TurnOnFlag(ON);
208         // auto -> off
209         } else if (flags & ToolbarInfo::AUTO) {
210                 TurnOffFlag(AUTO);
211                 TurnOnFlag(OFF);
212         } else if (allowauto 
213                    && ((flags & ToolbarInfo::MATH) 
214                        || (flags & ToolbarInfo::TABLE)
215                        || (flags & ToolbarInfo::REVIEW)
216                        || (flags & ToolbarInfo::MATHMACROTEMPLATE))) {
217                 // for math etc, toggle from on -> auto
218                 TurnOffFlag(ON);
219                 TurnOnFlag(AUTO);
220         } else {
221                 // for others, toggle from on -> off
222                 TurnOffFlag(ON);
223                 TurnOnFlag(OFF);
224         }
225         tbi->flags = static_cast<ToolbarInfo::Flags>(flags);
226 }
227
228
229 void GuiToolbars::toggleFullScreen(bool start_full_screen)
230 {
231         // we need to know number of fullscreens until every
232         // LyXView has its own toolbar configuration
233         toolbarbackend.fullScreenWindows += start_full_screen ? 1 : -1;
234
235         // extracts the toolbars from the backend
236         ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
237         ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
238         int flags = 0;
239
240         for (; cit != end; ++cit) {
241
242                 if (start_full_screen) {
243                         if (toolbarbackend.fullScreenWindows == 1)
244                                 flags = cit->before_fullscreen = cit->flags;
245                         TurnOffFlag(ON);
246                         TurnOffFlag(AUTO);
247                         TurnOnFlag(OFF);
248                 } else
249                         flags = cit->before_fullscreen;
250
251                 cit->flags = static_cast<ToolbarInfo::Flags>(flags);
252         }
253 }
254 #undef TurnOnFlag
255 #undef TurnOffFlag
256
257
258 void GuiToolbars::update(bool in_math, bool in_table, bool review, 
259         bool in_mathmacrotemplate)
260 {
261         updateIcons();
262
263         // extracts the toolbars from the backend
264         ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
265         ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
266
267         for (; cit != end; ++cit) {
268                 if (cit->flags & ToolbarInfo::ON)
269                         displayToolbar(*cit, true);
270                 else if (cit->flags & ToolbarInfo::OFF)
271                         displayToolbar(*cit, false);
272                 else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::MATH))
273                         displayToolbar(*cit, in_math);
274                 else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::TABLE))
275                         displayToolbar(*cit, in_table);
276                 else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::REVIEW))
277                         displayToolbar(*cit, review);   
278                 else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::MATHMACROTEMPLATE))
279                         displayToolbar(*cit, in_mathmacrotemplate);
280         }
281 }
282
283
284 bool GuiToolbars::visible(string const & name) const
285 {
286         map<string, GuiToolbar *>::const_iterator it =
287                 toolbars_.find(name);
288         if (it == toolbars_.end())
289                 return false;
290         return it->second->isVisible();
291 }
292
293
294 void GuiToolbars::saveToolbarInfo()
295 {
296         ToolbarSection & tb = LyX::ref().session().toolbars();
297
298         for (ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
299                 cit != toolbarbackend.end(); ++cit) {
300                 ToolbarsMap::iterator it = toolbars_.find(cit->name);
301                 LASSERT(it != toolbars_.end(), /**/);
302                 // get toolbar info from session.
303                 ToolbarSection::ToolbarInfo & info = tb.load(cit->name);
304                 if (cit->flags & ToolbarInfo::ON)
305                         info.state = ToolbarSection::ToolbarInfo::ON;
306                 else if (cit->flags & ToolbarInfo::OFF)
307                         info.state = ToolbarSection::ToolbarInfo::OFF;
308                 else if (cit->flags & ToolbarInfo::AUTO)
309                         info.state = ToolbarSection::ToolbarInfo::AUTO;
310                 // save other information
311                 // if auto, frontend should *not* set on/off
312                 it->second->saveInfo(info);
313                 // maybe it is useful to update flags with real status. I do not know
314                 /*
315                 if (!(cit->flags & ToolbarInfo::AUTO)) {
316                         unsigned int flags = static_cast<unsigned int>(cit->flags);
317                         flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarInfo::OFF : ToolbarInfo::ON);
318                         flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarInfo::ON : ToolbarInfo::OFF);
319                         if (info.state == ToolbarSection::ToolbarInfo::ON)
320                         cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
321                 }
322                 */
323         }
324 }
325
326
327 void GuiToolbars::add(ToolbarInfo const & tbinfo, bool newline)
328 {
329         GuiToolbar * tb_ptr = owner_.makeToolbar(tbinfo, newline);
330         toolbars_[tbinfo.name] = tb_ptr;
331
332         if (tbinfo.flags & ToolbarInfo::ON)
333                 tb_ptr->show();
334         else
335                 tb_ptr->hide();
336 }
337
338
339 void GuiToolbars::displayToolbar(ToolbarInfo const & tbinfo,
340                               bool show_it)
341 {
342         ToolbarsMap::iterator it = toolbars_.find(tbinfo.name);
343         LASSERT(it != toolbars_.end(), /**/);
344
345         if (show_it) {
346                 if (it->second->isVisible())
347                         return;
348                 it->second->show();
349         }
350         else if (it->second->isVisible())
351                 it->second->hide();
352 }
353
354
355 void GuiToolbars::updateIcons()
356 {
357         ToolbarsMap::const_iterator it = toolbars_.begin();
358         ToolbarsMap::const_iterator const end = toolbars_.end();
359         for (; it != end; ++it)
360                 it->second->updateContents();
361 }
362
363
364 void GuiToolbars::showCommandBuffer(bool show_it)
365 {
366         ToolbarsMap::const_iterator it = toolbars_.begin();
367         ToolbarsMap::const_iterator const end = toolbars_.end();
368         for (; it != end; ++it) {
369                 GuiCommandBuffer * cb = it->second->commandBuffer();
370                 if (!cb)
371                         continue;
372                 if (!show_it) {
373                         // FIXME: this is a hack, "minibuffer" should not be
374                         // hardcoded.
375                         display("minibuffer", false);
376                         return;
377                 }
378                 if (!it->second->isVisible())
379                         display("minibuffer", true);
380                 cb->setFocus();
381                 return;
382         }
383 }
384
385 } // namespace frontend
386 } // namespace lyx