X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fxforms%2FMenubar_pimpl.C;h=bb90a386bad67f2ace9652d0281f339869833cf4;hb=9f29ab3aa5fb11baca9bc28dc3710076cb3a2645;hp=d3bd54caae96d2ae0993d6acec6c9bed4fd01bc4;hpb=4b2a999762c83627476428e595d3c1e3704a3da0;p=lyx.git diff --git a/src/frontends/xforms/Menubar_pimpl.C b/src/frontends/xforms/Menubar_pimpl.C index d3bd54caae..bb90a386ba 100644 --- a/src/frontends/xforms/Menubar_pimpl.C +++ b/src/frontends/xforms/Menubar_pimpl.C @@ -7,35 +7,37 @@ * *======================================================*/ +#include + +#include + #ifdef __GNUG__ #pragma implementation #endif -#include - -#include -#include #include "support/lstrings.h" -#include "support/filetools.h" -#include "support/StrPool.h" #include "support/LAssert.h" #include "debug.h" #include "LyXAction.h" #include "lyxfunc.h" #include "kbmap.h" -#include "bufferlist.h" -#include "lastfiles.h" +#include "buffer.h" +#include "Dialogs.h" #include "LyXView.h" -#include "lyx_gui_misc.h" #include "MenuBackend.h" #include "Menubar_pimpl.h" using std::endl; +using std::vector; +using std::max; +using std::min; + +typedef vector::size_type size_type; -extern kb_keymap * toplevel_keymap; +extern boost::scoped_ptr toplevel_keymap; extern LyXAction lyxaction; -extern BufferList bufferlist; -extern LastFiles * lastfiles; + +namespace { // Some constants const int MENU_LABEL_SIZE = FL_NORMAL_SIZE; @@ -48,120 +50,77 @@ const int mbadd = 20; // menu button add (to width) const int air = 2; char const * menu_tabstop = "aa"; char const * default_tabstop = "aaaaaaaa"; +// We do not want to mix position values in a menu (like the index of +// a submenu) with the action numbers which convey actual information. +// Therefore we offset all the action values by an arbitrary large +// constant. +const int action_offset = 1000; + +// This is used a few times below. +inline +int string_width(string const & str) +{ + return fl_get_string_widthTAB(FL_NORMAL_STYLE, MENU_LABEL_SIZE, + str.c_str(), + static_cast(str.length())); +} + +} // namespace anon -//Defined later. +//Defined later, used in makeMenubar(). extern "C" void C_Menubar_Pimpl_MenuCallback(FL_OBJECT * ob, long button); Menubar::Pimpl::Pimpl(LyXView * view, MenuBackend const & mb) - : frame_(0), owner_(view), menubackend_(&mb) + : owner_(view), menubackend_(&mb), current_group_(0) { - // Should we do something here? + for (MenuBackend::const_iterator menu = menubackend_->begin(); + menu != menubackend_->end() ; ++menu) { + if (menu->menubar()) { + FL_OBJECT * group = fl_bgn_group(); + makeMenubar(*menu); + fl_end_group(); + fl_hide_object(group); + lyxerr[Debug::GUI] + << "Menubar::Pimpl::Pimpl: " + << "creating and hiding group " << group + << " for menubar " << menu->name() << endl; + menubarmap_[menu->name()] = group; + } + } } -Menubar::Pimpl::~Pimpl() -{ - // Should we do something here? -} -void Menubar::Pimpl::set(string const & menu_name) +void Menubar::Pimpl::makeMenubar(Menu const &menu) { - lyxerr[Debug::GUI] << "Entering Menubar::Pimpl::set " - << "for menu `" << menu_name << "'" << endl; - - if (menu_name == current_menu) { - lyxerr[Debug::GUI] << "Nothing to do." << endl; - return; - } - - // If the backend has not been initialized yet, we use a - // default instead. - if (menubackend_->empty()) { - lyxerr << "Menubar::Pimpl::set: menubackend is empty! " - "using default values." << endl; - MenuBackend * mb = new MenuBackend(); - mb->defaults(); - menubackend_ = mb; - } - - if (!menubackend_->hasMenu(menu_name)){ - lyxerr << "ERROR:set: Unknown menu `" << menu_name - << "'" << endl; - return; - } - - Menu menu = menubackend_->getMenu(menu_name); - - if (!menu.menubar()) { - lyxerr << "Only a menubar-type object can go in a " - "toplevel menu" << endl; - return; - } - - current_menu = menu_name; FL_FORM * form = owner_->getForm(); int moffset = 0; - bool form_was_open, form_was_frozen; - - if (fl_current_form == form) - form_was_open = true; - else if (fl_current_form == 0) { - form_was_open = false; - fl_addto_form(form); - } - else { - lyxerr << "Something is wrong: unknown form " - << fl_current_form << " is already open" - << "(main form is " << form << ")" << endl; - return; - } - if (form->frozen) - form_was_frozen = true; - else { - form_was_frozen = false; - fl_freeze_form(form); - } - - // Delete old buttons if there are some. - for(ButtonList::const_iterator cit = buttonlist_.begin(); - cit != buttonlist_.end(); ++cit) { - if ((*cit)->obj_) { - fl_delete_object((*cit)->obj_); - fl_free_object((*cit)->obj_); - } - delete (*cit); - } - buttonlist_.clear(); // Create menu frame if there is non yet. - if (!frame_) { - frame_ = fl_add_frame(FL_UP_FRAME, 0, 0, form->w, mheight, ""); - fl_set_object_resize(frame_, FL_RESIZE_ALL); - fl_set_object_gravity(frame_, NorthWestGravity, - NorthEastGravity); - } + FL_OBJECT * frame = fl_add_frame(FL_UP_FRAME, 0, 0, + form->w, mheight, ""); + fl_set_object_resize(frame, FL_RESIZE_ALL); + fl_set_object_gravity(frame, NorthWestGravity, + NorthEastGravity); for (Menu::const_iterator i = menu.begin(); i != menu.end(); ++i) { FL_OBJECT * obj; if (i->kind() != MenuItem::Submenu) { - lyxerr << "ERROR: Menubar::Pimpl::Pimpl:" + lyxerr << "ERROR: Menubar::Pimpl::createMenubar:" " only submenus can appear in a menubar"; break; } - char const * label = idex(i->label().c_str()); - char const * shortcut = scex(i->label().c_str()); - int width = fl_get_string_width(FL_NORMAL_STYLE, - MENU_LABEL_SIZE, - label, - strlen(label)); - obj = fl_add_button(FL_TOUCH_BUTTON, + string label = i->label(); + string shortcut = "#" + i->shortcut(); + int width = string_width(label); + obj = fl_add_button(FL_MENU_BUTTON, air + moffset, yloc, width + mbadd, mbheight, - label); + label.c_str()); 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); @@ -170,34 +129,59 @@ void Menubar::Pimpl::set(string const & menu_name) fl_set_object_gravity(obj, NorthWestGravity, NorthWestGravity); moffset += obj->w + air; - fl_set_object_shortcut(obj, shortcut, 1); + fl_set_object_shortcut(obj, shortcut.c_str(), 1); fl_set_object_callback(obj, C_Menubar_Pimpl_MenuCallback, 1); - ItemInfo * iteminfo = new ItemInfo(this, - new MenuItem(*i), obj); + + boost::shared_ptr iteminfo(new ItemInfo(this, + new MenuItem(*i), obj)); buttonlist_.push_back(iteminfo); - obj->u_vdata = iteminfo; -// lyxerr << "MenuCallback: ItemInfo address=" << iteminfo -// << " Val=(pimpl_=" << iteminfo->pimpl_ -// << ", item_=" << iteminfo->item_ -// << ", obj_=" << iteminfo->obj_ << ")" <u_vdata = iteminfo.get(); } - if (!form_was_frozen) { - fl_unfreeze_form(form); - } - if (!form_was_open) - fl_end_form(); +} + +void Menubar::Pimpl::set(string const & menu_name) +{ + lyxerr[Debug::GUI] << "Entering Menubar::Pimpl::set " + << "for menu `" << menu_name << "'" << endl; - lyxerr[Debug::GUI] << "Menubar set." << endl; + if (menu_name != current_menu_name_) { + MenubarMap::iterator mbit = menubarmap_.find(menu_name); + + if (mbit == menubarmap_.end()) { + lyxerr << "ERROR:set: Unknown menu `" << menu_name + << "'" << endl; + return; + } + + if (current_group_) { + lyxerr[Debug::GUI] << " hiding group " + << current_group_ << endl; + fl_hide_object(current_group_); + } + + lyxerr[Debug::GUI] << " showing group " + << mbit->second << endl; + fl_show_object(mbit->second); + current_menu_name_ = menu_name; + current_group_ = mbit->second; + lyxerr[Debug::GUI] << "Menubar::Pimpl::set: Menubar set." + << endl; + } + else + lyxerr [Debug::GUI] << "Menubar::Pimpl::set: Nothing to do." + << endl; } void Menubar::Pimpl::openByName(string const & name) { - for(ButtonList::const_iterator cit = buttonlist_.begin(); - cit != buttonlist_.end(); ++cit) { - if ((*cit)->item_->submenu() == name) { - MenuCallback((*cit)->obj_, 1); - return; + if (menubackend_->getMenu(current_menu_name_).hasSubmenu(name)) { + for (ButtonList::const_iterator cit = buttonlist_.begin(); + cit != buttonlist_.end(); ++cit) { + if ((*cit)->item_->submenu() == name) { + MenuCallback((*cit)->obj_, 1); + return; + } } } lyxerr << "Menubar::Pimpl::openByName: menu " @@ -205,136 +189,309 @@ void Menubar::Pimpl::openByName(string const & name) } -void Menubar::Pimpl::add_lastfiles(int menu, string const & extra_label, - std::vector & /*smn*/, - StrPool & strpool) +namespace { + +inline +string const limit_string_length(string const & str) { - int ii = 1; - for (LastFiles::const_iterator cit = lastfiles->begin(); - cit != lastfiles->end() && ii < 10; ++cit, ++ii) { - - int action = - lyxaction.getPseudoAction(LFUN_FILE_OPEN, (*cit)); - string label = tostr(ii) + ". " - + MakeDisplayPath((*cit),30) - + "%x" + tostr(action); - if ((cit + 1) == lastfiles->end()) - label += extra_label; - string shortcut = tostr(ii) + "#" + tostr(ii); - lyxerr[Debug::GUI] << "shortcut is " << shortcut << - endl; - - int n = fl_addtopup(menu, strpool.add(label)); - fl_setpup_shortcut(menu, n, strpool.add(shortcut)); - } + string::size_type const max_item_length = 45; + + if (str.size() > max_item_length) + return str.substr(0, max_item_length - 3) + "..."; + else + return str; +} + +int get_new_submenu(vector & smn, Window win) +{ + static size_type max_number_of_menus = 32; + if (smn.size() >= max_number_of_menus) + max_number_of_menus = + fl_setpup_maxpup(static_cast(2*smn.size())); + int menu = fl_newpup(win); + smn.push_back(menu); + return menu; } -void Menubar::Pimpl::add_documents(int menu, string const & extra_label, - std::vector & /*smn*/, - StrPool & strpool) + +size_type const max_number_of_items = 25; + +inline +string const fixlabel(string const & str) { - std::vector names = bufferlist.getFileNames(); +#if FL_REVISION < 89 + return subst(str, '%', '?'); +#else + return subst(str, "%", "%%"); +#endif +} - if (names.empty()) { - fl_addtopup(menu,_("No Documents Open!%i")); - return; +} // namespace anon + + +void add_toc2(int menu, string const & extra_label, + vector & smn, Window win, + vector const & toc_list, + size_type from, size_type to, int depth) +{ + int shortcut_count = 0; + if (to - from <= max_number_of_items) { + for (size_type i = from; i < to; ++i) { + int const action = lyxaction. + getPseudoAction(LFUN_GOTO_PARAGRAPH, + tostr(toc_list[i].par->id())); + string label(4 * max(0, toc_list[i].depth - depth),' '); + label += fixlabel(toc_list[i].str); + label = limit_string_length(label); + label += "%x" + tostr(action + action_offset); + if (i == to - 1 && depth == 0) + label += extra_label; + if (toc_list[i].depth == depth + && ++shortcut_count <= 9) { + label += "%h"; + fl_addtopup(menu, label.c_str(), + tostr(shortcut_count).c_str()); + } else + fl_addtopup(menu, label.c_str()); + } + } else { + size_type pos = from; + size_type count = 0; + while (pos < to) { + ++count; + if (count > max_number_of_items) { + int menu2 = get_new_submenu(smn, win); + add_toc2(menu2, extra_label, smn, win, + toc_list, pos, to, depth); + string label = _("More"); + label += "...%m"; + if (depth == 0) + label += extra_label; + fl_addtopup(menu, label.c_str(), menu2); + break; + } + size_type new_pos = pos+1; + while (new_pos < to && + toc_list[new_pos].depth > depth) + ++new_pos; + + int const action = lyxaction. + getPseudoAction(LFUN_GOTO_PARAGRAPH, + tostr(toc_list[pos].par->id())); + string label(4 * max(0, toc_list[pos].depth - depth), ' '); + label += fixlabel(toc_list[pos].str); + label = limit_string_length(label); + if (new_pos == to && depth == 0) + label += extra_label; + string shortcut; + if (toc_list[pos].depth == depth && + ++shortcut_count <= 9) + shortcut = tostr(shortcut_count); + + if (new_pos == pos + 1) { + label += "%x" + tostr(action + action_offset); + if (!shortcut.empty()) { + label += "%h"; + fl_addtopup(menu, label.c_str(), + shortcut.c_str()); + } else + fl_addtopup(menu, label.c_str()); + } else { + int menu2 = get_new_submenu(smn, win); + add_toc2(menu2, extra_label, smn, win, + toc_list, pos, new_pos, depth+1); + label += "%m"; + if (!shortcut.empty()) { + label += "%h"; + fl_addtopup(menu, label.c_str(), menu2, + shortcut.c_str()); + } else + fl_addtopup(menu, label.c_str(), menu2); + } + pos = new_pos; + } } +} - for (std::vector::const_iterator cit = names.begin(); - cit != names.end() ; ++cit) { - int action = - lyxaction.getPseudoAction(LFUN_SWITCHBUFFER, *cit); - string label = MakeDisplayPath(*cit, 30) - + "%x" + tostr(action); - if ((cit + 1) == names.end()) - label += extra_label; - - fl_addtopup(menu, strpool.add(label)); + +void Menubar::Pimpl::add_toc(int menu, string const & extra_label, + vector & smn, Window win) +{ +#if 0 + //xgettext:no-c-format + static char const * MenuNames[3] = { N_("List of Figures%m"), + //xgettext:no-c-format + N_("List of Tables%m"), + //xgettext:no-c-format + N_("List of Algorithms%m") }; + + vector > toc_list = + owner_->buffer()->getTocList(); + + // Handle LOF/LOT/LOA + int max_nonempty = 0; + for (int i = 1; i <= 3; ++i) + if (!toc_list[i].empty()) + max_nonempty = i; + + for (int j = 1; j <= 3; ++j) + if (!toc_list[j].empty()) { + int menu2 = get_new_submenu(smn, win); + for (size_type i = 0; i < toc_list[j].size(); ++i) { + if (i > max_number_of_items) { + fl_addtopup(menu2, ". . .%d"); + break; + } + int const action = lyxaction. + getPseudoAction(LFUN_GOTO_PARAGRAPH, + tostr(toc_list[j][i].par->id())); + string label = fixlabel(toc_list[j][i].str); + label = limit_string_length(label); + label += "%x" + tostr(action + action_offset); + fl_addtopup(menu2, label.c_str()); + } + if (j == max_nonempty) { + string label = _(MenuNames[j - 1]); + label += "%l"; + fl_addtopup(menu, label.c_str(), menu2); + } else + fl_addtopup(menu, _(MenuNames[j - 1]), menu2); + } + + // Handle normal TOC + if (max_nonempty == 0 && toc_list[0].empty()) { + fl_addtopup(menu, (_("No Table of Contents%i") + + extra_label).c_str()); + return; } + add_toc2(menu, extra_label, smn, win, + toc_list[0], 0, toc_list[0].size(), 0); +#else +#warning Fix Me! (Lgb) + Buffer::Lists toc_list = owner_->buffer()->getLists(); + Buffer::Lists::const_iterator cit = toc_list.begin(); + Buffer::Lists::const_iterator end = toc_list.end(); + for (; cit != end; ++cit) { + // Handle this elsewhere + if (cit->first == "TOC") continue; + + int menu2 = get_new_submenu(smn, win); + Buffer::SingleList::const_iterator ccit = cit->second.begin(); + Buffer::SingleList::const_iterator eend = cit->second.end(); + for (; ccit != eend; ++ccit) { + int const action = + lyxaction + .getPseudoAction(LFUN_GOTO_PARAGRAPH, + tostr(ccit->par->id())); + string label = fixlabel(ccit->str); + label = limit_string_length(label); + label += "%x" + tostr(action + action_offset); + fl_addtopup(menu2, label.c_str()); + } + string const m = cit->first + "%m"; + fl_addtopup(menu, m.c_str(), menu2); + } + + + // Handle normal TOC + cit = toc_list.find("TOC"); + if (cit == end) { + string const tmp = _("No Table of contents%i") + extra_label; + fl_addtopup(menu, tmp.c_str()); + return; + } else { + add_toc2(menu, extra_label, smn, win, + cit->second, 0, cit->second.size(), 0); + } + +#endif } - int Menubar::Pimpl::create_submenu(Window win, LyXView * view, string const & menu_name, - std::vector & smn, StrPool & strpool) + vector & smn) { if (!menubackend_->hasMenu(menu_name)){ lyxerr << "ERROR:create_submenu: Unknown menu `" << menu_name << "'" << endl; return -1; } - Menu md = menubackend_->getMenu(menu_name); + Menu md = Menu(); + menubackend_->getMenu(menu_name).expand(md, owner_->buffer()); - int menu = fl_newpup(win); + int menu = get_new_submenu(smn, win); fl_setpup_softedge(menu, true); fl_setpup_bw(menu, -1); lyxerr[Debug::GUI] << "Adding menu " << menu << " in deletion list" << endl; - smn.push_back(menu); // Compute the size of the largest label (because xforms is // not able to support shortcuts correctly...) - int max_width = 0, max_tabs = 0; - int tab_width = fl_get_string_width(FL_NORMAL_STYLE, MENU_LABEL_SIZE, - menu_tabstop, strlen(menu_tabstop)); - for (Menu::const_iterator i = md.begin(); i != md.end(); ++i) { - MenuItem item = (*i); + int max_width = 0; + string widest_label; + Menu::const_iterator end = md.end(); + for (Menu::const_iterator i = md.begin(); i != end; ++i) { + MenuItem const & item = (*i); if (item.kind() == MenuItem::Command) { - string label = idex(item.label().c_str()); - int width = fl_get_string_width(FL_NORMAL_STYLE, - MENU_LABEL_SIZE, - label.c_str(), - label.length()); - if (width > max_width) + string label = item.label() + '\t'; + int width = string_width(label); + if (width > max_width) { max_width = width; + widest_label = label; + } } } - max_tabs = (max_width + 5)/tab_width + 1; - lyxerr[Debug::GUI] << "tab_width=" << tab_width - << ", max_width=" << max_width - << ", max_tabs=" << max_tabs << endl; - - for (Menu::const_iterator i = md.begin(); i != md.end(); ++i) { - MenuItem item = (*i); - // Is there a separator after this item? - string extra_label; - if ((i+1) != md.end() - && (i+1)->kind() == MenuItem::Separator) - extra_label = "%l"; - - switch(item.kind()) { + lyxerr[Debug::GUI] << "max_width=" << max_width + << ", widest_label=`" << widest_label + << "'" << endl; + + // Compute where to put separators + vector extra_labels(md.size()); + vector::iterator it = extra_labels.begin(); + vector::iterator last = it; + for (Menu::const_iterator i = md.begin(); i != end; ++i, ++it) + if (i->kind() == MenuItem::Separator) + *last = "%l"; + else if (!i->optional() || + !(view->getLyXFunc()->getStatus(i->action()) & LyXFunc::Disabled)) + last = it; + + it = extra_labels.begin(); + for (Menu::const_iterator i = md.begin(); i != end; ++i, ++it) { + MenuItem const & item = (*i); + string & extra_label = *it; + + switch (item.kind()) { case MenuItem::Command: { LyXFunc::func_status flag = view->getLyXFunc()->getStatus(item.action()); + + // handle optional entries. + if (item.optional() && (flag & LyXFunc::Disabled)) { + lyxerr[Debug::GUI] + << "Skipping optional item " + << item.label() << endl; + break; + } + // Get the keys bound to this action, but keep only the // first one later - string accel = toplevel_keymap->findbinding(item.action()); - lyxerr[Debug::GUI] << "Command: " - << lyxaction.getActionName(item.action()) - << " Binding " << accel << endl; - + string const accel = toplevel_keymap->findbinding(item.action()); // Build the menu label from all the info - string label = idex(item.label().c_str()); + string label = item.label(); if (!accel.empty()) { - // Try to be clever and add enough + // Try to be clever and add just enough // tabs to align shortcuts. - int width = - fl_get_string_width(FL_NORMAL_STYLE, - MENU_LABEL_SIZE, - label.c_str(), - label.length()); - int nb = max_tabs - width/tab_width; - lyxerr[Debug::GUI] << "label=" << label - << ", tabs=" << nb - << endl; - if (nb > 0) - label += string(nb, '\t'); + do + label += '\t'; + while (string_width(label) < max_width + 5); label += accel.substr(1,accel.find(']') - 1); } - label += "%x" + tostr(item.action()) + extra_label; + label += "%x" + tostr(item.action() + action_offset) + + extra_label; // Modify the entry using the function status string pupmode; @@ -347,38 +504,41 @@ int Menubar::Pimpl::create_submenu(Window win, LyXView * view, label += pupmode; // Finally the menu shortcut - string shortcut = scex(item.label().c_str()); + string shortcut = item.shortcut(); if (!shortcut.empty()) { - string xfshortcut; - xfshortcut += uppercase(shortcut[0]); - xfshortcut += '#'; - xfshortcut += uppercase(shortcut[0]); - xfshortcut += lowercase(shortcut[0]); - xfshortcut += '#'; - xfshortcut += lowercase(shortcut[0]); - lyxerr[Debug::GUI] << "shortcut is " - << xfshortcut << endl; + shortcut += lowercase(shortcut[0]); label += "%h"; - fl_addtopup(menu, strpool.add(label), - strpool.add(xfshortcut)); + fl_addtopup(menu, label.c_str(), + shortcut.c_str()); } else - fl_addtopup(menu, strpool.add(label)); - + fl_addtopup(menu, label.c_str()); + + lyxerr[Debug::GUI] << "Command: \"" + << lyxaction.getActionName(item.action()) + << "\", binding \"" << accel + << "\", shortcut \"" << shortcut + << "\"" << endl; break; } case MenuItem::Submenu: { int submenu = create_submenu(win, view, - item.submenu(), - smn, strpool); + item.submenu(), smn); if (submenu == -1) return -1; - string label = idex(item.label().c_str()); + string label = item.label(); label += extra_label + "%m"; - string shortcut = scex(item.label().c_str()); - int n = fl_addtopup(menu, strpool.add(label), submenu); - fl_setpup_shortcut(menu, n, strpool.add(shortcut)); + string shortcut = item.shortcut(); + if (!shortcut.empty()) { + shortcut += lowercase(shortcut[0]); + label += "%h"; + fl_addtopup(menu, label.c_str(), + submenu, shortcut.c_str()); + } + else { + fl_addtopup(menu, label.c_str(), submenu); + } break; } @@ -387,13 +547,18 @@ int Menubar::Pimpl::create_submenu(Window win, LyXView * view, // we just ignore it. break; - case MenuItem::Documents: - add_documents(menu, extra_label, smn, strpool); + case MenuItem::Toc: + add_toc(menu, extra_label, smn, win); break; - + case MenuItem::Documents: case MenuItem::Lastfiles: - add_lastfiles(menu, extra_label, smn, strpool); + case MenuItem::ViewFormats: + case MenuItem::UpdateFormats: + case MenuItem::ExportFormats: + case MenuItem::ImportFormats: + lyxerr << "Menubar::Pimpl::create_submenu: " + "this should not happen" << endl; break; } @@ -401,6 +566,7 @@ int Menubar::Pimpl::create_submenu(Window win, LyXView * view, return menu; } + extern "C" void C_Menubar_Pimpl_MenuCallback(FL_OBJECT * ob, long button) { @@ -417,8 +583,14 @@ void Menubar::Pimpl::MenuCallback(FL_OBJECT * ob, long button) // << ", obj_=" << iteminfo->obj_ << ")" <pimpl_->owner_; - MenuItem const * item = iteminfo->item_; - + MenuItem const * item = iteminfo->item_.get(); + + /* get the splash out of the way. It would be nicer + * to only have this code at the start, but xforms + * makes it too ugly to do + */ + view->getDialogs()->destroySplash(); + if (button == 1) { // set the pseudo menu-button fl_set_object_boxtype(ob, FL_DOWN_BOX); @@ -431,12 +603,10 @@ void Menubar::Pimpl::MenuCallback(FL_OBJECT * ob, long button) // set tabstop length fl_set_tabstop(menu_tabstop); - std::vector submenus; - StrPool strpool; + vector submenus; int menu = iteminfo->pimpl_-> create_submenu(FL_ObjWin(ob), view, - item->submenu(), - submenus, strpool); + item->submenu(), submenus); if (menu != -1) { // place popup fl_setpup_position(view->getForm()->x + ob->x, @@ -448,9 +618,16 @@ void Menubar::Pimpl::MenuCallback(FL_OBJECT * ob, long button) fl_set_object_boxtype(ob, FL_FLAT_BOX); fl_redraw_object(ob); } - - if (choice >= 1) { - view->getLyXFunc()->Dispatch(choice); + + // 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); + } + else { + lyxerr[Debug::GUI] + << "MenuCallback: ignoring bogus action " + << choice << endl; } } else