#include "Buffer.h"
#include "BufferView.h"
#include "BufferParams.h"
-#include "Counters.h"
#include "Cursor.h"
-#include "DispatchResult.h"
#include "Encoding.h"
#include "FuncRequest.h"
#include "FuncStatus.h"
#include "InsetCaption.h"
#include "InsetLabel.h"
+#include "InsetLayout.h"
#include "Language.h"
#include "LaTeXFeatures.h"
#include "Lexer.h"
#include "output_latex.h"
#include "output_docbook.h"
#include "output_xhtml.h"
-#include "OutputParams.h"
-#include "TextClass.h"
#include "TexRow.h"
#include "texstream.h"
#include "frontends/alert.h"
#include "frontends/Application.h"
-#include "support/regex.h"
-
+#include <cstring>
+#include <regex>
#include <sstream>
using namespace std;
}
-Inset::RowFlags InsetListings::rowFlags() const
+int InsetListings::rowFlags() const
{
return params().isInline() || params().isFloat() ? Inline : Display | AlignLeft;
}
}
}
++par;
- // for the inline case, if there are multiple paragraphs
+ // Add new line between paragraphs in displayed listings.
+ // Exception: merged paragraphs in change tracking mode.
+ // Also, for the inline case, if there are multiple paragraphs
// they are simply joined. Otherwise, expect latex errors.
- if (par != end && !isInline && !captionline)
+ if (par != end && !isInline && !captionline && !par->parEndChange().deleted())
code += "\n";
}
if (isInline) {
}
-namespace {
-
-const InsetLabel* findLabelInParagraph(const Paragraph &par)
-{
- for (pos_type pos = 0; pos < par.size(); ++pos) {
- const Inset *inset = par.getInset(pos);
-
- // Maybe an inset is directly a label, in which case no more work is needed.
- if (inset && dynamic_cast<const InsetLabel *>(inset))
- return dynamic_cast<const InsetLabel *>(inset);
-
- // More likely, the label is hidden in an inset of a paragraph (only if a subtype of InsetText).
- if (!dynamic_cast<const InsetText *>(inset))
- continue;
-
- auto insetAsText = dynamic_cast<const InsetText *>(inset);
- auto itIn = insetAsText->paragraphs().begin();
- auto endIn = insetAsText->paragraphs().end();
- for (; itIn != endIn; ++itIn) {
- for (pos_type posIn = 0; posIn < itIn->size(); ++posIn) {
- const Inset *insetIn = itIn->getInset(posIn);
- if (insetIn && dynamic_cast<const InsetLabel *>(insetIn)) {
- return dynamic_cast<const InsetLabel *>(insetIn);
- }
- }
- }
-
- // Obviously, this solution does not scale with more levels of paragraphs-insets, but this should be enough.
- }
-
- return nullptr;
-}
-
-} // anonymous namespace
-
-
void InsetListings::docbook(XMLStream & xs, OutputParams const & rp) const
{
InsetLayout const & il = getLayout();
// TODO: parts of this code could be merged with InsetFloat and findLabelInParagraph.
InsetCaption const * caption = getCaptionInset();
if (caption) {
- // Find the label in the caption, if any.
- InsetLabel const * label;
- auto const end = caption->paragraphs().end();
- for (auto it = caption->paragraphs().begin(); it != end; ++it) {
- label = findLabelInParagraph(*it);
- if (label)
- break;
- }
+ InsetLabel const * label = getLabelInset();
// Ensure that the label will not be output a second time as an anchor.
OutputParams rpNoLabel = rp;
docstring const InsetListings::buttonLabel(BufferView const & bv) const
{
// FIXME UNICODE
- if (decoration() == InsetLayout::CLASSIC)
- return isOpen(bv) ? _("Listing") : getNewLabel(_("Listing"));
- else
- return getNewLabel(_("Listing"));
+ docstring const locked = tempfile_ ? docstring(1, 0x1F512) : docstring();
+ if (decoration() == InsetDecoration::CLASSIC)
+ return locked + (isOpen(bv) ? _("Listing") : getNewLabel(_("Listing")));
+ return locked + getNewLabel(_("Listing"));
}