]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetLabel.cpp
de.po
[lyx.git] / src / insets / InsetLabel.cpp
index f6538f4c45429b45b676a24aa3c50f00a4e77af6..6d5c0b6ddde9a1f1392772dbd52515caf5b0e4e2 100644 (file)
@@ -28,6 +28,7 @@
 #include "output_xhtml.h"
 #include "ParIterator.h"
 #include "sgml.h"
+#include "texstream.h"
 #include "Text.h"
 #include "TextClass.h"
 #include "TocBackend.h"
@@ -82,10 +83,11 @@ void InsetLabel::uniqueLabel(docstring & label) const
 }
 
 
-void InsetLabel::updateLabel(docstring const & new_label)
+void InsetLabel::updateLabel(docstring const & new_label, bool const active)
 {
        docstring label = new_label;
-       uniqueLabel(label);
+       if (active)
+               uniqueLabel(label);
        setParam("name", label);
 }
 
@@ -146,9 +148,21 @@ void InsetLabel::updateBuffer(ParIterator const & par, UpdateType utype)
 {
        docstring const & label = getParam("name");
 
-       // Check if this one is deleted (ct)
+       // Check if this one is active (i.e., neither deleted with change-tracking
+       // nor in an inset that does not produce output, such as notes or inactive branches)
        Paragraph const & para = par.paragraph();
-       bool const active = !para.isDeleted(par.pos());
+       bool active = !para.isDeleted(par.pos()) && para.inInset().producesOutput();
+       // If not, check whether we are in a deleted/non-outputting inset
+       if (active) {
+               for (size_type sl = 0 ; sl < par.depth() ; ++sl) {
+                       Paragraph const & outer_par = par[sl].paragraph();
+                       if (outer_par.isDeleted(par[sl].pos())
+                           || !outer_par.inInset().producesOutput()) {
+                               active = false;
+                               break;
+                       }
+               }
+       }
 
        if (buffer().activeLabel(label) && active) {
                // Problem: We already have an active InsetLabel with the same name!
@@ -176,17 +190,20 @@ void InsetLabel::updateBuffer(ParIterator const & par, UpdateType utype)
 
 
 void InsetLabel::addToToc(DocIterator const & cpit, bool output_active,
-                                                 UpdateType, TocBackend & backend) const
+                         UpdateType, TocBackend & backend) const
 {
        docstring const & label = getParam("name");
-       if (!buffer().activeLabel(label))
-               return;
 
+       // inactive labels get a cross mark
+       if (buffer().insetLabel(label, true) != this)
+               output_active = false;
+
+       // We put both  active and inactive labels to the outliner
        shared_ptr<Toc> toc = backend.toc("label");
-       if (buffer().insetLabel(label, true) != this) {
-               toc->push_back(TocItem(cpit, 0, screen_label_, output_active));
-       } else {
-               toc->push_back(TocItem(cpit, 0, screen_label_, output_active));
+       toc->push_back(TocItem(cpit, 0, screen_label_, output_active));
+       // The refs get assigned only to the active label. If no active one exists,
+       // assign the (BROKEN) refs to the first inactive one.
+       if (buffer().insetLabel(label, true) == this || !buffer().activeLabel(label)) {
                for (auto const & p : buffer().references(label)) {
                        DocIterator const ref_pit(p.second);
                        if (p.first->lyxCode() == MATH_REF_CODE)
@@ -278,6 +295,22 @@ void InsetLabel::doDispatch(Cursor & cur, FuncRequest & cmd)
 }
 
 
+void InsetLabel::latex(otexstream & os, OutputParams const & runparams_in) const
+{
+       OutputParams runparams = runparams_in;
+       docstring command = getCommand(runparams);
+       // In macros with moving arguments, such as \section,
+       // we store the label and output it after the macro (#2154)
+       if (runparams_in.postpone_fragile_stuff)
+               runparams_in.post_macro += command;
+       else {
+               if (runparams.moving_arg)
+                       os << "\\protect";
+               os << command;
+       }
+}
+
+
 int InsetLabel::plaintext(odocstringstream & os,
         OutputParams const &, size_t) const
 {