// loop over children
Impl::BufferPositionMap::iterator it = d->children_positions.begin();
Impl::BufferPositionMap::iterator end = d->children_positions.end();
- for (; it != end; ++it)
- theBufferList().releaseChild(this, const_cast<Buffer *>(it->first));
+ for (; it != end; ++it) {
+ Buffer * child = const_cast<Buffer *>(it->first);
+ // The child buffer might have been closed already.
+ if (theBufferList().isLoaded(child))
+ theBufferList().releaseChild(this, child);
+ }
// clear references to children in macro tables
d->children_positions.clear();
// Uwe C. Schroeder
// changed to be public and have one parameter
-// Returns false if "\end_document" is not read (Asger)
+// Returns true if "\end_document" is not read (Asger)
bool Buffer::readDocument(Lexer & lex)
{
ErrorList & errorList = d->errorLists["Parse"];
if (isLyXFilename(master_file.absFilename())) {
Buffer * master =
checkAndLoadLyXFile(master_file, true);
- // set master as master buffer, but only if we are
- // a real child
- if (master && master->isChild(this))
- d->parent_buffer = master;
- else
- LYXERR0("The master '"
- << params().master
- << "' assigned to this document does not include "
- "this document. Ignoring the master assignment.");
+ if (master) {
+ // set master as master buffer, but only
+ // if we are a real child
+ if (master->isChild(this))
+ setParent(master);
+ // if the master is not fully loaded
+ // it is probably just loading this
+ // child. No warning needed then.
+ else if (master->isFullyLoaded())
+ LYXERR0("The master '"
+ << params().master
+ << "' assigned to this document '"
+ << absFileName()
+ << "' does not include "
+ "this document. Ignoring the master assignment.");
+ }
}
}
bformat(_("%1$s is from a different"
" version of LyX, but a temporary"
" file for converting it could"
- " not be created."),
+ " not be created."),
from_utf8(filename.absFilename())));
return failure;
}
bformat(_("%1$s is from a different"
" version of LyX, but the"
" conversion script lyx2lyx"
- " could not be found."),
+ " could not be found."),
from_utf8(filename.absFilename())));
return failure;
}
Alert::error(_("Conversion script failed"),
bformat(_("%1$s is from a different version"
" of LyX, but the lyx2lyx script"
- " failed to convert it."),
+ " failed to convert it."),
from_utf8(filename.absFilename())));
return failure;
} else {
}
+std::vector<Buffer *> Buffer::getChildren() const
+{
+ std::vector<Buffer *> clist;
+ // loop over children
+ Impl::BufferPositionMap::iterator it = d->children_positions.begin();
+ Impl::BufferPositionMap::iterator end = d->children_positions.end();
+ for (; it != end; ++it) {
+ Buffer * child = const_cast<Buffer *>(it->first);
+ clist.push_back(child);
+ // there might be grandchildren
+ std::vector<Buffer *> glist = child->getChildren();
+ for (vector<Buffer *>::const_iterator git = glist.begin();
+ git != glist.end(); ++git)
+ clist.push_back(*git);
+ }
+ return clist;
+}
+
+
template<typename M>
typename M::iterator greatest_below(M & m, typename M::key_type const & x)
{
// is it a nested text inset?
if (iit->inset->asInsetText()) {
// Inset needs its own scope?
- InsetText const * itext
- = iit->inset->asInsetText();
+ InsetText const * itext = iit->inset->asInsetText();
bool newScope = itext->isMacroScope();
// scope which ends just behind the inset
// is it an external file?
if (iit->inset->lyxCode() == INCLUDE_CODE) {
// get buffer of external file
- InsetInclude const & inset
- = static_cast<InsetInclude const &>(*iit->inset);
+ InsetInclude const & inset =
+ static_cast<InsetInclude const &>(*iit->inset);
d->macro_lock = true;
Buffer * child = inset.loadIfNeeded(*this);
d->macro_lock = false;
// register its position, but only when it is
// included first in the buffer
- if (d->children_positions.find(child)
- == d->children_positions.end())
- d->children_positions[child] = it;
+ if (d->children_positions.find(child) ==
+ d->children_positions.end())
+ d->children_positions[child] = it;
// register child with its scope
d->position_to_children[it] = Impl::ScopeBuffer(scope, child);
continue;
// get macro data
- MathMacroTemplate & macroTemplate
- = static_cast<MathMacroTemplate &>(*iit->inset);
+ MathMacroTemplate & macroTemplate =
+ static_cast<MathMacroTemplate &>(*iit->inset);
MacroContext mc(*this, it);
macroTemplate.updateToContext(mc);
}
+bool Buffer::hasGuiDelegate() const
+{
+ return gui_;
+}
+
+
void Buffer::setGuiDelegate(frontend::GuiBufferDelegate * gui)
{
gui_ = gui;
}
-void Buffer::updateLabels(bool childonly) const
+void Buffer::setBuffersForInsets() const
+{
+ inset().setBuffer(const_cast<Buffer &>(*this));
+}
+
+
+void Buffer::updateLabels(UpdateScope scope) const
{
// Use the master text class also for child documents
Buffer const * const master = masterBuffer();
// master comes back we can see which of them were actually seen (i.e.
// via an InsetInclude). The remaining ones in the set need still be updated.
static std::set<Buffer const *> bufToUpdate;
- if (!childonly) {
+ if (scope == UpdateMaster) {
// If this is a child document start with the master
if (master != this) {
bufToUpdate.insert(this);
- master->updateLabels(false);
+ master->updateLabels();
+ // Do this here in case the master has no gui associated with it. Then,
+ // the TocModel is not updated and TocModel::toc_ is invalid (bug 5699).
+ if (!master->gui_)
+ structureChanged();
// was buf referenced from the master (i.e. not in bufToUpdate anymore)?
if (bufToUpdate.find(this) == bufToUpdate.end())
// update all caches
clearReferenceCache();
- inset().setBuffer(const_cast<Buffer &>(*this));
updateMacros();
Buffer & cbuf = const_cast<Buffer &>(*this);
return;
cbuf.tocBackend().update();
- if (!childonly)
+ if (scope == UpdateMaster)
cbuf.structureChanged();
}