]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
There was a bit too much copying of dociterators gpoing on leading to an
[lyx.git] / src / Buffer.cpp
index 7bba41a1cdf25b7015ef390f41e6604867d79410..2c44c7f3c3e415529b220b461fe17418e914823a 100644 (file)
@@ -118,7 +118,7 @@ namespace os = support::os;
 
 namespace {
 
-int const LYX_FORMAT = 309; // Bernhard Reiter: support for \nocite
+int const LYX_FORMAT = 313; // Richard Heck: conversion of module representations
 
 } // namespace anon
 
@@ -192,7 +192,7 @@ public:
        map<string, ErrorList> errorLists;
 
        /// all embedded files of this buffer
-       EmbeddedFiles embedded_files;
+       EmbeddedFileList embedded_files;
 
        /// timestamp and checksum used to test if the file has been externally
        /// modified. (Used to properly enable 'File->Revert to saved', bug 4114).
@@ -207,7 +207,7 @@ public:
 
        /// A cache for the bibfiles (including bibfiles of loaded child
        /// documents), needed for appropriate update of natbib labels.
-       mutable FileNameList bibfilesCache_;
+       mutable EmbeddedFileList bibfilesCache_;
 };
 
 /// Creates the per buffer temporary directory
@@ -233,7 +233,7 @@ Buffer::Impl::Impl(Buffer & parent, FileName const & file, bool readonly_)
        : parent_buffer(0), lyx_clean(true), bak_clean(true), unnamed(false),
          read_only(readonly_), filename(file), file_fully_loaded(false),
          inset(params), toc_backend(&parent), macro_lock(false),
-         embedded_files(&parent), timestamp_(0), checksum_(0), wa_(0), 
+         embedded_files(), timestamp_(0), checksum_(0), wa_(0), 
          undo_(parent)
 {
        temppath = createBufferTmpDir();
@@ -366,18 +366,24 @@ TocBackend & Buffer::tocBackend() const
 }
 
 
-EmbeddedFiles & Buffer::embeddedFiles()
+EmbeddedFileList & Buffer::embeddedFiles()
 {
        return d->embedded_files;
 }
 
 
-EmbeddedFiles const & Buffer::embeddedFiles() const
+EmbeddedFileList const & Buffer::embeddedFiles() const
 {
        return d->embedded_files;
 }
 
 
+bool Buffer::embedded() const
+{
+       return params().embedded;
+}
+
+
 Undo & Buffer::undo()
 {
        return d->undo_;
@@ -517,6 +523,8 @@ int Buffer::readHeader(Lexer & lex)
                errorList.push_back(ErrorItem(_("Document header error"),
                        s, -1, 0, 0));
        }
+       
+       params().makeTextClass();
 
        return unknown_tokens;
 }
@@ -542,14 +550,6 @@ bool Buffer::readDocument(Lexer & lex)
        BOOST_ASSERT(paragraphs().empty());
 
        readHeader(lex);
-       TextClass const & baseClass = textclasslist[params().getBaseClass()];
-       if (!baseClass.load(filePath())) {
-               string theclass = baseClass.name();
-               Alert::error(_("Can't load document class"), bformat(
-                       _("Using the default document class, because the "
-                                    "class %1$s could not be loaded."), from_utf8(theclass)));
-               params().setBaseClass(defaultTextclass());
-       }
 
        if (params().outputChanges) {
                bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
@@ -678,6 +678,8 @@ bool Buffer::readFile(FileName const & filename)
                FileName lyxfile(addName(temppath(), "content.lyx"));
                // if both manifest.txt and file.lyx exist, this is am embedded file
                if (lyxfile.exists()) {
+                       // if in bundled format, save checksum of the compressed file, not content.lyx
+                       saveCheckSum(filename);
                        params().embedded = true;
                        fname = lyxfile;
                }
@@ -914,20 +916,19 @@ bool Buffer::writeFile(FileName const & fname) const
        }
 
        removeAutosaveFile(d->filename.absFilename());
+
+       if (params().embedded) {
+               message(str + _(" writing embedded files!."));
+               // if embedding is enabled, write file.lyx and all the embedded files
+               // to the zip file fname.
+               if (!d->embedded_files.writeFile(fname, *this)) {
+                       message(str + _(" could not write embedded files!."));
+                       return false;
+               }
+       }
        saveCheckSum(d->filename);
        message(str + _(" done."));
 
-       if (!params().embedded)
-               return true;
-
-       message(str + _(" writing embedded files!."));
-       // if embedding is enabled, write file.lyx and all the embedded files
-       // to the zip file fname.
-       if (!d->embedded_files.writeFile(fname)) {
-               message(str + _(" could not write embedded files!."));
-               return false;
-       }
-       message(str + _(" error while writing embedded files."));
        return true;
 }
 
@@ -947,7 +948,6 @@ bool Buffer::write(ostream & ofs) const
            << "\\lyxformat " << LYX_FORMAT << "\n"
            << "\\begin_document\n";
 
-
        /// For each author, set 'used' to true if there is a change
        /// by this author in the document; otherwise set it to 'false'.
        AuthorList::Authors::const_iterator a_it = params().authors().begin();
@@ -955,8 +955,8 @@ bool Buffer::write(ostream & ofs) const
        for (; a_it != a_end; ++a_it)
                a_it->second.setUsed(false);
 
