3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
16 #include "LyXAction.h"
18 #include "FuncStatus.h"
20 #include "bufferparams.h"
21 #include "funcrequest.h"
24 #include "support/filetools.h"
25 #include "support/lstrings.h"
34 GView::Position getPosition(ToolbarBackend::Flags const & flags)
36 if (flags & ToolbarBackend::TOP)
38 if (flags & ToolbarBackend::BOTTOM)
40 if (flags & ToolbarBackend::LEFT)
42 if (flags & ToolbarBackend::RIGHT)
48 LyXTextClass const & getTextClass(LyXView const & lv)
50 return lv.buffer()->params().getLyXTextClass();
54 char const * gToolData = "tool_data";
57 inline void comboClear(Gtk::Combo & combo)
59 std::vector<Glib::ustring> strings;
60 strings.push_back("");
61 combo.set_popdown_strings(strings);
65 inline bool comboIsEmpty(Gtk::Combo & combo)
67 std::vector<Glib::ustring> strings = combo.get_popdown_strings();
68 return (strings.empty() || (strings.size() == 1 && strings[0] == ""));
75 GToolbar::GToolbar(LyXView * lyxView, int /*x*/, int /*y*/)
76 : view_(lyxView), internal_(false)
78 combo_.set_value_in_list();
79 combo_.get_entry()->set_editable(false);
80 combo_.unset_flags(Gtk::CAN_FOCUS | Gtk::CAN_DEFAULT);
81 combo_.get_entry()->unset_flags(Gtk::CAN_FOCUS | Gtk::CAN_DEFAULT);
83 combo_.get_entry()->signal_changed().connect(
85 >oolbar::onLayoutSelected));
93 void GToolbar::add(ToolbarBackend::Toolbar const & tbb)
95 Gtk::Toolbar * toolbar = manage(new Gtk::Toolbar);
96 ToolbarBackend::item_iterator it = tbb.items.begin();
97 ToolbarBackend::item_iterator end = tbb.items.end();
98 for (; it != end; ++it)
100 toolbar->set_toolbar_style(Gtk::TOOLBAR_ICONS);
102 GView::Position const position = getPosition(tbb.flags);
104 if (position == GView::Left || position == GView::Right)
105 toolbar->set_orientation(Gtk::ORIENTATION_VERTICAL);
107 GView * gview = static_cast<GView*>(view_);
108 gview->getBox(position).children().push_back(
109 Gtk::Box_Helpers::Element(*toolbar, Gtk::PACK_SHRINK));
111 if (tbb.flags & ToolbarBackend::ON)
114 toolbars_[tbb.name] = toolbar;
118 void GToolbar::add(Gtk::Toolbar * toolbar,
119 ToolbarBackend::Item const & item)
121 FuncRequest const & func = item.first;
122 string const & tooltip = item.second;
123 switch (func.action) {
124 case ToolbarBackend::SEPARATOR:
125 toolbar->tools().push_back(Gtk::Toolbar_Helpers::Space());
127 case ToolbarBackend::MINIBUFFER:
128 // Not supported yet.
130 case ToolbarBackend::LAYOUTS:
133 toolbar->tools().push_back(
134 Gtk::Toolbar_Helpers::Element(combo_));
135 toolbar->tools().back().get_widget()->set_data(
137 reinterpret_cast<void*>(&const_cast<ToolbarBackend::Item&>(item)));
142 Glib::ustring xpmName =
143 Glib::locale_to_utf8(toolbarbackend.getIcon(func));
144 Glib::ustring tip = Glib::locale_to_utf8(tooltip);
145 if (xpmName.size() == 0) {
146 toolbar->tools().push_back(
147 Gtk::Toolbar_Helpers::ButtonElem(
149 SigC::bind(SigC::slot(*this, >oolbar::onButtonClicked),
154 Gtk::manage(new Gtk::Image(xpmName));
156 toolbar->tools().push_back(
157 Gtk::Toolbar_Helpers::ButtonElem(
160 SigC::bind(SigC::slot(*this, >oolbar::onButtonClicked),
164 toolbar->tools().back().get_content()->set_data(
166 reinterpret_cast<void*>(&const_cast<ToolbarBackend::Item&>(item)));
173 void GToolbar::onButtonClicked(FuncRequest func)
175 view_->getLyXFunc().dispatch(func, true);
179 void GToolbar::onLayoutSelected()
183 string layoutGuiName = combo_.get_entry()->get_text();
184 // we get two signal, one of it is empty and useless
185 if (layoutGuiName.empty())
187 LyXTextClass const & tc = getTextClass(*view_);
189 LyXTextClass::const_iterator end = tc.end();
190 for (LyXTextClass::const_iterator cit = tc.begin();
192 if ((*cit)->name() == layoutGuiName) {
193 view_->getLyXFunc().dispatch(
194 FuncRequest(LFUN_LAYOUT, (*cit)->name()),
199 lyxerr << "ERROR (GToolbar::layoutSelected): layout not found! name : "
205 void GToolbar::displayToolbar(ToolbarBackend::Toolbar const & tbb, bool show_it)
207 ToolbarMap::iterator it = toolbars_.find(tbb.name);
208 BOOST_ASSERT(it != toolbars_.end());
217 void GToolbar::update()
219 ToolbarMap::iterator itToolbar;
220 for (itToolbar = toolbars_.begin();
221 itToolbar != toolbars_.end(); ++itToolbar) {
222 Gtk::Toolbar * toolbar = itToolbar->second;
223 Gtk::Toolbar_Helpers::ToolList::iterator it;
224 for (it = toolbar->tools().begin();
225 it != toolbar->tools().end(); ++it) {
226 Gtk::Widget * widget;
227 switch (it->get_type()) {
228 case Gtk::TOOLBAR_CHILD_WIDGET:
229 widget = it->get_widget();
231 case Gtk::TOOLBAR_CHILD_SPACE:
234 widget = it->get_content();
236 ToolbarBackend::Item * item =
237 reinterpret_cast<ToolbarBackend::Item*>(
238 widget->get_data(gToolData));
239 if (item->first.action == int(ToolbarBackend::LAYOUTS)) {
240 LyXFunc const & lf = view_->getLyXFunc();
241 bool const sensitive =
242 lf.getStatus(FuncRequest(LFUN_LAYOUT)).enabled();
243 widget->set_sensitive(sensitive);
246 FuncStatus const status = view_->
247 getLyXFunc().getStatus(item->first);
248 bool sensitive = status.enabled();
249 widget->set_sensitive(sensitive);
250 if (it->get_type() != Gtk::TOOLBAR_CHILD_BUTTON)
252 if (status.onoff(true))
253 static_cast<Gtk::Button*>(widget)->
254 set_relief(Gtk::RELIEF_NORMAL);
255 if (status.onoff(false))
256 static_cast<Gtk::Button*>(widget)->
257 set_relief(Gtk::RELIEF_NONE);
263 void GToolbar::setLayout(string const & layout)
265 LyXTextClass const & tc = getTextClass(*view_);
267 combo_.get_entry()->set_text(tc[layout]->name());
272 void GToolbar::updateLayoutList()
274 LyXTextClass const & tc = getTextClass(*view_);
275 LyXTextClass::const_iterator end = tc.end();
276 std::vector<Glib::ustring> strings;
277 for (LyXTextClass::const_iterator cit = tc.begin();
279 if ((*cit)->obsoleted_by().empty())
281 Glib::locale_to_utf8((*cit)->name()));
283 combo_.set_popdown_strings(strings);
288 void GToolbar::openLayoutList()
290 combo_.get_list()->activate();
294 void GToolbar::clearLayoutList()