]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.h
de.po
[lyx.git] / src / Buffer.h
index 4e5565449003dbdd82474a65238d30c2bffa8d30..99cfce1fe12eb160331cac29c9fb74336498e939 100644 (file)
 #define BUFFER_H
 
 #include "OutputEnums.h"
-#include "OutputParams.h"
-
-#include "insets/InsetCode.h"
 
+#include "support/unique_ptr.h"
 #include "support/strfwd.h"
 #include "support/types.h"
+#include "support/FileNameList.h"
 
 #include <map>
 #include <list>
@@ -52,6 +51,7 @@ class MacroData;
 class MacroNameSet;
 class MacroSet;
 class OutputParams;
+class otexstream;
 class Paragraph;
 class ParConstIterator;
 class ParIterator;
@@ -65,16 +65,17 @@ class WordLangTuple;
 namespace frontend {
 class GuiBufferDelegate;
 class WorkAreaManager;
-}
+} // namespace frontend
 
 namespace support {
+class DocFileName;
 class FileName;
-class FileNameList;
-}
+} // namespace support
 
 namespace graphics {
 class PreviewLoader;
-}
+class Cache;
+} // namespace graphics
 
 
 class Buffer;
@@ -131,33 +132,19 @@ public:
                // export
                ExportSuccess,
                ExportCancel,
+               ExportKilled,
                ExportError,
                ExportNoPathToFormat,
                ExportTexPathHasSpaces,
                ExportConverterError,
                // preview
+               // Implies ExportSuccess.
                PreviewSuccess,
+               // The exported file exists but there was an error when opening
+               // it in a viewer.
                PreviewError
        };
 
-       /// Method to check if a file is externally modified, used by
-       /// isExternallyModified()
-       /**
-        * timestamp is fast but inaccurate. For example, the granularity
-        * of timestamp on a FAT filesystem is 2 seconds. Also, various operations
-        * may touch the timestamp of a file even when its content is unchanged.
-        *
-        * checksum is accurate but slow, which can be a problem when it is
-        * frequently used, or used for a large file on a slow (network) file
-        * system.
-        *
-        * FIXME: replace this method with support/FileMonitor.
-        */
-       enum CheckMethod {
-               checksum_method, ///< Use file checksum
-               timestamp_method ///< Use timestamp, and checksum if timestamp has changed
-       };
-
        ///
        enum UpdateScope {
                UpdateMaster,
@@ -171,9 +158,9 @@ public:
        /// Destructor
        ~Buffer();
 
-       /// Clones the entire structure of which this Buffer is part, starting
-       /// with the master and cloning all the children, too.
-       Buffer * cloneFromMaster() const;
+       /// Clones the entire structure of which this Buffer is part, 
+       /// cloning all the children, too.
+       Buffer * cloneWithChildren() const;
        /// Just clones this single Buffer. For autosave.
        Buffer * cloneBufferOnly() const;
        ///
@@ -232,19 +219,20 @@ public:
        /// read a new document from a string
        bool readString(std::string const &);
        /// Reloads the LyX file
-       /// \param clearUndo if false, leave alone the undo stack.
-       ReadStatus reload(bool clearUndo = true);
+       ReadStatus reload();
 //FIXME: The following function should be private
 //private:
        /// read the header, returns number of unknown tokens
        int readHeader(Lexer & lex);
 
+       double fontScalingFactor() const;
+
 private:
        ///
        typedef std::map<Buffer const *, Buffer *> BufferMap;
        ///
        void cloneWithChildren(BufferMap &, CloneList *) const;
-       /// save timestamp and checksum of the given file.
+       /// save checksum of the given file.
        void saveCheckSum() const;
        /// read a new file
        ReadStatus readFile(support::FileName const & fn);
@@ -265,6 +253,8 @@ private:
        /// of the temporary file to be read
        ReadStatus convertLyXFormat(support::FileName const & fn,
                support::FileName & tmpfile, int from_format);
+       /// get appropriate name for backing up files from older versions
+       support::FileName getBackupName() const;
        //@}
 
 public:
@@ -307,7 +297,7 @@ public:
        };
 
        /// Just a wrapper for writeLaTeXSource, first creating the ofstream.
