]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/XFormsMenubar.C
Change glob() API to accept a dir parameter.
[lyx.git] / src / frontends / xforms / XFormsMenubar.C
index d737f499fb0d4ef02c0d8c72c1d1211369b8fbb0..31aaac9475bef07ca9aed992bc8029d9fccbe71b 100644 (file)
 #include "support/lstrings.h"
 #include "support/tostr.h"
 
+#include <boost/bind.hpp>
+
 #include "lyx_forms.h"
 
-using lyx::support::lowercase;
-using lyx::support::subst;
+using boost::shared_ptr;
 
+using std::distance;
 using std::endl;
 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;
 
@@ -81,8 +89,12 @@ extern "C" {
 
 
 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());
 }
 
@@ -93,16 +105,27 @@ XFormsMenubar::~XFormsMenubar()
 
 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) {
@@ -116,11 +139,12 @@ void XFormsMenubar::makeMenubar(Menu const & menu)
                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);
@@ -128,7 +152,6 @@ void XFormsMenubar::makeMenubar(Menu const & menu)
                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);
 
@@ -137,7 +160,6 @@ void XFormsMenubar::makeMenubar(Menu const & menu)
                buttonlist_.push_back(iteminfo);
                obj->u_vdata = iteminfo.get();
        }
-
 }
 
 
@@ -268,7 +290,7 @@ int XFormsMenubar::create_submenu(Window win, XFormsView * view,
                                label += "%B";
                        if (flag.onoff(false))
                                label += "%b";
-                       if (flag.disabled())
+                       if (!flag.enabled())
                                label += "%i";
 
                        // Add the shortcut
@@ -296,7 +318,7 @@ int XFormsMenubar::create_submenu(Window win, XFormsView * view,
                                Funcs::iterator fit =
                                        funcs.insert(funcs.end(), item.func());
                                int const action_count =
-                                       std::distance(funcs.begin(), fit);
+                                       distance(funcs.begin(), fit);
 
                                label += "%x" + tostr(action_count + action_offset);
                                lyxerr[Debug::GUI] << "Action: \""
@@ -379,7 +401,7 @@ void XFormsMenubar::MenuCallback(FL_OBJECT * ob, long button)
                // If the action value is too low, then it is not a
                // valid action, but something else.
                if (choice >= action_offset) {
-                       view->getLyXFunc().dispatch(funcs[choice - action_offset], true);
+                       view->getLyXFunc().dispatch(funcs[choice - action_offset]);
                } else {
                        lyxerr[Debug::GUI]
                                << "MenuCallback: ignoring bogus action "
@@ -406,3 +428,6 @@ XFormsMenubar::ItemInfo::ItemInfo
 
 XFormsMenubar::ItemInfo::~ItemInfo()
 {}
+
+} // namespace frontend
+} // namespace lyx