X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetInclude.cpp;h=6d512b4b7d9aefe5180006806f7aae2e3c087a29;hb=62ca7f3ae55ad2e0c395cb554d71afab87de1ee3;hp=265b96e7d918180280086675fcb57cf79d91161f;hpb=304f884930328612f9e1a014d79fbb4621253ecc;p=lyx.git diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index 265b96e7d9..6d512b4b7d 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -29,7 +29,6 @@ #include "LayoutFile.h" #include "LayoutModuleList.h" #include "LyX.h" -#include "LyXFunc.h" #include "LyXRC.h" #include "Lexer.h" #include "MetricsInfo.h" @@ -200,6 +199,12 @@ void InsetInclude::setBuffer(Buffer & buffer) } +void InsetInclude::setChildBuffer(Buffer * buffer) +{ + child_buffer_ = buffer; +} + + ParamInfo const & InsetInclude::findInfo(string const & /* cmdName */) { // FIXME @@ -222,7 +227,7 @@ bool InsetInclude::isCompatibleCommand(string const & s) void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd) { - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_EDIT: { editIncluded(to_utf8(params()["filename"])); @@ -299,7 +304,7 @@ void InsetInclude::editIncluded(string const & file) bool InsetInclude::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & flag) const { - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_EDIT: flag.setEnabled(true); @@ -336,6 +341,18 @@ void InsetInclude::setParams(InsetCommandParams const & p) } +bool InsetInclude::isChildIncluded() const +{ + std::list includeonlys = + buffer().params().getIncludedChildren(); + if (includeonlys.empty()) + return true; + return (std::find(includeonlys.begin(), + includeonlys.end(), + to_utf8(params()["filename"])) != includeonlys.end()); +} + + docstring InsetInclude::screenLabel() const { docstring temp; @@ -351,7 +368,10 @@ docstring InsetInclude::screenLabel() const temp = buffer().B_("Verbatim Input*"); break; case INCLUDE: - temp = buffer().B_("Include"); + if (isChildIncluded()) + temp = buffer().B_("Include"); + else + temp += buffer().B_("Include (excluded)"); break; case LISTINGS: temp = listings_label_; @@ -382,23 +402,28 @@ Buffer * InsetInclude::getChildBuffer() const Buffer * InsetInclude::loadIfNeeded() const { + // This is for background export and preview. We don't even want to + // try to load the cloned child document again. + if (buffer().isClone()) + return child_buffer_; + // Don't try to load it again if we failed before. if (failedtoload_ || isVerbatim(params()) || isListings(params())) return 0; + FileName const included_file = includedFilename(buffer(), params()); // Use cached Buffer if possible. if (child_buffer_ != 0) { - if (theBufferList().isLoaded(child_buffer_)) + if (theBufferList().isLoaded(child_buffer_) + // additional sanity check: make sure the Buffer really is + // associated with the file we want. + && child_buffer_ == theBufferList().getBuffer(included_file)) return child_buffer_; // Buffer vanished, so invalidate cache and try to reload. child_buffer_ = 0; } - string const parent_filename = buffer().absFileName(); - FileName const included_file = - makeAbsPath(to_utf8(params()["filename"]), onlyPath(parent_filename)); - - if (!isLyXFilename(included_file.absFilename())) + if (!isLyXFilename(included_file.absFileName())) return 0; Buffer * child = theBufferList().getBuffer(included_file); @@ -407,7 +432,7 @@ Buffer * InsetInclude::loadIfNeeded() const if (!included_file.exists()) return 0; - child = theBufferList().newBuffer(included_file.absFilename()); + child = theBufferList().newBuffer(included_file.absFileName()); if (!child) // Buffer creation is not possible. return 0; @@ -445,7 +470,7 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const // This isn't sufficient, as the inclusion could be downstream. // But it'll have to do for now. if (isInputOrInclude(params()) && - buffer().absFileName() == included_file.absFilename()) + buffer().absFileName() == included_file.absFileName()) { Alert::error(_("Recursive input"), bformat(_("Attempted to include file %1$s in itself! " @@ -459,7 +484,7 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const // buffer directory. if (!FileName::isAbsolute(incfile)) { // FIXME UNICODE - incfile = to_utf8(makeRelPath(from_utf8(included_file.absFilename()), + incfile = to_utf8(makeRelPath(from_utf8(included_file.absFileName()), from_utf8(masterBuffer->filePath()))); } @@ -472,7 +497,7 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const mangled = DocFileName(included_file).mangledFilename(); } else { exportfile = changeExtension(incfile, ".tex"); - mangled = DocFileName(changeExtension(included_file.absFilename(), ".tex")). + mangled = DocFileName(changeExtension(included_file.absFileName(), ".tex")). mangledFilename(); } @@ -494,7 +519,7 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const //Don't try to load or copy the file if we're //in a comment or doing a dryrun } else if (isInputOrInclude(params()) && - isLyXFilename(included_file.absFilename())) { + isLyXFilename(included_file.absFileName())) { //if it's a LyX file and we're inputting or including, //try to load it so we can write the associated latex if (!loadIfNeeded()) @@ -547,7 +572,7 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const runparams.encoding = &tmp->params().encoding(); runparams.master_language = buffer().params().language; tmp->makeLaTeXFile(writefile, - masterFileName(buffer()).onlyPath().absFilename(), + masterFileName(buffer()).onlyPath().absFileName(), runparams, false); runparams.encoding = oldEnc; runparams.master_language = oldLang; @@ -565,7 +590,7 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const LYXERR(Debug::LATEX, to_utf8(bformat(_("Could not copy the file\n%1$s\n" "into the temporary directory."), - from_utf8(included_file.absFilename())))); + from_utf8(included_file.absFileName())))); return 0; } } @@ -587,7 +612,7 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const exportfile); // \input wants file with extension (default is .tex) - if (!isLyXFilename(included_file.absFilename())) { + if (!isLyXFilename(included_file.absFileName())) { incfile = latex_path(incfile); // FIXME UNICODE os << '\\' << from_ascii(params().getCmdName()) @@ -642,21 +667,19 @@ docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const &rp) const bool const listing = isListings(params()); if (listing || isVerbatim(params())) { if (listing) - xs << StartTag("pre"); + xs << html::StartTag("pre"); // FIXME: We don't know the encoding of the file, default to UTF-8. xs << includedFilename(buffer(), params()).fileContents("UTF-8"); if (listing) - xs << EndTag("pre"); + xs << html::EndTag("pre"); return docstring(); } // We don't (yet) know how to Input or Include non-LyX files. // (If we wanted to get really arcane, we could run some tex2html // converter on the included file. But that's just masochistic.) - string const parent_filename = buffer().absFileName(); - FileName const included_file = - makeAbsPath(to_utf8(params()["filename"]), onlyPath(parent_filename)); - if (!isLyXFilename(included_file.absFilename())) { + FileName const included_file = includedFilename(buffer(), params()); + if (!isLyXFilename(included_file.absFileName())) { frontend::Alert::warning(_("Unsupported Inclusion"), bformat(_("LyX does not know how to include non-LyX files when " "generating HTML output. Offending file:\n%1$s"), @@ -668,7 +691,7 @@ docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const &rp) const // Check we're not trying to include ourselves. // FIXME RECURSIVE INCLUDE - if (buffer().absFileName() == included_file.absFilename()) { + if (buffer().absFileName() == included_file.absFileName()) { Alert::error(_("Recursive input"), bformat(_("Attempted to include file %1$s in itself! " "Ignoring inclusion."), params()["filename"])); @@ -707,7 +730,7 @@ int InsetInclude::docbook(odocstream & os, OutputParams const & runparams) const if (incfile.empty()) return 0; - string const included_file = includedFilename(buffer(), params()).absFilename(); + string const included_file = includedFilename(buffer(), params()).absFileName(); // Check we're not trying to include ourselves. // FIXME RECURSIVE INCLUDE @@ -764,7 +787,7 @@ void InsetInclude::validate(LaTeXFeatures & features) const LASSERT(&buffer() == &features.buffer(), /**/); string const included_file = - includedFilename(buffer(), params()).absFilename(); + includedFilename(buffer(), params()).absFileName(); if (isLyXFilename(included_file)) writefile = changeExtension(included_file, ".sgml"); @@ -774,7 +797,7 @@ void InsetInclude::validate(LaTeXFeatures & features) const if (!features.runparams().nice && !isVerbatim(params()) && !isListings(params())) { incfile = DocFileName(writefile).mangledFilename(); writefile = makeAbsPath(incfile, - buffer().masterBuffer()->temppath()).absFilename(); + buffer().masterBuffer()->temppath()).absFileName(); } features.includeFile(include_label, writefile); @@ -810,7 +833,7 @@ void InsetInclude::fillWithBibKeys(BiblioInfo & keys, InsetIterator const & /*di*/) const { if (loadIfNeeded()) { - string const included_file = includedFilename(buffer(), params()).absFilename(); + string const included_file = includedFilename(buffer(), params()).absFileName(); Buffer * tmp = theBufferList().getBuffer(FileName(included_file)); BiblioInfo const & newkeys = tmp->localBibInfo(); keys.mergeBiblioInfo(newkeys); @@ -1021,18 +1044,18 @@ void InsetInclude::updateCommand() setParams(p); } -void InsetInclude::updateLabels(ParIterator const & it) +void InsetInclude::updateBuffer(ParIterator const & it, UpdateType utype) { Buffer const * const childbuffer = getChildBuffer(); if (childbuffer) { - childbuffer->updateLabels(Buffer::UpdateChildOnly); + childbuffer->updateBuffer(Buffer::UpdateChildOnly, utype); return; } if (!isListings(params())) return; if (label_) - label_->updateLabels(it); + label_->updateBuffer(it, utype); InsetListingsParams const par(to_utf8(params()["lstparams"])); if (par.getParamValue("caption").empty()) { @@ -1044,7 +1067,7 @@ void InsetInclude::updateLabels(ParIterator const & it) docstring const cnt = from_ascii("listing"); listings_label_ = master.B_("Program Listing"); if (counters.hasCounter(cnt)) { - counters.step(cnt); + counters.step(cnt, utype); listings_label_ += " " + convert(counters.value(cnt)); } }