From 99ee47f0cd7fafd33038794dfb79b41dfd88d12d Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Mon, 10 Dec 2012 09:19:56 +0100 Subject: [PATCH] Disallow the insertion of multiplenon-item arguments of the same type in a sequence of merged environment pars --- src/Text3.cpp | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/Text3.cpp b/src/Text3.cpp index b685129ba5..1c7616ba4b 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -2533,16 +2533,38 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, args.find(arg); if (lait != args.end()) { enable = true; - InsetList::const_iterator it = cur.paragraph().insetList().begin(); - InsetList::const_iterator const end = cur.paragraph().insetList().end(); - for (; it != end; ++it) { - if (it->inset->lyxCode() == ARG_CODE) { - InsetArgument const * ins = - static_cast(it->inset); - if (ins->name() == arg) { - // we have this already - enable = false; + pit_type pit = cur.pit(); + pit_type lastpit = cur.pit(); + if (lay.isEnvironment() && !prefixIs(arg, "item:")) { + // In a sequence of "merged" environment layouts, we only allow + // non-item arguments once. + lastpit = cur.lastpit(); + // get the first paragraph in sequence with this layout + depth_type const current_depth = cur.paragraph().params().depth(); + while (true) { + if (pit == 0) break; + Paragraph cpar = pars_[pit - 1]; + if (cpar.layout() == lay && cpar.params().depth() == current_depth) + --pit; + else + break; + } + } + for (; pit <= lastpit; ++pit) { + if (pars_[pit].layout() != lay) + break; + InsetList::const_iterator it = pars_[pit].insetList().begin(); + InsetList::const_iterator end = pars_[pit].insetList().end(); + for (; it != end; ++it) { + if (it->inset->lyxCode() == ARG_CODE) { + InsetArgument const * ins = + static_cast(it->inset); + if (ins->name() == arg) { + // we have this already + enable = false; + break; + } } } }