]> git.lyx.org Git - features.git/blobdiff - src/frontends/qt4/Menus.cpp
Allow to separate menu string from label string for arguments
[features.git] / src / frontends / qt4 / Menus.cpp
index 40a4f575e36a9ec56b835c3c6383e00e1df2841a..333e3b51c818cdf97103b11db61f066599a2b06e 100644 (file)
@@ -40,6 +40,7 @@
 #include "IndicesList.h"
 #include "KeyMap.h"
 #include "Language.h"
+#include "Layout.h"
 #include "Lexer.h"
 #include "LyXAction.h"
 #include "LyX.h"
@@ -172,7 +173,13 @@ public:
                /// Words suggested by the spellchecker.
                SpellingSuggestions,
                /** Used Languages */
-               LanguageSelector
+               LanguageSelector,
+               /** This is the list of arguments available
+                   for insertion into the current layout. */
+               Arguments,
+               /** This is the list of arguments available
+                   for in the InsetArgument context menu. */
+               SwitchArguments
        };
 
        explicit MenuItem(Kind kind) : kind_(kind), optional_(false) {}
@@ -241,7 +248,7 @@ public:
                // Get the keys bound to this action, but keep only the
                // first one later
                KeyMap::Bindings bindings = theTopLevelKeymap().findBindings(func_);
-               if (bindings.size())
+               if (!bindings.empty())
                        return toqstr(bindings.begin()->print(KeySequence::ForGui));
 
                LYXERR(Debug::KBMAP, "No binding for "
@@ -348,6 +355,7 @@ public:
        void expandGraphicsGroups(BufferView const *);
        void expandSpellingSuggestions(BufferView const *);
        void expandLanguageSelector(Buffer const * buf);
+       void expandArguments(BufferView const *, bool switcharg = false);
        ///
        ItemList items_;
        ///
@@ -455,10 +463,13 @@ void MenuDefinition::read(Lexer & lex)
                md_toolbars,
                md_graphicsgroups,
                md_spellingsuggestions,
-               md_languageselector
+               md_languageselector,
+               md_arguments,
+               md_switcharguments
        };
 
        LexerKeyword menutags[] = {
+               { "arguments", md_arguments },
                { "bookmarks", md_bookmarks },
                { "branches", md_branches },
                { "charstyles", md_charstyles },
@@ -485,6 +496,7 @@ void MenuDefinition::read(Lexer & lex)
                { "separator", md_separator },
                { "spellingsuggestions", md_spellingsuggestions },
                { "submenu", md_submenu },
+               { "switcharguments", md_switcharguments },
                { "toc", md_toc },
                { "toolbars", md_toolbars },
                { "updateformats", md_updateformats },
@@ -616,6 +628,14 @@ void MenuDefinition::read(Lexer & lex)
                        add(MenuItem(MenuItem::IndicesListsContext));
                        break;
 
+               case md_arguments:
+                       add(MenuItem(MenuItem::Arguments));
+                       break;
+
+               case md_switcharguments:
+                       add(MenuItem(MenuItem::SwitchArguments));
+                       break;
+
                case md_optsubmenu:
                        optional = true;
                        // fallback to md_submenu
@@ -783,7 +803,11 @@ void MenuDefinition::expandSpellingSuggestions(BufferView const * bv)
                                        MenuItem w(MenuItem::Command, toqstr(suggestion),
                                                FuncRequest(LFUN_WORD_REPLACE,
                                                        replace2string(suggestion, selection,
-                                                               true, true, false, true, false)));
+                                                               true,     // case sensitive
+                                                               true,     // match word
+                                                               false,    // all words
+                                                               true,     // forward
+                                                               false))); // find next
                                        if (i < m)
                                                add(w);
                                        else
@@ -883,7 +907,7 @@ void MenuDefinition::expandLanguageSelector(Buffer const * buf)
                        }
                }
                MenuItem w(MenuItem::Command, label,
-                       FuncRequest(LFUN_LANGUAGE, (*cit)->lang()));
+                       FuncRequest(LFUN_LANGUAGE, (*cit)->lang() + " set"));
                item.submenu().addWithStatusCheck(w);
        }
        item.submenu().add(MenuItem(MenuItem::Separator));
@@ -1297,7 +1321,7 @@ void MenuDefinition::expandToc(Buffer const * buf)
        if (cit == end)
                LYXERR(Debug::GUI, "No table of contents.");
        else {
-               if (cit->second.size() > 0 )
+               if (!cit->second.empty())
                        expandToc2(cit->second, 0, cit->second.size(), 0);
                else
                        add(MenuItem(MenuItem::Info, qt_("<Empty Table of Contents>")));
@@ -1523,6 +1547,43 @@ void MenuDefinition::expandCiteStyles(BufferView const * bv)
        }
 }
 
