From 99f2abf59fc88faeac69df6a64d0d2a3615c8972 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrgen=20Spitzm=C3=BCller?= Date: Mon, 28 Apr 2008 15:21:55 +0000 Subject: [PATCH] dynamic context menu for InsetCitation. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@24538 a592a061-630c-0410-9148-cb99ea01b6c8 --- lib/ui/stdcontext.inc | 10 +++++ src/frontends/qt4/Menus.cpp | 80 +++++++++++++++++++++++++++++++----- src/insets/InsetCitation.cpp | 8 +++- src/insets/InsetCitation.h | 2 + 4 files changed, 89 insertions(+), 11 deletions(-) diff --git a/lib/ui/stdcontext.inc b/lib/ui/stdcontext.inc index 7ae39fc6f5..16fd69f3fd 100644 --- a/lib/ui/stdcontext.inc +++ b/lib/ui/stdcontext.inc @@ -94,6 +94,16 @@ Menuset End +# +# InsetCitation context menu +# + Menu "context-citation" + CiteStyles + Separator + Item "Settings...|S" "next-inset-toggle" + End + + # # InsetBibtex context menu # diff --git a/src/frontends/qt4/Menus.cpp b/src/frontends/qt4/Menus.cpp index 0aa3cbe597..e9b3795f02 100644 --- a/src/frontends/qt4/Menus.cpp +++ b/src/frontends/qt4/Menus.cpp @@ -23,10 +23,12 @@ #include "GuiView.h" #include "qt_helpers.h" +#include "BiblioInfo.h" #include "BranchList.h" #include "Buffer.h" #include "BufferList.h" #include "BufferParams.h" +#include "BufferView.h" #include "Converter.h" #include "CutAndPaste.h" #include "Floating.h" @@ -45,6 +47,9 @@ #include "TocBackend.h" #include "ToolbarBackend.h" +#include "insets/Inset.h" +#include "insets/InsetCitation.h" + #include "support/assert.h" #include "support/convert.h" #include "support/debug.h" @@ -131,7 +136,9 @@ public: /** toolbars */ Toolbars, /** Available branches in document */ - Branches + Branches, + /** Available citation styles for a given citation */ + CiteStyles }; explicit MenuItem(Kind kind) : kind_(kind), optional_(false) {} @@ -283,6 +290,7 @@ public: void expandPasteRecent(); void expandToolbars(); void expandBranches(Buffer const * buf); + void expandCiteStyles(BufferView const *); /// ItemList items_; /// @@ -363,6 +371,7 @@ void MenuDefinition::read(Lexer & lex) enum { md_item = 1, md_branches, + md_citestyles, md_documents, md_bookmarks, md_charstyles, @@ -389,6 +398,7 @@ void MenuDefinition::read(Lexer & lex) { "bookmarks", md_bookmarks }, { "branches", md_branches }, { "charstyles", md_charstyles }, + { "citestyles", md_citestyles }, { "custom", md_custom }, { "documents", md_documents }, { "elements", md_elements }, @@ -500,6 +510,10 @@ void MenuDefinition::read(Lexer & lex) add(MenuItem(MenuItem::Branches)); break; + case md_citestyles: + add(MenuItem(MenuItem::CiteStyles)); + break; + case md_optsubmenu: optional = true; // fallback to md_submenu @@ -1055,6 +1069,47 @@ void MenuDefinition::expandBranches(Buffer const * buf) } } + +void MenuDefinition::expandCiteStyles(BufferView const * bv) +{ + if (!bv) { + add(MenuItem(MenuItem::Command, + qt_("No Document Open!"), + FuncRequest(LFUN_NOACTION))); + return; + } + + Inset const * inset = bv->cursor().nextInset(); + if (!inset || inset->lyxCode() != CITE_CODE) { + add(MenuItem(MenuItem::Command, + qt_("No Citation in Scope!"), + FuncRequest(LFUN_NOACTION))); + return; + } + InsetCommand const * citinset = + static_cast(inset); + + Buffer const * buf = &bv->buffer(); + docstring key = citinset->getParam("key"); + + vector citeStyleList = citeStyles(buf->params().citeEngine()); + vector citeStrings = + buf->masterBibInfo().getCiteStrings(key, bv->buffer()); + + vector::const_iterator cit = citeStrings.begin(); + vector::const_iterator end = citeStrings.end(); + + for (int ii = 1; cit != end; ++cit, ++ii) { + docstring label = *cit; + CitationStyle cs; + CiteStyle cst = citeStyleList[ii - 1]; + cs.style = cst; + addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label), + FuncRequest(LFUN_NEXT_INSET_MODIFY, + "changetype " + from_utf8(citationStyleToString(cs))))); + } +} + } // namespace anon @@ -1170,7 +1225,7 @@ struct Menus::Impl { ViewFormats, ExportFormats, UpdateFormats, Branches */ void expand(MenuDefinition const & frommenu, MenuDefinition & tomenu, - Buffer const *) const; + BufferView const *) const; /// Initialize specific MACOS X menubar void macxMenuBarInit(GuiView * view, QMenuBar * qmb); @@ -1273,13 +1328,14 @@ void Menus::Impl::macxMenuBarInit(GuiView * view, QMenuBar * qmb) void Menus::Impl::expand(MenuDefinition const & frommenu, - MenuDefinition & tomenu, Buffer const * buf) const + MenuDefinition & tomenu, BufferView const * bv) const { if (!tomenu.empty()) tomenu.clear(); for (MenuDefinition::const_iterator cit = frommenu.begin(); cit != frommenu.end() ; ++cit) { + Buffer const * buf = bv ? &bv->buffer() : 0; switch (cit->kind()) { case MenuItem::Lastfiles: tomenu.expandLastfiles(); @@ -1332,6 +1388,10 @@ void Menus::Impl::expand(MenuDefinition const & frommenu, tomenu.expandBranches(buf); break; + case MenuItem::CiteStyles: + tomenu.expandCiteStyles(bv); + break; + case MenuItem::Toc: tomenu.expandToc(buf); break; @@ -1339,7 +1399,7 @@ void Menus::Impl::expand(MenuDefinition const & frommenu, case MenuItem::Submenu: { MenuItem item(*cit); item.setSubmenu(MenuDefinition(cit->submenuname())); - expand(getMenu(cit->submenuname()), item.submenu(), buf); + expand(getMenu(cit->submenuname()), item.submenu(), bv); tomenu.addWithStatusCheck(item); } break; @@ -1488,10 +1548,10 @@ void Menus::fillMenuBar(QMenuBar * qmb, GuiView * view, bool initial) LYXERR(Debug::GUI, "menu bar entries " << d->menubar_.size()); MenuDefinition menu; - Buffer * buf = 0; + BufferView * bv = 0; if (view) - buf = view->buffer(); - d->expand(d->menubar_, menu, buf); + bv = view->view(); + d->expand(d->menubar_, menu, bv); MenuDefinition::const_iterator m = menu.begin(); MenuDefinition::const_iterator end = menu.end(); @@ -1541,10 +1601,10 @@ void Menus::updateMenu(Menu * qmenu) } MenuDefinition const & fromLyxMenu = d->getMenu(qmenu->d->name); - Buffer * buf = 0; + BufferView * bv = 0; if (qmenu->d->view) - buf = qmenu->d->view->buffer(); - d->expand(fromLyxMenu, *qmenu->d->top_level_menu, buf); + bv = qmenu->d->view->view(); + d->expand(fromLyxMenu, *qmenu->d->top_level_menu, bv); qmenu->d->populate(*qmenu, *qmenu->d->top_level_menu); } diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp index dbc68316fc..c41cd370ef 100644 --- a/src/insets/InsetCitation.cpp +++ b/src/insets/InsetCitation.cpp @@ -84,7 +84,7 @@ string defaultCiteCommand(CiteEngine engine) return str; } - + string asValidLatexCommand(string const & input, CiteEngine const engine) { string const default_str = defaultCiteCommand(engine); @@ -516,4 +516,10 @@ void InsetCitation::validate(LaTeXFeatures & features) const } +docstring InsetCitation::contextMenu(BufferView const &, int, int) const +{ + return from_ascii("context-citation"); +} + + } // namespace lyx diff --git a/src/insets/InsetCitation.h b/src/insets/InsetCitation.h index 9140dc7040..a7c2ce02cc 100644 --- a/src/insets/InsetCitation.h +++ b/src/insets/InsetCitation.h @@ -65,6 +65,8 @@ public: static std::string defaultCommand() { return "cite"; } /// static bool isCompatibleCommand(std::string const & cmd); + /// + virtual docstring contextMenu(BufferView const & bv, int x, int y) const; private: /// Inset * clone() const { return new InsetCitation(*this); } -- 2.39.5