#include "insets/Inset.h"
#include "insets/InsetCitation.h"
#include "insets/InsetGraphics.h"
+#include "insets/InsetInfo.h"
#include "insets/InsetQuotes.h"
#include "support/lassert.h"
IndicesListsContext,
/** Available citation styles for a given citation */
CiteStyles,
+ /** Available arguments for a given info inset */
+ InfoArguments,
/** Available graphics groups */
GraphicsGroups,
/// Words suggested by the spellchecker.
SwitchCaptions,
/** Commands to separate environments. */
EnvironmentSeparators,
+ /** Commands to separate environments (context menu version). */
+ EnvironmentSeparatorsContext,
/** This is the list of quotation marks available */
SwitchQuotes
};
void expandIndices(Buffer const * buf, bool listof = false);
void expandIndicesContext(Buffer const * buf, bool listof = false);
void expandCiteStyles(BufferView const *);
+ void expandInfoArguments(BufferView const *);
void expandGraphicsGroups(BufferView const *);
void expandSpellingSuggestions(BufferView const *);
void expandLanguageSelector(Buffer const * buf);
void expandArguments(BufferView const *, bool switcharg = false);
void expandCaptions(Buffer const * buf, bool switchcap = false);
- void expandEnvironmentSeparators(BufferView const *);
+ void expandEnvironmentSeparators(BufferView const *, bool contextmenu = false);
void expandQuotes(BufferView const *);
///
ItemList items_;
md_indicescontext,
md_indiceslists,
md_indiceslistscontext,
+ md_infoarguments,
md_lastfiles,
md_optitem,
md_optsubmenu,
md_captions,
md_switchcaptions,
md_env_separators,
+ md_env_separatorscontext,
md_switchquotes
};
{ "elements", md_elements },
{ "end", md_endmenu },
{ "environmentseparators", md_env_separators },
+ { "environmentseparatorscontext", md_env_separatorscontext },
{ "exportformat", md_exportformat },
{ "exportformats", md_exportformats },
{ "floatinsert", md_floatinsert },
{ "indicescontext", md_indicescontext },
{ "indiceslists", md_indiceslists },
{ "indiceslistscontext", md_indiceslistscontext },
+ { "infoarguments", md_infoarguments },
{ "item", md_item },
{ "languageselector", md_languageselector },
{ "lastfiles", md_lastfiles },
add(MenuItem(MenuItem::CiteStyles));
break;
+ case md_infoarguments:
+ add(MenuItem(MenuItem::InfoArguments));
+ break;
+
+
case md_graphicsgroups:
add(MenuItem(MenuItem::GraphicsGroups));
break;
add(MenuItem(MenuItem::EnvironmentSeparators));
break;
+ case md_env_separatorscontext:
+ add(MenuItem(MenuItem::EnvironmentSeparatorsContext));
+ break;
+
case md_switchquotes:
add(MenuItem(MenuItem::SwitchQuotes));
break;
set<string>::const_iterator it = grp.begin();
set<string>::const_iterator end = grp.end();
add(MenuItem(MenuItem::Command, qt_("No Group"),
- FuncRequest(LFUN_SET_GRAPHICS_GROUP)));
+ FuncRequest(LFUN_GRAPHICS_SET_GROUP)));
for (; it != end; ++it) {
addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(*it) + '|',
- FuncRequest(LFUN_SET_GRAPHICS_GROUP, *it)));
+ FuncRequest(LFUN_GRAPHICS_SET_GROUP, *it)));
}
}
if (languages_buffer.size() < 2)
return;
- std::set<Language const *, sortLanguageByName> languages;
+ std::set<Language const *, sortLanguageByName> langs;
std::set<Language const *>::const_iterator const beg =
languages_buffer.begin();
for (std::set<Language const *>::const_iterator cit = beg;
cit != languages_buffer.end(); ++cit) {
- languages.insert(*cit);
+ langs.insert(*cit);
}
MenuItem item(MenuItem::Submenu, qt_("Language|L"));
QStringList accelerators;
if (morelangs.contains('|'))
accelerators.append(morelangs.section('|', -1));
- std::set<Language const *, sortLanguageByName>::const_iterator const begin = languages.begin();
+ std::set<Language const *, sortLanguageByName>::const_iterator const begin = langs.begin();
for (std::set<Language const *, sortLanguageByName>::const_iterator cit = begin;
- cit != languages.end(); ++cit) {
+ cit != langs.end(); ++cit) {
QString label = qt_((*cit)->display());
// try to add an accelerator
bool success = false;
add(MenuItem(MenuItem::Command, toqstr(lbl), FuncRequest(action)));
continue;
}
- // fall through
+ break;
case MenuItem::ExportFormats:
if (!f->inExportMenu())
continue;
if (cit->second.lyxtype() == type) {
if (!cit->second.obsoleted_by().empty())
continue;
- docstring label = cit->first;
+ docstring name = cit->first;
// we remove the "Flex:" prefix, if it is present
- if (prefixIs(label, from_ascii("Flex:")))
- label = label.substr(5);
+ if (prefixIs(name, from_ascii("Flex:")))
+ name = name.substr(5);
+ docstring const label = (cit->second.menustring().empty()) ?
+ name
+ : cit->second.menustring();
addWithStatusCheck(MenuItem(MenuItem::Command,
toqstr(translateIfPossible(label)),
- FuncRequest(LFUN_FLEX_INSERT, Lexer::quoteString(label))));
+ FuncRequest(LFUN_FLEX_INSERT, Lexer::quoteString(name))));
}
}
// FIXME This is a little clunky.
if (!buf || buf->hasReadonlyFlag())
return;
- 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 = master_params.branchlist().begin();
- BranchList::const_iterator end = master_params.branchlist().end();
+ BranchList const & child_list = buf->params().branchlist();
+ set<docstring> brset;
+ int ii = 1;
+ for (auto const & b : child_list) {
+ docstring const & bname = b.branch();
+ // NUM. Branch Name + "|", which triggers an empty shortcut in
+ // case that character should be in the branch name.
+ docstring label = convert<docstring>(ii) + ". " + bname + char_type('|');
+ // Add NUM as a keyboard shortcut if it's a single digit
+ if (ii < 10)
+ label += convert<docstring>(ii);
- for (int ii = 1; cit != end; ++cit, ++ii) {
- docstring label = cit->branch();
- if (ii < 10) {
- label = convert<docstring>(ii) + ". " + label
- + char_type('|') + convert<docstring>(ii);
- }
addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label),
- FuncRequest(LFUN_BRANCH_INSERT,
- cit->branch())));
+ FuncRequest(LFUN_BRANCH_INSERT, bname)));
+
+ brset.insert(bname);
+ ++ii;
}
- if (buf == buf->masterBuffer())
- return;
+ set<Buffer const *> bufset;
+ Buffer const * nextbuf = buf->parent();
+ MenuDefinition master_branches;
+ ii = 1;
+ while (nextbuf) {
+ // recursive includes are a bad idea, but let's not crash
+ // if we find one.
+ if (bufset.count(nextbuf))
+ break;
+
+ for (auto const & b : nextbuf->params().branchlist()) {
+ docstring const & bname = b.branch();
+ // do not add it if we've already seen it
+ if (brset.count(bname))
+ continue;
- MenuDefinition child_branches;
+ docstring label = convert<docstring>(ii) + ". " + bname + char_type('|');
+ if (ii < 10)
+ label += convert<docstring>(ii);
- BranchList::const_iterator ccit = params.branchlist().begin();
- BranchList::const_iterator cend = params.branchlist().end();
+ master_branches.addWithStatusCheck(MenuItem(MenuItem::Command,
+ toqstr(label), FuncRequest(LFUN_BRANCH_INSERT, bname)));
- for (int ii = 1; ccit != cend; ++ccit, ++ii) {
- docstring label = ccit->branch();
- if (ii < 10) {
- label = convert<docstring>(ii) + ". " + label
- + char_type('|') + convert<docstring>(ii);
- } else
- label += char_type('|');
- child_branches.addWithStatusCheck(MenuItem(MenuItem::Command,
- toqstr(label),
- FuncRequest(LFUN_BRANCH_INSERT,
- ccit->branch())));
+ bufset.insert(nextbuf);
+ brset.insert(bname);
+ ++ii;
+ }
+
+ nextbuf = nextbuf->parent();
}
- if (!child_branches.empty()) {
- MenuItem item(MenuItem::Submenu, qt_("Child Document"));
- item.setSubmenu(child_branches);
+ if (!master_branches.empty()) {
+ MenuItem item(MenuItem::Submenu, qt_("Master Documents"));
+ item.setSubmenu(master_branches);
add(item);
}
}
for (int ii = 1; cit != end; ++cit, ++ii) {
docstring label = cit->second;
- CitationStyle cs = citeStyleList[ii - 1];
- cs.forceUpperCase &= force;
- cs.hasStarredVersion &= star;
+ CitationStyle ccs = citeStyleList[ii - 1];
+ ccs.forceUpperCase &= force;
+ ccs.hasStarredVersion &= star;
addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label),
FuncRequest(LFUN_INSET_MODIFY,
- "changetype " + from_utf8(citationStyleToString(cs)))));
+ "changetype " + from_utf8(citationStyleToString(ccs)))));
}
if (cs.hasStarredVersion) {
if (amps > 0) {
if (amps > 1)
starred = subst(starred, from_ascii("&&"), from_ascii("<:amp:>"));
- size_t n = starred.find('&');
+ size_t nn = starred.find('&');
char_type accel = char_type();
- if (n != docstring::npos && n < starred.size() - 1)
- accel = starred[n + 1];
+ if (nn != docstring::npos && nn < starred.size() - 1)
+ accel = starred[nn + 1];
starred = subst(starred, from_ascii("&"), from_ascii(""));
if (amps > 1)
starred = subst(starred, from_ascii("<:amp:>"), from_ascii("&&"));
}
+void MenuDefinition::expandInfoArguments(BufferView const * bv)
+{
+ if (!bv)
+ return;
+
+ Inset const * inset = bv->cursor().nextInset();
+ if (!inset || inset->lyxCode() != INFO_CODE) {
+ add(MenuItem(MenuItem::Command,
+ qt_("No Text Field in Scope!"),
+ FuncRequest(LFUN_NOACTION)));
+ return;
+ }
+ InsetInfo const * iinset = static_cast<InsetInfo const *>(inset);
+
+ string const type = iinset->params().infoType();
+ vector<pair<string,docstring>> const args =
+ iinset->params().getArguments(&bv->buffer(), type);
+
+ // Don't generate a menu for big lists (such as lfuns and rcs)
+ if (args.size() > 15)
+ return;
+
+ for (auto const & p : args) {
+ if (p.first == "invalid")
+ // non-selectable
+ continue;
+ if (p.first == "custom") {
+ add(MenuItem(MenuItem::Command, qt_("Custom..."),
+ FuncRequest(LFUN_INSET_SETTINGS, "info")));
+ continue;
+ }
+ docstring label = p.second;
+ addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label),
+ FuncRequest(LFUN_INSET_MODIFY, type + " " + p.first)));
+ }
+}
+
+
+
void MenuDefinition::expandArguments(BufferView const * bv, bool switcharg)
{
if (!bv)
}
-void MenuDefinition::expandEnvironmentSeparators(BufferView const * bv)
+void MenuDefinition::expandEnvironmentSeparators(BufferView const * bv,
+ bool contextmenu)
{
if (!bv)
return;
return;
pit_type pit = bv->cursor().selBegin().pit();
- pos_type pos = bv->cursor().selBegin().pos();
Paragraph const & par = text->getPar(pit);
docstring const curlayout = par.layout().name();
docstring outerlayout;
break;
}
if (par.layout().isEnvironment()) {
- docstring label = bformat(_("Separated %1$s Above"),
- translateIfPossible(curlayout));
+ docstring label = contextmenu ?
+ bformat(_("Insert Separated %1$s Above"),
+ translateIfPossible(curlayout)) :
+ bformat(_("Separated %1$s Above"),
+ translateIfPossible(curlayout));
add(MenuItem(MenuItem::Command, toqstr(label),
FuncRequest(LFUN_ENVIRONMENT_SPLIT,
from_ascii("before"))));
- if (!par.layout().keepempty || pos > 0 || !text->isFirstInSequence(pit)) {
- label = bformat(_("Separated %1$s Below"),
+ label = contextmenu ?
+ bformat(_("Insert Separated %1$s Below"),
+ translateIfPossible(curlayout)):
+ bformat(_("Separated %1$s Below"),
translateIfPossible(curlayout));
+ // We use command-alternatives here since this is how the binding is defined
+ // (otherwise, the binding is not displayed in the menu)
+ if (getStatus(FuncRequest(LFUN_ENVIRONMENT_SPLIT)).enabled())
add(MenuItem(MenuItem::Command, toqstr(label),
- FuncRequest(LFUN_ENVIRONMENT_SPLIT)));
- }
+ FuncRequest(LFUN_COMMAND_ALTERNATIVES,
+ from_ascii("environment-split ; environment-split previous"))));
}
else if (!prevlayout.empty()) {
- docstring const label =
+ docstring const label = contextmenu ?
+ bformat(_("Insert Separated %1$s Below"),
+ translateIfPossible(prevlayout)) :
bformat(_("Separated %1$s Below"),
translateIfPossible(prevlayout));
- add(MenuItem(MenuItem::Command, toqstr(label),
- FuncRequest(LFUN_ENVIRONMENT_SPLIT,
- from_ascii("previous"))));
+ // We use command-alternatives here since this is how the binding is defined
+ // (otherwise, the binding is not displayed in the menu)
+ if (getStatus(FuncRequest(LFUN_ENVIRONMENT_SPLIT)).enabled())
+ add(MenuItem(MenuItem::Command, toqstr(label),
+ FuncRequest(LFUN_COMMAND_ALTERNATIVES,
+ from_ascii("environment-split ; environment-split previous"))));
}
if (!outerlayout.empty()) {
- docstring const label = (outerlayout == curlayout) ?
- bformat(_("Separated Outer %1$s Below"),
- translateIfPossible(outerlayout)) :
- bformat(_("Separated %1$s Below"),
- translateIfPossible(outerlayout));
+ docstring label;
+ if (contextmenu) {
+ label = (outerlayout == curlayout) ?
+ bformat(_("Insert Separated Outer %1$s Below"),
+ translateIfPossible(outerlayout)) :
+ bformat(_("Insert Separated %1$s Below"),
+ translateIfPossible(outerlayout));
+ } else {
+ label = (outerlayout == curlayout) ?
+ bformat(_("Separated Outer %1$s Below"),
+ translateIfPossible(outerlayout)) :
+ bformat(_("Separated %1$s Below"),
+ translateIfPossible(outerlayout));
+ }
add(MenuItem(MenuItem::Command, toqstr(label),
FuncRequest(LFUN_ENVIRONMENT_SPLIT,
from_ascii("outer"))));
tomenu.expandCiteStyles(bv);
break;
+ case MenuItem::InfoArguments:
+ tomenu.expandInfoArguments(bv);
+ break;
+
+
case MenuItem::Toc:
tomenu.expandToc(buf);
break;
tomenu.expandEnvironmentSeparators(bv);
break;
+ case MenuItem::EnvironmentSeparatorsContext:
+ tomenu.expandEnvironmentSeparators(bv, true);
+ break;
+
case MenuItem::SwitchQuotes:
tomenu.expandQuotes(bv);
break;
bool Menus::searchMenu(FuncRequest const & func,
- docstring_list & names) const
+ docstring_list & names, BufferView const * bv) const
{
MenuDefinition menu;
- d->expand(d->menubar_, menu, 0);
+ d->expand(d->menubar_, menu, bv);
return menu.searchMenu(func, names);
}
continue;
}
- Menu * menu = new Menu(view, m->submenuname(), true);
- menu->setTitle(label(*m));
+ Menu * menuptr = new Menu(view, m->submenuname(), true);
+ menuptr->setTitle(label(*m));
#if defined(Q_OS_MAC) && (defined(QT_MAC_USE_COCOA) || (QT_VERSION >= 0x050000))
// On Mac OS with QT/cocoa, the menu is not displayed if there is no action
// so we create a temporary one here
- QAction * action = new QAction(menu);
- menu->addAction(action);
+ QAction * action = new QAction(menuptr);
+ menuptr->addAction(action);
#endif
- qmb->addMenu(menu);
+ qmb->addMenu(menuptr);
- d->name_map_[view][name] = menu;
+ d->name_map_[view][name] = menuptr;
}
}