]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
After a hiatus, I'm returning to the rewrite of InsetCommandParams, the purpose of...
[lyx.git] / src / Buffer.cpp
index 7ccf355a8e58d931102c7f76daa81e02d048ebf6..3a074cba943e6663a491b42c2dbff92c057c593c 100644 (file)
@@ -79,7 +79,6 @@
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/ExceptionMessage.h"
-#include "support/FileFilterList.h"
 #include "support/FileName.h"
 #include "support/FileNameList.h"
 #include "support/filetools.h"
@@ -114,7 +113,7 @@ namespace os = support::os;
 
 namespace {
 
-int const LYX_FORMAT = 313; // Richard Heck: conversion of module representations
+int const LYX_FORMAT = 315; // Richard Heck: column separation
 
 } // namespace anon
 
@@ -204,6 +203,9 @@ public:
        /// A cache for the bibfiles (including bibfiles of loaded child
        /// documents), needed for appropriate update of natbib labels.
        mutable EmbeddedFileList bibfilesCache_;
+       
+       ///
+       WordList words_;
 };
 
 /// Creates the per buffer temporary directory
@@ -467,6 +469,7 @@ int Buffer::readHeader(Lexer & lex)
        params().headheight.erase();
        params().headsep.erase();
        params().footskip.erase();
+       params().columnsep.erase();
        params().listings_params.clear();
        params().clearLayoutModules();
        params().pdfoptions().clear();
@@ -568,10 +571,7 @@ bool Buffer::readDocument(Lexer & lex)
        }
 
        // read main text
-       bool const res = text().read(*this, lex, errorList);
-       for_each(text().paragraphs().begin(),
-                text().paragraphs().end(),
-                bind(&Paragraph::setInsetOwner, _1, &inset()));
+       bool const res = text().read(*this, lex, errorList, &(d->inset));
 
        updateMacros();
        updateMacroInstances();
