X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FMenus.cpp;h=8de4f83257d98e75c7508b816216b44b04262085;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=708aaf936cd72b1ff8415271b4c158a86283e72b;hpb=a5ceef887d9c53f471367e4e9aa33f5e1ca10475;p=lyx.git diff --git a/src/frontends/qt4/Menus.cpp b/src/frontends/qt4/Menus.cpp index 708aaf936c..8de4f83257 100644 --- a/src/frontends/qt4/Menus.cpp +++ b/src/frontends/qt4/Menus.cpp @@ -36,17 +36,20 @@ #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 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))); } } @@ -681,26 +777,40 @@ void MenuDefinition::expandLastfiles() void MenuDefinition::expandDocuments() { + MenuItem item(MenuItem::Submenu, qt_("Invisible")); + item.setSubmenu(MenuDefinition(qt_("Invisible"))); + Buffer * first = theBufferList().first(); if (first) { Buffer * b = first; - int ii = 1; + int vis = 1; + int invis = 1; // We cannot use a for loop as the buffer list cycles. do { QString label = toqstr(b->fileName().displayName(20)); if (!b->isClean()) label += "*"; + 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); - add(MenuItem(MenuItem::Command, label, - FuncRequest(LFUN_BUFFER_SWITCH, b->absFileName()))); - + if (shown) { + add(MenuItem(MenuItem::Command, label, + FuncRequest(LFUN_BUFFER_SWITCH, b->absFileName()))); + ++vis; + } else { + item.submenu().add(MenuItem(MenuItem::Command, label, + FuncRequest(LFUN_BUFFER_SWITCH, b->absFileName()))); + ++invis; + } b = theBufferList().next(b); - ++ii; } while (b != first); + if (!item.submenu().empty()) + add(item); } else - add(MenuItem(MenuItem::Info, qt_(""))); + add(MenuItem(MenuItem::Info, qt_(""))); } @@ -720,7 +830,7 @@ void MenuDefinition::expandBookmarks() } } if (empty) - add(MenuItem(MenuItem::Info, qt_(""))); + add(MenuItem(MenuItem::Info, qt_(""))); } @@ -752,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) { @@ -778,8 +899,17 @@ void MenuDefinition::expandFormats(MenuItem::Kind kind, Buffer const * buf) label += "..."; break; case MenuItem::ViewFormats: - case MenuItem::ExportFormats: case MenuItem::UpdateFormats: + 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; break; @@ -790,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); } @@ -855,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!"))); } @@ -923,7 +1064,7 @@ void MenuDefinition::expandToc(Buffer const * buf) // OK, so we avoid this unnecessary overhead (JMarc) if (!buf) { - add(MenuItem(MenuItem::Info, qt_(""))); + add(MenuItem(MenuItem::Info, qt_(""))); return; } @@ -984,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_(""))); + add(MenuItem(MenuItem::Info, qt_(""))); } } @@ -1031,14 +1172,15 @@ void MenuDefinition::expandBranches(Buffer const * buf) if (!buf) return; - BufferParams const & params = buf->masterBuffer()->params(); - if (params.branchlist().empty()) { - add(MenuItem(MenuItem::Help, qt_("No branches set for document!"))); + 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!"))); return; } - BranchList::const_iterator cit = params.branchlist().begin(); - BranchList::const_iterator end = params.branchlist().end(); + BranchList::const_iterator cit = master_params.branchlist().begin(); + BranchList::const_iterator end = master_params.branchlist().end(); for (int ii = 1; cit != end; ++cit, ++ii) { docstring label = cit->branch(); @@ -1050,6 +1192,104 @@ void MenuDefinition::expandBranches(Buffer const * buf) FuncRequest(LFUN_BRANCH_INSERT, cit->branch()))); } + + if (buf == buf->masterBuffer()) + return; + + MenuDefinition child_branches; + + BranchList::const_iterator ccit = params.branchlist().begin(); + BranchList::const_iterator cend = params.branchlist().end(); + + for (int ii = 1; ccit != cend; ++ccit, ++ii) { + docstring label = ccit->branch(); + if (ii < 10) { + label = convert(ii) + ". " + label + + char_type('|') + convert(ii); + } + child_branches.addWithStatusCheck(MenuItem(MenuItem::Command, + toqstr(label), + FuncRequest(LFUN_BRANCH_INSERT, + ccit->branch()))); + } + + if (!child_branches.empty()) { + MenuItem item(MenuItem::Submenu, qt_("Child Document")); + item.setSubmenu(child_branches); + add(item); + } +} + + +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()))); + } + } } @@ -1087,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))))); } } @@ -1205,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; @@ -1380,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; @@ -1392,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())); @@ -1561,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(); @@ -1601,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; @@ -1614,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); }