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);
54 bool valid_location = true;
55 // init tbb.flags with saved location
56 if (info.location == ToolbarSection::ToolbarInfo::TOP)
58 else if (info.location == ToolbarSection::ToolbarInfo::BOTTOM)
60 else if (info.location == ToolbarSection::ToolbarInfo::RIGHT)
62 else if (info.location == ToolbarSection::ToolbarInfo::LEFT)
66 valid_location = false;
69 // invalid location is for a new toolbar that has no saved information,
70 // so info.visible is not used for this case.
72 // init tbb.flags with saved visibility,
76 if (info.state == ToolbarSection::ToolbarInfo::ON)
78 else if (info.state == ToolbarSection::ToolbarInfo::OFF)
84 std::cout << "State " << info.state << " FLAGS: " << flags
85 << " ON:" << (flags & ToolbarBackend::ON)
86 << " OFF:" << (flags & ToolbarBackend::OFF)
87 << " L:" << (flags & ToolbarBackend::LEFT)
88 << " R:" << (flags & ToolbarBackend::RIGHT)
89 << " T:" << (flags & ToolbarBackend::TOP)
90 << " B:" << (flags & ToolbarBackend::BOTTOM)
91 << " MA:" << (flags & ToolbarBackend::MATH)
92 << " RE:" << (flags & ToolbarBackend::REVIEW)
93 << " TB:" << (flags & ToolbarBackend::TABLE)
94 << " AU:" << (flags & ToolbarBackend::AUTO)
98 tbb.flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
102 void Toolbars::init()
104 // extracts the toolbars from the backend
105 ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
106 ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
108 for (; cit != end; ++cit) {
115 void Toolbars::display(string const & name, bool show)
117 ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
118 ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
120 for (; cit != end; ++cit) {
121 if (cit->name == name) {
122 displayToolbar(*cit, show);
127 lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
132 ToolbarBackend::Flags Toolbars::getToolbarState(string const & name)
134 ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
135 ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
137 for (; cit != end; ++cit) {
138 if (cit->name == name)
142 lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
145 // return dummy for msvc
146 return ToolbarBackend::OFF;
150 void Toolbars::toggleToolbarState(string const & name)
152 ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
153 ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
155 for (; cit != end; ++cit) {
156 if (cit->name == name) {
157 int flags = cit->flags;
159 if (flags & ToolbarBackend::OFF) {
163 } else if (flags & ToolbarBackend::AUTO) {
166 } else if ((flags & ToolbarBackend::MATH) || (flags & ToolbarBackend::TABLE)
167 || (flags & ToolbarBackend::REVIEW)) {
168 // for math etc, toggle from on -> auto
172 // for others, toggle from on -> off
176 cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
180 lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
187 void Toolbars::update(bool in_math, bool in_table, bool review)
191 // extracts the toolbars from the backend
192 ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
193 ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
195 for (; cit != end; ++cit) {
196 if (cit->flags & ToolbarBackend::ON)
197 displayToolbar(*cit, true);
198 else if (cit->flags & ToolbarBackend::OFF)
199 displayToolbar(*cit, false);
200 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::MATH))
201 displayToolbar(*cit, in_math);
202 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::TABLE))
203 displayToolbar(*cit, in_table);
204 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::REVIEW))
205 displayToolbar(*cit, review);
210 void Toolbars::saveToolbarInfo()
212 ToolbarSection & tb = LyX::ref().session().toolbars();
214 for (ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
215 cit != toolbarbackend.end(); ++cit) {
216 ToolbarsMap::iterator it = toolbars_.find(cit->name);
217 BOOST_ASSERT(it != toolbars_.end());
218 // get toolbar info from session.
219 ToolbarSection::ToolbarInfo & info = tb.load(cit->name);
220 if (cit->flags & ToolbarBackend::ON)
221 info.state = ToolbarSection::ToolbarInfo::ON;
222 else if (cit->flags & ToolbarBackend::OFF)
223 info.state = ToolbarSection::ToolbarInfo::OFF;
224 else if (cit->flags & ToolbarBackend::AUTO)
225 info.state = ToolbarSection::ToolbarInfo::AUTO;
226 // save other information
227 // if auto, frontend should *not* set on/off
228 it->second->saveInfo(info);
229 // maybe it is useful to update flags with real status. I do not know
231 if (!(cit->flags & ToolbarBackend::AUTO)) {
232 unsigned int flags = static_cast<unsigned int>(cit->flags);
233 flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::OFF : ToolbarBackend::ON);
234 flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::ON : ToolbarBackend::OFF);
235 if (info.state == ToolbarSection::ToolbarInfo::ON)
236 cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
243 void Toolbars::setLayout(string const & layout)
246 layout_->set(layout);
250 bool Toolbars::updateLayoutList(int textclass)
252 // update the layout display
253 if (last_textclass_ != textclass) {
256 last_textclass_ = textclass;
263 void Toolbars::openLayoutList()
270 void Toolbars::clearLayoutList()
272 last_textclass_ = -1;
278 void Toolbars::add(ToolbarBackend::Toolbar const & tbb)
280 ToolbarPtr tb_ptr = owner_.makeToolbar(tbb);
281 toolbars_[tbb.name] = tb_ptr;
283 if (tbb.flags & ToolbarBackend::ON)
288 if (tb_ptr->layout())
289 layout_ = tb_ptr->layout();
293 void Toolbars::displayToolbar(ToolbarBackend::Toolbar const & tbb,
296 ToolbarsMap::iterator it = toolbars_.find(tbb.name);
297 BOOST_ASSERT(it != toolbars_.end());
300 it->second->show(true);
302 it->second->hide(true);
306 void Toolbars::update()
308 ToolbarsMap::const_iterator it = toolbars_.begin();
309 ToolbarsMap::const_iterator const end = toolbars_.end();
310 for (; it != end; ++it)
311 it->second->update();
314 lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled();
317 layout_->setEnabled(enable);
321 void layoutSelected(LyXView & lv, string const & name)
323 LyXTextClass const & tc = lv.buffer()->params().getLyXTextClass();
325 LyXTextClass::const_iterator it = tc.begin();
326 LyXTextClass::const_iterator const end = tc.end();
327 for (; it != end; ++it) {
328 string const & itname = (*it)->name();
329 // Yes, the lyx::to_utf8(_()) is correct
330 if (lyx::to_utf8(_(itname)) == name) {
331 FuncRequest const func(LFUN_LAYOUT, itname,
337 lyxerr << "ERROR (layoutSelected): layout not found!"