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
9 * Full author contact details are available in file CREDITS.
17 #include "bufferparams.h"
19 #include "funcrequest.h"
20 #include "FuncStatus.h"
23 #include "lyxtextclass.h"
34 Toolbars::Toolbars(LyXView & owner)
40 #define TurnOnFlag(x) flags |= ToolbarBackend::x
41 #define TurnOffFlag(x) flags &= ~ToolbarBackend::x
43 void Toolbars::initFlags(ToolbarBackend::Toolbar & tbb)
45 ToolbarSection::ToolbarInfo & info = LyX::ref().session().toolbars().load(tbb.name);
47 unsigned int flags = static_cast<unsigned int>(tbb.flags);
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;
57 bool valid_location = true;
58 // init tbb.flags with saved location
59 if (info.location == ToolbarSection::ToolbarInfo::TOP)
61 else if (info.location == ToolbarSection::ToolbarInfo::BOTTOM)
63 else if (info.location == ToolbarSection::ToolbarInfo::RIGHT)
65 else if (info.location == ToolbarSection::ToolbarInfo::LEFT)
68 // use setting from default.ui
70 valid_location = false;
73 // invalid location is for a new toolbar that has no saved information,
74 // so info.visible is not used for this case.
76 // init tbb.flags with saved visibility,
80 if (info.state == ToolbarSection::ToolbarInfo::ON)
82 else if (info.state == ToolbarSection::ToolbarInfo::OFF)
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)
102 tbb.flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
106 void Toolbars::init()
108 // extracts the toolbars from the backend
109 ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
110 ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
112 for (; cit != end; ++cit) {
119 void Toolbars::display(string const & name, bool show)
121 ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
122 ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
124 for (; cit != end; ++cit) {
125 if (cit->name == name) {
126 displayToolbar(*cit, show);
131 lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
136 ToolbarBackend::Flags Toolbars::getToolbarState(string const & name)
138 ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
139 ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
141 for (; cit != end; ++cit) {
142 if (cit->name == name)
146 lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
149 // return dummy for msvc
150 return ToolbarBackend::OFF;
154 void Toolbars::toggleToolbarState(string const & name)
156 ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
157 ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
159 for (; cit != end; ++cit) {
160 if (cit->name == name) {
161 int flags = cit->flags;
163 if (flags & ToolbarBackend::OFF) {
167 } else if (flags & ToolbarBackend::AUTO) {
170 } else if ((flags & ToolbarBackend::MATH) || (flags & ToolbarBackend::TABLE)
171 || (flags & ToolbarBackend::REVIEW)) {
172 // for math etc, toggle from on -> auto
176 // for others, toggle from on -> off
180 cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
184 lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
191 void Toolbars::update(bool in_math, bool in_table, bool review)
195 // extracts the toolbars from the backend
196 ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
197 ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
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);
214 void Toolbars::saveToolbarInfo()
216 ToolbarSection & tb = LyX::ref().session().toolbars();
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
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);
247 void Toolbars::setLayout(string const & layout)
250 layout_->set(layout);
254 bool Toolbars::updateLayoutList(int textclass)
256 // update the layout display
257 if (last_textclass_ != textclass) {
260 last_textclass_ = textclass;
267 void Toolbars::openLayoutList()
274 void Toolbars::clearLayoutList()
276 last_textclass_ = -1;
282 void Toolbars::add(ToolbarBackend::Toolbar const & tbb)
284 ToolbarPtr tb_ptr = owner_.makeToolbar(tbb);
285 toolbars_[tbb.name] = tb_ptr;
287 if (tbb.flags & ToolbarBackend::ON)
292 if (tb_ptr->layout())
293 layout_ = tb_ptr->layout();
297 void Toolbars::displayToolbar(ToolbarBackend::Toolbar const & tbb,
300 ToolbarsMap::iterator it = toolbars_.find(tbb.name);
301 BOOST_ASSERT(it != toolbars_.end());
304 it->second->show(true);
306 it->second->hide(true);
310 void Toolbars::update()
312 ToolbarsMap::const_iterator it = toolbars_.begin();
313 ToolbarsMap::const_iterator const end = toolbars_.end();
314 for (; it != end; ++it)
315 it->second->update();
318 lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled();
321 layout_->setEnabled(enable);
325 void layoutSelected(LyXView & lv, string const & name)
327 LyXTextClass const & tc = lv.buffer()->params().getLyXTextClass();
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);
341 lyxerr << "ERROR (layoutSelected): layout not found!"