#include <config.h>
#include "XFormsMenubar.h"
-#include "MenuBackend.h"
+
#include "XFormsView.h"
+
+#include "debug.h"
+#include "gettext.h"
#include "lyxfunc.h"
+#include "MenuBackend.h"
+
#include "support/lstrings.h"
#include "support/tostr.h"
-#include "support/LAssert.h"
-#include "gettext.h"
-#include "debug.h"
-#include "lyx_forms.h"
-//#include <boost/scoped_ptr.hpp>
+#include <boost/bind.hpp>
-#include <algorithm>
+#include "lyx_forms.h"
-using namespace lyx::support;
+using boost::shared_ptr;
+using std::distance;
using std::endl;
-using std::vector;
-using std::max;
-using std::min;
using std::for_each;
+using std::string;
+using std::vector;
+
+namespace lyx {
+
+using support::lowercase;
+using support::subst;
+
+namespace frontend {
typedef vector<int>::size_type size_type;
XFormsMenubar::XFormsMenubar(LyXView * view, MenuBackend const & mb)
- : owner_(static_cast<XFormsView*>(view)), menubackend_(&mb)
+ : owner_(static_cast<XFormsView*>(view)),
+ menubackend_(&mb)
{
+ owner_->metricsUpdated.connect(boost::bind(&WidgetMap::updateMetrics,
+ &widgets_));
+
makeMenubar(menubackend_->getMenubar());
}
void XFormsMenubar::makeMenubar(Menu const & menu)
{
- FL_FORM * form = owner_->getForm();
- int moffset = 0;
+ // Draw a frame around the whole.
+ BoxList & boxlist = owner_->getBox(XFormsView::Top)->children();
- // Create menu frame if there is non yet.
- FL_OBJECT * frame = fl_add_frame(FL_UP_FRAME, 0, 0,
- form->w, mheight, "");
+ FL_OBJECT * frame = fl_add_frame(FL_UP_FRAME, 0, 0, 0, 0, "");
fl_set_object_resize(frame, FL_RESIZE_ALL);
- fl_set_object_gravity(frame, NorthWestGravity,
- NorthEastGravity);
+ fl_set_object_gravity(frame, NorthWestGravity, NorthEastGravity);
+
+ menubar_ = widgets_.add(frame, boxlist, 0, mheight);
+
+ // The menubar contains three vertically-aligned Boxes,
+ // the center one of which is to contain the buttons,
+ // aligned horizontally.
+ // The other two provide some visual padding.
+ menubar_->children().push_back(Box(0, yloc));
+ shared_ptr<Box> menubar_center = menubar_->children().push_back(Box(0,0));
+ menubar_center->set(Box::Horizontal);
+ menubar_->children().push_back(Box(0, yloc));
+
+ BoxList & menubar_buttons = menubar_center->children();
+ // Add the buttons.
Menu::const_iterator i = menu.begin();
Menu::const_iterator end = menu.end();
for (; i != end; ++i) {
string const label = i->label();
string const shortcut = '#' + i->shortcut();
int const width = string_width(label);
- obj = fl_add_button(FL_MENU_BUTTON,
- air + moffset, yloc,
- width + mbadd,
- mbheight,
- label.c_str());
+
+ obj = fl_add_button(FL_MENU_BUTTON, 0, 0, 0, 0, label.c_str());
+
+ menubar_buttons.push_back(Box(air, 0));
+ widgets_.add(obj, menubar_buttons, width + mbadd, mbheight);
+
fl_set_object_boxtype(obj, FL_FLAT_BOX);
fl_set_object_color(obj, FL_MCOL, FL_MCOL);
fl_set_object_lsize(obj, MENU_LABEL_SIZE);
fl_set_object_resize(obj, FL_RESIZE_ALL);
fl_set_object_gravity(obj, NorthWestGravity,
NorthWestGravity);
- moffset += obj->w + air;
fl_set_object_shortcut(obj, shortcut.c_str(), 1);
fl_set_object_callback(obj, C_XFormsMenubar_MenuCallback, 1);
buttonlist_.push_back(iteminfo);
obj->u_vdata = iteminfo.get();
}
-
}
int XFormsMenubar::create_submenu(Window win, XFormsView * view,
- Menu const & menu, vector<int> & smn)
+ Menu const & menu,
+ vector<int> & smn, Funcs & funcs)
{
- const int menuid = get_new_submenu(smn, win);
+ int const menuid = get_new_submenu(smn, win);
lyxerr[Debug::GUI] << "XFormsMenubar::create_submenu: creating "
<< menu.name() << " as menuid=" << menuid << endl;
++count;
// add a More... submenu if the menu is too long (but
// not just for one extra entry!)
- if (count > max_number_of_items && (i+1) != end) {
+ if (count > max_number_of_items && (i + 1) != end) {
int tmpmenuid = get_new_submenu(smn, win);
lyxerr[Debug::GUI] << "Too many items, creating "
<< "new menu " << tmpmenuid << endl;
}
// Is there a separator after the item?
- if ((i+1) != end
+ if ((i + 1) != end
&& (i + 1)->kind() == MenuItem::Separator)
label += "%l";
label += "%B";
if (flag.onoff(false))
label += "%b";
- if (flag.disabled())
+ if (!flag.enabled())
label += "%i";
// Add the shortcut
// create the submenu
submenuid =
create_submenu(win, view,
- *item.submenu(), smn);
+ *item.submenu(), smn, funcs);
if (submenuid == -1)
return -1;
label += "%x" + tostr(smn.size());
<< "), ";
} else {
// Add the action
- label += "%x" + tostr(item.action()
- + action_offset);
+ Funcs::iterator fit =
+ funcs.insert(funcs.end(), item.func());
+ int const action_count =
+ distance(funcs.begin(), fit);
+
+ label += "%x" + tostr(action_count + action_offset);
lyxerr[Debug::GUI] << "Action: \""
- << item.action() << "\", ";
+ << item.func().action
+ << "(" << item.func().argument
+ << ")\", ";
}
// Add everything to the menu
}
// Paranoia check
- Assert(item->kind() == MenuItem::Submenu);
+ BOOST_ASSERT(item->kind() == MenuItem::Submenu);
// set tabstop length
fl_set_tabstop(menu_tabstop);
Menu tomenu;
Menu const frommenu = menubackend_->getMenu(item->submenuname());
menubackend_->expand(frommenu, tomenu, view);
+ Funcs funcs;
vector<int> submenus;
int menu = iteminfo->menubar_->create_submenu(FL_ObjWin(ob), view,
- tomenu, submenus);
+ tomenu, submenus, funcs);
if (menu != -1) {
// place popup
fl_setpup_position(view->getForm()->x + ob->x,
// If the action value is too low, then it is not a
// valid action, but something else.
- if (choice >= action_offset + 1) {
- view->getLyXFunc().dispatch(choice - action_offset, true);
+ if (choice >= action_offset) {
+ view->getLyXFunc().dispatch(funcs[choice - action_offset]);
} else {
lyxerr[Debug::GUI]
<< "MenuCallback: ignoring bogus action "
XFormsMenubar::ItemInfo::~ItemInfo()
{}
+
+} // namespace frontend
+} // namespace lyx