]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
de.po
[lyx.git] / src / Paragraph.cpp
index cdd6b23b943986aba2c3ad4f14db95702e24d793..59cfa6457674363a652c7373dd3fbe66b4418810 100644 (file)
@@ -1351,7 +1351,8 @@ void Paragraph::Private::validate(LaTeXFeatures & features) const
                otexstringstream os;
                os << layout_->preamble();
                size_t const length = os.length();
-               TeXOnePar(buf, buf.text(), buf.getParFromID(owner_->id()).pit(), os,
+               TeXOnePar(buf, *inset_owner_->getText(int(buf.getParFromID(owner_->id()).idx())),
+                         buf.getParFromID(owner_->id()).pit(), os,
                          features.runparams(), string(), 0, -1, true);
                if (os.length() > length)
                        features.addPreambleSnippet(os.release(), true);
@@ -1646,6 +1647,8 @@ void Paragraph::validate(LaTeXFeatures & features) const
        d->validate(features);
        bool fragile = features.runparams().moving_arg;
        fragile |= layout().needprotect;
+       if (inInset().getLayout().isNeedProtect())
+               fragile = true;
        if (needsCProtection(fragile))
                features.require("cprotect");
 }
@@ -3434,10 +3437,31 @@ bool Paragraph::needsCProtection(bool const fragile) const
        }
 
        // now check whether we have insets that need cprotection
-       pos_type size = d->text_.size();
-       for (pos_type i = 0; i < size; ++i)
-               if (isInset(i) && getInset(i)->needsCProtection(maintext, fragile))
+       pos_type size = pos_type(d->text_.size());
+       for (pos_type i = 0; i < size; ++i) {
+               if (!isInset(i))
+                       continue;
+               Inset const * ins = getInset(i);
+               if (ins->needsCProtection(maintext, fragile))
+                       return true;
+               if (ins->getLayout().latextype() == InsetLayout::ENVIRONMENT)
+                       // Environments need cprotection regardless the content
                        return true;
+               // Now check math environments
+               InsetMath const * im = getInset(i)->asInsetMath();
+               if (!im || im->cell(0).empty())
+                       continue;
+               switch(im->cell(0)[0]->lyxCode()) {
+               case MATH_AMSARRAY_CODE:
+               case MATH_SUBSTACK_CODE:
+               case MATH_ENV_CODE:
+               case MATH_XYMATRIX_CODE:
+                       // these need cprotection
+                       return true;
+               default:
+                       break;
+               }
+       }
 
        return false;
 }
@@ -3668,32 +3692,43 @@ bool Paragraph::allowEmpty() const
 
 bool Paragraph::brokenBiblio() const
 {
-       // there is a problem if there is no bibitem at position 0 or
-       // if there is another bibitem in the paragraph.
-       return d->layout_->labeltype == LABEL_BIBLIO
+       // There is a problem if there is no bibitem at position 0 in
+       // paragraphs that need one, if there is another bibitem in the
+       // paragraph or if this paragraph is not supposed to have
+       // a bibitem inset at all.
+       return ((d->layout_->labeltype == LABEL_BIBLIO
                && (d->insetlist_.find(BIBITEM_CODE) != 0
-                   || d->insetlist_.find(BIBITEM_CODE, 1) > 0);
+                   || d->insetlist_.find(BIBITEM_CODE, 1) > 0))
+               || (d->layout_->labeltype != LABEL_BIBLIO
+                   && d->insetlist_.find(BIBITEM_CODE) != -1));
 }
 
 
 int Paragraph::fixBiblio(Buffer const & buffer)
 {
-       // FIXME: What about the case where paragraph is not BIBLIO
-       // but there is an InsetBibitem?
        // FIXME: when there was already an inset at 0, the return value is 1,
        // which does not tell whether another inset has been remove; the
        // cursor cannot be correctly updated.
 
-       if (d->layout_->labeltype != LABEL_BIBLIO)
-               return 0;
-
        bool const track_changes = buffer.params().track_changes;
        int bibitem_pos = d->insetlist_.find(BIBITEM_CODE);
-       bool const hasbibitem0 = bibitem_pos == 0;
 
+       // The case where paragraph is not BIBLIO
+       if (d->layout_->labeltype != LABEL_BIBLIO) {
+               if (bibitem_pos == -1)
+                       // No InsetBibitem => OK
+                       return 0;
+               // There is an InsetBibitem: remove it!
+               d->insetlist_.release(bibitem_pos);
+               eraseChar(bibitem_pos, track_changes);
+               return (bibitem_pos == 0) ? -1 : -bibitem_pos;
+       }
+
+       bool const hasbibitem0 = bibitem_pos == 0;
        if (hasbibitem0) {
                bibitem_pos = d->insetlist_.find(BIBITEM_CODE, 1);
-               // There was an InsetBibitem at pos 0, and no other one => OK
+               // There was an InsetBibitem at pos 0,
+               // and no other one => OK
                if (bibitem_pos == -1)
                        return 0;
                // there is a bibitem at the 0 position, but since
@@ -3708,7 +3743,7 @@ int Paragraph::fixBiblio(Buffer const & buffer)
        }
 
        // We need to create an inset at the beginning
-       Inset * inset = 0;
+       Inset * inset = nullptr;
        if (bibitem_pos > 0) {
                // there was one somewhere in the paragraph, let's move it
                inset = d->insetlist_.release(bibitem_pos);
@@ -3722,6 +3757,8 @@ int Paragraph::fixBiblio(Buffer const & buffer)
        insertInset(0, inset, font, Change(track_changes ? Change::INSERTED
                                                   : Change::UNCHANGED));
 
+       // This is needed to get the counters right
+       buffer.updateBuffer();
        return 1;
 }