]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/Menus.cpp
* fix spelling in comments to please John.
[lyx.git] / src / frontends / qt4 / Menus.cpp
index 5c02c392d5e6eb1fc498fbac4c3b08de58462bdd..8de4f83257d98e75c7508b816216b44b04262085 100644 (file)
 #include "Format.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
+#include "IndicesList.h"
 #include "KeyMap.h"
 #include "Lexer.h"
 #include "LyXAction.h"
 #include "LyX.h" // for lastfiles
 #include "LyXFunc.h"
+#include "LyXRC.h"
 #include "Paragraph.h"
 #include "ParIterator.h"
 #include "Session.h"
 #include "TextClass.h"
 #include "TocBackend.h"
 #include "Toolbars.h"
+#include "WordLangTuple.h"
 
 #include "insets/Inset.h"
 #include "insets/InsetCitation.h"
@@ -148,10 +151,20 @@ public:
                Toolbars,
                /** Available branches in document */
                Branches,
+               /** Available indices in document */
+               Indices,
+               /** Context menu for indices in document */
+               IndicesContext,
+               /** Available index lists in document */
+               IndicesLists,
+               /** Context menu for available indices lists in document */
+               IndicesListsContext,
                /** Available citation styles for a given citation */
                CiteStyles,
                /** Available graphics groups */
-               GraphicsGroups
+               GraphicsGroups,
+               /// Words suggested by the spellchecker.
+               SpellingSuggestions
        };
 
        explicit MenuItem(Kind kind) : kind_(kind), optional_(false) {}
@@ -168,10 +181,11 @@ public:
        MenuItem(Kind kind,
                 QString const & label,
                 FuncRequest const & func,
-                bool optional = false)
+                bool optional = false,
+                FuncRequest::Origin origin = FuncRequest::MENU)
                : kind_(kind), label_(label), func_(func), optional_(optional)
        {
-               func_.origin = FuncRequest::MENU;
+               func_.origin = origin;
        }
 
        // boost::shared_ptr<MenuDefinition> needs this apprently...
@@ -303,8 +317,11 @@ public:
        void expandPasteRecent(Buffer const * buf);
        void expandToolbars();
        void expandBranches(Buffer const * buf);
+       void expandIndices(Buffer const * buf, bool listof = false);
+       void expandIndicesContext(Buffer const * buf, bool listof = false);
        void expandCiteStyles(BufferView const *);
        void expandGraphicsGroups(BufferView const *);
+       void expandSpellingSuggestions(BufferView const *);
        ///
        ItemList items_;
        ///
@@ -394,6 +411,10 @@ void MenuDefinition::read(Lexer & lex)
                md_endmenu,
                md_exportformats,
                md_importformats,
+               md_indices,
+               md_indicescontext,
+               md_indiceslists,
+               md_indiceslistscontext,
                md_lastfiles,
                md_optitem,
                md_optsubmenu,
@@ -406,7 +427,8 @@ void MenuDefinition::read(Lexer & lex)
                md_floatinsert,
                md_pasterecent,
                md_toolbars,
-               md_graphicsgroups
+               md_graphicsgroups,
+               md_spellingsuggestions
        };
 
        LexerKeyword menutags[] = {
@@ -423,12 +445,17 @@ void MenuDefinition::read(Lexer & lex)
                { "floatlistinsert", md_floatlistinsert },
                { "graphicsgroups", md_graphicsgroups },
                { "importformats", md_importformats },
+               { "indices", md_indices },
+               { "indicescontext", md_indicescontext },
+               { "indiceslists", md_indiceslists },
+               { "indiceslistscontext", md_indiceslistscontext },
                { "item", md_item },
                { "lastfiles", md_lastfiles },
                { "optitem", md_optitem },
                { "optsubmenu", md_optsubmenu },
                { "pasterecent", md_pasterecent },
                { "separator", md_separator },
+               { "spellingsuggestions", md_spellingsuggestions },
                { "submenu", md_submenu },
                { "toc", md_toc },
                { "toolbars", md_toolbars },
@@ -453,7 +480,10 @@ void MenuDefinition::read(Lexer & lex)
                        lex.next(true);
                        string const command = lex.getString();
                        FuncRequest func = lyxaction.lookupFunc(command);
-                       add(MenuItem(MenuItem::Command, toqstr(name), func, optional));
+                       FuncRequest::Origin origin = FuncRequest::MENU;
+                       if (name_.startsWith("context-toc-"))
+                               origin = FuncRequest::TOC;
+                       add(MenuItem(MenuItem::Command, toqstr(name), func, optional, origin));
                        optional = false;
                        break;
                }
