]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
fix "make check" with gcc 4.3
[lyx.git] / src / Buffer.cpp
index 2c26164ae37d9aa3e7c05f0434b1b94c7e2e5cb4..32acc6f5a1f2c10cc9ac73e7168f79da8ba7e6be 100644 (file)
@@ -118,7 +118,7 @@ namespace {
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-int const LYX_FORMAT = 345;  // jamatos: xml elements
+int const LYX_FORMAT = 348;  // uwestoehr: add support for \*phantom
 
 typedef map<string, bool> DepClean;
 typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
@@ -289,8 +289,12 @@ Buffer::~Buffer()
        // 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();
@@ -547,7 +551,7 @@ int Buffer::readHeader(Lexer & lex)
 
 // 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"];
@@ -566,19 +570,19 @@ bool Buffer::readDocument(Lexer & lex)
 
        if (params().outputChanges) {
                bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
-               bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+               bool xcolorulem = LaTeXFeatures::isAvailable("ulem") &&
                                  LaTeXFeatures::isAvailable("xcolor");
 
-               if (!dvipost && !xcolorsoul) {
+               if (!dvipost && !xcolorulem) {
                        Alert::warning(_("Changes not shown in LaTeX output"),
                                       _("Changes will not be highlighted in LaTeX output, "
-                                        "because neither dvipost nor xcolor/soul are installed.\n"
+                                        "because neither dvipost nor xcolor/ulem are installed.\n"
                                         "Please install these packages or redefine "
                                         "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
-               } else if (!xcolorsoul) {
+               } else if (!xcolorulem) {
                        Alert::warning(_("Changes not shown in LaTeX output"),
                                       _("Changes will not be highlighted in LaTeX output "
-                                        "when using pdflatex, because xcolor and soul are not installed.\n"
+                                        "when using pdflatex, because xcolor and ulem are not installed.\n"
                                         "Please install both packages or redefine "
                                         "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
                }
@@ -588,8 +592,24 @@ bool Buffer::readDocument(Lexer & lex)
                FileName const master_file = makeAbsPath(params().master,
                           onlyPath(absFileName()));
                if (isLyXFilename(master_file.absFilename())) {
-                       Buffer * master = checkAndLoadLyXFile(master_file);
-                       d->parent_buffer = master;
+                       Buffer * master = 
+                               checkAndLoadLyXFile(master_file, true);
+                       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.");
+                       }
                }
        }
 
@@ -685,6 +705,8 @@ bool Buffer::readFile(FileName const & filename)
 {
        FileName fname(filename);
 
+       params().compressed = fname.isZippedFile();
+
        // remove dummy empty par
        paragraphs().clear();
        Lexer lex;
@@ -1743,6 +1765,25 @@ DocIterator Buffer::firstChildPosition(Buffer const * child)
 }
 
 
+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)
 {
@@ -1925,11 +1966,10 @@ void Buffer::updateMacros(DocIterator & it, DocIterator & scope) const
                        // is it an external file?
                        if (iit->inset->lyxCode() == INCLUDE_CODE) {
                                // get buffer of external file
-                               InsetCommand const & inset
-                                       = static_cast<InsetCommand const &>(*iit->inset);
-                               InsetCommandParams const & ip = inset.params();
+                               InsetInclude const & inset
+                                       = static_cast<InsetInclude const &>(*iit->inset);
                                d->macro_lock = true;
-                               Buffer * child = loadIfNeeded(*this, ip);
+                               Buffer * child = inset.loadIfNeeded(*this);
                                d->macro_lock = false;
                                if (!child)
                                        continue;
@@ -2266,6 +2306,12 @@ void Buffer::resetAutosaveTimers() const
 }
 
 
+bool Buffer::hasGuiDelegate() const
+{
+       return gui_;
+}
+
+
 void Buffer::setGuiDelegate(frontend::GuiBufferDelegate * gui)
 {
        gui_ = gui;
@@ -2683,7 +2729,13 @@ void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const
 }
 
 
-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();
@@ -2693,11 +2745,15 @@ void Buffer::updateLabels(bool childonly) const
        // 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())
@@ -2713,7 +2769,6 @@ void Buffer::updateLabels(bool childonly) const
 
        // update all caches
        clearReferenceCache();
-       inset().setBuffer(const_cast<Buffer &>(*this));
        updateMacros();
 
        Buffer & cbuf = const_cast<Buffer &>(*this);
@@ -2729,7 +2784,7 @@ void Buffer::updateLabels(bool childonly) const
                return;
 
        cbuf.tocBackend().update();
-       if (!childonly)
+       if (scope == UpdateMaster)
                cbuf.structureChanged();
 }