@@ -1128,9 +1128,15 @@ void Buffer::writeLaTeXSource(odocstream & os,
        
        LYXERR(Debug::INFO, "preamble finished, now the body.");
 
+       // load children, if not already done. 
+       // This includes an updateMacro() call.
+       // Don't move this behind the parent_buffer=0 code below,
+       // because then the macros will not get the right "redefinition"
+       // flag as they don't see the parent macros which are output before.
+       loadChildDocuments();
+
        // fold macros if possible, still with parent buffer as the
        // macros will be put in the prefix anyway.
-       updateMacros();
        updateMacroInstances();
 
        // if we are doing a real file with body, even if this is the
@@ -1145,10 +1151,8 @@ void Buffer::writeLaTeXSource(odocstream & os,
                d->parent_buffer = 0;
        }
 
-       loadChildDocuments();
-
        // the real stuff
-       latexParagraphs(*this, paragraphs(), os, d->texrow, runparams);
+       latexParagraphs(*this, text(), os, d->texrow, runparams);
 
        // Restore the parenthood if needed
        if (output_preamble) {
@@ -1183,19 +1187,19 @@ void Buffer::writeLaTeXSource(odocstream & os,
 
 bool Buffer::isLatex() const
 {
-       return params().getTextClass().outputType() == LATEX;
+       return params().textClass().outputType() == LATEX;
 }
 
 
 bool Buffer::isLiterate() const
 {
-       return params().getTextClass().outputType() == LITERATE;
+       return params().textClass().outputType() == LITERATE;
 }
 
 
 bool Buffer::isDocBook() const
 {
-       return params().getTextClass().outputType() == DOCBOOK;
+       return params().textClass().outputType() == DOCBOOK;
 }
 
 
@@ -1226,7 +1230,7 @@ void Buffer::writeDocBookSource(odocstream & os, string const & fname,
 
        d->texrow.reset();
 
-       TextClass const & tclass = params().getTextClass();
+       TextClass const & tclass = params().textClass();
        string const top_element = tclass.latexname();
 
        if (!only_body) {
@@ -1281,7 +1285,7 @@ void Buffer::writeDocBookSource(odocstream & os, string const & fname,
            << " file was created by LyX " << lyx_version
            << "\n  See http://www.lyx.org/ for more information -->\n";
 
-       params().getTextClass().counters().reset();
+       params().textClass().counters().reset();
 
        loadChildDocuments();
 
@@ -1482,60 +1486,37 @@ bool Buffer::isMultiLingual() const
 }
 
 
-ParConstIterator Buffer::getParFromID(int const id) const
-{
-       ParConstIterator it = par_iterator_begin();
-       ParConstIterator const end = par_iterator_end();
-
-       if (id < 0) {
-               // John says this is called with id == -1 from undo
-               lyxerr << "getParFromID(), id: " << id << endl;
-               return end;
-       }
-
-       for (; it != end; ++it)
-               if (it->id() == id)
-                       return it;
-
-       return end;
-}
-
-
-ParIterator Buffer::getParFromID(int const id)
+DocIterator Buffer::getParFromID(int const id) const
 {
-       ParIterator it = par_iterator_begin();
-       ParIterator const end = par_iterator_end();
-
        if (id < 0) {
                // John says this is called with id == -1 from undo
                lyxerr << "getParFromID(), id: " << id << endl;
-               return end;
+               return doc_iterator_end(inset());
        }
 
-       for (; it != end; ++it)
-               if (it->id() == id)
+       for (DocIterator it = doc_iterator_begin(inset()); !it.atEnd(); it.forwardPar())
+               if (it.paragraph().id() == id)
                        return it;
 
-       return end;
+       return doc_iterator_end(inset());
 }
 
 
 bool Buffer::hasParWithID(int const id) const
 {
-       ParConstIterator const it = getParFromID(id);
-       return it != par_iterator_end();
+       return !getParFromID(id).atEnd();
 }
 
 
 ParIterator Buffer::par_iterator_begin()
 {
-       return lyx::par_iterator_begin(inset());
+       return ParIterator(doc_iterator_begin(inset()));
 }
 
 
 ParIterator Buffer::par_iterator_end()
 {
-       return lyx::par_iterator_end(inset());
+       return ParIterator(doc_iterator_end(inset()));
 }
 
 
@@ -1750,31 +1731,33 @@ MacroData const * Buffer::getBufferMacro(docstring const & name,
        // find macros in included files
        Impl::PositionScopeBufferMap::const_iterator it
        = greatest_below(d->position_to_children, pos);
-       if (it != d->position_to_children.end()) {
-               while (true) {
-                       // do we know something better (i.e. later) already?
-                       if (it->first < bestPos )               
-                               break;
+       if (it == d->position_to_children.end())
+               // no children before
+               return bestData;
 
-                       // scope ends behind pos?
-                       if (pos < it->second.first) {
-                               // look for macro in external file
-                               d->macro_lock = true;
-                               MacroData const * data
-                               = it->second.second->getMacro(name, false);
-                               d->macro_lock = false;
-                               if (data) {
-                                       bestPos = it->first;
-                                       bestData = data;                               
-                                       break;
-                               }
-                       }
-                       
-                       // try previous file if there is one
-                       if (it == d->position_to_children.begin())
+       while (true) {
+               // do we know something better (i.e. later) already?
+               if (it->first < bestPos )
+                       break;
+
+               // scope ends behind pos?
+               if (pos < it->second.first) {
+                       // look for macro in external file
+                       d->macro_lock = true;
+                       MacroData const * data
+                       = it->second.second->getMacro(name, false);
+                       d->macro_lock = false;
+                       if (data) {
+                               bestPos = it->first;
+                               bestData = data;
                                break;
-                       --it;
+                       }
                }
+
+               // try previous file if there is one
+               if (it == d->position_to_children.begin())
+                       break;
+               --it;
        }
                
        // return the best macro we have found
@@ -1895,7 +1878,7 @@ void Buffer::updateEnvironmentMacros(DocIterator & it,
                                if (!child)
                                        continue;                               
 
-                               // register it, but only when it is
+                               // register its position, but only when it is
                                // included first in the buffer
                                if (d->children_positions.find(child)
                                    == d->children_positions.end())
@@ -2005,8 +1988,8 @@ void Buffer::updateMacroInstances() const
 {
        LYXERR(Debug::MACROS, "updateMacroInstances for "
                << d->filename.onlyFileName());
-       ParConstIterator it = par_iterator_begin();
-       ParConstIterator end = par_iterator_end();
+       DocIterator it = doc_iterator_begin(inset());
+       DocIterator end = doc_iterator_end(inset());
        for (; it != end; it.forwardPos()) {
                // look for MathData cells in InsetMathNest insets
                Inset * inset = it.nextInset();
@@ -2076,7 +2059,7 @@ void Buffer::writeParentMacros(odocstream & os) const
                MacroData const * data = 
                d->parent_buffer->getMacro(*it, *this, false);
                if (data)
-                       data->write(os, true);          
+                       data->write(os, true);  
        }
 }
 
@@ -2156,7 +2139,7 @@ void Buffer::getSourceCode(odocstream & os, pit_type par_begin,
                d->texrow.newline();
                // output paragraphs
                if (isLatex()) {
-                       latexParagraphs(*this, paragraphs(), os, d->texrow, runparams);
+                       latexParagraphs(*this, text(), os, d->texrow, runparams);
                } else {
                        // DocBook
                        docbookParagraphs(paragraphs(), *this, os, runparams);
@@ -2260,14 +2243,12 @@ private:
 };
 
 
-#if !defined (HAVE_FORK)
-# define fork() -1
-#endif
-
 int AutoSaveBuffer::generateChild()
 {
        // tmp_ret will be located (usually) in /tmp
        // will that be a problem?
+       // Note that this calls ForkedCalls::fork(), so it's
+       // ok cross-platform.
        pid_t const pid = fork();
        // If you want to debug the autosave
        // you should set pid to -1, and comment out the fork.
@@ -2334,6 +2315,9 @@ void Buffer::autoSave() const
 
 void Buffer::resetChildDocuments(bool close_them) const
 {
+       if (text().empty())
+               return;
+
        for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {
                if (it->lyxCode() != INCLUDE_CODE)
                        continue;
@@ -2467,40 +2451,40 @@ bool Buffer::doExport(string const & format, bool put_in_tempdir,
        if (!success)
                return false;
 
-       if (put_in_tempdir)
+       if (put_in_tempdir) {
                result_file = tmp_result_file.absFilename();
-       else {
-               result_file = changeExtension(absFileName(), ext);
-               // We need to copy referenced files (e. g. included graphics
-               // if format == "dvi") to the result dir.
-               vector<ExportedFile> const files =
-                       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) {
-                       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()) {
-                       // Finally copy the main file
-                       status = copyFile(format, tmp_result_file,
-                                         FileName(result_file), result_file,
-                                         status == FORCE);
-                       message(bformat(_("Document exported as %1$s "
-                                                              "to file `%2$s'"),
-                                               formats.prettyName(format),
-                                               makeDisplayPath(result_file)));
-               } else {
-                       // This must be a dummy converter like fax (bug 1888)
-                       message(bformat(_("Document exported as %1$s"),
-                                               formats.prettyName(format)));
-               }
+               return true;
+       }
+
+       result_file = changeExtension(absFileName(), ext);
+       // We need to copy referenced files (e. g. included graphics
+       // if format == "dvi") to the result dir.
+       vector<ExportedFile> const files =
+               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) {
+               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()) {
+               // Finally copy the main file
+               status = copyFile(format, tmp_result_file,
+                       FileName(result_file), result_file,
+                       status == FORCE);
+               message(bformat(_("Document exported as %1$s "
+                       "to file `%2$s'"),
+                       formats.prettyName(format),
+                       makeDisplayPath(result_file)));
+       } else {
+               // This must be a dummy converter like fax (bug 1888)
+               message(bformat(_("Document exported as %1$s"),
+                       formats.prettyName(format)));
        }
 
        return true;
@@ -2552,7 +2536,7 @@ vector<Format const *> Buffer::exportableFormats(bool only_viewable) const
 vector<string> Buffer::backends() const
 {
        vector<string> v;
-       if (params().getTextClass().isTeXClassAvailable()) {
+       if (params().textClass().isTeXClassAvailable()) {
                v.push_back(bufferFormat());
                // FIXME: Don't hardcode format names here, but use a flag
                if (v.back() == "latex")
@@ -2683,4 +2667,16 @@ void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const
        }
 }
 
+
+void Buffer::registerWord(docstring const & word)
+{
+       d->words_.insert(word);
+}
+
+
+WordList const & Buffer::registeredWords() const
+{
+       return d->words_;
+}
+
 } // namespace lyx