@@ -534,6 +564,26 @@ void MenuDefinition::read(Lexer & lex)
                        add(MenuItem(MenuItem::GraphicsGroups));
                        break;
 
+               case md_spellingsuggestions:
+                       add(MenuItem(MenuItem::SpellingSuggestions));
+                       break;
+
+               case md_indices:
+                       add(MenuItem(MenuItem::Indices));
+                       break;
+
+               case md_indicescontext:
+                       add(MenuItem(MenuItem::IndicesContext));
+                       break;
+
+               case md_indiceslists:
+                       add(MenuItem(MenuItem::IndicesLists));
+                       break;
+
+               case md_indiceslistscontext:
+                       add(MenuItem(MenuItem::IndicesListsContext));
+                       break;
+
                case md_optsubmenu:
                        optional = true;
                        // fallback to md_submenu
@@ -663,17 +713,63 @@ void MenuDefinition::expandGraphicsGroups(BufferView const * bv)
        }
 }
 
+
+void MenuDefinition::expandSpellingSuggestions(BufferView const * bv)
+{
+       if (!bv)
+               return;
+       WordLangTuple wl;
+       docstring_list suggestions;
+       pos_type from = bv->cursor().pos();
+       pos_type to = from;
+       Paragraph const & par = bv->cursor().paragraph();
+       if (!par.spellCheck(from, to, wl, suggestions))
+               return;
+       LYXERR(Debug::GUI, "Misspelled Word! Suggested Words = ");
+       size_t i = 0;
+       MenuItem item(MenuItem::Submenu, qt_("More Spelling Suggestions"));
+       item.setSubmenu(MenuDefinition(qt_("More Spelling Suggestions")));
+       for (; i != suggestions.size(); ++i) {
+               docstring const & suggestion = suggestions[i];
+               LYXERR(Debug::GUI, suggestion);
+               MenuItem w(MenuItem::Command, toqstr(suggestion),
+                       FuncRequest(LFUN_WORD_REPLACE, suggestion));
+               if (i < 10)
+                       add(w);
+               else
+                       item.submenu().add(w);
+       }
+       if (i >= 10)
+               add(item);
+       if (i > 0)
+               add(MenuItem(MenuItem::Separator));
+       docstring arg = wl.word() + " " + from_ascii(wl.lang_code());
+       if (!wl.lang_variety().empty())
+               arg += from_ascii("-") + from_ascii(wl.lang_variety());
+       add(MenuItem(MenuItem::Command, qt_("Add to personal dictionary|c"),
+                       FuncRequest(LFUN_SPELLING_ADD, arg)));
+       add(MenuItem(MenuItem::Command, qt_("Ignore all|I"),
+                       FuncRequest(LFUN_SPELLING_IGNORE, arg)));
+       
+}
+
+
 void MenuDefinition::expandLastfiles()
 {
        LastFilesSection::LastFiles const & lf = theSession().lastFiles().lastFiles();
        LastFilesSection::LastFiles::const_iterator lfit = lf.begin();
 
-       int ii = 1;
+       unsigned int ii = 1;
 
-       for (; lfit != lf.end() && ii < 10; ++lfit, ++ii) {
+       for (; lfit != lf.end() && ii <= lyxrc.num_lastfiles; ++lfit, ++ii) {
                string const file = lfit->absFilename();
-               QString const label = QString("%1. %2|%3").arg(ii)
-                       .arg(toqstr(makeDisplayPath(file, 30))).arg(ii);
+               QString label;
+               if (ii < 10)
+                       label = QString("%1. %2|%3").arg(ii)
+                               .arg(toqstr(makeDisplayPath(file, 30))).arg(ii);
+               else
+                       label = QString("%1. %2").arg(ii)
+                               .arg(toqstr(makeDisplayPath(file, 30)));
                add(MenuItem(MenuItem::Command, label, FuncRequest(LFUN_FILE_OPEN, file)));
        }
 }
@@ -695,7 +791,8 @@ void MenuDefinition::expandDocuments()
                        QString label = toqstr(b->fileName().displayName(20));
                        if (!b->isClean())
                                label += "*";
-                       bool const shown = guiApp->currentView()->workArea(*b);
+                       bool const shown = guiApp->currentView()
+                                          ? guiApp->currentView()->workArea(*b) : false;
                        int ii = shown ? vis : invis;
                        if (ii < 10)
                                label = QString::number(ii) + ". " + label + '|' + QString::number(ii);
@@ -713,7 +810,7 @@ void MenuDefinition::expandDocuments()
                if (!item.submenu().empty())
                        add(item);
        } else