-       ParIterator const end = par_iterator_end();
-       ParIterator it = par_iterator_begin();
+       ParIterator const end = const_cast<Buffer *>(this)->par_iterator_end();
+       ParIterator it = const_cast<Buffer *>(this)->par_iterator_begin();
        for ( ; it != end; ++it)
                it->checkAuthors(params().authors());
 
@@ -1024,8 +1024,13 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
                      runparams, output_preamble, output_body);
        }
        catch (EncodingException & e) {
-               docstring msg = _("Could not find LaTeX command for character '%'");
-               msg[msg.size() - 2] = e.failed_char;
+               odocstringstream ods;
+               ods.put(e.failed_char);
+               ostringstream oss;
+               oss << "0x" << hex << e.failed_char << dec;
+               docstring msg = bformat(_("Could not find LaTeX command for character '%1$s'"
+                                         " (code point %2$s)"),
+                                         ods.str(), from_utf8(oss.str()));
                errorList.push_back(ErrorItem(msg, _("Some characters of your document are probably not "
                                "representable in the chosen encoding.\n"
                                "Changing the document encoding to utf8 could help."),
@@ -1204,7 +1209,6 @@ void Buffer::makeDocBookFile(FileName const & fname,
 {
        LYXERR(Debug::LATEX, "makeDocBookFile...");
 
-       //ofstream ofs;
        odocfstream ofs;
        if (!openFileWrite(ofs, fname))
                return;
@@ -1385,7 +1389,7 @@ void Buffer::updateBibfilesCache() const
                if (it->lyxCode() == BIBTEX_CODE) {
                        InsetBibtex const & inset =
                                static_cast<InsetBibtex const &>(*it);
-                       FileNameList const bibfiles = inset.getFiles(*this);
+                       EmbeddedFileList const bibfiles = inset.getFiles(*this);
                        d->bibfilesCache_.insert(d->bibfilesCache_.end(),
                                bibfiles.begin(),
                                bibfiles.end());
@@ -1393,7 +1397,7 @@ void Buffer::updateBibfilesCache() const
                        InsetInclude & inset =
                                static_cast<InsetInclude &>(*it);
                        inset.updateBibfilesCache(*this);
-                       FileNameList const & bibfiles =
+                       EmbeddedFileList const & bibfiles =
                                        inset.getBibfilesCache(*this);
                        d->bibfilesCache_.insert(d->bibfilesCache_.end(),
                                bibfiles.begin(),
@@ -1403,7 +1407,7 @@ void Buffer::updateBibfilesCache() const
 }
 
 
-FileNameList const & Buffer::getBibfilesCache() const
+EmbeddedFileList const & Buffer::getBibfilesCache() const
 {
        // if this is a child document and the parent is already loaded
        // use the parent's cache instead
@@ -1482,7 +1486,7 @@ bool Buffer::isMultiLingual() const
 }
 
 
-ParIterator Buffer::getParFromID(int const id) const
+ParConstIterator Buffer::getParFromID(int const id) const
 {
        ParConstIterator it = par_iterator_begin();
        ParConstIterator const end = par_iterator_end();
@@ -1501,6 +1505,25 @@ ParIterator Buffer::getParFromID(int const id) const
 }
 
 
+ParIterator Buffer::getParFromID(int const id)
+{
+       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;
+       }
+
+       for (; it != end; ++it)
+               if (it->id() == id)
+                       return it;
+
+       return end;
+}
+
+
 bool Buffer::hasParWithID(int const id) const
 {
        ParConstIterator const it = getParFromID(id);
@@ -1640,7 +1663,7 @@ string Buffer::absFileName() const
 
 string Buffer::filePath() const
 {
-       return d->filename.onlyPath().absFilename();
+       return d->filename.onlyPath().absFilename() + "/";
 }
 
 
@@ -1691,7 +1714,7 @@ typename M::iterator greatest_below(M & m, typename M::key_type const & x)
 MacroData const * Buffer::getBufferMacro(docstring const & name, 
                                         DocIterator const & pos) const
 {
-       LYXERR(Debug::DEBUG, "Searching for " << to_ascii(name) << " at " << pos);
+       LYXERR(Debug::MACROS, "Searching for " << to_ascii(name) << " at " << pos);
 
        // if paragraphs have no macro context set, pos will be empty
        if (pos.empty())
@@ -1964,7 +1987,7 @@ void Buffer::updateMacros() const
        if (d->macro_lock)
                return;
 
-       LYXERR(Debug::DEBUG, "updateMacro of " << d->filename.onlyFileName());
+       LYXERR(Debug::MACROS, "updateMacro of " << d->filename.onlyFileName());
 
        // start with empty table
        d->macros.clear();
@@ -1984,9 +2007,10 @@ void Buffer::updateMacros() const
 
 void Buffer::updateMacroInstances() const
 {
-       LYXERR(Debug::DEBUG, "updateMacroInstances for " << d->filename.onlyFileName());
-       ParIterator it = par_iterator_begin();
-       ParIterator end = par_iterator_end();
+       LYXERR(Debug::MACROS, "updateMacroInstances for "
+               << d->filename.onlyFileName());
+       ParConstIterator it = par_iterator_begin();
+       ParConstIterator end = par_iterator_end();
        for (; it != end; it.forwardPos()) {
                // look for MathData cells in InsetMathNest insets
                Inset * inset = it.nextInset();