X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetArgument.cpp;h=2e4285e7fef5ca48f341717e3080ed0f3420fdf1;hb=f83ac67e1a98fa3f6b20904e397afba81fe9830f;hp=d971a16e3a804f3ea7d7e18355acf3ab4daac5cd;hpb=4b4e9560d11519bee146d52a7b3a0717cc2f7db1;p=lyx.git diff --git a/src/insets/InsetArgument.cpp b/src/insets/InsetArgument.cpp index d971a16e3a..2e4285e7fe 100644 --- a/src/insets/InsetArgument.cpp +++ b/src/insets/InsetArgument.cpp @@ -4,6 +4,7 @@ * Licence details can be found in the file COPYING. * * \author Martin Vermeer + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -12,12 +13,16 @@ #include "InsetArgument.h" +#include "Buffer.h" +#include "BufferParams.h" #include "Cursor.h" #include "FuncStatus.h" #include "FuncRequest.h" #include "InsetList.h" +#include "Language.h" #include "Layout.h" #include "Lexer.h" +#include "OutputParams.h" #include "ParIterator.h" #include "support/convert.h" @@ -32,7 +37,9 @@ namespace lyx { InsetArgument::InsetArgument(Buffer * buf, string const & name) - : InsetCollapsable(buf), name_(name), labelstring_(docstring()) + : InsetCollapsable(buf), name_(name), labelstring_(docstring()), + font_(inherit_font), labelfont_(inherit_font), decoration_(string()), + pass_thru_(false) {} @@ -50,18 +57,19 @@ void InsetArgument::read(Lexer & lex) void InsetArgument::updateBuffer(ParIterator const & it, UpdateType utype) { - Layout::LaTeXArgMap args; - bool const insetlayout = &it.inset() && it.paragraph().layout().latexargs().empty(); - if (insetlayout) - args = it.inset().getLayout().latexargs(); - else - args = it.paragraph().layout().latexargs(); - + Layout::LaTeXArgMap args = it.paragraph().layout().args(); + pass_thru_ = it.paragraph().layout().pass_thru; + bool const insetlayout = &it.inset() && args.empty(); + if (insetlayout) { + args = it.inset().getLayout().args(); + pass_thru_ = it.inset().getLayout().isPassThru(); + } + // Handle pre 2.1 ArgInsets (lyx2lyx cannot classify them) if (name_ == "999") { - unsigned int const req = insetlayout ? it.inset().getLayout().numRequiredArgs() + unsigned int const req = insetlayout ? it.inset().getLayout().requiredArgs() : it.paragraph().layout().requiredArgs(); - unsigned int const opts = insetlayout ? it.inset().getLayout().numOptArgs() + unsigned int const opts = insetlayout ? it.inset().getLayout().optArgs() : it.paragraph().layout().optArgs(); unsigned int nr = 0; unsigned int ours = 0; @@ -92,14 +100,16 @@ void InsetArgument::updateBuffer(ParIterator const & it, UpdateType utype) name_ = convert(ours); } } - Layout::LaTeXArgMap::const_iterator const lait = - args.find(convert(name_)); + Layout::LaTeXArgMap::const_iterator const lait = args.find(name_); if (lait != args.end()) { docstring label = translateIfPossible((*lait).second.labelstring); docstring striplabel; support::rsplit(label, striplabel, '|'); labelstring_ = striplabel.empty() ? label: striplabel; tooltip_ = translateIfPossible((*lait).second.tooltip); + font_ = (*lait).second.font; + labelfont_ = (*lait).second.labelfont; + decoration_ = (*lait).second.decoration; } else { labelstring_ = _("Unknown Argument"); tooltip_ = _("Argument not known in this Layout. Will be supressed in the output."); @@ -139,6 +149,25 @@ void InsetArgument::doDispatch(Cursor & cur, FuncRequest & cmd) break; } + case LFUN_PASTE: + case LFUN_CLIPBOARD_PASTE: + case LFUN_SELECTION_PASTE: + case LFUN_PRIMARY_SELECTION_PASTE: + // Do not call InsetCollapsable::doDispatch(cur, cmd) + // with (inherited) pass_thru to avoid call for + // fixParagraphsFont(), which does not play nicely with + // inherited pass_thru (see #8471). + // FIXME: Once we have implemented genuine pass_thru + // option for InsetArgument (not inherited pass_thru), + // we should probably directly call + // InsetCollapsable::doDispatch(cur, cmd) for that + // case as well + if (pass_thru_) + text().dispatch(cur, cmd); + else + InsetCollapsable::doDispatch(cur, cmd); + break; + default: InsetCollapsable::doDispatch(cur, cmd); break; @@ -166,8 +195,7 @@ bool InsetArgument::getStatus(Cursor & cur, FuncRequest const & cmd, args = cur.inset().getLayout().latexargs(); else args = cur.paragraph().layout().latexargs(); - Layout::LaTeXArgMap::const_iterator const lait = - args.find(convert(type)); + Layout::LaTeXArgMap::const_iterator const lait = args.find(type); if (lait != args.end()) { flag.setEnabled(true); InsetList::const_iterator it = cur.paragraph().insetList().begin(); @@ -200,15 +228,41 @@ string InsetArgument::contextMenuName() const return "context-argument"; } +FontInfo InsetArgument::getFont() const +{ + if (font_ != inherit_font) + return font_; + return getLayout().font(); +} + +FontInfo InsetArgument::getLabelfont() const +{ + if (labelfont_ != inherit_font) + return labelfont_; + return getLayout().labelfont(); +} + +InsetLayout::InsetDecoration InsetArgument::decoration() const +{ + InsetLayout::InsetDecoration dec = getLayout().decoration(); + if (!decoration_.empty()) + dec = translateDecoration(decoration_); + return dec == InsetLayout::DEFAULT ? InsetLayout::CLASSIC : dec; +} + void InsetArgument::latexArgument(otexstream & os, - OutputParams const & runparams, docstring const & ldelim, - docstring const & rdelim) const + OutputParams const & runparams_in, docstring const & ldelim, + docstring const & rdelim, docstring const & presetarg) const { TexRow texrow; odocstringstream ss; otexstream ots(ss, texrow); + OutputParams runparams = runparams_in; InsetText::latex(ots, runparams); docstring str = ss.str(); + docstring const sep = str.empty() ? docstring() : from_ascii(", "); + if (!presetarg.empty()) + str = presetarg + sep + str; if (ldelim != "{" && support::contains(str, rdelim)) str = '{' + str + '}'; os << ldelim << str << rdelim;