-               add(MenuItem(MenuItem::Info, qt_("<No documents open>")));
+               add(MenuItem(MenuItem::Info, qt_("<No Documents Open>")));
 }
 
 
@@ -733,7 +830,7 @@ void MenuDefinition::expandBookmarks()
                }
        }
        if (empty)
-               add(MenuItem(MenuItem::Info, qt_("<No bookmarks saved yet>")));
+               add(MenuItem(MenuItem::Info, qt_("<No Bookmarks Saved Yet>")));
 }
 
 
@@ -765,6 +862,17 @@ void MenuDefinition::expandFormats(MenuItem::Kind kind, Buffer const * buf)
        }
        sort(formats.begin(), formats.end(), &compareFormat);
 
+       bool const view_update = (kind == MenuItem::ViewFormats
+                       || kind == MenuItem::UpdateFormats);
+
+       QString smenue;
+       if (view_update)
+               smenue = (kind == MenuItem::ViewFormats ?
+                       qt_("View (Other Formats)|F")
+                       : qt_("Update (Other Formats)|p"));
+       MenuItem item(MenuItem::Submenu, smenue);
+       item.setSubmenu(MenuDefinition(smenue));
+
        Formats::const_iterator fit = formats.begin();
        Formats::const_iterator end = formats.end();
        for (; fit != end ; ++fit) {
@@ -792,8 +900,15 @@ void MenuDefinition::expandFormats(MenuItem::Kind kind, Buffer const * buf)
                        break;
                case MenuItem::ViewFormats:
                case MenuItem::UpdateFormats:
-                       if ((*fit)->name() == buf->getDefaultOutputFormat())
+                       if ((*fit)->name() == buf->getDefaultOutputFormat()) {
+                               docstring lbl = (kind == MenuItem::ViewFormats ?
+                                       bformat(_("View [%1$s]|V"), qstring_to_ucs4(label))
+                                       : bformat(_("Update [%1$s]|U"), qstring_to_ucs4(label)));
+                               MenuItem w(MenuItem::Command, toqstr(lbl),
+                                               FuncRequest(action, (*fit)->name()));
+                               add(w);
                                continue;
+                       }
                case MenuItem::ExportFormats:
                        if (!(*fit)->documentFormat())
                                continue;
@@ -805,13 +920,24 @@ void MenuDefinition::expandFormats(MenuItem::Kind kind, Buffer const * buf)
                if (!shortcut.isEmpty())
                        label += '|' + shortcut;
 
-               if (buf)
-                       addWithStatusCheck(MenuItem(MenuItem::Command, label,
-                               FuncRequest(action, (*fit)->name())));
-               else
-                       add(MenuItem(MenuItem::Command, label,
-                               FuncRequest(action, (*fit)->name())));
+               if (view_update) {
+                       if (buf)
+                               item.submenu().addWithStatusCheck(MenuItem(MenuItem::Command, label,
+                                       FuncRequest(action, (*fit)->name())));
+                       else
+                               item.submenu().add(MenuItem(MenuItem::Command, label,
+                                       FuncRequest(action, (*fit)->name())));
+               } else {
+                       if (buf)
+                               addWithStatusCheck(MenuItem(MenuItem::Command, label,
+                                       FuncRequest(action, (*fit)->name())));
+                       else
+                               add(MenuItem(MenuItem::Command, label,
+                                       FuncRequest(action, (*fit)->name())));
+               }
        }
