]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.h
GuiBox.cpp: fix logic
[lyx.git] / src / Buffer.h
index 3a042989cb09dc9a59651f448c6d9f79127c76c1..50b273352fc70530e33ac41dca94633e90a1d1a8 100644 (file)
@@ -15,8 +15,6 @@
 #include "OutputEnums.h"
 #include "OutputParams.h"
 
-#include "insets/InsetCode.h"
-
 #include "support/strfwd.h"
 #include "support/types.h"
 
@@ -79,10 +77,12 @@ class PreviewLoader;
 
 class Buffer;
 typedef std::list<Buffer *> ListOfBuffers;
+/// a list of Buffers we cloned
+typedef std::set<Buffer *> CloneList;
 
 
 /** The buffer object.
- * This is the buffer object. It contains all the informations about
+ * This is the buffer object. It contains all the information about
  * a document loaded into LyX.
  * The buffer object owns the Text (wrapped in an InsetText), which
  * contains the individual paragraphs of the document.
@@ -92,6 +92,9 @@ typedef std::list<Buffer *> ListOfBuffers;
  * minimal, probably not.
  * \author Lars Gullik Bjønnes
  */
+
+class MarkAsExporting;
+
 class Buffer {
 public:
        /// What type of log will \c getLogName() return?
@@ -109,7 +112,7 @@ public:
                ReadWrongVersion,
                ReadFileNotFound,
                ReadVCError,
-               ReadAutosaveFailure,            
+               ReadAutosaveFailure,
                ReadEmergencyFailure,
                ReadNoLyXFormat,
                ReadDocumentFailure,
@@ -125,12 +128,16 @@ public:
        enum ExportStatus {
                // export
                ExportSuccess,
+               ExportCancel,
                ExportError,
                ExportNoPathToFormat,
                ExportTexPathHasSpaces,
                ExportConverterError,
                // preview
+               // Implies ExportSuccess.
                PreviewSuccess,
+               // The exported file exists but there was an error when opening
+               // it in a viewer.
                PreviewError
        };
 
@@ -138,7 +145,7 @@ public:
        /// isExternallyModified()
        /**
         * timestamp is fast but inaccurate. For example, the granularity
-        * of timestamp on a FAT filesystem is 2 second. Also, various operations
+        * 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
@@ -165,8 +172,11 @@ public:
        /// Destructor
        ~Buffer();
 
-       ///
-       Buffer * clone() const;
+       /// Clones the entire structure of which this Buffer is part, starting
+       /// with the master and cloning all the children, too.
+       Buffer * cloneFromMaster() const;
+       /// Just clones this single Buffer. For autosave.
+       Buffer * cloneBufferOnly() const;
        ///
        bool isClone() const;
 
@@ -216,6 +226,10 @@ public:
        /// emergency or autosave files, one should use \c loadLyXFile.
        /// /sa loadLyXFile
        ReadStatus loadThisLyXFile(support::FileName const & fn);
+       /// import a new document from a string
+       bool importString(std::string const &, docstring const &, ErrorList &);
+       /// import a new file
+       bool importFile(std::string const &, support::FileName const &, ErrorList &);
        /// read a new document from a string
        bool readString(std::string const &);
        /// Reloads the LyX file
@@ -225,13 +239,15 @@ public:
        /// read the header, returns number of unknown tokens
        int readHeader(Lexer & lex);
 
+       double fontScalingFactor() const;
+
 private:
        ///
        typedef std::map<Buffer const *, Buffer *> BufferMap;
        ///
-       void clone(BufferMap &) const;
+       void cloneWithChildren(BufferMap &, CloneList *) const;
        /// save timestamp and checksum of the given file.
-       void saveCheckSum() const;      
+       void saveCheckSum() const;
        /// read a new file
        ReadStatus readFile(support::FileName const & fn);
        /// Reads a file without header.
@@ -239,18 +255,17 @@ private:
        /// \return \c true if file is not completely read.
        bool readDocument(Lexer &);
        /// Try to extract the file from a version control container
-       /// before reading if the file cannot be found. This is only
-       /// implemented for RCS.
+       /// before reading if the file cannot be found.
        /// \sa LyXVC::file_not_found_hook
        ReadStatus extractFromVC();
-       /// Reads the first tag of a LyX File and 
+       /// Reads the first tag of a LyX File and
        /// returns the file format number.
        ReadStatus parseLyXFormat(Lexer & lex, support::FileName const & fn,
                int & file_format) const;
        /// Convert the LyX file to the LYX_FORMAT using
        /// the lyx2lyx script and returns the filename
        /// of the temporary file to be read
-       ReadStatus convertLyXFormat(support::FileName const & fn, 
+       ReadStatus convertLyXFormat(support::FileName const & fn,
                support::FileName & tmpfile, int from_format);
        //@}
 
@@ -258,7 +273,7 @@ public:
        /// \name Functions involved in autosave and emergency files.
        //@{
        /// Save an autosave file to #filename.lyx#
-       bool autoSave() const;  
+       bool autoSave() const;
        /// save emergency file
        /// \return a status message towards the user.
        docstring emergencyWrite();
@@ -267,11 +282,11 @@ public:
 //private:
        ///
        void removeAutosaveFile() const;
-       
+
 private:
        /// Try to load an autosave file associated to \c fn.
        ReadStatus loadAutosave();
-       /// Try to load an emergency file associated to \c fn. 
+       /// Try to load an emergency file associated to \c fn.
        ReadStatus loadEmergency();
        /// Get the filename of the emergency file associated with the Buffer
        support::FileName getEmergencyFileName() const;
@@ -288,7 +303,9 @@ public:
        enum OutputWhat {
                FullSource,
                OnlyBody,
-               OnlyPreamble
+               IncludedFile,
+               OnlyPreamble,
+               CurrentParagraph
        };
 
        /// Just a wrapper for writeLaTeXSource, first creating the ofstream.
@@ -371,6 +388,8 @@ public:
        /// automatically saved, nor it needs to trigger any "do you want to save ?" question.
        bool isInternal() const;
 
+       void setInternal(bool flag);
+
        /// Mark this buffer as dirty.
        void markDirty();
 
@@ -380,10 +399,22 @@ public:
        /// Returns the buffer's filename. It is always an absolute path.
        std::string absFileName() const;
 
-       /// Returns the the path where the buffer lives.
+       /// Returns the path where the buffer lives.
        /// It is always an absolute path.
        std::string filePath() 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.
        */
@@ -403,15 +434,15 @@ public:
 
        /// \return true if \p child is a child of this \c Buffer.
        bool isChild(Buffer * child) const;
-       
+
        /// \return true if this \c Buffer has children
        bool hasChildren() const;
-       
+
        /// \return a list of the direct children of this Buffer.
        /// this list has no duplicates and is in the order in which
        /// the children appear.
        ListOfBuffers getChildren() const;
-       
+
        /// \return a list of all descendents of this Buffer (children,
        /// grandchildren, etc). this list has no duplicates and is in
        /// the order in which the children appear.
@@ -443,7 +474,7 @@ public:
        void validate(LaTeXFeatures &) const;
 
        /// Reference information is cached in the Buffer, so we do not
-       /// have to check or read things over and over. 
+       /// have to check or read things over and over.
        ///
        /// There are two caches.
        ///
@@ -451,11 +482,11 @@ public:
        /// 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 children add their information to the master's cache.
-       
+
        /// Calling this method invalidates the cache and so requires a
        /// re-read.
        void invalidateBibinfoCache() const;
@@ -476,10 +507,15 @@ public:
        /// add a single piece of bibliography info to our cache
        void addBibTeXInfo(docstring const & key, BibTeXInfo const & bi) const;
        ///
+       void makeCitationLabels() const;
+       ///
        bool citeLabelsValid() const;
        ///
        void getLabelList(std::vector<docstring> &) const;
 
+       /// This removes the .aux and .bbl files from the temp dir.
+       void removeBiblioTempFiles() const;
+
        ///
        void changeLanguage(Language const * from, Language const * to);
 
@@ -491,6 +527,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
@@ -569,13 +607,13 @@ public:
 
        /// Replace the inset contents for insets which InsetCode is equal
        /// to the passed \p inset_code.
-       void changeRefsIfUnique(docstring const & from, docstring const & to,
-               InsetCode code);
+       void changeRefsIfUnique(docstring const & from, docstring const & to);
 
        /// 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, bool full_source) const;
+       void 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
@@ -619,32 +657,41 @@ public:
 
        ///
        ExportStatus doExport(std::string const & target, bool put_in_tempdir) 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;
+       ///
+       void setMathFlavor(OutputParams & op) const;
 
 public:
-       /// mark the buffer as busy exporting something, or not
-       void setExportStatus(bool e) const;
        ///
        bool isExporting() const;
 
        ///
        typedef std::vector<std::pair<Inset *, ParIterator> > References;
-       References & references(docstring const & label);
+       ///
        References const & references(docstring const & label) const;
+       ///
+       void addReference(docstring const & label, Inset * inset, ParIterator it);
+       ///
        void clearReferenceCache() const;
+       ///
        void setInsetLabel(docstring const & label, InsetLabel const * il);
+       ///
        InsetLabel const * insetLabel(docstring const & label) const;
 
        /// return a list of all used branches (also in children)
@@ -662,7 +709,7 @@ public:
        /// do this one.
        /// \param output: whether we are preparing for output.
        void updateBuffer(UpdateScope scope, UpdateType utype) const;
-       /// 
+       ///
        void updateBuffer(ParIterator & parit, UpdateType utype) const;
 
        /// Spellcheck starting from \p from.
@@ -675,8 +722,35 @@ public:
                WordLangTuple & word_lang, docstring_list & suggestions) const;
        ///
        void checkChildBuffers();
