]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Output labels (1.1, etc) with the TOC.
[lyx.git] / src / Buffer.cpp
index fbf288db42bd8ffca05cf3cd3b49f299586f681d..bc72f21afdef7e931b39d95155f40abc3c5cb20c 100644 (file)
@@ -248,7 +248,10 @@ public:
                // if parent_buffer is not loaded, then it has been unloaded,
                // which means that parent_buffer is an invalid pointer. So we
                // set it to null in that case.
-               if (!theBufferList().isLoaded(parent_buffer))
+               // however, the BufferList doesn't know about cloned buffers, so
+               // they will always be regarded as unloaded. in that case, we hope
+               // for the best.
+               if (!cloned_buffer_ && !theBufferList().isLoaded(parent_buffer))
                        parent_buffer = 0;
                return parent_buffer; 
        }
@@ -407,6 +410,7 @@ Buffer * Buffer::clone() const
                child_clone->d->setParent(buffer_clone);
                buffer_clone->setChild(dit, child_clone);
        }
+       buffer_clone->d->macro_lock = false;
        return buffer_clone;
 }
 
@@ -912,11 +916,18 @@ Buffer::ReadStatus Buffer::readFile(Lexer & lex, FileName const & filename,
 
                cmd_ret const ret = runCommand(command_str);
                if (ret.first != 0) {
-                       Alert::error(_("Conversion script failed"),
-                                    bformat(_("%1$s is from a different version"
+                       if (file_format < LYX_FORMAT)
+                               Alert::error(_("Conversion script failed"),
+                                    bformat(_("%1$s is from an older version"
                                              " of LyX, but the lyx2lyx script"
                                              " failed to convert it."),
                                              from_utf8(filename.absFilename())));
+                       else
+                               Alert::error(_("Conversion script failed"),
+                                    bformat(_("%1$s is from a newer version"
+                                             " of LyX and cannot be converted by the"
+                                                               " lyx2lyx script."),
+                                             from_utf8(filename.absFilename())));
                        return failure;
                } else {
                        bool const ret = readFile(tmpfile);
@@ -1487,21 +1498,21 @@ void Buffer::writeLyXHTMLSource(odocstream & os,
 {
        LaTeXFeatures features(*this, params(), runparams);
        validate(features);
-       updateLabels(UpdateMaster, true);
+       updateLabels(UpdateMaster, OutputUpdate);
        checkBibInfoCache();
        d->bibinfo_.makeCitationLabels(*this);
+       updateMacros();
+       updateMacroInstances();
 
        if (!only_body) {
                os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
                os << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN\" \"http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd\">\n";
                // FIXME Language should be set properly.
                os << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
-               // FIXME Header
                os << "<head>\n";
                // FIXME Presumably need to set this right
                os << "<meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" />\n";
-               // FIXME Get this during validation? What about other meta-data?
-               os << "<title>TBA</title>\n";
+               os << "<title>" << features.htmlTitle() << "</title>\n";
 
                os << "\n<!-- Text Class Preamble -->\n"
                        << features.getTClassHTMLPreamble()
@@ -1671,7 +1682,6 @@ BiblioInfo const & Buffer::masterBibInfo() const
 
 BiblioInfo const & Buffer::localBibInfo() const
 {
-       checkBibInfoCache();
        return d->bibinfo_;
 }
 
@@ -2556,7 +2566,7 @@ MacroData const * Buffer::getMacro(docstring const & name,
 
 void Buffer::updateMacros(DocIterator & it, DocIterator & scope) const
 {
-       pit_type lastpit = it.lastpit();
+       pit_type const lastpit = it.lastpit();
 
        // look for macros in each paragraph
        while (it.pit() <= lastpit) {
@@ -2822,6 +2832,7 @@ void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to,
        // Check if the label 'from' appears more than once
        vector<docstring> labels;
        string paramName;
+       checkBibInfoCache();
        BiblioInfo const & keys = masterBibInfo();
        BiblioInfo::const_iterator bit  = keys.begin();
        BiblioInfo::const_iterator bend = keys.end();
@@ -3262,13 +3273,16 @@ bool Buffer::doExport(string const & format, bool put_in_tempdir,
                runparams.exportdata->externalFiles(format);
        string const dest = onlyPath(result_file);
        CopyStatus status = SUCCESS;
-       for (vector<ExportedFile>::const_iterator it = files.begin();
-               it != files.end() && status != CANCEL; ++it) {
+       
+       vector<ExportedFile>::const_iterator it = files.begin();
+       vector<ExportedFile>::const_iterator const en = files.end();
+       for (; it != en && status != CANCEL; ++it) {
                string const fmt = formats.getFormatFromFile(it->sourceName);
                status = copyFile(fmt, it->sourceName,
                        makeAbsPath(it->exportName, dest),
                        it->exportName, status == FORCE);
        }
+
        if (status == CANCEL) {
                message(_("Document export cancelled."));
        } else if (tmp_result_file.exists()) {
@@ -3489,11 +3503,15 @@ void Buffer::setBuffersForInsets() const
 }
 
 
-void Buffer::updateLabels(UpdateScope scope, bool out) const
+void Buffer::updateLabels(UpdateScope scope, UpdateType utype) const
 {
        // Use the master text class also for child documents
        Buffer const * const master = masterBuffer();
        DocumentClass const & textclass = master->params().documentClass();
+       
+       // do this only if we are the top-level Buffer
+       if (scope != UpdateMaster || master == this)
+               checkBibInfoCache();
 
        // keep the buffers to be children in this set. If the call from the
        // master comes back we can see which of them were actually seen (i.e.
@@ -3503,7 +3521,7 @@ void Buffer::updateLabels(UpdateScope scope, bool out) const
                // If this is a child document start with the master
                if (master != this) {
                        bufToUpdate.insert(this);
-                       master->updateLabels(UpdateMaster, out);
+                       master->updateLabels(UpdateMaster, utype);
                        // 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_)
@@ -3531,7 +3549,7 @@ void Buffer::updateLabels(UpdateScope scope, bool out) const
 
        // do the real work
        ParIterator parit = cbuf.par_iterator_begin();
-       updateLabels(parit, out);
+       updateLabels(parit, utype);
 
        if (master != this)
                // TocBackend update will be done later.
@@ -3613,7 +3631,7 @@ static bool needEnumCounterReset(ParIterator const & it)
 
 
 // set the label of a paragraph. This includes the counters.
-void Buffer::setLabel(ParIterator & it) const
+void Buffer::setLabel(ParIterator & it, UpdateType utype) const
 {
        BufferParams const & bp = this->masterBuffer()->params();
        DocumentClass const & textclass = bp.documentClass();
@@ -3645,7 +3663,7 @@ void Buffer::setLabel(ParIterator & it) const
                if (layout.toclevel <= bp.secnumdepth
                    && (layout.latextype != LATEX_ENVIRONMENT
                        || it.text()->isFirstInSequence(it.pit()))) {
-                       counters.step(layout.counter);
+                       counters.step(layout.counter, utype);
                        par.params().labelString(
                                par.expandLabel(layout, bp));
                } else
@@ -3699,7 +3717,7 @@ void Buffer::setLabel(ParIterator & it) const
                // Maybe we have to reset the enumeration counter.
                if (needEnumCounterReset(it))
                        counters.reset(enumcounter);
-               counters.step(enumcounter);
+               counters.step(enumcounter, utype);
 
                string const & lang = par.getParLanguage(bp)->code();
                par.params().labelString(counters.theCounter(enumcounter, lang));
@@ -3716,7 +3734,7 @@ void Buffer::setLabel(ParIterator & it) const
                        docstring name = this->B_(textclass.floats().getType(type).name());
                        if (counters.hasCounter(from_utf8(type))) {
                                string const & lang = par.getParLanguage(bp)->code();
-                               counters.step(from_utf8(type));
+                               counters.step(from_utf8(type), utype);
                                full_label = bformat(from_ascii("%1$s %2$s:"), 
                                                     name, 
                                                     counters.theCounter(from_utf8(type), lang));
@@ -3742,7 +3760,7 @@ void Buffer::setLabel(ParIterator & it) const
 }
 
 
-void Buffer::updateLabels(ParIterator & parit, bool out) const
+void Buffer::updateLabels(ParIterator & parit, UpdateType utype) const
 {
        LASSERT(parit.pit() == 0, /**/);
 
@@ -3759,15 +3777,23 @@ void Buffer::updateLabels(ParIterator & parit, bool out) const
                parit->params().depth(min(parit->params().depth(), maxdepth));
                maxdepth = parit->getMaxDepthAfter();
 
+               if (utype == OutputUpdate) {
+                       // track the active counters
+                       // we have to do this for the master buffer, since the local
+                       // buffer isn't tracking anything.
+                       masterBuffer()->params().documentClass().counters().
+                                       setActiveLayout(parit->layout());
+               }
+               
                // set the counter for this paragraph
-               setLabel(parit);
+               setLabel(parit, utype);
 
-               // Now the insets
+               // now the insets
                InsetList::const_iterator iit = parit->insetList().begin();
                InsetList::const_iterator end = parit->insetList().end();
                for (; iit != end; ++iit) {
                        parit.pos() = iit->pos;
-                       iit->inset->updateLabels(parit, out);
+                       iit->inset->updateLabels(parit, utype);
                }
        }
 }