+       if (view_update)
+               add(item);
 }
 
 
@@ -870,7 +996,7 @@ void MenuDefinition::expandFlexInsert(
        }
        // FIXME This is a little clunky.
        if (items_.empty() && type == InsetLayout::CUSTOM)
-               add(MenuItem(MenuItem::Help, qt_("No custom insets defined!")));
+               add(MenuItem(MenuItem::Help, qt_("No Custom Insets Defined!")));
 }
 
 
@@ -938,7 +1064,7 @@ void MenuDefinition::expandToc(Buffer const * buf)
        // OK, so we avoid this unnecessary overhead (JMarc)
 
        if (!buf) {
-               add(MenuItem(MenuItem::Info, qt_("<No document open>")));
+               add(MenuItem(MenuItem::Info, qt_("<No Document Open>")));
                return;
        }
 
@@ -999,7 +1125,7 @@ void MenuDefinition::expandToc(Buffer const * buf)
                if (cit->second.size() > 0 ) 
                        expandToc2(cit->second, 0, cit->second.size(), 0);
                else
-                       add(MenuItem(MenuItem::Info, qt_("<Empty table of contents>")));
+                       add(MenuItem(MenuItem::Info, qt_("<Empty Table of Contents>")));
        }
 }
 
@@ -1049,7 +1175,7 @@ void MenuDefinition::expandBranches(Buffer const * buf)
        BufferParams const & master_params = buf->masterBuffer()->params();
        BufferParams const & params = buf->params();
        if (params.branchlist().empty() && master_params.branchlist().empty() ) {
-               add(MenuItem(MenuItem::Help, qt_("No branches set for document!")));
+               add(MenuItem(MenuItem::Help, qt_("No Branches Set for Document!")));
                return;
        }
 
@@ -1095,6 +1221,78 @@ void MenuDefinition::expandBranches(Buffer const * buf)
 }
 
 
+void MenuDefinition::expandIndices(Buffer const * buf, bool listof)
+{
+       if (!buf)
+               return;
+
+       BufferParams const & params = buf->masterBuffer()->params();
+       if (!params.use_indices) {
+               if (listof)
+                       addWithStatusCheck(MenuItem(MenuItem::Command,
+                                          qt_("Index List|I"),
+                                          FuncRequest(LFUN_INDEX_PRINT,
+                                                 from_ascii("idx"))));
+               else
+                       addWithStatusCheck(MenuItem(MenuItem::Command,
+                                          qt_("Index Entry|d"),
+                                          FuncRequest(LFUN_INDEX_INSERT,
+                                                 from_ascii("idx"))));
+               return;
+       }
+
+       if (params.indiceslist().empty())
+               return;
+
+       IndicesList::const_iterator cit = params.indiceslist().begin();
+       IndicesList::const_iterator end = params.indiceslist().end();
+
+       for (int ii = 1; cit != end; ++cit, ++ii) {
+               if (listof)
+                       addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(cit->index()),
+                                          FuncRequest(LFUN_INDEX_PRINT,
+                                                 cit->shortcut())));
+               else {
+                       docstring label = _("Index Entry");
+                       label += " (" + cit->index() + ")";
+                       addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label),
+                                          FuncRequest(LFUN_INDEX_INSERT,
+                                                 cit->shortcut())));
+               }
+       }
+}
+
+
+void MenuDefinition::expandIndicesContext(Buffer const * buf, bool listof)
+{
+       if (!buf)
+               return;
+
+       BufferParams const & params = buf->masterBuffer()->params();
+       if (!params.use_indices || params.indiceslist().empty())
+               return;
+
+       IndicesList::const_iterator cit = params.indiceslist().begin();
+       IndicesList::const_iterator end = params.indiceslist().end();
+
+       for (int ii = 1; cit != end; ++cit, ++ii) {
+               if (listof) {
+                       InsetCommandParams p(INDEX_PRINT_CODE);
+                       p["type"] = cit->shortcut();
+                       string const data = InsetCommand::params2string("index_print", p);
+                       addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(cit->index()),
+                                          FuncRequest(LFUN_INSET_MODIFY, data)));
+               } else {
+                       docstring label = _("Index Entry");
+                       label += " (" + cit->index() + ")";
+                       addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label),
+                                          FuncRequest(LFUN_INSET_MODIFY,
+                                                 from_ascii("changetype ") + cit->shortcut())));
+               }
+       }
+}
+
+
 void MenuDefinition::expandCiteStyles(BufferView const * bv)
 {
        if (!bv)
@@ -1129,7 +1327,7 @@ void MenuDefinition::expandCiteStyles(BufferView const * bv)
                CiteStyle cst = citeStyleList[ii - 1];
                cs.style = cst;
                addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label),
