Fix for bugs 2199 and 3667. Most of the changes were to the logic. Buffers

that were opened for possible included LyX files need to be closed if those
files cannot be loaded, for example. A bit more work was needed to allow a
LyX file to include itself as a verbatim or listings without trying to load
itself and without relying upon loadIfNeeded() to report the problem.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18494 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2007-05-24 17:17:04 +00:00
parent d396035606
commit d2fb80eec7
2 changed files with 36 additions and 16 deletions

View File

@ -1413,18 +1413,20 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
BOOST_ASSERT(lyx_view_);
FileName const filename =
makeAbsPath(argument, lyx_view_->buffer()->filePath());
setMessage(bformat(_("Opening child document %1$s..."),
makeDisplayPath(filename.absFilename())));
view()->saveBookmark(false);
string const parentfilename = lyx_view_->buffer()->fileName();
if (theBufferList().exists(filename.absFilename()))
lyx_view_->setBuffer(theBufferList().getBuffer(filename.absFilename()));
else
lyx_view_->loadLyXFile(filename);
if (lyx_view_->loadLyXFile(filename)) {
// Set the parent name of the child document.
// This makes insertion of citations and references in the child work,
// when the target is in the parent or another child document.
lyx_view_->buffer()->setParentName(parentfilename);
setMessage(bformat(_("Opening child document %1$s..."),
makeDisplayPath(filename.absFilename())));
} else
setMessage(_("Document not loaded."));
break;
}

View File

@ -230,6 +230,13 @@ bool isVerbatim(InsetCommandParams const & params)
}
bool isInputOrInclude(InsetCommandParams const & params)
{
Types const t = type(params);
return (t == INPUT) or (t == INCLUDE);
}
string const masterFilename(Buffer const & buffer)
{
return buffer.getMasterBuffer()->fileName();
@ -393,12 +400,14 @@ bool loadIfNeeded(Buffer const & buffer, InsetCommandParams const & params)
if (!fs::exists(included_file.toFilesystemEncoding()))
return false;
buf = theBufferList().newBuffer(included_file.absFilename());
if (!loadLyXFile(buf, included_file))
if (!loadLyXFile(buf, included_file)) {
//close the buffer we just opened
theBufferList().close(buf, false);
return false;
}
if (buf)
}
buf->setParentName(parentFilename(buffer));
return buf != 0;
return true;
}
@ -420,7 +429,9 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
//FIXME RECURSIVE INCLUDE
//This isn't sufficient, as the inclusion could be downstream.
//But it'll have to do for now.
if (!isListings(params_) && buffer.fileName() == included_file.toFilesystemEncoding()) {
if (isInputOrInclude(params_) &&
buffer.fileName() == included_file.toFilesystemEncoding())
{
Alert::error(_("Recursive input"),
bformat(_("Attempted to include file %1$s in itself! "
"Ignoring inclusion."), from_utf8(incfile)));
@ -439,8 +450,9 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
// write it to a file (so far the complete file)
string const exportfile = changeExtension(incfile, ".tex");
string const mangled = DocFileName(changeExtension(included_file.absFilename(),
".tex")).mangledFilename();
string const mangled =
DocFileName(changeExtension(included_file.absFilename(),".tex")).
mangledFilename();
FileName const writefile(makeAbsPath(mangled, m_buffer->temppath()));
if (!runparams.nice)
@ -451,8 +463,14 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
if (runparams.inComment || runparams.dryrun)
// Don't try to load or copy the file
;
else if (loadIfNeeded(buffer, params_)) {
return true;
//if it's a LyX file and we're including or inputting it...
else if (isInputOrInclude(params_) &&
isLyXFilename(included_file.absFilename())) {
//try to load it so we can write the associated latex
if (!loadIfNeeded(buffer, params_))
return false;
Buffer * tmp = theBufferList().getBuffer(included_file.absFilename());
if (tmp->params().textclass != m_buffer->params().textclass) {