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::iterator cit = toolbarbackend.begin();
122 ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
124 for (; cit != end; ++cit) {
125 if (cit->name == name) {
126 unsigned int flags = cit->flags;
135 cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
136 displayToolbar(*cit, show);
141 lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
146 ToolbarBackend::Flags Toolbars::getToolbarState(string const & name)
148 ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
149 ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
151 for (; cit != end; ++cit) {
152 if (cit->name == name)
156 lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
159 // return dummy for msvc
160 return ToolbarBackend::OFF;
164 void Toolbars::toggleToolbarState(string const & name)
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 int flags = cit->flags;
173 if (flags & ToolbarBackend::OFF) {
177 } else if (flags & ToolbarBackend::AUTO) {
180 } else if ((flags & ToolbarBackend::MATH) || (flags & ToolbarBackend::TABLE)
181 || (flags & ToolbarBackend::REVIEW)) {
182 // for math etc, toggle from on -> auto
186 // for others, toggle from on -> off
190 cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
194 lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
201 void Toolbars::update(bool in_math, bool in_table, bool review)
205 // extracts the toolbars from the backend
206 ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
207 ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
209 for (; cit != end; ++cit) {
210 if (cit->flags & ToolbarBackend::ON)
211 displayToolbar(*cit, true);
212 else if (cit->flags & ToolbarBackend::OFF)
213 displayToolbar(*cit, false);
214 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::MATH))
215 displayToolbar(*cit, in_math);
216 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::TABLE))
217 displayToolbar(*cit, in_table);
218 else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::REVIEW))
219 displayToolbar(*cit, review);
224 void Toolbars::saveToolbarInfo()
226 ToolbarSection & tb = LyX::ref().session().toolbars();
228 for (ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
229 cit != toolbarbackend.end(); ++cit) {
230 ToolbarsMap::iterator it = toolbars_.find(cit->name);
231 BOOST_ASSERT(it != toolbars_.end());
232 // get toolbar info from session.
233 ToolbarSection::ToolbarInfo & info = tb.load(cit->name);
234 if (cit->flags & ToolbarBackend::ON)
235 info.state = ToolbarSection::ToolbarInfo::ON;
236 else if (cit->flags & ToolbarBackend::OFF)
237 info.state = ToolbarSection::ToolbarInfo::OFF;
238 else if (cit->flags & ToolbarBackend::AUTO)
239 info.state = ToolbarSection::ToolbarInfo::AUTO;
240 // save other information
241 // if auto, frontend should *not* set on/off
242 it->second->saveInfo(info);
243 // maybe it is useful to update flags with real status. I do not know
245 if (!(cit->flags & ToolbarBackend::AUTO)) {
246 unsigned int flags = static_cast<unsigned int>(cit->flags);
247 flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::OFF : ToolbarBackend::ON);
248 flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::ON : ToolbarBackend::OFF);
249 if (info.state == ToolbarSection::ToolbarInfo::ON)
250 cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
257 void Toolbars::setLayout(string const & layout)
260 layout_->set(layout);
264 bool Toolbars::updateLayoutList(int textclass)
266 // update the layout display
267 if (last_textclass_ != textclass) {
270 last_textclass_ = textclass;
277 void Toolbars::openLayoutList()
284 void Toolbars::clearLayoutList()
286 last_textclass_ = -1;
292 void Toolbars::add(ToolbarBackend::Toolbar const & tbb)
294 ToolbarPtr tb_ptr = owner_.makeToolbar(tbb);
295 toolbars_[tbb.name] = tb_ptr;
297 if (tbb.flags & ToolbarBackend::ON)
302 if (tb_ptr->layout())
303 layout_ = tb_ptr->layout();
307 void Toolbars::displayToolbar(ToolbarBackend::Toolbar const & tbb,
310 ToolbarsMap::iterator it = toolbars_.find(tbb.name);
311 BOOST_ASSERT(it != toolbars_.end());
314 it->second->show(true);
316 it->second->hide(true);
320 void Toolbars::update()
322 ToolbarsMap::const_iterator it = toolbars_.begin();
323 ToolbarsMap::const_iterator const end = toolbars_.end();
324 for (; it != end; ++it)
325 it->second->update();
328 lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled();
331 layout_->setEnabled(enable);
335 void layoutSelected(LyXView & lv, string const & name)
337 LyXTextClass const & tc = lv.buffer()->params().getLyXTextClass();
339 LyXTextClass::const_iterator it = tc.begin();
340 LyXTextClass::const_iterator const end = tc.end();
341 for (; it != end; ++it) {
342 string const & itname = (*it)->name();
343 // Yes, the lyx::to_utf8(_()) is correct
344 if (lyx::to_utf8(_(itname)) == name) {
345 FuncRequest const func(LFUN_LAYOUT, itname,
346 FuncRequest::TOOLBAR);
351 lyxerr << "ERROR (layoutSelected): layout not found!"