-                                   FuncRequest(LFUN_NEXT_INSET_MODIFY,
+                                   FuncRequest(LFUN_INSET_MODIFY,
                                                "changetype " + from_utf8(citationStyleToString(cs)))));
        }
 }
@@ -1247,7 +1445,7 @@ 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
+           ViewFormats, ExportFormats, UpdateFormats, Branches, Indices
        */
        void expand(MenuDefinition const & frommenu, MenuDefinition & tomenu,
                BufferView const *) const;
@@ -1422,6 +1620,22 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                        tomenu.expandBranches(buf);
                        break;
 
+               case MenuItem::Indices:
+                       tomenu.expandIndices(buf);
+                       break;
+
+               case MenuItem::IndicesContext:
+                       tomenu.expandIndicesContext(buf);
+                       break;
+
+               case MenuItem::IndicesLists:
+                       tomenu.expandIndices(buf, true);
+                       break;
+
+               case MenuItem::IndicesListsContext:
+                       tomenu.expandIndicesContext(buf, true);
+                       break;
+
                case MenuItem::CiteStyles:
                        tomenu.expandCiteStyles(bv);
                        break;
@@ -1434,6 +1648,10 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                        tomenu.expandGraphicsGroups(bv);
                        break;
 
+               case MenuItem::SpellingSuggestions:
+                       tomenu.expandSpellingSuggestions(bv);
+                       break;
+
                case MenuItem::Submenu: {
                        MenuItem item(*cit);
                        item.setSubmenu(MenuDefinition(cit->submenuname()));
@@ -1603,7 +1821,7 @@ void Menus::fillMenuBar(QMenuBar * qmb, GuiView * view, bool initial)
        MenuDefinition menu;
        BufferView * bv = 0;
        if (view)
-               bv = view->view();
+               bv = view->currentBufferView();
        d->expand(d->menubar_, menu, bv);
 
        MenuDefinition::const_iterator m = menu.begin();
@@ -1643,11 +1861,8 @@ void Menus::updateMenu(Menu * qmenu)
        if (qmenu->d->name.isEmpty())
                return;
 
-       // Here, We make sure that theLyXFunc points to the correct LyXView.
-       theLyXFunc().setLyXView(qmenu->d->view);
-
        if (!d->hasMenu(qmenu->d->name)) {
-               qmenu->addAction(qt_("No action defined!"));
+               qmenu->addAction(qt_("No Action Defined!"));
                LYXERR(Debug::GUI, "\tWARNING: non existing menu: "
                        << qmenu->d->name);
                return;
@@ -1656,7 +1871,7 @@ void Menus::updateMenu(Menu * qmenu)
        MenuDefinition const & fromLyxMenu = d->getMenu(qmenu->d->name);
        BufferView * bv = 0;
        if (qmenu->d->view)
-               bv = qmenu->d->view->view();
+               bv = qmenu->d->view->currentBufferView();
        d->expand(fromLyxMenu, *qmenu->d->top_level_menu, bv);
        qmenu->d->populate(*qmenu, *qmenu->d->top_level_menu);
 }