-       bool makeLaTeXFile(support::FileName const & filename,
+       ExportStatus makeLaTeXFile(support::FileName const & filename,
                           std::string const & original_path,
                           OutputParams const &,
                           OutputWhat output = FullSource) const;
@@ -319,13 +309,13 @@ public:
            method with a string stream if the output is supposed to go to a
            file. \code
            ofdocstream ofs;
-           otexstream os(ofs, texrow);
+           otexstream os(ofs);
            ofs.open("test.tex");
            writeLaTeXSource(os, ...);
            ofs.close();
            \endcode is NOT equivalent to \code
            odocstringstream oss;
-           otexstream os(oss, texrow);
+           otexstream os(oss);
            writeLaTeXSource(os, ...);
            ofdocstream ofs;
            ofs.open("test.tex");
@@ -333,23 +323,23 @@ public:
            ofs.close();
            \endcode
         */
-       void writeLaTeXSource(otexstream & os,
+       ExportStatus writeLaTeXSource(otexstream & os,
                           std::string const & original_path,
                           OutputParams const &,
                           OutputWhat output = FullSource) const;
        ///
-       void makeDocBookFile(support::FileName const & filename,
+       ExportStatus makeDocBookFile(support::FileName const & filename,
                             OutputParams const & runparams_in,
                             OutputWhat output = FullSource) const;
        ///
-       void writeDocBookSource(odocstream & os, std::string const & filename,
+       ExportStatus writeDocBookSource(odocstream & os, std::string const & filename,
                             OutputParams const & runparams_in,
                             OutputWhat output = FullSource) const;
        ///
-       void makeLyXHTMLFile(support::FileName const & filename,
+       ExportStatus makeLyXHTMLFile(support::FileName const & filename,
                             OutputParams const & runparams_in) const;
        ///
-       void writeLyXHTMLSource(odocstream & os,
+       ExportStatus writeLyXHTMLSource(odocstream & os,
                             OutputParams const & runparams_in,
                             OutputWhat output = FullSource) const;
        /// returns the main language for the buffer (document)
@@ -364,8 +354,15 @@ public:
        ///
        bool isDepClean(std::string const & name) const;
 
-       /// whether or not disk file has been externally modified
-       bool isExternallyModified(CheckMethod method) const;
+       /// Whether or not disk file has been externally modified. Uses a checksum
+       /// which is accurate but slow, which can be a problem when it is frequently
+       /// used, or used for a large file on a slow (network) file system.
+       bool isChecksumModified() const;
+
+       /// Flag set by the FileSystemWatcher.
+       /// Fast but (not so) inaccurate, can be cleared by the user.
+       bool notifiesExternalModification() const;
+       void clearExternalModification() const;
 
        /// mark the main lyx file as not needing saving
        void markClean() const;
@@ -401,6 +398,39 @@ public:
        /// It is always an absolute path.
        std::string filePath() const;
 
+       /** Contructs a file name of a referenced file (child doc, included graphics etc).
+        *  Absolute names are returned as is. If the name is relative, it is
+        *  interpreted relative to filePath() if the file exists, otherwise
+        *  relative to the original path where the document was last saved.
+        *  The original path may be different from filePath() if the document was
+        *  later manually moved to a different location.
+        */
+       support::DocFileName getReferencedFileName(std::string const & fn) const;
+
+       /// Format a file name for LaTeX output (absolute or relative or filename only,
+       /// depending on file and context)
+       std::string const prepareFileNameForLaTeX(std::string const &,
+                                       std::string const &, bool nice) const;
+
+       /** Returns a vector of bibliography (*.bib) file paths suitable for the
+        *  output in the respective BibTeX/Biblatex macro
+        */
+       std::vector<docstring> const prepareBibFilePaths(OutputParams const &,
+                                   const docstring_list & bibfilelist,
+                                   bool const extension = true) const;
+
+       /** Returns the path where a local layout file lives.
+        *  An empty string is returned for standard system and user layouts.
+        *  If possible, it is always relative to the buffer path.
+        */
+       std::string layoutPos() const;
+
+       /** Set the path to a local layout file.
+        *  This must be an absolute path but, if possible, it is always
+        *  stored as relative to the buffer path.
+        */
+       void setLayoutPos(std::string const & path);
+
        /** A transformed version of the file name, adequate for LaTeX.
            \param no_path optional if \c true then the path is stripped.
        */
@@ -442,9 +472,13 @@ public:
        /// thing from whichever Buffer it is called.
        ListOfBuffers allRelatives() const;
 
-       /// Is buffer read-only?
+       /// Is buffer read-only? True if it has either the read-only flag or the
+       /// externally modified flag.
        bool isReadonly() const;
 
+       /// Does the buffer have the read-only flag?
+       bool hasReadonlyFlag() const;
+
        /// Set buffer read-only flag
        void setReadonly(bool flag = true);
 
@@ -459,35 +493,27 @@ public:
        */
        void validate(LaTeXFeatures &) const;
 
-       /// Reference information is cached in the Buffer, so we do not
+       /// Bibliography information is cached in the Buffer, so we do not
        /// have to check or read things over and over.
-       ///
-       /// There are two caches.
-       ///
-       /// One is a cache of the BibTeX files from which reference info is
-       /// being gathered. This cache is PER BUFFER, and the cache for the
-       /// master essentially includes the cache for its children. This gets
-       /// invalidated when an InsetBibtex is created, deleted, or modified.
-       ///
-       /// The other is a cache of the reference information itself. This
-       /// exists only in the master buffer, and when it needs to be updated,
+       /// The cache exists only in the master buffer. When it is updated,
        /// the children add their information to the master's cache.
-
        /// Calling this method invalidates the cache and so requires a
        /// re-read.
        void invalidateBibinfoCache() const;
-       /// This invalidates the cache of files we need to check.
-       void invalidateBibfileCache() const;
+       /// Clear the bibfiles cache
+       void clearBibFileCache() const;
        /// Updates the cached bibliography information, checking first to see
        /// whether the cache is valid. If so, we do nothing. If not, then we
        /// reload all the BibTeX info.
        /// Note that this operates on the master document.
-       void reloadBibInfoCache() const;
+       void reloadBibInfoCache(bool const force = false) const;
        /// \return the bibliography information for this buffer's master,
        /// or just for it, if it isn't a child.
        BiblioInfo const & masterBibInfo() const;
+       /// \return this buffer's bibliography information
+       BiblioInfo const & bibInfo() const;
        /// collect bibliography info from the various insets in this buffer.
-       void collectBibKeys() const;
+       void collectBibKeys(support::FileNameList &) const;
        /// add some BiblioInfo to our cache
        void addBiblioInfo(BiblioInfo const & bi) const;
        /// add a single piece of bibliography info to our cache
@@ -495,6 +521,8 @@ public:
        ///
        void makeCitationLabels() const;
        ///
+       void invalidateCiteLabels() const;
+       ///
        bool citeLabelsValid() const;
        ///
        void getLabelList(std::vector<docstring> &) const;
@@ -513,6 +541,8 @@ public:
        ///
        BufferParams & params();
        BufferParams const & params() const;
+       ///
+       BufferParams const & masterParams() const;
 
        /** The list of paragraphs.
            This is a linked list of paragraph, this list holds the
@@ -558,6 +588,8 @@ public:
        void updatePreviews() const;
        /// Remove any previewed LaTeX snippets associated with this buffer
        void removePreviews() const;
+       ///
+       graphics::Cache & graphicsCache() const;
 
        /// Our main text (inside the top InsetText)
        Text & text() const;
@@ -595,9 +627,10 @@ public:
 
        /// get source code (latex/docbook) for some paragraphs, or all paragraphs
        /// including preamble
-       void getSourceCode(odocstream & os, std::string const format,
-                          pit_type par_begin, pit_type par_end, OutputWhat output,
-                          bool master) const;
+       /// returns nullptr if Id to Row conversion is unsupported
+       unique_ptr<TexRow> getSourceCode(odocstream & os,
+                       std::string const & format, pit_type par_begin,
+                       pit_type par_end, OutputWhat output, bool master) const;
 
        /// Access to error list.
        /// This method is used only for GUI visualisation of Buffer related
@@ -641,22 +674,23 @@ public:
 
        ///
        ExportStatus doExport(std::string const & target, bool put_in_tempdir) const;
-       ///
-       ExportStatus doExport(std::string const & target, bool put_in_tempdir,
-               std::string & result_file) const;
-       ///
+       /// Export buffer to format \p format and open the result in a suitable viewer.
+       /// Note: This has nothing to do with preview of graphics or math formulas.
        ExportStatus preview(std::string const & format) const;
+       /// true if there was a previous preview this session of this buffer and
+       /// there was an error on the previous preview of this buffer.
+       bool lastPreviewError() const;
 
 private:
+       ///
+       ExportStatus doExport(std::string const & target, bool put_in_tempdir,
+               std::string & result_file) const;
        /// target is a format name optionally followed by a space
        /// and a destination file-name
        ExportStatus doExport(std::string const & target, bool put_in_tempdir,
                bool includeall, std::string & result_file) const;
        ///
-       ExportStatus doExport(std::string const & target, bool put_in_tempdir,
-               bool includeall) const;
-       ///
-       ExportStatus preview(std::string const & format, bool includeall = false) const;
+       ExportStatus preview(std::string const & format, bool includeall) const;
        ///
        void setMathFlavor(OutputParams & op) const;
 
@@ -664,26 +698,32 @@ public:
        ///
        bool isExporting() const;
 
-       ///
+       /// A collection of InsetRef insets and their position in the buffer
        typedef std::vector<std::pair<Inset *, ParIterator> > References;
-       ///
+       /// Get all InsetRef insets and their positions associated with
+       /// the InsetLabel with the label string \p label
        References const & references(docstring const & label) const;
-       ///
+       /// Add an InsetRef at position \p it to the Insetlabel
+       /// with the label string \p label
        void addReference(docstring const & label, Inset * inset, ParIterator it);
-       ///
+       /// Clear the whole reference cache
        void clearReferenceCache() const;
-       ///
-       void setInsetLabel(docstring const & label, InsetLabel const * il);
-       ///
-       InsetLabel const * insetLabel(docstring const & label) const;
+       /// Set the InsetLabel for a given \p label string. \p active
+       /// determines whether this is an active label (see @ref activeLabel)
+       void setInsetLabel(docstring const & label, InsetLabel const * il,
+                          bool const active);
+       /// \return the InsetLabel associated with this \p label string
+       /// If \p active is true we only return active labels
+       /// (see @ref activeLabel)
+       InsetLabel const * insetLabel(docstring const & label,
+                                     bool const active = false) const;
+       /// \return true if this \param label is an active label.
+       /// Inactive labels are currently deleted labels (in ct mode)
+       bool activeLabel(docstring const & label) const;
 
        /// return a list of all used branches (also in children)
        void getUsedBranches(std::list<docstring> &, bool const from_master = false) const;
 
-       /// sets the buffer_ member for every inset in this buffer.
-       // FIXME This really shouldn't be needed, but at the moment it's not
-       // clear how to do it just for the individual pieces we need.
-       void setBuffersForInsets() const;
        /// Updates screen labels and some other information associated with
        /// insets and paragraphs. Actually, it's more like a general "recurse
        /// through the Buffer" routine, that visits all the insets and paragraphs.
@@ -708,6 +748,18 @@ public:
        ///
        void checkMasterBuffer();
 
+       /// If the document is being saved to a new location and the named file
+       /// exists at the old location, return its updated path relative to the
+       /// new buffer path if possible, otherwise return its absolute path.
+       /// In all other cases, this is a no-op and name is returned unchanged.
+       /// If a non-empty ext is given, the existence of name.ext is checked
+       /// but the returned path will not contain this extension.
+       /// Similarly, when loading a document that was moved from the location
+       /// where it was saved, return the correct path relative to the new
+       /// location.
+       std::string includedFilePath(std::string const & name,
+                               std::string const & ext = empty_string()) const;
+
        /// compute statistics between \p from and \p to
        /// \p from initial position
        /// \p to points to the end position
@@ -718,6 +770,16 @@ public:
        int wordCount() const;
        int charCount(bool with_blanks) const;
 
+       // this is const because it does not modify the buffer's real contents,
+       // only the mutable flag.
+       void setChangesPresent(bool) const;
+       bool areChangesPresent() const;
+       void updateChangesPresent() const;
+       ///
+       void registerBibfiles(docstring_list const & bf) const;
+       ///
+       support::FileName getBibfilePath(docstring const & bibid) const;
+
 private:
        friend class MarkAsExporting;
        /// mark the buffer as busy exporting something, or not
@@ -733,13 +795,10 @@ private:
        /// last time we loaded the cache. Note that this does NOT update the
        /// cached information.
        void checkIfBibInfoCacheIsValid() const;
-       /// Update the list of all bibfiles in use (including bibfiles
-       /// of loaded child documents).
-       void updateBibfilesCache(UpdateScope scope = UpdateMaster) const;
        /// Return the list with all bibfiles in use (including bibfiles
        /// of loaded child documents).
-       support::FileNameList const &
-               getBibfilesCache(UpdateScope scope = UpdateMaster) const;
+       docstring_list const &
+               getBibfiles(UpdateScope scope = UpdateMaster) const;
        ///
        void collectChildren(ListOfBuffers & children, bool grand_children) const;