]> git.lyx.org Git - lyx.git/blob - src/Buffer.h
Remove hardcoded values
[lyx.git] / src / Buffer.h
1 // -*- C++ -*-
2 /**
3  * \file Buffer.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Lars Gullik Bjønnes
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #ifndef BUFFER_H
13 #define BUFFER_H
14
15 #include "OutputEnums.h"
16
17 #include "support/unique_ptr.h"
18 #include "support/strfwd.h"
19 #include "support/types.h"
20
21 #include <map>
22 #include <list>
23 #include <set>
24 #include <string>
25 #include <vector>
26
27
28 namespace lyx {
29
30 class BiblioInfo;
31 class BibTeXInfo;
32 class BufferParams;
33 class DispatchResult;
34 class DocIterator;
35 class docstring_list;
36 class ErrorList;
37 class FuncRequest;
38 class FuncStatus;
39 class Inset;
40 class InsetLabel;
41 class InsetRef;
42 class Font;
43 class Format;
44 class Lexer;
45 class Text;
46 class LyXVC;
47 class LaTeXFeatures;
48 class Language;
49 class MacroData;
50 class MacroNameSet;
51 class MacroSet;
52 class OutputParams;
53 class otexstream;
54 class Paragraph;
55 class ParConstIterator;
56 class ParIterator;
57 class ParagraphList;
58 class TeXErrors;
59 class TexRow;
60 class TocBackend;
61 class Undo;
62 class WordLangTuple;
63
64 namespace frontend {
65 class GuiBufferDelegate;
66 class WorkAreaManager;
67 }
68
69 namespace support {
70 class DocFileName;
71 class FileName;
72 class FileNameList;
73 }
74
75 namespace graphics {
76 class PreviewLoader;
77 class Cache;
78 }
79
80
81 class Buffer;
82 typedef std::list<Buffer *> ListOfBuffers;
83 /// a list of Buffers we cloned
84 typedef std::set<Buffer *> CloneList;
85
86
87 /** The buffer object.
88  * This is the buffer object. It contains all the information about
89  * a document loaded into LyX.
90  * The buffer object owns the Text (wrapped in an InsetText), which
91  * contains the individual paragraphs of the document.
92  *
93  *
94  * I am not sure if the class is complete or
95  * minimal, probably not.
96  * \author Lars Gullik Bjønnes
97  */
98
99 class MarkAsExporting;
100
101 class Buffer {
102 public:
103         /// What type of log will \c getLogName() return?
104         enum LogType {
105                 latexlog, ///< LaTeX log
106                 buildlog  ///< Literate build log
107         };
108
109         /// Result of \c readFile()
110         enum ReadStatus {
111                 ReadSuccess,
112                 ReadCancel,
113                 // failures
114                 ReadFailure,
115                 ReadWrongVersion,
116                 ReadFileNotFound,
117                 ReadVCError,
118                 ReadAutosaveFailure,
119                 ReadEmergencyFailure,
120                 ReadNoLyXFormat,
121                 ReadDocumentFailure,
122                 // lyx2lyx
123                 LyX2LyXNoTempFile,
124                 LyX2LyXNotFound,
125                 LyX2LyXOlderFormat,
126                 LyX2LyXNewerFormat,
127                 // other
128                 ReadOriginal
129         };
130
131         enum ExportStatus {
132                 // export
133                 ExportSuccess,
134                 ExportCancel,
135                 ExportError,
136                 ExportNoPathToFormat,
137                 ExportTexPathHasSpaces,
138                 ExportConverterError,
139                 // preview
140                 // Implies ExportSuccess.
141                 PreviewSuccess,
142                 // The exported file exists but there was an error when opening
143                 // it in a viewer.
144                 PreviewError
145         };
146
147         /// Method to check if a file is externally modified, used by
148         /// isExternallyModified()
149         /**
150          * timestamp is fast but inaccurate. For example, the granularity
151          * of timestamp on a FAT filesystem is 2 seconds. Also, various operations
152          * may touch the timestamp of a file even when its content is unchanged.
153          *
154          * checksum is accurate but slow, which can be a problem when it is
155          * frequently used, or used for a large file on a slow (network) file
156          * system.
157          *
158          * FIXME: replace this method with support/FileMonitor.
159          */
160         enum CheckMethod {
161                 checksum_method, ///< Use file checksum
162                 timestamp_method ///< Use timestamp, and checksum if timestamp has changed
163         };
164
165         ///
166         enum UpdateScope {
167                 UpdateMaster,
168                 UpdateChildOnly
169         };
170
171         /// Constructor
172         explicit Buffer(std::string const & file, bool readonly = false,
173                 Buffer const * cloned_buffer = 0);
174
175         /// Destructor
176         ~Buffer();
177
178         /// Clones the entire structure of which this Buffer is part, starting
179         /// with the master and cloning all the children, too.
180         Buffer * cloneFromMaster() const;
181         /// Just clones this single Buffer. For autosave.
182         Buffer * cloneBufferOnly() const;
183         ///
184         bool isClone() const;
185
186         /** High-level interface to buffer functionality.
187             This function parses a command string and executes it.
188         */
189         void dispatch(std::string const & command, DispatchResult & result);
190
191         /// Maybe we know the function already by number...
192         void dispatch(FuncRequest const & func, DispatchResult & result);
193
194         /// Can this function be exectued?
195         /// \return true if we made a decision
196         bool getStatus(FuncRequest const & cmd, FuncStatus & flag);
197
198         ///
199         DocIterator getParFromID(int id) const;
200         /// do we have a paragraph with this id?
201         bool hasParWithID(int id) const;
202
203         ///
204         frontend::WorkAreaManager & workAreaManager() const;
205
206         /** Save file.
207             Takes care of auto-save files and backup file if requested.
208             Returns \c true if the save is successful, \c false otherwise.
209         */
210         bool save() const;
211         /// Renames and saves the buffer
212         bool saveAs(support::FileName const & fn);
213
214         /// Write document to stream. Returns \c false if unsuccessful.
215         bool write(std::ostream &) const;
216         /// Write file. Returns \c false if unsuccessful.
217         bool writeFile(support::FileName const &) const;
218
219         /// \name Functions involved in reading files/strings.
220         //@{
221         /// Loads the LyX file into the buffer. This function
222         /// tries to extract the file from version control if it
223         /// cannot be found. If it can be found, it will try to
224         /// read an emergency save file or an autosave file.
225         /// \sa loadThisLyXFile
226         ReadStatus loadLyXFile();
227         /// Loads the LyX file \c fn into the buffer. If you want
228         /// to check for files in a version control container,
229         /// emergency or autosave files, one should use \c loadLyXFile.
230         /// /sa loadLyXFile
231         ReadStatus loadThisLyXFile(support::FileName const & fn);
232         /// import a new document from a string
233         bool importString(std::string const &, docstring const &, ErrorList &);
234         /// import a new file
235         bool importFile(std::string const &, support::FileName const &, ErrorList &);
236         /// read a new document from a string
237         bool readString(std::string const &);
238         /// Reloads the LyX file
239         ReadStatus reload();
240 //FIXME: The following function should be private
241 //private:
242         /// read the header, returns number of unknown tokens
243         int readHeader(Lexer & lex);
244
245         double fontScalingFactor() const;
246
247 private:
248         ///
249         typedef std::map<Buffer const *, Buffer *> BufferMap;
250         ///
251         void cloneWithChildren(BufferMap &, CloneList *) const;
252         /// save timestamp and checksum of the given file.
253         void saveCheckSum() const;
254         /// read a new file
255         ReadStatus readFile(support::FileName const & fn);
256         /// Reads a file without header.
257         /// \param par if != 0 insert the file.
258         /// \return \c true if file is not completely read.
259         bool readDocument(Lexer &);
260         /// Try to extract the file from a version control container
261         /// before reading if the file cannot be found.
262         /// \sa LyXVC::file_not_found_hook
263         ReadStatus extractFromVC();
264         /// Reads the first tag of a LyX File and
265         /// returns the file format number.
266         ReadStatus parseLyXFormat(Lexer & lex, support::FileName const & fn,
267                 int & file_format) const;
268         /// Convert the LyX file to the LYX_FORMAT using
269         /// the lyx2lyx script and returns the filename
270         /// of the temporary file to be read
271         ReadStatus convertLyXFormat(support::FileName const & fn,
272                 support::FileName & tmpfile, int from_format);
273         /// get appropriate name for backing up files from older versions
274         support::FileName getBackupName() const;
275         //@}
276
277 public:
278         /// \name Functions involved in autosave and emergency files.
279         //@{
280         /// Save an autosave file to #filename.lyx#
281         bool autoSave() const;
282         /// save emergency file
283         /// \return a status message towards the user.
284         docstring emergencyWrite();
285
286 //FIXME:The following function should be private
287 //private:
288         ///
289         void removeAutosaveFile() const;
290
291 private:
292         /// Try to load an autosave file associated to \c fn.
293         ReadStatus loadAutosave();
294         /// Try to load an emergency file associated to \c fn.
295         ReadStatus loadEmergency();
296         /// Get the filename of the emergency file associated with the Buffer
297         support::FileName getEmergencyFileName() const;
298         /// Get the filename of the autosave file associated with the Buffer
299         support::FileName getAutosaveFileName() const;
300         ///
301         void moveAutosaveFile(support::FileName const & old) const;
302         //@}
303
304 public:
305         /// Fill in the ErrorList with the TeXErrors
306         void bufferErrors(TeXErrors const &, ErrorList &) const;
307
308         enum OutputWhat {
309                 FullSource,
310                 OnlyBody,
311                 IncludedFile,
312                 OnlyPreamble,
313                 CurrentParagraph
314         };
315
316         /// Just a wrapper for writeLaTeXSource, first creating the ofstream.
317         bool makeLaTeXFile(support::FileName const & filename,
318                            std::string const & original_path,
319                            OutputParams const &,
320                            OutputWhat output = FullSource) const;
321         /** Export the buffer to LaTeX.
322             If \p os is a file stream, and params().inputenc is "auto" or
323             "default", and the buffer contains text in different languages
324             with more than one encoding, then this method will change the
325             encoding associated to \p os. Therefore you must not call this
326             method with a string stream if the output is supposed to go to a
327             file. \code
328             ofdocstream ofs;
329             otexstream os(ofs);
330             ofs.open("test.tex");
331             writeLaTeXSource(os, ...);
332             ofs.close();
333             \endcode is NOT equivalent to \code
334             odocstringstream oss;
335             otexstream os(oss);
336             writeLaTeXSource(os, ...);
337             ofdocstream ofs;
338             ofs.open("test.tex");
339             ofs << oss.str();
340             ofs.close();
341             \endcode
342          */
343         void writeLaTeXSource(otexstream & os,
344                            std::string const & original_path,
345                            OutputParams const &,
346                            OutputWhat output = FullSource) const;
347         ///
348         void makeDocBookFile(support::FileName const & filename,
349                              OutputParams const & runparams_in,
350                              OutputWhat output = FullSource) const;
351         ///
352         void writeDocBookSource(odocstream & os, std::string const & filename,
353                              OutputParams const & runparams_in,
354                              OutputWhat output = FullSource) const;
355         ///
356         void makeLyXHTMLFile(support::FileName const & filename,
357                              OutputParams const & runparams_in) const;
358         ///
359         void writeLyXHTMLSource(odocstream & os,
360                              OutputParams const & runparams_in,
361                              OutputWhat output = FullSource) const;
362         /// returns the main language for the buffer (document)
363         Language const * language() const;
364         /// get l10n translated to the buffers language
365         docstring const B_(std::string const & l10n) const;
366
367         ///
368         int runChktex();
369         /// return true if the main lyx file does not need saving
370         bool isClean() const;
371         ///
372         bool isDepClean(std::string const & name) const;
373
374         /// whether or not disk file has been externally modified
375         bool isExternallyModified(CheckMethod method) const;
376
377         /// mark the main lyx file as not needing saving
378         void markClean() const;
379
380         ///
381         void markDepClean(std::string const & name);
382
383         ///
384         void setUnnamed(bool flag = true);
385
386         /// Whether or not a filename has been assigned to this buffer
387         bool isUnnamed() const;
388
389         /// Whether or not this buffer is internal.
390         ///
391         /// An internal buffer does not contain a real document, but some auxiliary text segment.
392         /// It is not associated with a filename, it is never saved, thus it does not need to be
393         /// automatically saved, nor it needs to trigger any "do you want to save ?" question.
394         bool isInternal() const;
395
396         void setInternal(bool flag);
397
398         /// Mark this buffer as dirty.
399         void markDirty();
400
401         /// Returns the buffer's filename. It is always an absolute path.
402         support::FileName fileName() const;
403
404         /// Returns the buffer's filename. It is always an absolute path.
405         std::string absFileName() const;
406
407         /// Returns the path where the buffer lives.
408         /// It is always an absolute path.
409         std::string filePath() const;
410
411         /** Contructs a file name of a referenced file (child doc, included graphics etc).
412          *  Absolute names are returned as is. If the name is relative, it is
413          *  interpreted relative to filePath() if the file exists, otherwise
414          *  relative to the original path where the document was last saved.
415          *  The original path may be different from filePath() if the document was
416          *  later manually moved to a different location.
417          */
418         support::DocFileName getReferencedFileName(std::string const & fn) const;
419
420         /** Returns the path where a local layout file lives.
421          *  An empty string is returned for standard system and user layouts.
422          *  If possible, it is always relative to the buffer path.
423          */
424         std::string layoutPos() const;
425
426         /** Set the path to a local layout file.
427          *  This must be an absolute path but, if possible, it is always
428          *  stored as relative to the buffer path.
429          */
430         void setLayoutPos(std::string const & path);
431
432         /** A transformed version of the file name, adequate for LaTeX.
433             \param no_path optional if \c true then the path is stripped.
434         */
435         std::string latexName(bool no_path = true) const;
436
437         /// Get the name and type of the log.
438         std::string logName(LogType * type = 0) const;
439
440         /// Set document's parent Buffer.
441         void setParent(Buffer const *);
442         Buffer const * parent() const;
443
444         /** Get the document's master (or \c this if this is not a
445             child document)
446          */
447         Buffer const * masterBuffer() const;
448
449         /// \return true if \p child is a child of this \c Buffer.
450         bool isChild(Buffer * child) const;
451
452         /// \return true if this \c Buffer has children
453         bool hasChildren() const;
454
455         /// \return a list of the direct children of this Buffer.
456         /// this list has no duplicates and is in the order in which
457         /// the children appear.
458         ListOfBuffers getChildren() const;
459
460         /// \return a list of all descendents of this Buffer (children,
461         /// grandchildren, etc). this list has no duplicates and is in
462         /// the order in which the children appear.
463         ListOfBuffers getDescendents() const;
464
465         /// Collect all relative buffers, in the order in which they appear.
466         /// I.e., the "root" Buffer is first, then its first child, then any
467         /// of its children, etc. However, there are no duplicates in this
468         /// list.
469         /// This is "stable", too, in the sense that it returns the same
470         /// thing from whichever Buffer it is called.
471         ListOfBuffers allRelatives() const;
472
473         /// Is buffer read-only?
474         bool isReadonly() const;
475
476         /// Set buffer read-only flag
477         void setReadonly(bool flag = true);
478
479         /** Validate a buffer for LaTeX.
480             This validates the buffer, and returns a struct for use by
481             #makeLaTeX# and others. Its main use is to figure out what
482             commands and packages need to be included in the LaTeX file.
483             It (should) also check that the needed constructs are there
484             (i.e. that the \refs points to coresponding \labels). It
485             should perhaps inset "error" insets to help the user correct
486             obvious mistakes.
487         */
488         void validate(LaTeXFeatures &) const;
489
490         /// Reference information is cached in the Buffer, so we do not
491         /// have to check or read things over and over.
492         ///
493         /// There are two caches.
494         ///
495         /// One is a cache of the BibTeX files from which reference info is
496         /// being gathered. This cache is PER BUFFER, and the cache for the
497         /// master essentially includes the cache for its children. This gets
498         /// invalidated when an InsetBibtex is created, deleted, or modified.
499         ///
500         /// The other is a cache of the reference information itself. This
501         /// exists only in the master buffer, and when it needs to be updated,
502         /// the children add their information to the master's cache.
503
504         /// Calling this method invalidates the cache and so requires a
505         /// re-read.
506         void invalidateBibinfoCache() const;
507         /// This invalidates the cache of files we need to check.
508         void invalidateBibfileCache() const;
509         /// Updates the cached bibliography information, checking first to see
510         /// whether the cache is valid. If so, we do nothing. If not, then we
511         /// reload all the BibTeX info.
512         /// Note that this operates on the master document.
513         void reloadBibInfoCache() const;
514         /// \return the bibliography information for this buffer's master,
515         /// or just for it, if it isn't a child.
516         BiblioInfo const & masterBibInfo() const;
517         /// collect bibliography info from the various insets in this buffer.
518         void collectBibKeys() const;
519         /// add some BiblioInfo to our cache
520         void addBiblioInfo(BiblioInfo const & bi) const;
521         /// add a single piece of bibliography info to our cache
522         void addBibTeXInfo(docstring const & key, BibTeXInfo const & bi) const;
523         ///
524         void makeCitationLabels() const;
525         ///
526         bool citeLabelsValid() const;
527         ///
528         void getLabelList(std::vector<docstring> &) const;
529
530         /// This removes the .aux and .bbl files from the temp dir.
531         void removeBiblioTempFiles() const;
532
533         ///
534         void changeLanguage(Language const * from, Language const * to);
535
536         ///
537         bool isMultiLingual() const;
538         ///
539         std::set<Language const *> getLanguages() const;
540
541         ///
542         BufferParams & params();
543         BufferParams const & params() const;
544         ///
545         BufferParams const & masterParams() const;
546
547         /** The list of paragraphs.
548             This is a linked list of paragraph, this list holds the
549             whole contents of the document.
550          */
551         ParagraphList & paragraphs();
552         ParagraphList const & paragraphs() const;
553
554         /// LyX version control object.
555         LyXVC & lyxvc();
556         LyXVC const & lyxvc() const;
557
558         /// Where to put temporary files.
559         std::string const temppath() const;
560
561         /// Used when typesetting to place errorboxes.
562         TexRow const & texrow() const;
563         TexRow & texrow();
564
565         ///
566         ParIterator par_iterator_begin();
567         ///
568         ParConstIterator par_iterator_begin() const;
569         ///
570         ParIterator par_iterator_end();
571         ///
572         ParConstIterator par_iterator_end() const;
573
574         // Position of the child buffer where it appears first in the master.
575         DocIterator firstChildPosition(Buffer const * child);
576
577         /** \returns true only when the file is fully loaded.
578          *  Used to prevent the premature generation of previews
579          *  and by the citation inset.
580          */
581         bool isFullyLoaded() const;
582         /// Set by buffer_funcs' newFile.
583         void setFullyLoaded(bool);
584
585         /// FIXME: Needed by RenderPreview.
586         graphics::PreviewLoader * loader() const;
587         /// Update the LaTeX preview snippets associated with this buffer
588         void updatePreviews() const;
589         /// Remove any previewed LaTeX snippets associated with this buffer
590         void removePreviews() const;
591         ///
592         graphics::Cache & graphicsCache() const;
593
594         /// Our main text (inside the top InsetText)
595         Text & text() const;
596
597         /// Our top InsetText
598         Inset & inset() const;
599
600         //
601         // Macro handling
602         //
603         /// Collect macro definitions in paragraphs
604         void updateMacros() const;
605         /// Iterate through the whole buffer and try to resolve macros
606         void updateMacroInstances(UpdateType) const;
607
608         /// List macro names of this buffer, the parent and the children
609         void listMacroNames(MacroNameSet & macros) const;
610         /// Collect macros of the parent and its children in front of this buffer.
611         void listParentMacros(MacroSet & macros, LaTeXFeatures & features) const;
612
613         /// Return macro defined before pos (or in the master buffer)
614         MacroData const * getMacro(docstring const & name, DocIterator const & pos, bool global = true) const;
615         /// Return macro defined anywhere in the buffer (or in the master buffer)
616         MacroData const * getMacro(docstring const & name, bool global = true) const;
617         /// Return macro defined before the inclusion of the child
618         MacroData const * getMacro(docstring const & name, Buffer const & child, bool global = true) const;
619
620         /// Collect user macro names at loading time
621         typedef std::set<docstring> UserMacroSet;
622         mutable UserMacroSet usermacros;
623
624         /// Replace the inset contents for insets which InsetCode is equal
625         /// to the passed \p inset_code.
626         void changeRefsIfUnique(docstring const & from, docstring const & to);
627
628         /// get source code (latex/docbook) for some paragraphs, or all paragraphs
629         /// including preamble
630         /// returns nullptr if Id to Row conversion is unsupported
631         unique_ptr<TexRow> getSourceCode(odocstream & os,
632                         std::string const & format, pit_type par_begin,
633                         pit_type par_end, OutputWhat output, bool master) const;
634
635         /// Access to error list.
636         /// This method is used only for GUI visualisation of Buffer related
637         /// errors (like parsing or LateX compilation). This method is const
638         /// because modifying the returned ErrorList does not touch the document
639         /// contents.
640         ErrorList & errorList(std::string const & type) const;
641
642         /// The Toc backend.
643         /// This is useful only for screen visualisation of the Buffer. This
644         /// method is const because modifying this backend does not touch
645         /// the document contents.
646         TocBackend & tocBackend() const;
647
648         ///
649         Undo & undo();
650
651         /// This function is called when the buffer is changed.
652         void changed(bool update_metrics) const;
653         ///
654         void setChild(DocIterator const & dit, Buffer * child);
655         ///
656         void updateTocItem(std::string const &, DocIterator const &) const;
657         /// This function is called when the buffer structure is changed.
658         void structureChanged() const;
659         /// This function is called when some parsing error shows up.
660         void errors(std::string const & err, bool from_master = false) const;
661         /// This function is called when the buffer busy status change.
662         void setBusy(bool on) const;
663         /// Update window titles of all users.
664         void updateTitles() const;
665         /// Reset autosave timers for all users.
666         void resetAutosaveTimers() const;
667         ///
668         void message(docstring const & msg) const;
669
670         ///
671         void setGuiDelegate(frontend::GuiBufferDelegate * gui);
672         ///
673         bool hasGuiDelegate() const;
674
675         ///
676         ExportStatus doExport(std::string const & target, bool put_in_tempdir) const;
677         /// Export buffer to format \p format and open the result in a suitable viewer.
678         /// Note: This has nothing to do with preview of graphics or math formulas.
679         ExportStatus preview(std::string const & format) const;
680         /// true if there was a previous preview this session of this buffer and
681         /// there was an error on the previous preview of this buffer.
682         bool lastPreviewError() const;
683
684 private:
685         ///
686         ExportStatus doExport(std::string const & target, bool put_in_tempdir,
687                 std::string & result_file) const;
688         /// target is a format name optionally followed by a space
689         /// and a destination file-name
690         ExportStatus doExport(std::string const & target, bool put_in_tempdir,
691                 bool includeall, std::string & result_file) const;
692         ///
693         ExportStatus preview(std::string const & format, bool includeall) const;
694         ///
695         void setMathFlavor(OutputParams & op) const;
696
697 public:
698         ///
699         bool isExporting() const;
700
701         ///
702         typedef std::vector<std::pair<Inset *, ParIterator> > References;
703         ///
704         References const & references(docstring const & label) const;
705         ///
706         void addReference(docstring const & label, Inset * inset, ParIterator it);
707         ///
708         void clearReferenceCache() const;
709         ///
710         void setInsetLabel(docstring const & label, InsetLabel const * il);
711         ///
712         InsetLabel const * insetLabel(docstring const & label) const;
713
714         /// return a list of all used branches (also in children)
715         void getUsedBranches(std::list<docstring> &, bool const from_master = false) const;
716
717         /// sets the buffer_ member for every inset in this buffer.
718         // FIXME This really shouldn't be needed, but at the moment it's not
719         // clear how to do it just for the individual pieces we need.
720         void setBuffersForInsets() const;
721         /// Updates screen labels and some other information associated with
722         /// insets and paragraphs. Actually, it's more like a general "recurse
723         /// through the Buffer" routine, that visits all the insets and paragraphs.
724         void updateBuffer() const { updateBuffer(UpdateMaster, InternalUpdate); }
725         /// \param scope: whether to start with the master document or just
726         /// do this one.
727         /// \param output: whether we are preparing for output.
728         void updateBuffer(UpdateScope scope, UpdateType utype) const;
729         ///
730         void updateBuffer(ParIterator & parit, UpdateType utype) const;
731
732         /// Spellcheck starting from \p from.
733         /// \p from initial position, will then points to the next misspelled
734         ///    word.
735         /// \p to will points to the end of the next misspelled word.
736         /// \p word_lang will contain the found misspelled word.
737         /// \return progress if a new word was found.
738         int spellCheck(DocIterator & from, DocIterator & to,
739                 WordLangTuple & word_lang, docstring_list & suggestions) const;
740         ///
741         void checkChildBuffers();
742         ///
743         void checkMasterBuffer();
744
745         /// If the document is being saved to a new location and the named file
746         /// exists at the old location, return its updated path relative to the
747         /// new buffer path if possible, otherwise return its absolute path.
748         /// In all other cases, this is a no-op and name is returned unchanged.
749         /// If a non-empty ext is given, the existence of name.ext is checked
750         /// but the returned path will not contain this extension.
751         /// Similarly, when loading a document that was moved from the location
752         /// where it was saved, return the correct path relative to the new
753         /// location.
754         std::string includedFilePath(std::string const & name,
755                                 std::string const & ext = empty_string()) const;
756
757         /// compute statistics between \p from and \p to
758         /// \p from initial position
759         /// \p to points to the end position
760         /// \p skipNoOutput if notes etc. should be ignored
761         void updateStatistics(DocIterator & from, DocIterator & to,
762                                                   bool skipNoOutput = true) const;
763         /// statistics accessor functions
764         int wordCount() const;
765         int charCount(bool with_blanks) const;
766
767         // this is const because it does not modify the buffer's real contents,
768         // only the mutable flag.
769         void setChangesPresent(bool) const;
770         bool areChangesPresent() const;
771         void updateChangesPresent() const;
772
773 private:
774         friend class MarkAsExporting;
775         /// mark the buffer as busy exporting something, or not
776         void setExportStatus(bool e) const;
777
778         ///
779         References & getReferenceCache(docstring const & label);
780         /// Change name of buffer. Updates "read-only" flag.
781         void setFileName(support::FileName const & fname);
782         ///
783         void getLanguages(std::set<Language const *> &) const;
784         /// Checks whether any of the referenced bibfiles have changed since the
785         /// last time we loaded the cache. Note that this does NOT update the
786         /// cached information.
787         void checkIfBibInfoCacheIsValid() const;
788         /// Update the list of all bibfiles in use (including bibfiles
789         /// of loaded child documents).
790         void updateBibfilesCache(UpdateScope scope = UpdateMaster) const;
791         /// Return the list with all bibfiles in use (including bibfiles
792         /// of loaded child documents).
793         support::FileNameList const &
794                 getBibfilesCache(UpdateScope scope = UpdateMaster) const;
795         ///
796         void collectChildren(ListOfBuffers & children, bool grand_children) const;
797
798         /// noncopyable
799         Buffer(Buffer const &);
800         void operator=(Buffer const &);
801
802         /// Use the Pimpl idiom to hide the internals.
803         class Impl;
804         /// The pointer never changes although *pimpl_'s contents may.
805         Impl * const d;
806 };
807
808
809 /// Helper class, to guarantee that the export status
810 /// gets reset properly. To use, simply create a local variable:
811 ///    MarkAsExporting mex(bufptr);
812 /// and leave the rest to us.
813 class MarkAsExporting {
814 public:
815         MarkAsExporting(Buffer const * buf) : buf_(buf)
816         {
817                 buf_->setExportStatus(true);
818         }
819         ~MarkAsExporting()
820         {
821                 buf_->setExportStatus(false);
822         }
823 private:
824         Buffer const * const buf_;
825 };
826
827
828 } // namespace lyx
829
830 #endif