2 * \file GuiToolbars.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Lars Gullik Bjønnes
7 * \author Angus Leeming
8 * \author Abdelrazak Younes
10 * Full author contact details are available in file CREDITS.
15 #include "GuiToolbars.h"
17 #include "GuiCommandBuffer.h"
18 #include "GuiToolbar.h"
22 #include "BufferParams.h"
23 #include "FuncRequest.h"
24 #include "FuncStatus.h"
28 #include "TextClass.h"
29 #include "ToolbarBackend.h"
31 #include "support/debug.h"
32 #include "support/gettext.h"
34 #include "support/lassert.h"
42 #define TurnOnFlag(x) flags |= ToolbarInfo::x
43 #define TurnOffFlag(x) flags &= ~ToolbarInfo::x
45 GuiToolbars::GuiToolbars(GuiView & owner)
52 void GuiToolbars::initFlags(ToolbarInfo & tbinfo)
54 ToolbarSection::ToolbarInfo & info = LyX::ref().session().toolbars().load(tbinfo.name);
56 unsigned int flags = static_cast<unsigned int>(tbinfo.flags);
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;
66 bool valid_location = true;
67 // init tbinfo.flags with saved location
68 if (info.location == ToolbarSection::ToolbarInfo::TOP)
70 else if (info.location == ToolbarSection::ToolbarInfo::BOTTOM)
72 else if (info.location == ToolbarSection::ToolbarInfo::RIGHT)
74 else if (info.location == ToolbarSection::ToolbarInfo::LEFT)
77 // use setting from default.ui
79 valid_location = false;
82 // invalid location is for a new toolbar that has no saved information,
83 // so info.visible is not used for this case.
85 // init tbinfo.flags with saved visibility,
89 if (info.state == ToolbarSection::ToolbarInfo::ON)
91 else if (info.state == ToolbarSection::ToolbarInfo::OFF)
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)
111 tbinfo.flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
115 void GuiToolbars::init()
117 ToolbarsMap::const_iterator it = toolbars_.begin();
118 for (; it != toolbars_.end(); ++it)
122 // extracts the toolbars from the backend
123 ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
124 ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
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)
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;
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) {
155 last_loc = tb->info.location;
156 last_posx = tb->info.posx;
157 last_posy = tb->info.posy;
164 void GuiToolbars::display(string const & name, bool show)
166 ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
167 ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
169 for (; cit != end; ++cit) {
170 if (cit->name == name) {
171 unsigned int flags = cit->flags;
179 cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
180 displayToolbar(*cit, show);
184 LYXERR(Debug::GUI, "Toolbar::display: no toolbar named " << name);
188 ToolbarInfo * GuiToolbars::getToolbarInfo(string const & name)
190 return toolbarbackend.getUsedToolbarInfo(name);
194 void GuiToolbars::toggleToolbarState(string const & name, bool allowauto)
196 ToolbarInfo * tbi = toolbarbackend.getUsedToolbarInfo(name);
199 LYXERR(Debug::GUI, "Toolbar::display: no toolbar named " << name);
203 int flags = tbi->flags;
205 if (flags & ToolbarInfo::OFF) {
209 } else if (flags & ToolbarInfo::AUTO) {
213 && ((flags & ToolbarInfo::MATH)
214 || (flags & ToolbarInfo::TABLE)
215 || (flags & ToolbarInfo::REVIEW)
216 || (flags & ToolbarInfo::MATHMACROTEMPLATE))) {
217 // for math etc, toggle from on -> auto
221 // for others, toggle from on -> off
225 tbi->flags = static_cast<ToolbarInfo::Flags>(flags);
229 void GuiToolbars::toggleFullScreen(bool start_full_screen)
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;
235 // extracts the toolbars from the backend
236 ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
237 ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
240 for (; cit != end; ++cit) {
242 if (start_full_screen) {
243 if (toolbarbackend.fullScreenWindows == 1)
244 flags = cit->before_fullscreen = cit->flags;
249 flags = cit->before_fullscreen;
251 cit->flags = static_cast<ToolbarInfo::Flags>(flags);
258 void GuiToolbars::update(bool in_math, bool in_table, bool review,
259 bool in_mathmacrotemplate)
263 // extracts the toolbars from the backend
264 ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
265 ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
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);
284 bool GuiToolbars::visible(string const & name) const
286 map<string, GuiToolbar *>::const_iterator it =
287 toolbars_.find(name);
288 if (it == toolbars_.end())
290 return it->second->isVisible();
294 void GuiToolbars::saveToolbarInfo()
296 ToolbarSection & tb = LyX::ref().session().toolbars();
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
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);
327 void GuiToolbars::add(ToolbarInfo const & tbinfo, bool newline)
329 GuiToolbar * tb_ptr = owner_.makeToolbar(tbinfo, newline);
330 toolbars_[tbinfo.name] = tb_ptr;
332 if (tbinfo.flags & ToolbarInfo::ON)
339 void GuiToolbars::displayToolbar(ToolbarInfo const & tbinfo,
342 ToolbarsMap::iterator it = toolbars_.find(tbinfo.name);
343 LASSERT(it != toolbars_.end(), /**/);
346 if (it->second->isVisible())
350 else if (it->second->isVisible())
355 void GuiToolbars::updateIcons()
357 ToolbarsMap::const_iterator it = toolbars_.begin();
358 ToolbarsMap::const_iterator const end = toolbars_.end();
359 for (; it != end; ++it)
360 it->second->updateContents();
364 void GuiToolbars::showCommandBuffer(bool show_it)
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();
373 // FIXME: this is a hack, "minibuffer" should not be
375 display("minibuffer", false);
378 if (!it->second->isVisible())
379 display("minibuffer", true);
385 } // namespace frontend