+
+void MenuDefinition::expandArguments(BufferView const * bv, bool switcharg)
+{
+       if (!bv)
+               return;
+
+       Inset const * inset = &bv->cursor().inset();
+       Layout::LaTeXArgMap args;
+       if (inset && bv->cursor().paragraph().layout().latexargs().empty()
+           && bv->cursor().paragraph().layout().itemargs().empty())
+               args = inset->getLayout().latexargs();
+       else {
+               args = bv->cursor().paragraph().layout().latexargs();
+               Layout::LaTeXArgMap itemargs = bv->cursor().paragraph().layout().itemargs();
+               if (!itemargs.empty())
+                       args.insert(itemargs.begin(), itemargs.end());
+       }
+       if (args.empty() || (switcharg && args.size() == 1))
+               return;
+       Layout::LaTeXArgMap::const_iterator lait = args.begin();
+       Layout::LaTeXArgMap::const_iterator const laend = args.end();
+       for (; lait != laend; ++lait) {
+               Layout::latexarg arg = (*lait).second;
+               docstring str = arg.menustring.empty()? arg.labelstring : arg.menustring;
+               QString item = toqstr(translateIfPossible(str));
+               if (switcharg)
+                       add(MenuItem(MenuItem::Command, item,
+                                    FuncRequest(LFUN_INSET_MODIFY,
+                                                from_ascii("changetype ")
+                                                + from_ascii((*lait).first))));
+               else
+                       add(MenuItem(MenuItem::Command, item,
+                                    FuncRequest(LFUN_ARGUMENT_INSERT,
+                                                from_ascii((*lait).first))));
+       }
+}
+
 } // namespace anon
 
 
@@ -1570,7 +1631,7 @@ static QString label(MenuItem const & mi)
 void Menu::Impl::populate(QMenu & qMenu, MenuDefinition const & menu)
 {
        LYXERR(Debug::GUI, "populating menu " << menu.name());
-       if (menu.size() == 0) {
+       if (menu.empty()) {
                LYXERR(Debug::GUI, "\tERROR: empty menu " << menu.name());
                return;
        }
@@ -1666,7 +1727,8 @@ struct Menus::Impl {
        /// Expands some special entries of the menu
        /** The entries with the following kind are expanded to a
            sequence of Command MenuItems: Lastfiles, Documents,
-           ViewFormats, ExportFormats, UpdateFormats, Branches, Indices
+           ViewFormats, ExportFormats, UpdateFormats, Branches,
+           Indices, Arguments, SwitchArguments
        */
        void expand(MenuDefinition const & frommenu, MenuDefinition & tomenu,
                BufferView const *) const;
@@ -1750,12 +1812,12 @@ void Menus::Impl::macxMenuBarInit(GuiView * view, QMenuBar * qmb)
                 QAction::AboutRole},
                {LFUN_DIALOG_SHOW, "prefs", "Preferences",
                 QAction::PreferencesRole},
-               {LFUN_RECONFIGURE, "", "Reconfigure",
-                QAction::ApplicationSpecificRole},
+               /* {LFUN_RECONFIGURE, "", "Reconfigure",
+                QAction::ApplicationSpecificRole}, */
                {LFUN_LYX_QUIT, "", "Quit LyX", QAction::QuitRole}
        };
        const size_t num_entries = sizeof(entries) / sizeof(entries[0]);
-       const bool first_call = mac_special_menu_.size() == 0;
+       const bool first_call = mac_special_menu_.empty();
 
        // the special menu for Menus. Fill it up only once.
        if (first_call) {
@@ -1887,6 +1949,14 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                        tomenu.expandLanguageSelector(buf);
                        break;
 
+               case MenuItem::Arguments:
+                       tomenu.expandArguments(bv, false);
+                       break;
+
+               case MenuItem::SwitchArguments:
+                       tomenu.expandArguments(bv, true);
+                       break;
+
                case MenuItem::Submenu: {
                        MenuItem item(*cit);
                        item.setSubmenu(MenuDefinition(cit->submenuname()));
@@ -2046,7 +2116,7 @@ void Menus::fillMenuBar(QMenuBar * qmb, GuiView * view, bool initial)
 
        LYXERR(Debug::GUI, "populating menu bar" << d->menubar_.name());
 
-       if (d->menubar_.size() == 0) {
+       if (d->menubar_.empty()) {
                LYXERR(Debug::GUI, "\tERROR: empty menu bar"
                        << d->menubar_.name());
                return;
@@ -2111,7 +2181,7 @@ void Menus::updateMenu(Menu * qmenu)
                MenuDefinition cat_menu = d->getMenu(toqstr(menu_name));
                //FIXME: 50 is a wild guess. We should take into account here
                //the expansion of menu items, disabled optional items etc.
-               bool const in_sub_menu = fromLyxMenu.size() > 0
+               bool const in_sub_menu = !fromLyxMenu.empty()
                        && fromLyxMenu.size() + cat_menu.size() > 50 ;
                if (in_sub_menu)
                        fromLyxMenu.catSub(menu_name);