+       ///
+       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.
+       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
+       /// \p skipNoOutput if notes etc. should be ignored
+       void updateStatistics(DocIterator & from, DocIterator & to,
+                                                 bool skipNoOutput = true) const;
+       /// statistics accessor functions
+       int wordCount() const;
+       int charCount(bool with_blanks) const;
 
 private:
+       friend class MarkAsExporting;
+       /// mark the buffer as busy exporting something, or not
+       void setExportStatus(bool e) const;
+
+       ///
+       References & getReferenceCache(docstring const & label);
        /// Change name of buffer. Updates "read-only" flag.
        void setFileName(support::FileName const & fname);
        ///
@@ -690,7 +764,7 @@ private:
        void updateBibfilesCache(UpdateScope scope = UpdateMaster) const;
        /// Return the list with all bibfiles in use (including bibfiles
        /// of loaded child documents).
-       support::FileNameList const & 
+       support::FileNameList const &
                getBibfilesCache(UpdateScope scope = UpdateMaster) const;
        ///
        void collectChildren(ListOfBuffers & children, bool grand_children) const;
@@ -706,6 +780,25 @@ private:
 };
 
 
+/// Helper class, to guarantee that the export status
+/// gets reset properly. To use, simply create a local variable:
+///    MarkAsExporting mex(bufptr);
+/// and leave the rest to us.
+class MarkAsExporting {
+public:
+       MarkAsExporting(Buffer const * buf) : buf_(buf)
+       {
+               buf_->setExportStatus(true);
+       }
+       ~MarkAsExporting()
+       {
+               buf_->setExportStatus(false);
+       }
+private:
+       Buffer const * const buf_;
+};
+
+
 } // namespace lyx
 
 #endif