X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetInclude.cpp;h=62804ffd167e48adbcae7999af6e462fc8e70584;hb=700c3dc0ef81de871787a698a0949fb7c26444ca;hp=d5621f6618c012240334fd9bc5c201139f9e4fc8;hpb=16f119cab5419dabc52f0e40cc876c391edc41cd;p=lyx.git diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index d5621f6618..62804ffd16 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -29,10 +29,10 @@ #include "LayoutFile.h" #include "LayoutModuleList.h" #include "LyX.h" -#include "LyXFunc.h" #include "LyXRC.h" #include "Lexer.h" #include "MetricsInfo.h" +#include "output_xhtml.h" #include "OutputParams.h" #include "TextClass.h" #include "TocBackend.h" @@ -57,7 +57,7 @@ #include "support/lstrings.h" // contains #include "support/lyxalgo.h" -#include +#include "support/bind.h" using namespace std; using namespace lyx::support; @@ -133,42 +133,42 @@ FileName const masterFileName(Buffer const & buffer) void add_preview(RenderMonitoredPreview &, InsetInclude const &, Buffer const &); -string const parentFilename(Buffer const & buffer) +string const parentFileName(Buffer const & buffer) { return buffer.absFileName(); } -FileName const includedFilename(Buffer const & buffer, +FileName const includedFileName(Buffer const & buffer, InsetCommandParams const & params) { return makeAbsPath(to_utf8(params["filename"]), - onlyPath(parentFilename(buffer))); + onlyPath(parentFileName(buffer))); } -InsetLabel * createLabel(docstring const & label_str) +InsetLabel * createLabel(Buffer * buf, docstring const & label_str) { if (label_str.empty()) return 0; InsetCommandParams icp(LABEL_CODE); icp["name"] = label_str; - return new InsetLabel(icp); + return new InsetLabel(buf, icp); } } // namespace anon -InsetInclude::InsetInclude(InsetCommandParams const & p) - : InsetCommand(p, "include"), include_label(uniqueID()), +InsetInclude::InsetInclude(Buffer * buf, InsetCommandParams const & p) + : InsetCommand(buf, p, "include"), include_label(uniqueID()), preview_(new RenderMonitoredPreview(this)), failedtoload_(false), set_label_(false), label_(0), child_buffer_(0) { - preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this)); + preview_->fileChanged(bind(&InsetInclude::fileChanged, this)); if (isListings(params())) { InsetListingsParams listing_params(to_utf8(p["lstparams"])); - label_ = createLabel(from_utf8(listing_params.getParamValue("label"))); + label_ = createLabel(buffer_, from_utf8(listing_params.getParamValue("label"))); } } @@ -178,7 +178,7 @@ InsetInclude::InsetInclude(InsetInclude const & other) preview_(new RenderMonitoredPreview(this)), failedtoload_(false), set_label_(false), label_(0), child_buffer_(0) { - preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this)); + preview_->fileChanged(bind(&InsetInclude::fileChanged, this)); if (other.label_) label_ = new InsetLabel(*other.label_); @@ -187,6 +187,8 @@ InsetInclude::InsetInclude(InsetInclude const & other) InsetInclude::~InsetInclude() { + if (isBufferLoaded()) + buffer_->invalidateBibfileCache(); delete label_; } @@ -199,6 +201,12 @@ void InsetInclude::setBuffer(Buffer & buffer) } +void InsetInclude::setChildBuffer(Buffer * buffer) +{ + child_buffer_ = buffer; +} + + ParamInfo const & InsetInclude::findInfo(string const & /* cmdName */) { // FIXME @@ -221,8 +229,7 @@ bool InsetInclude::isCompatibleCommand(string const & s) void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd) { - LASSERT(cur.buffer() == &buffer(), return); - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_EDIT: { editIncluded(to_utf8(params()["filename"])); @@ -230,7 +237,7 @@ void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd) } case LFUN_INSET_MODIFY: { - // It should be OK just to invalidate the cache is setParams() + // It should be OK just to invalidate the cache in setParams() // If not.... // child_buffer_ = 0; InsetCommandParams p(INCLUDE_CODE); @@ -253,7 +260,7 @@ void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd) if (label_) old_label = label_->getParam("name"); else { - label_ = createLabel(new_label); + label_ = createLabel(buffer_, new_label); label_->setBuffer(buffer()); } @@ -269,8 +276,9 @@ void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd) } } setParams(p); + cur.forceBufferUpdate(); } else - cur.noUpdate(); + cur.noScreenUpdate(); break; } @@ -299,13 +307,19 @@ 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: - case LFUN_INSET_MODIFY: flag.setEnabled(true); return true; + case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "changetype") + return InsetCommand::getStatus(cur, cmd, flag); + else + flag.setEnabled(true); + return true; + default: return InsetCommand::getStatus(cur, cmd, flag); } @@ -326,7 +340,19 @@ void InsetInclude::setParams(InsetCommandParams const & p) if (type(params()) == INPUT) add_preview(*preview_, *this, buffer()); - buffer().updateBibfilesCache(); + buffer().invalidateBibfileCache(); +} + + +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()); } @@ -345,7 +371,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_; @@ -359,7 +388,7 @@ docstring InsetInclude::screenLabel() const if (params()["filename"].empty()) temp += "???"; else - temp += from_utf8(onlyFilename(to_utf8(params()["filename"]))); + temp += from_utf8(onlyFileName(to_utf8(params()["filename"]))); return temp; } @@ -376,23 +405,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); @@ -401,7 +435,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; @@ -432,14 +466,14 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const if (incfile.empty()) return 0; - FileName const included_file = includedFilename(buffer(), params()); + FileName const included_file = includedFileName(buffer(), params()); // Check we're not trying to include ourselves. // FIXME RECURSIVE INCLUDE // 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! " @@ -453,7 +487,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()))); } @@ -463,18 +497,18 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const // bug 5681 if (type(params()) == LISTINGS) { exportfile = incfile; - mangled = DocFileName(included_file).mangledFilename(); + mangled = DocFileName(included_file).mangledFileName(); } else { exportfile = changeExtension(incfile, ".tex"); - mangled = DocFileName(changeExtension(included_file.absFilename(), ".tex")). - mangledFilename(); + mangled = DocFileName(changeExtension(included_file.absFileName(), ".tex")). + mangledFileName(); } FileName const writefile(makeAbsPath(mangled, masterBuffer->temppath())); if (!runparams.nice) incfile = mangled; - else if (!isValidLaTeXFilename(incfile)) { + else if (!isValidLaTeXFileName(incfile)) { frontend::Alert::warning(_("Invalid filename"), _("The following filename is likely to cause trouble " "when running the exported file through LaTeX: ") + @@ -488,14 +522,14 @@ 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())) { - //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()) + 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 + + Buffer * tmp = loadIfNeeded(); + if (!tmp) return false; - Buffer * tmp = theBufferList().getBuffer(included_file); - if (tmp->params().baseClass() != masterBuffer->params().baseClass()) { // FIXME UNICODE docstring text = bformat(_("Included file `%1$s'\n" @@ -535,12 +569,16 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const // argument. Should we set it to string(), or should makeLaTeXFile // make use of it somehow? (JMarc 20031002) // The included file might be written in a different encoding + // and language. Encoding const * const oldEnc = runparams.encoding; + Language const * const oldLang = runparams.master_language; 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; } else { // In this case, it's not a LyX file, so we copy the file // to the temp dir, so that .aux files etc. are not created @@ -555,7 +593,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; } } @@ -577,7 +615,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()) @@ -622,32 +660,33 @@ int InsetInclude::latex(odocstream & os, OutputParams const & runparams) const } -docstring InsetInclude::xhtml(odocstream & os, OutputParams const &rp) const +docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const &rp) const { if (rp.inComment) return docstring(); // For verbatim and listings, we just include the contents of the file as-is. // In the case of listings, we wrap it in
.
-	bool const listing = isListings(params();
+	bool const listing = isListings(params());
 	if (listing || isVerbatim(params())) {
 		if (listing)
-			os << "
\n";
+			xs << html::StartTag("pre");
 		// FIXME: We don't know the encoding of the file, default to UTF-8.
-		os << includedFilename(buffer(), params()).fileContents("UTF-8");
+		xs << includedFileName(buffer(), params()).fileContents("UTF-8");
 		if (listing)
-			os << "
\n"; + 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.) - if (!isLyXFilename(included_file.absFilename())) { + FileName const included_file = includedFileName(buffer(), params()); + if (!isLyXFileName(included_file.absFileName())) { frontend::Alert::warning(_("Unsupported Inclusion"), - _("LyX does not know how to include non-LyX files when" - "generating HTML output. Offending file: ") + - params()["filename"]); + bformat(_("LyX does not know how to include non-LyX files when " + "generating HTML output. Offending file:\n%1$s"), + params()["filename"])); return docstring(); } @@ -655,10 +694,7 @@ docstring InsetInclude::xhtml(odocstream & os, OutputParams const &rp) const // Check we're not trying to include ourselves. // FIXME RECURSIVE INCLUDE - string const parent_filename = buffer().absFileName(); - FileName const included_file = - makeAbsPath(to_utf8(params()["filename"]), onlyPath(parent_filename)); - 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"])); @@ -668,7 +704,7 @@ docstring InsetInclude::xhtml(odocstream & os, OutputParams const &rp) const Buffer const * const ibuf = loadIfNeeded(); if (!ibuf) return docstring(); - ibuf->writeLyXHTMLSource(os, rp, true); + ibuf->writeLyXHTMLSource(xs.os(), rp, true); return docstring(); } @@ -678,7 +714,7 @@ int InsetInclude::plaintext(odocstream & os, OutputParams const &) const if (isVerbatim(params()) || isListings(params())) { os << '[' << screenLabel() << '\n'; // FIXME: We don't know the encoding of the file, default to UTF-8. - os << includedFilename(buffer(), params()).fileContents("UTF-8"); + os << includedFileName(buffer(), params()).fileContents("UTF-8"); os << "\n]"; return PLAINTEXT_NEWLINE + 1; // one char on a separate line } else { @@ -697,7 +733,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 @@ -714,10 +750,9 @@ int InsetInclude::docbook(odocstream & os, OutputParams const & runparams) const string const exportfile = changeExtension(incfile, ".sgml"); DocFileName writefile(changeExtension(included_file, ".sgml")); - if (loadIfNeeded()) { - Buffer * tmp = theBufferList().getBuffer(FileName(included_file)); - - string const mangled = writefile.mangledFilename(); + Buffer * tmp = loadIfNeeded(); + if (tmp) { + string const mangled = writefile.mangledFileName(); writefile = makeAbsPath(mangled, buffer().masterBuffer()->temppath()); if (!runparams.nice) @@ -754,17 +789,17 @@ 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)) + if (isLyXFileName(included_file)) writefile = changeExtension(included_file, ".sgml"); else writefile = included_file; if (!features.runparams().nice && !isVerbatim(params()) && !isListings(params())) { - incfile = DocFileName(writefile).mangledFilename(); + incfile = DocFileName(writefile).mangledFileName(); writefile = makeAbsPath(incfile, - buffer().masterBuffer()->temppath()).absFilename(); + buffer().masterBuffer()->temppath()).absFileName(); } features.includeFile(include_label, writefile); @@ -777,9 +812,9 @@ void InsetInclude::validate(LaTeXFeatures & features) const // Here we must do the fun stuff... // Load the file in the include if it needs // to be loaded: - if (loadIfNeeded()) { - // a file got loaded - Buffer * const tmp = theBufferList().getBuffer(FileName(included_file)); + Buffer * const tmp = loadIfNeeded(); + if (tmp) { + // the file is loaded // make sure the buffer isn't us // FIXME RECURSIVE INCLUDES // This is not sufficient, as recursive includes could be @@ -799,32 +834,10 @@ void InsetInclude::validate(LaTeXFeatures & features) const void InsetInclude::fillWithBibKeys(BiblioInfo & keys, InsetIterator const & /*di*/) const { - if (loadIfNeeded()) { - string const included_file = includedFilename(buffer(), params()).absFilename(); - Buffer * tmp = theBufferList().getBuffer(FileName(included_file)); - BiblioInfo const & newkeys = tmp->localBibInfo(); - keys.mergeBiblioInfo(newkeys); - } -} - - -void InsetInclude::updateBibfilesCache() -{ - Buffer const * const child = getChildBuffer(); - if (child) - child->updateBibfilesCache(Buffer::UpdateChildOnly); -} - - -support::FileNameList const & - InsetInclude::getBibfilesCache() const -{ - Buffer const * const child = getChildBuffer(); - if (child) - return child->getBibfilesCache(Buffer::UpdateChildOnly); - - static support::FileNameList const empty; - return empty; + Buffer * child = loadIfNeeded(); + if (!child) + return; + child->fillWithBibKeys(keys); } @@ -905,7 +918,7 @@ namespace { bool preview_wanted(InsetCommandParams const & params, Buffer const & buffer) { - FileName const included_file = includedFilename(buffer, params); + FileName const included_file = includedFileName(buffer, params); return type(params) == INPUT && params.preview() && included_file.isReadableFile(); @@ -931,7 +944,7 @@ void add_preview(RenderMonitoredPreview & renderer, InsetInclude const & inset, InsetCommandParams const & params = inset.params(); if (RenderPreview::status() != LyXRC::PREVIEW_OFF && preview_wanted(params, buffer)) { - renderer.setAbsFile(includedFilename(buffer, params)); + renderer.setAbsFile(includedFileName(buffer, params)); docstring const snippet = latexString(inset); renderer.addPreview(snippet, buffer); } @@ -940,12 +953,13 @@ void add_preview(RenderMonitoredPreview & renderer, InsetInclude const & inset, } // namespace anon -void InsetInclude::addPreview(graphics::PreviewLoader & ploader) const +void InsetInclude::addPreview(DocIterator const & /*inset_pos*/, + graphics::PreviewLoader & ploader) const { Buffer const & buffer = ploader.buffer(); if (!preview_wanted(params(), buffer)) return; - preview_->setAbsFile(includedFilename(buffer, params())); + preview_->setAbsFile(includedFileName(buffer, params())); docstring const snippet = latexString(*this); preview_->addPreview(snippet, ploader); } @@ -1010,18 +1024,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()) { @@ -1033,7 +1047,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)); } }