#include "insets/Inset.h"
#include "insets/InsetCitation.h"
#include "insets/InsetGraphics.h"
+#include "insets/InsetQuotes.h"
#include "support/lassert.h"
#include "support/convert.h"
in the InsetCaption context menu. */
SwitchCaptions,
/** Commands to separate environments. */
- EnvironmentSeparators
+ EnvironmentSeparators,
+ /** This is the list of quotation marks available */
+ SwitchQuotes
};
explicit MenuItem(Kind kind) : kind_(kind), optional_(false) {}
///
size_t size() const { return items_.size(); }
///
- MenuItem const & operator[](size_t) const;
- ///
const_iterator begin() const { return items_.begin(); }
///
const_iterator end() const { return items_.end(); }
void expandFloatListInsert(Buffer const * buf);
void expandFloatInsert(Buffer const * buf);
void expandFlexInsert(Buffer const * buf, InsetLayout::InsetLyXType type);
+ void expandTocSubmenu(std::string const & type, Toc const & toc_list);
void expandToc2(Toc const & toc_list, size_t from, size_t to, int depth, string toc_type);
void expandToc(Buffer const * buf);
void expandPasteRecent(Buffer const * buf);
void expandArguments(BufferView const *, bool switcharg = false);
void expandCaptions(Buffer const * buf, bool switchcap = false);
void expandEnvironmentSeparators(BufferView const *);
+ void expandQuotes(BufferView const *);
///
ItemList items_;
///
md_switcharguments,
md_captions,
md_switchcaptions,
- md_env_separators
+ md_env_separators,
+ md_switchquotes
};
LexerKeyword menutags[] = {
{ "submenu", md_submenu },
{ "switcharguments", md_switcharguments },
{ "switchcaptions", md_switchcaptions },
+ { "switchquotes", md_switchquotes },
{ "toc", md_toc },
{ "toolbars", md_toolbars },
{ "updateformats", md_updateformats },
add(MenuItem(MenuItem::EnvironmentSeparators));
break;
+ case md_switchquotes:
+ add(MenuItem(MenuItem::SwitchQuotes));
+ break;
+
case md_optsubmenu:
case md_submenu: {
lex.next(true);
}
-MenuItem const & MenuDefinition::operator[](size_type i) const
-{
- return items_[i];
-}
-
-
bool MenuDefinition::hasFunc(FuncRequest const & func) const
{
for (const_iterator it = begin(), et = end(); it != et; ++it)
if (!buf && kind != MenuItem::ImportFormats)
return;
- typedef vector<Format const *> Formats;
- Formats formats;
+ FormatList formats;
FuncCode action = LFUN_NOACTION;
switch (kind) {
LATTEST(false);
return;
}
- sort(formats.begin(), formats.end(), Format::formatSorter);
bool const view_update = (kind == MenuItem::ViewFormats
|| kind == MenuItem::UpdateFormats);
}
MenuDefinition other_lists;
- FloatList const & floatlist = buf->params().documentClass().floats();
TocList const & toc_list = buf->tocBackend().tocs();
TocList::const_iterator cit = toc_list.begin();
TocList::const_iterator end = toc_list.end();
if (cit->first == "tableofcontents" || cit->second->empty())
continue;
MenuDefinition submenu;
- // "Open outliner..." entry
- FuncRequest f(LFUN_DIALOG_SHOW, "toc " + cit->first);
- submenu.add(MenuItem(MenuItem::Command, qt_("Open Outliner..."), f));
- submenu.add(MenuItem(MenuItem::Separator));
- // add entries
- submenu.expandToc2(*cit->second, 0, cit->second->size(), 0, cit->first);
+ submenu.expandTocSubmenu(cit->first, *cit->second);
MenuItem item(MenuItem::Submenu, guiName(cit->first, buf->params()));
item.setSubmenu(submenu);
// deserves to be in the main menu?
- if (floatlist.typeExist(cit->first) || cit->first == "child")
+ if (!TocBackend::isOther(cit->first))
add(item);
else
other_lists.add(item);
}
+void MenuDefinition::expandTocSubmenu(std::string const & type, Toc const & toc)
+{
+ // "Open outliner..." entry
+ FuncRequest f(LFUN_DIALOG_SHOW, "toc " + type);
+ add(MenuItem(MenuItem::Command, qt_("Open Outliner..."), f));
+ add(MenuItem(MenuItem::Separator));
+ // add entries
+ expandToc2(toc, 0, toc.size(), 0, type);
+}
+
+
void MenuDefinition::expandPasteRecent(Buffer const * buf)
{
docstring_list const sel = cap::availableSelections(buf);
FuncRequest(LFUN_NOACTION)));
return;
}
- InsetCommand const * citinset =
- static_cast<InsetCommand const *>(inset);
+ InsetCitation const * citinset =
+ static_cast<InsetCitation const *>(inset);
Buffer const * buf = &bv->buffer();
+ BufferParams const & bp = buf->params();
string const cmd = citinset->params().getCmdName();
docstring const & key = citinset->getParam("key");
return;
}
- docstring const & before = citinset->getParam("before");
- docstring const & after = citinset->getParam("after");
-
size_t const n = cmd.size();
- bool const force = cmd[0] == 'C';
- bool const full = cmd[n] == '*';
+ bool const force = isUpperCase(cmd[0]);
+ bool const star = cmd[n] == '*';
vector<docstring> const keys = getVectorFromString(key);
vector<CitationStyle> const citeStyleList = buf->params().citeStyles();
- static const size_t max_length = 40;
+ CiteItem ci;
+ ci.textBefore = citinset->getParam("before");
+ ci.textAfter = citinset->getParam("after");
+ ci.forceUpperCase = force;
+ ci.Starred = star;
+ ci.context = CiteItem::Dialog;
+ ci.max_size = 40;
vector<docstring> citeStrings =
- buf->masterBibInfo().getCiteStrings(keys, citeStyleList, bv->buffer(),
- before, after, from_utf8("dialog"), max_length);
+ buf->masterBibInfo().getCiteStrings(keys, citeStyleList, bv->buffer(), ci);
vector<docstring>::const_iterator cit = citeStrings.begin();
vector<docstring>::const_iterator end = citeStrings.end();
docstring label = *cit;
CitationStyle cs = citeStyleList[ii - 1];
cs.forceUpperCase &= force;
- cs.fullAuthorList &= full;
+ cs.hasStarredVersion &= star;
addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label),
FuncRequest(LFUN_INSET_MODIFY,
"changetype " + from_utf8(citationStyleToString(cs)))));
}
+
+ // Extra features of the citation styles
+ CitationStyle cs = citinset->getCitationStyle(bp, cmd, citeStyleList);
+
+ if (cs.hasStarredVersion) {
+ docstring starred = _("All authors|h");
+ // Check if we have a custom string/tooltip for the starred version
+ if (!cs.stardesc.empty()) {
+ string val =
+ bp.documentClass().getCiteMacro(buf->params().citeEngineType(), cs.stardesc);
+ if (!val.empty())
+ starred = translateIfPossible(from_utf8(val));
+ // Transform qt-style accelerators to menu-style
+ int const amps = count_char(starred, '&');
+ if (amps > 0) {
+ if (amps > 1)
+ starred = subst(starred, from_ascii("&&"), from_ascii("<:amp:>"));
+ size_t n = starred.find('&');
+ char_type accel = char_type();
+ if (n != docstring::npos && n < starred.size() - 1)
+ accel = starred[n + 1];
+ starred = subst(starred, from_ascii("&"), from_ascii(""));
+ if (amps > 1)
+ starred = subst(starred, from_ascii("<:amp:>"), from_ascii("&&"));
+ if (accel != char_type())
+ starred = starred + '|' + accel;
+ }
+ }
+ add(MenuItem(MenuItem::Separator));
+ addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(starred),
+ FuncRequest(LFUN_INSET_MODIFY, "toggleparam star")));
+ }
+
+ if (cs.forceUpperCase) {
+ if (!cs.hasStarredVersion)
+ add(MenuItem(MenuItem::Separator));
+ addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(_("Force upper case|u")),
+ FuncRequest(LFUN_INSET_MODIFY, "toggleparam casing")));
+ }
}
}
+void MenuDefinition::expandQuotes(BufferView const * bv)
+{
+ if (!bv)
+ return;
+
+ if (!bv->cursor().inTexted())
+ return;
+
+ Inset const * inset = bv->cursor().nextInset();
+ if (!inset || inset->lyxCode() != QUOTE_CODE) {
+ add(MenuItem(MenuItem::Command,
+ qt_("No Quote in Scope!"),
+ FuncRequest(LFUN_NOACTION)));
+ return;
+ }
+ InsetQuotes const * qinset =
+ static_cast<InsetQuotes const *>(inset);
+
+ map<string, docstring> styles = quoteparams.getTypes();
+ string const qtype = qinset->getType();
+
+ map<string, docstring>::const_iterator qq = styles.begin();
+ map<string, docstring>::const_iterator end = styles.end();
+
+ MenuDefinition aqs;
+
+ BufferParams const & bp = bv->buffer().masterBuffer()->params();
+
+ // The global setting
+ InsetQuotesParams::QuoteStyle globalqs = bp.quotes_style;
+ char const globalqsc = quoteparams.getStyleChar(globalqs);
+
+ // The current language's default
+ InsetQuotesParams::QuoteStyle langdefqs =
+ bp.getQuoteStyle(bv->cursor().current_font.language()->quoteStyle());
+ char const langqs = quoteparams.getStyleChar(langdefqs);
+
+ bool main_global_qs = false;
+ bool main_langdef_qs = false;
+ bool main_dynamic_qs = false;
+ docstring const subcmd = from_ascii("changetype ");
+ docstring const wildcards = from_ascii("..");
+ // Add the items
+ // First the top level menu (all glyphs of the current style) ...
+ // Begin with dynamic (if they are current style),
+ if (qtype[0] == 'x') {
+ FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + from_ascii("xld"));
+ docstring desc = bformat(_("%1$s (dynamic)"),
+ quoteparams.getShortGuiLabel(globalqsc + from_ascii("ld")));
+ add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + from_ascii("xls"));
+ desc = bformat(_("%1$s (dynamic)"),
+ quoteparams.getShortGuiLabel(globalqsc + from_ascii("ls")));
+ add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + from_ascii("xrd"));
+ desc = bformat(_("%1$s (dynamic)"),
+ quoteparams.getShortGuiLabel(globalqsc + from_ascii("rd")));
+ add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + from_ascii("xrs"));
+ desc = bformat(_("%1$s (dynamic)"),
+ quoteparams.getShortGuiLabel(globalqsc + from_ascii("rs")));
+ add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ main_dynamic_qs = true;
+ }
+ // now traverse through the static styles ...
+ for (; qq != end; ++qq) {
+ docstring const style = from_ascii(qq->first);
+ bool langdef = (style[0] == langqs);
+ bool globaldef = (style[0] == globalqsc);
+
+ if (prefixIs(style, qtype[0])) {
+ FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + style);
+ docstring const desc = quoteparams.getShortGuiLabel(style);
+ add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ main_global_qs = globaldef;
+ main_langdef_qs = langdef;
+ }
+ else if (!langdef && !globaldef && suffixIs(style, from_ascii("ld"))) {
+ docstring const desc =
+ quoteparams.getGuiLabel(quoteparams.getQuoteStyle(to_ascii(style)));
+ FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + style[0] + "..");
+ aqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ }
+ }
+
+ add(MenuItem(MenuItem::Separator));
+
+ bool have_section = false;
+ bool display_static = false;
+ // ... then potentially items to reset to the defaults and to dynamic style ...
+ if (!main_dynamic_qs && globalqsc != 'x') {
+ FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + 'x' + wildcards);
+ docstring const desc = bformat(_("Use dynamic quotes (%1$s)|d"),
+ quoteparams.getGuiLabel(globalqs));
+ add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ have_section = true;
+ display_static = true;
+ }
+ if (!main_global_qs && langdefqs != globalqs) {
+ docstring const variant = main_dynamic_qs ? _("dynamic[[Quotes]]") : _("static[[Quotes]]");
+ FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + globalqsc + wildcards);
+ docstring const desc = bformat(_("Reset to document default (%1$s, %2$s)|o"),
+ quoteparams.getGuiLabel(globalqs), variant);
+ add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ have_section = true;
+ }
+ if (!main_langdef_qs) {
+ FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + globalqsc + wildcards);
+ docstring const desc = (main_dynamic_qs || display_static)
+ ? bformat(_("Reset to language default (%1$s, %2$s)|l"),
+ quoteparams.getGuiLabel(langdefqs), _("static[[Quotes]]"))
+ : bformat(_("Reset to language default (%1$s)|l"),
+ quoteparams.getGuiLabel(langdefqs));
+ add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ have_section = true;
+ }
+
+ if (have_section)
+ add(MenuItem(MenuItem::Separator));
+
+ // ... and a subitem with the rest
+ MenuItem item(MenuItem::Submenu, qt_("Change Style|y"));
+ item.setSubmenu(aqs);
+ add(item);
+}
+
+
void MenuDefinition::expandEnvironmentSeparators(BufferView const * bv)
{
if (!bv)
QString(), qMenu);
action->setMenuRole(entries[i].role);
qMenu->addAction(action);
+ ++i;
}
}
tomenu.expandEnvironmentSeparators(bv);
break;
+ case MenuItem::SwitchQuotes:
+ tomenu.expandQuotes(bv);
+ break;
+
case MenuItem::Submenu: {
MenuItem item(*cit);
item.setSubmenu(MenuDefinition(cit->submenuname()));